spec.md 5.7 KB

变更规格:app-entry-page-form-unification

status: done

背景

应用中心当前同时存在访问入口、业务对象、表单设计、列表设计和运行态发布能力。近期列表设计器已经支持多页面画布,表单设计器前端也支持多个表单资产,但整体协议仍以单表单 formDesignerSchema 为主,访问入口也没有显式绑定 pageKey/formKey,导致用户无法清晰理解“入口、对象、页面、表单”的边界。

目标

建立统一主链路:

访问入口 AppEntry
  -> 业务对象 BusinessObject
  -> 页面 pageKey
  -> 表单 formKey

本变更覆盖:

  • 多表单协议标准化:formDesignerSchema.forms[] + defaultFormKey,兼容旧单表单结构。
  • 表单设计器语义统一:区分“当前对象主表单”和“关联对象表单”,避免和业务对象设计混淆。
  • 访问入口配置增强:入口可选择业务对象、目标页面、目标表单和默认参数。
  • 列表页面动作增强:按钮、行操作、页面跳转支持 targetFormKey
  • 发布检查增强:检查入口/按钮引用的目标页面、目标表单是否存在。
  • 运行态承接:入口和页面动作能把 pageKey/formKey 传递到运行页。

非目标

  • 不新增独立业务对象类型来代表表单。
  • 不把每个表单强制发布为单独入口。
  • 不重写整个运行页,只补齐现有运行态对 pageKey/formKey 的识别和透传。
  • 不在本轮改动资金、状态机或真实权限策略。

设计原则

  • 访问入口解决“从哪里进来”。
  • 业务对象解决“操作哪类数据”。
  • 页面解决“展示哪个页面布局”。
  • 表单解决“使用哪套填写/展示结构”。
  • 旧数据必须兼容:没有 forms[] 的旧 formDesignerSchema 自动视为默认表单。

阶段划分

  1. 协议层:前后端 DTO 和前端 schema 工具统一多表单结构。
  2. 设计器层:表单设计 UI 和列表动作配置补齐 formKey
  3. 入口层:访问入口配置选择对象、页面、表单。
  4. 运行层:打开入口、页面跳转、按钮动作透传 pageKey/formKey
  5. 发布检查:阻断失效页面、失效表单、无动作按钮等问题。

本轮已覆盖

  • formDesignerSchema 升级为兼容多表单结构,新增 forms[]defaultFormKey,旧单表单结构会自动包装为默认表单。
  • 后端 FormDesignerSchemaDTO 增加 defaultFormKey/forms,运行态配置会携带完整表单 schema。
  • 访问入口配置支持选择目标页面、目标表单和默认参数,并在打开运行态时转为 pageKey/formKey/defaultParams 查询参数。
  • 访问入口配置补齐入口类型、入口权限码和结构化默认参数,运行态会把 URL 公共参数带入列表查询,把表单默认值带入新增/编辑表单。
  • 表单设计器文案避免继续使用“设计对象”,改为主表单/关联表单语义。
  • 表单设计器支持多表单资产的新增、复制、删除、重命名、用途维护和默认表单设置。
  • 表单设计器补齐表单治理配置:表单权限、字段覆盖规则、表单事件。运行态已应用字段隐藏、必填、只读、默认值;请求型表单事件已接入打开表单前、提交前、提交成功后。
  • 列表设计器的按钮、行操作、页面跳转配置支持目标表单,发布和运行态会透传 targetFormKey
  • 按钮组件补齐主点击动作、权限码、二次确认和成功后行为,写入统一事件协议;普通画布按钮运行态已支持跳转、请求、确认提示和成功后行为。
  • 按钮和行操作的参数映射支持固定值、当前行字段、路由参数、系统变量,运行态和后端构建器保留并解析 sourceType/sourceField
  • 列表设计器补齐桌面、窄屏、弹窗、抽屉、移动预览预设,复用现有画布宽度和缩放能力。
  • 发布检查补齐入口、按钮、布局跳转中的页面和表单引用校验,并检查入口类型/权限、无动作按钮、动作目标、请求地址、敏感参数、表单治理配置和动作参数映射。
  • 草稿/发布版本隔离已收口:设计保存仍更新草稿模型和页面,运行态 /ai/crud-config/render/{configKey} 对低代码已发布配置会读取 publishedVersion 对应的 ai_crud_config_version 快照字段,避免未发布表单或列表设计影响线上入口。
  • 真实预览从单开关升级为模式化预览:模拟数据、真实列表、新增表单、编辑表单、详情状态,支持预览记录 ID、请求状态、成功/失败信息和最后错误;发布检查会阻断最后一次真实接口预览失败的页面。
  • 按钮配置继续产品化:自定义按钮和普通画布按钮支持显示条件,运行态按当前用户权限集合过滤 permissionCode,条件表达式采用安全的 field=value / field!=value / field in A,B 子集,不执行任意脚本。
  • 表单事件补齐安全执行边界:请求型事件支持结果回填;自定义脚本只允许白名单函数 noopfillCurrentDatefillCurrentTime,发布检查会阻断未登记脚本。

后续待办

  • 参数映射继续产品化:入口参数和表单事件结果回填后续可抽成同一套映射编辑器;本轮已打通运行协议,暂未做 UI 组件级复用。
  • 浏览器实机验证:本轮完成构建/编译/静态检查,未启动本地后端和浏览器做真实点击链路验证。

归档记录(HARD-GATE)

  • 状态:done
  • 归档时间:2026-06-27
  • 归档人:yaomd(批量归档)
  • 归档路径:code-copilot/changes/archive/2026-06-27-app-entry-page-form-unification/
  • 判定依据:任务清单全部完成,execution-log 验证通过(编译/构建/lint 闭环)。