status: done created: 2026-06-15 complexity: 🔴复杂
当前 /app-center/object/crm_follow_record?suiteCode=IN_OUT 进入“设计对象 → 表单设计”后,中间表单编辑区依赖 FormCreate 通用设计器。它能完成基础拖拽,但体验不符合业务对象设计器的目标:字段资产、布局编排、运行态 CRUD 和发布检查是 Forge 自己的业务链路,FormCreate 画布只理解通用表单组件,导致操作割裂、拖拽反馈弱、布局调整不直观。
本次变更目标是将表单设计器中间画布改造成 Forge 原生设计体验,达到“类似飞书多维表格/表格配置面板”的轻快操作感:
AiCrudPage、AiForm、动态 CRUD、发布检查和后端运行配置生成链路。formDesignerSchema,后续可由 PC Renderer 和 Mobile Renderer 使用同一 Schema 渲染。可验证结果:
crm_follow_record 表单设计不再直接展示 FcDesigner 作为主画布。每个结论必须有代码出处(文件路径 + 类名/方法名)
业务对象详情页入口在 forge-admin-ui/src/views/app-center/object.[objectCode].vue。
template 第 18 行和第 95 行通过 openDesigner('form') 打开设计器。BusinessObjectDesignerPage,传入 embedded-object-code、embedded-object-id、initial-panel。业务对象设计器表单面板在 forge-admin-ui/src/views/app-center/object-designer.[objectCode].vue。
activePanel === 'form' 面板。BusinessFormDesigner。v-model="draft.pageSchema" 和 v-model:form-designer-schema="draft.formDesignerSchema" 同步设计协议。saveDesignerDraft() 仍走 saveBusinessObjectDesigner() 保存整体设计草稿。当前中间画布在 forge-admin-ui/src/views/app-center/components/designer/BusinessFormDesigner.vue。
BusinessFormCreateDesigner。saveBusinessObjectDesigner、saveBusinessObjectFormLayout。syncFormDesignerSchemaToPageSchema() 将 formDesignerSchema 编译进 pageSchema.zones[edit]。FormCreate 嵌入点在 forge-admin-ui/src/views/app-center/components/designer/BusinessFormCreateDesigner.vue。
FcDesigner。@form-create/designer。formCreateBridge 安装 FormCreate + Element Plus 适配。forgeSchemaToFormCreate() 将 Forge Schema 转为 FormCreate rule。flushDesigner() 再用 formCreateToForgeSchema() 转回 Forge Schema。Forge 自研表单 Schema 已存在于 forge-admin-ui/src/views/app-center/components/designer/form-first/formDesignerSchema.js。
FIELD_COMPONENT_KEYS 定义字段组件。LAYOUT_COMPONENT_KEYS 同时支持 elCard/card、elTabs/tabs 等双命名。createDefaultFormDesignerSchema() 能按字段生成默认表单。normalizeFormDesignerSchema() 负责归一化。createComponentFromField() 能从字段资产生成组件节点。表单设计结果已经能编译到运行态:
BusinessFormDesigner.vue 第 497 行 syncFormDesignerSchemaToPageSchema() 读取 formDesignerSchema。fieldSettings。formLayout。formCreateRule 兼容旧运行逻辑。formLayout。compiledFrom: 'formDesignerSchema'。运行态已经支持布局节点:
forge-admin-ui/src/views/ai/crud-page.vue 第 307 行 transformEditFields() 会读取 options.editFormLayout。hydrateRuntimeLayoutNode() 将运行布局节点和字段 schema 合并。editSchema 传入 AiCrudPage。forge-admin-ui/src/components/ai-form/AiFormLayoutNodes.vue 第 1 行开始渲染布局节点。AiFormLayoutNodes.vue 第 55 行支持 card。tabs。collapse。divider。后端运行配置生成已经消费 formLayout:
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/lowcode/LowcodeRuntimeConfigBuilder.java 第 55 行 buildRuntimeConfig() 将页面协议转换为 AiCrudPage 运行配置。buildOptions() 读取编辑区 props。formLayout。options.editFormLayout。前端已有拖拽依赖和基础用例:
forge-admin-ui/package.json 已包含 vuedraggable 与 @vueuse/core。forge-admin-ui/src/components/lowcode-builder/model/ModelFieldTable.vue 使用 vuedraggable 做字段排序。forge-admin-ui/src/components/lowcode-builder/page/BuilderCanvas.vue 使用 vuedraggable 做区块排序。forge-admin-ui/src/components/ai-form/AiTableFilter.vue 已有拖动中/悬停/列表移动样式和 transition-group。AiCrudPage 当设计器画布,会把运行态接口、弹窗、表格和设计态拖拽强绑定,后续维护风险高。BusinessFormCreateDesigner,保留 BusinessFormDesigner.syncFormDesignerSchemaToPageSchema() 和运行态链路。prefers-reduced-motion,不能为了“顺滑”引入持续动效或大面积重绘。[ ] 原生 Forge 表单设计器
formDesignerSchema、字段资产、对象编码、对象名称。formDesignerSchema,由现有编译链路生成 pageSchema。[ ] 三栏式设计工作台
[ ] 飞书多维表格式顺滑拖拽
cursor: grab,按下后切换 cursor: grabbing。transform 和 opacity。transform 平滑移动。[ ] 字段操作简化
[ ] 布局操作简化
title/divider、card、tabs/tabPane、collapse/collapseItem、row/col。[ ] 属性面板
[ ] 代码结构与可维护性
.vue 文件原则上不承载拖拽、渲染、属性编辑和 schema 操作全部逻辑。handleData、processItem、tempList 这类泛化命名。[ ] 预览与运行态一致性
AiFormLayoutNodes 兼容的节点模型。fieldSettings 和 formLayout。AiCrudPage 新增/编辑/详情表单排版与设计器一致。[ ] 兼容旧数据
formDesignerSchema 直接读取。BusinessFormCreateDesigner 临时回退入口,便于对比和应急。formDesignerSchema 为主数据源。pageSchema、modelSchema、formDesignerSchema 为准。prefers-reduced-motion:用户开启减少动态效果时,保留落点高亮但禁用跟手弹性和重排动画。| 操作 | 表名 | 字段/索引 | 说明 |
|---|---|---|---|
| 无 | - | - | Phase 1 不新增表字段,继续使用现有业务对象设计草稿中的 formDesignerSchema、pageSchema |
| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 无 | /ai/business/object/{objectId}/designer |
GET/PUT | 继续读取和保存现有设计器协议 |
| 无 | /ai/business/object/{objectId}/layout/preview |
POST | 继续使用现有预览生成 |
| 无 | /ai/business/object/{objectId}/publish |
POST | 继续使用现有发布 |
前端:
forge-admin-ui/src/views/app-center/components/designer/BusinessFormDesigner.vueforge-admin-ui/src/views/app-center/components/designer/BusinessFormCreateDesigner.vueforge-admin-ui/src/views/app-center/components/designer/forge-form-designer/forge-admin-ui/src/views/app-center/components/designer/form-first/formDesignerSchema.jsforge-admin-ui/src/components/ai-form/AiFormLayoutNodes.vue后端:
LowcodeRuntimeConfigBuilder 和业务对象发布检查。运行态:
forge-admin-ui/src/views/ai/crud-page.vueforge-admin-ui/src/components/ai-form/AiCrudPage.vueforge-admin-ui/src/components/ai-form/AiForm.vue典型验证对象:
/app-center/object/crm_follow_record?suiteCode=IN_OUTvuedraggable 默认 ghost class,可能达不到飞书多维表格式顺滑感;需要补自定义 drag overlay、drop indicator 和 FLIP 动效。formDesignerSchema、当前运行态 formLayout 必须共存过渡。AiFormLayoutNodes 差异过大,会造成“设计看到的不是发布后的样子”。测试范围:
formDesignerSchema 归一化、字段插入、移动、删除、布局容器嵌套。formDesignerSchema -> pageSchema.editZone.props.fieldSettings/formLayout 编译结果。crm_follow_record 保存、预览、发布、打开运行应用。prefers-reduced-motion 下动效降级。覆盖率目标:
pnpm build。独立 Test Spec:是。进入 /test 前创建或补充 test-spec.md,并按 code-copilot/rules/automated-testing-standard.md 追加 execution-log.md。
crm_follow_record 内置一个推荐布局模板:基础信息、跟进对象、跟进内容、时间负责人?@vicons/ionicons5 图标?决策 1:设计态不直接复用 AiCrudPage 页面壳。
AiCrudPage 是运行态组件,包含接口、弹窗、表格、导入导出、流程详情等职责;设计态应只复用字段渲染资产和布局协议。决策 2:Forge formDesignerSchema 作为设计态唯一事实来源。
决策 3:Phase 1 不引入新拖拽依赖,优先使用已有 vuedraggable + 自定义 Pointer/Overlay/FLIP。
vuedraggable,可覆盖列表和嵌套排序;复杂镜像和吸附提示由自研 composable 控制,减少依赖风险。决策 4:动效只用 transform、opacity、box-shadow,禁止拖拽中修改布局尺寸做动画。
决策 5:保留 FormCreate 兼容转换,但从主链路下线。
| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| Proposal | done | spec.md, tasks.md |
已创建改造提案 |
| Native designer skeleton | done | BusinessFormDesigner.vue, formDesignerSchema.js, forge-form-designer/* |
新版三栏画布骨架接入,旧 FormCreate 画布保留回退 |
| Validation | done | test-spec.md, execution-log.md |
eslint、pnpm build、git diff --check 通过 |
待 /review lowcode-form-designer-smooth-dnd 执行。