spec.md 41 KB

应用内低代码搭建器(前端交互升级)

status: apply created: 2026-07-21 complexity: 🔴复杂 change: in-app-lowcode-builder dependency: app-first-lowcode-workbench 已建立应用聚合、对象编排、工作台和应用级 options 持久化能力。

1. 背景与目标

当前 Forge 已具备对象、字段、表单、列表、规则、流程、动态 CRUD、组件画布与发布能力,但用户的工作路径仍偏向“应用中心 → 对象 → 专业设计器 → 访问入口”。业务人员难以把它理解为一个可直接打开、拥有首页、目录和菜单的完整应用。

本变更在不新建第二套低代码事实来源、不修改后端接口或数据库结构的前提下,新增“应用内低代码搭建器”的前端交互层。用户从应用进入运行壳后,在具备编辑权限时点击“编辑应用”,即可创建页面组(目录)、页面、首页内容和页面组件;需要配置字段、表单、列表、CRUD、规则或流程时,仍在同一应用上下文中复用既有设计器能力。

完成后应满足以下可验证结果:

  • 应用拥有独立运行壳:应用级导航、首页和内容区域;不把系统“用户管理、角色管理、字典管理”等全局控制台菜单混入应用导航。
  • 应用编辑者可从应用页面进入编辑态,管理目录和页面;创建页面时明确选择所属目录,空目录提供“在本组创建页面”,不依赖“拖拽页面或页面组到这里”的抽象提示。
  • 新建空白/介绍页面时,画布显示简洁引导和常用组件;用户可点击推荐组件或悬浮“添加组件”按钮插入组件。
  • 组件选择框按常用、业务、内容和高级分类展示,并支持搜索;点击组件即可插入当前画布,拖拽是可选快捷方式而非必经路径。
  • 应用页中间区域即最终页面的所见即所得展示;编辑态复用既有列表设计器的选中框、拖拽手柄、八向尺寸锚点、原位占位阴影和更多操作层。组件可在页面内容区域自由移动和调整尺寸,但不显示传统画布网格或完整自由画布工作台。
  • 业务数据页面可在应用搭建器中选择业务对象,并在当前上下文进入列表、表单、详情、规则、流程的已有配置能力;不得复制字段、表单或流程 Schema。
  • 页面目录、排序、首页和页面引用作为 ai_business_application.options.inAppBuilder 前端配置保存;继续使用既有应用更新、版本和发布链路。
  • 界面保持克制、紧凑、企业后台风格:不新增渐变大横幅、堆叠统计卡或复杂多级配置;高级设计能力按需展开。

2. 代码现状(Research Findings)

2.1 相关入口与持久化链路

  • forge-admin-ui/src/views/app-center/application.[applicationCode].vue 已是应用工作台入口,能按应用编码加载工作台、按分区承载对象、入口、流程、权限和发布能力。
  • forge-admin-ui/src/views/app-center/application-preview.[applicationCode].vue 已能以应用为上下文加载业务对象设计草稿并交给 LowcodePreviewPane 预览。
  • forge-admin-ui/src/api/business-application.js 已提供应用工作台读取和应用更新 API;forge-admin-ui/src/api/business-app.js 已提供对象设计保存 API。
  • forge-server/.../domain/entity/AiBusinessApplication.javaBusinessApplicationDTO.javaBusinessApplicationVO.java 都包含 options JSON 字段。
  • BusinessApplicationService.update(...) 接收并规范化 options;现有应用聚合发布/版本能力会对应用扩展配置做快照。因此首期应用内页面编排可存入 options,无需新增表、Flyway 或 Controller。

2.2 已有低代码设计能力

  • forge-admin-ui/src/components/lowcode-builder/page/ComponentPalette.vue 已提供按区块过滤的业务组件、基础控件、字段筛选和 HTML5 拖拽数据协议。
  • forge-admin-ui/src/components/lowcode-builder/page/LowcodePageBuilder.vueBuilderCanvas.vueBuilderZone.vueComponentPropertyPanel.vue 已提供页面画布、放置区和属性编辑基础。
  • forge-admin-ui/src/components/lowcode-builder/page/page-schema.js 是页面 Schema、默认组件、默认布局和字段同步的共享事实来源。
  • forge-admin-ui/src/views/app-center/components/designer/BusinessListDesigner.vue 已支持业务对象内多页面、新增、复制、删除、重命名和页面跳转目标校验;其 pages[] 是对象页面资产,不等同于应用级导航树。
  • forge-admin-ui/src/views/app-center/components/designer/BusinessFormDesigner.vueBusinessDetailDesigner.vueBusinessFlowBindingPanel.vue 已覆盖表单、详情与流程配置;runtime-rules.jsRuntimeRulesEditor.vue 已统一处理运行规则。
  • forge-admin-ui/src/views/ai/crud-page.vueListPageGridDesigner.vueLowcodePreviewPane.vue 已提供真实 CRUD 或设计态运行预览。

2.3 现有边界与风险

  • ai_business_app 是访问入口,不是应用页面树;BusinessAppOpenService.buildRuntimeTargetRoute(...) 仅按入口、configKeypageKey 和运行模式解析运行页,不能被改造成第二个应用页面存储。
  • 业务对象的 pageSchema.pages[] 解决“一个对象内的列表/详情/自定义页”,但不记录跨对象目录、首页或应用级菜单,不能直接作为应用导航树。
  • 现有全局菜单由 sys_resource、动态路由和系统 RBAC 管理。应用内编辑不得直接修改该菜单,否则会跨应用影响权限、路由和其他用户。
  • 仅靠前端隐藏编辑按钮不能构成授权。首期保存继续使用既有 ai:businessApplication:edit 后端授权;新页面级细粒度权限只做前端编排字段预留,不在本变更中声称已完成后端强制。

3. 功能点

3.1 应用运行壳与统一入口

输入:用户从应用中心或应用工作台打开某业务应用。

处理:前端加载应用、对象摘要、发布态配置和 options.inAppBuilder;以“应用壳”替代系统后台侧栏,展示应用名称、应用切换、通知/头像等共享顶栏元素、应用内导航与页面内容。

输出:

  • 运行用户只看到已发布/可访问的应用内页面;系统控制台作为顶部受权限控制的跳转入口,不混入左侧业务菜单。
  • 编辑者在右上角看到“编辑应用”;普通用户不显示该操作。
  • 首期运行壳支持首页、介绍/内容页、业务对象页和外部/既有入口页的前端路由编排;不改写动态 CRUD 运行时。

3.2 页面组和页面管理

输入:编辑者在应用编辑态点击“添加”。

处理:

  • “新建页面组”只要求名称、图标和所属位置;页面组是导航容器,不要求拥有独立画布。
  • “新建页面”要求名称、页面类型和所属目录。若从某目录上下文发起,自动预选该目录。
  • 初始页面类型包括:首页/介绍页、业务数据页、空白内容页、外部/既有入口页;模板选项以简短说明和预览呈现。
  • 空页面组显示“在本组创建页面”和“移动已有页面到此组”,不出现强制拖拽提示。
  • 每个节点的更多菜单提供重命名、移动到、上移、下移、删除;拖拽排序可后续补充,首期不得成为唯一操作。

输出:左侧为清晰的应用导航树;首页默认存在且固定在顶层,其他页面可按目录管理。

3.3 空白页引导、组件弹窗与画布插入

输入:编辑者创建空白/介绍页,或点击页面/区块悬浮“添加组件”。

处理:

  • 无组件时,中间画布展示页面说明和 4~6 个常用组件推荐,例如介绍区、指标卡、业务数据列表、录入表单、待办和图表。
  • 用户点击推荐项时,使用既有组件目录的默认属性创建组件并写入当前页面 Schema。
  • 页面主体与可插入容器旁显示轻量悬浮 +;点击后打开组件选择弹窗,支持关键字、常用/业务/内容/高级分类。
  • 组件入口固定在应用页面树下方;使用贴近入口的 Popover,不使用遮挡画布的 Modal。组件条目和画布组件均保留图标槽位,后续接入图标目录不改变布局协议。
  • 中间区域复用既有 listPageBlockCatalogcreateGridBlockGridBlockRenderer,但按最终页面流直接渲染;编辑态复用列表设计器的拖动手柄、选中边框、八向尺寸锚点、拖动占位/双胞胎阴影和更多操作层。应用页仍保存组件布局数据到 gridLayout,不启用网格背景或完整自由画布工作台。
  • 插入位置规则:当前选中容器内 → 当前选中组件后 → 当前区块末尾 → 页面主体末尾。发生兜底时给出明确提示。
  • 保留现有拖拽协议和画布能力,但不为普通用户强制展示复杂组件货架。

输出:用户可不学习拖拽操作,仅通过点击完成首个页面;插入后自动选中新组件并在右侧显示属性。

3.4 右侧上下文与属性编辑复用

输入:当前页面为空、选中页面、选中组件或选中业务数据页。

处理:右侧仅展示当前上下文所需内容:

状态 右侧内容
空白页面 页面简介、常用组件、页面模板、最近使用组件
选中页面 名称、图标、目录归属、可见性预留、页面说明、页面类型
选中组件 显示选中边框与排序手柄;复杂属性仍在既有专业设计器中维护
业务数据页 绑定对象、打开方式、默认页面/表单、快捷配置入口

编辑态未选中组件时不显示右侧属性面板,避免右侧同时承担新增、导航和属性配置。

不得复制现有属性编辑实现;新壳只适配选择状态、插入位置和应用级属性。

3.5 在应用上下文配置 CRUD、表单、规则和流程

输入:编辑者在业务数据页点击“配置数据页面”“配置表单”“配置规则”或“配置流程”。

处理:

  • 先选择/新建/关联业务对象;新页面仅保存对象引用、目标 pageKey、默认参数和展示设置。
  • 轻量配置(页面标题、菜单名称、默认打开模式、默认查询参数、快捷操作可见性)在应用右侧完成。
  • 深度配置复用已有 BusinessListDesignerBusinessFormDesignerBusinessDetailDesignerRuntimeRulesEditor 和既有流程配置入口,可在抽屉、全屏子工作区或深链中打开,但始终携带应用返回上下文。
  • 字段、表单 Schema、运行规则、流程绑定和对象发布继续只有既有对象设计链路能保存;应用搭建器不得写第二份拷贝。

输出:业务用户把“客户管理、商机表单、审批页”等放入应用并做常用设置;实施人员可无缝进入已存在的专业配置。

3.6 草稿、预览与发布提示

输入:用户改变应用导航、页面编排或应用内组件布局。

处理:

  • 编辑态明确显示“草稿编辑中”;提供保存草稿、预览、发布和退出操作。
  • 保存调用既有应用更新接口,把版本化配置写入 options.inAppBuilder,不产生新的后端协议。
  • 发布仍走既有应用发布工作台;发布前显示“导航/首页/页面编排将随应用版本发布”的提示。
  • 发布后继续沿用当前版本/回滚能力;本变更不新增页面级独立版本。

输出:用户不会误以为保存即对所有运行用户生效。

4. 业务规则

  • 应用内菜单只表示当前应用的页面导航,禁止在编辑态直接新增、删除或改写 sys_resource 全局菜单。
  • “用户管理、角色管理、部门、字典”等属于系统控制台;应用内只展示“成员与权限”业务投影视图或受控跳转,不能复制全局用户管理。
  • 首页是应用页面,创建应用时若缺失则在前端初始化默认首页;首页不允许变为其他节点的子节点。
  • 页面组只能包含页面组或页面,不能直接承载业务数据/组件画布;页面才可承载画布。
  • 页面组和页面名称在同一父节点下不得为空;同级重名允许但 UI 应提示,节点 ID 必须稳定且不能以名称作为引用。
  • 删除页面组前必须选择“同时删除子页面”或“将子页面移动到顶层/指定目录”;不得静默丢弃子节点。
  • 业务数据页只保存对象引用和页面引用,不复制 modelSchemaformDesignerSchemapageSchemaviewSchemalinkageSchema 或流程 JSON。
  • 组件插入只能来自现有、明确注册的组件目录;不在本期开放任意 HTML、任意 JavaScript 或任意远程组件。
  • 不支持的组件、缺失对象、未发布对象或失效 pageKey 必须显示可理解的占位和“去配置”动作,不能渲染 undefined
  • 首期页面可见性为前端编排预留字段;真正运行授权继续由现有访问入口、对象权限和数据权限后端链路决定。

5. 数据变更

本变更不新增表、不新增字段、不执行 Flyway。

应用级编排写入已存在的 ai_business_application.options

{
  "inAppBuilder": {
    "schemaVersion": 1,
    "homePageId": "page_home",
    "nodes": [
      { "id": "page_home", "type": "page", "pageType": "home", "title": "首页", "parentId": null, "sort": 0 },
      { "id": "group_sales", "type": "group", "title": "销售管理", "parentId": null, "sort": 10 },
      { "id": "page_opportunity", "type": "page", "pageType": "object", "title": "商机管理", "parentId": "group_sales", "sort": 0,
        "objectRef": { "objectId": "…", "objectCode": "crm_opportunity", "pageKey": "list" } }
    ],
    "pages": {
      "page_home": { "layout": { "items": [] } }
    }
  }
}

约束:配置中不得保存 Token、密码、AK/SK、脚本源代码或对象完整 Schema;版本升级必须通过前端 Schema 归一化兼容旧空 options

6. 接口变更

本期不新增或修改后端接口,复用:

场景 既有接口 前端用途
加载应用工作台 GET /ai/business/application/code/:applicationCode/workspace 应用、对象、入口摘要与 options
保存应用草稿 PUT /ai/business/application 保存 options.inAppBuilder
加载/保存对象设计 既有 /ai/business/object/:id/designer 及设计保存接口 深度配置字段、列表、表单和规则
发布/回滚 既有应用发布接口 继续管理应用版本
打开运行入口 既有 /ai/business/app/:id/open-info 复用入口权限和安全校验

如实施中发现工作台响应未返回 application.options 或已有应用更新接口不允许保留未知 JSON 键,必须停止前端实现并新增后端兼容任务,不允许绕过后端或改用浏览器本地存储作为多人共享事实来源。

7. 影响范围

  • forge-admin-ui/src/router/index.js:新增应用运行壳/编辑器前端路由;保持既有工作台和对象设计器路由兼容。
  • forge-admin-ui/src/views/app-center/:应用工作台头部增加“进入应用/编辑应用”入口,新建应用内运行壳和编辑器视图。
  • forge-admin-ui/src/components/lowcode-builder/:只复用或抽取现有画布、组件目录、属性面板和 Schema;不得破坏旧设计器。
  • forge-admin-ui/src/api/business-application.js:只在必要时补充已有接口封装或参数归一化;不新增协议。
  • code-copilot/changes/in-app-lowcode-builder/:本变更的 Spec、任务、测试计划和执行日志。

不影响:forge-server/** 业务实现、Flyway、sys_resource、动态 CRUD API、Flowable 引擎和既有对象设计 Schema。

8. 风险与关注点

  • ⚠️ 权限:首期的“编辑应用”仅是前端入口与既有应用 edit 权限的组合,页面级可见性不能被误宣传为后端安全隔离。
  • ⚠️ 配置冲突:必须严格区分应用页面编排与对象页面 Schema。把对象 Schema 拷贝到应用 options 会导致发布、回滚和对象设计双写冲突。
  • ⚠️ JSON 体积:options 适合导航、页面引用和轻量布局。若自定义页面布局逐渐变大或需要独立审计,应另开后端数据模型,不能无限堆进 options
  • ⚠️ 兼容:旧应用没有 inAppBuilder 时必须根据应用名称、主对象和入口生成只在前端内存中的默认首页,首次保存才写入 options。
  • ⚠️ 运行态:自定义页面必须采用已注册组件渲染;不能引入任意脚本执行、动态组件 URL 或绕过 open-info 的外部页面。
  • ⚠️ UX:不把全局用户管理等基础配置塞入应用菜单。整体感由统一顶栏、应用切换、成员投影与一致视觉建立,不由重复系统菜单建立。

8.5 测试策略

  • 测试范围:应用内编排 Schema 的创建、归一化、迁移、移动/删除节点、插入定位、业务对象引用校验;关键 Vue 交互单测;现有对象设计器与运行路由回归。
  • 浏览器验收:空应用创建首页 → 建目录 → 在目录创建业务页面 → 插入推荐组件/弹窗组件 → 修改属性 → 保存刷新 → 预览 → 进入对象深度设计 → 返回应用;同时验证普通用户不出现编辑入口。
  • 构建检查:新增单测后执行定向 Vitest;前端 ESLint;pnpm build。执行前必须读取 code-copilot/rules/automated-testing-standard.md 并追加 execution-log。
  • 覆盖率目标:新增编排 Schema 工具分支覆盖率不低于 80%;核心节点移动、删除、默认首页、组件插入和引用失效必须有用例。
  • 独立 Test Spec:是,进入 /test 或实际编码前创建/补充 test-spec.md

9. 待澄清

  • V1 应用运行壳的公开路由是否固定为 /app/:applicationCode,还是保持在 /app-center/application/:applicationCode/runtime?建议后者,避免与现有动态菜单和外部部署路径冲突。
  • V1 是否允许“外部/内嵌页面”作为应用内页面类型?建议只引用已经存在且通过 open-info 校验的访问入口,不提供自由输入外部 URL。
  • V1 的首页组件范围是否冻结为:介绍区、指标卡、业务数据列表、录入表单、待办、图表、文本、图片、分栏、分隔线?建议冻结该范围,其余组件走“高级设计”。
  • 现有应用发布版本是否已包含 options 全量快照?需要在编码前通过现有发布代码和测试确认;若不包含,V1 只能明确标注为“应用草稿编排”,不能承诺随发布版本回滚。

10. 技术决策

  1. 一个平台、两种视图,而不是两套低代码。 新应用内搭建器负责导航、页面编排、组件插入和轻量配置;当前对象设计器继续负责字段、表单、列表、规则、流程和运行态编译。
  2. 应用页面仅引用对象资产。 业务数据页引用 objectId/objectCode/pageKey,禁止复制模型、表单或流程 Schema。
  3. 前端优先持久化到应用 options。 已有 JSON 字段、应用更新和发布版本能力满足第一期;不为纯交互升级新增后端 API。若现有保存/快照不能保证契约,转为后端任务,不使用 LocalStorage 规避。
  4. 点击插入优先,拖拽增强。 复用现有拖拽与画布实现,但常用流程采用模板、推荐组件、悬浮插入按钮和“移动到”菜单。
  5. 应用壳与系统控制台分层。 应用左侧只显示业务页面,系统级菜单通过顶部受控入口回到原控制台;应用成员/权限是系统用户的范围投影,不复制账号体系。
  6. 渐进披露。 默认展示页面树、画布和最少属性;复杂对象/表单/规则/流程通过当前页面的“高级配置”进入已有实现。

11. 执行日志

Task 状态 实际改动文件 备注
Proposal completed spec.md, tasks.md 仅文档,未修改业务代码、后端接口或数据库
第三阶段统一体验 completed-static 页面设计器、业务应用 API/服务、发布与对象面板、相关单测 已完成按需对象门禁、草稿/发布运行分离、设计器内对象与发布抽屉;自动化与生产构建通过,真实服务/角色/菜单 E2E 待人工验收。

12. 审查结论

尚未进入实现审查。编码前需先完成第 9 章待澄清项并获得 HARD-GATE 确认。

13. 确认记录(HARD-GATE)

  • 确认时间:2026-07-21。
  • 确认人:用户。
  • 确认内容:用户明确要求“开始写代码”。默认决策:运行壳路由采用 /app-center/application/:applicationCode/runtime;首期组件范围按第 9 章建议冻结;外部页面仅引用既有受控访问入口;先复用现有应用 options 和发布快照能力,不新增后端接口或数据库结构。

14. 第二阶段确认:页面发布、权限与运行治理

2026-07-26 用户确认:以下能力全部进入本变更,不再仅保留前端编排字段。

14.1 发布时同步实际菜单

  • 草稿 options.inAppBuilder 只保存页面树、页面设置和编排;保存草稿绝不写入 sys_resource
  • 应用发布流程新增“页面菜单同步”步骤:仅同步启用“显示在系统菜单”的页面组和页面。页面组生成目录资源,页面生成菜单资源;未勾选的节点仅出现在应用内导航。
  • 资源权限编码由稳定的应用编码和页面 ID 组成,例如 ai:business:application:{applicationCode}:page:{pageId},不得使用页面名称。
  • 系统菜单页面统一指向既有运行壳路由,并以 pageId 查询参数定位页面;运行壳必须从已发布快照读取页面,不能读取草稿。
  • 页面隐藏、移除菜单或删除后同步停用旧资源,不物理删除已有角色授权的资源;页面组目录在没有可见子项时同步隐藏。

14.2 页面入口、权限、版本与发布校验

  • 页面设置新增:默认首页、应用内导航可见、系统菜单可见、页面访问范围和图标/排序。
  • 访问范围支持“继承应用访问权限”与“指定角色”。发布时同步角色资源关系;未选角色的指定角色页面为发布阻断项。
  • 运行配置接口按当前用户权限过滤页面及页面组;直接传入无权 pageId 时回退到第一个可访问页面。
  • 发布快照包含完整 inAppBuilder 与页面菜单摘要;发布前校验首页、对象引用、菜单权限和动作目标。回滚后按目标快照再次同步菜单和权限。

14.3 容器、跨页移动、变量动作与响应式

  • 容器内子组件支持选中、配置、排序、移出布局;标签页支持选择目标标签。
  • 跨页面支持复制和移动。移动在目标页成功写入后才删除源组件。
  • 页面协议新增白名单化变量/动作:仅 URL 参数、当前用户、当前组织、静态值和已注册页面跳转/刷新/打开表单动作;禁止任意脚本。
  • 编辑器提供桌面、平板、手机预览断点,只改变预览容器宽度,不改写设计布局。

14.4 数据、接口与验收

  • 允许新增发布菜单同步服务、已发布运行配置接口和必要 Flyway 元数据;所有 sys_resource / sys_role_resource 只由后端发布服务维护。
  • 保存草稿后系统菜单不变;发布后页面菜单和角色授权准确更新;回滚后菜单、权限、页面树恢复到目标版本。
  • 页面权限在系统菜单、应用内导航、运行配置接口和直接页面访问四处一致。

15. 第三阶段收口:统一应用开发体验与按需发布门禁

2026-07-27 用户反馈:页面设计、业务对象工作台和发布工作台的概念仍然割裂,纯页面应用被“必须且只能有一个主对象”错误阻断。本节覆盖前文“纯前端、不新增接口”和“发布跳转工作台”的首期限制,以本节为本轮实现依据。

15.1 统一用户路径

  • 应用中心普通用户只看到一个“新建应用”入口。创建应用只填写基本信息,成功后直接进入页面设计;模板、已有对象和数据库导入不再作为应用类型暴露。
  • 页面设计器是默认开发入口,承载页面、导航、组件、数据绑定和发布操作;原工作台保留为“高级配置”,用于对象详情、自动化、权限、版本历史和兼容入口。
  • 创建 CRUD、左树右表或主子表页面时,在页面上下文内完成“新建对象 / 使用已有对象 / 从数据库导入”,不要求用户先离开页面设计器理解主对象角色。
  • 发布在页面设计器内使用抽屉完成检查、问题定位和发布;发布历史仍复用既有发布面板和 API,不新增第二套发布实现。

15.2 发布门禁改为实际数据依赖驱动

  • 纯内容应用、介绍页、门户页和只使用页面级表单资产的应用允许关联 0 个业务对象并发布。
  • 应用只关联 1 个业务对象时,保存关联关系自动将其规范为 PRIMARY,不要求用户理解或手动选择对象角色。
  • 应用关联多个对象时允许不存在 PRIMARY,前提是每个数据消费节点都显式绑定到本应用内的有效对象;存在一个 PRIMARY 时,未显式绑定的数据节点可回退到该对象。
  • 同时存在多个 PRIMARY 始终阻断;显式引用应用外对象、对象引用失效、或数据组件无法解析到唯一对象时阻断。
  • 数据消费节点包括 pageType=object 页面和 AiCrudPage 区块;对象引用依次识别页面 objectRef、区块 props.objectRefprops.businessObjectRef,并递归检查容器子组件、栅格单元格和标签页。
  • 页面级 AiForm / formAssets 不自动等价于数据库业务对象。代码生成需要根对象时仍在“生成代码”阶段单独校验,不阻断应用发布。

15.3 草稿与正式运行配置分离

  • edit=1draft=1 读取应用工作台草稿;普通运行态调用 GET /ai/business/application/by-code/:applicationCode/runtime 读取 lastPublishVersion 指向的不可变发布快照。
  • 正式运行接口使用 ai:businessApplication:runtime 权限,只返回已启用应用的发布配置,并按发布时生成的稳定页面权限过滤导航节点和页面定义。
  • 无权页面从导航和 pages 中删除;其必要父目录保留;已发布首页不可访问时回退到第一个可访问页面。直接传入无权 pageId 由前端选择返回配置中的可访问首页。
  • 从正式运行切换到编辑态必须重新加载完整草稿,禁止在权限过滤后的发布快照上继续编辑。

15.4 接口与数据影响

  • 新增只读运行配置接口,不新增数据库字段和 Flyway;接口响应沿用工作台的 application / objects / entries 结构,但来源是不可变应用版本快照。
  • 发布快照继续是运行事实来源;草稿保存不改变正式运行配置。回滚生成的新发布版本会自然成为正式运行配置。
  • 发布步骤中的 PAGE_MENUS 必须出现在运行记录步骤名称和部分失败副作用判断中。

15.5 表单优先创建数据页面

2026-07-28 用户反馈:先创建页面表单并绑定 AiCrudPage 后,字段选择无法生效,发布仍提示数据页面未绑定业务对象。页面表单和持久化对象的边界虽然在发布规则中正确,但设计态仍允许形成误导性的半绑定状态。

  • ListPageGridDesigner 的字段清洗必须使用当前组件实际收到的字段目录;页面级 fields 与稳定的页面 modelSchema.fields 分离时,不能把刚选择的字段立即过滤掉。
  • AiCrudPage 的“数据”配置首先展示业务数据源。未绑定对象时必须明确说明页面表单只定义字段和布局、不提供数据库表与 CRUD 接口,并在当前上下文提供选择已有对象、管理/导入对象和从当前页面表单创建对象的入口。
  • 从页面表单创建对象时复用表单字段编码、字段属性和 formDesignerSchema,创建对象后自动加入当前应用并绑定回当前 AiCrudPage;页面表单原资产保留,不做破坏性删除。
  • 从表单升级只保存业务对象设计草稿,不自动执行数据库 DDL、不自动发布对象。数据库同步继续由对象设计器显式确认,应用发布继续校验对象自身就绪度。
  • 新建或尚未发布的业务对象在页面编辑态允许从对象设计草稿读取字段目录,使列表字段可以继续配置;正式运行态仍只读取已发布 CRUD 配置。

15.6 表单保存自动准备数据存储

2026-07-28 交互复核:普通用户只理解“表单”,不应在保存表单后再手工创建业务对象,更不应连续打开“数据对象”和“新建业务单元”两个抽屉。本节覆盖 15.5 中“从当前表单创建对象”的手动主流程。

  • 普通用户的主路径固定为“新建表单 → 设计字段和布局 → 保存”。当表单被未绑定的 AiCrudPage 使用且至少包含一个持久化字段时,首次成功保存必须自动准备表单数据存储,不再要求用户理解或创建“业务对象”。
  • CRUD、左树右表和主子表等数据页面模板直接创建页面并进入表单设计,不再以前置“选择/创建业务对象”阻断起步;复用已有数据、数据库导入和对象角色调整统一保留在高级数据设置。
  • 自动准备由应用聚合接口统一编排:选择默认的、可写、非只读且允许自动建表的 LOWCODE_RUNTIME 数据源,先在元数据事务中创建内部托管业务对象、保存表单派生字段与 formDesignerSchema 并加入当前应用;元数据提交后再按 15.9 执行安全数据库同步。接口不得自动发布对象或应用。
  • 应用与表单资产 ID 作为稳定托管标识。重复保存、网络重试或页面重新进入时必须复用同一个内部对象并同步最新表单设计,不得重复创建对象;19 位对象 ID 在前端始终按字符串传递。
  • 同一表单被多个未绑定 AiCrudPage 使用时只准备一个数据存储,并把这些区块统一绑定到返回的对象引用。手工绑定已有对象的页面不自动改写该对象,继续作为高级数据设置处理。
  • 没有持久化字段、未被数据列表使用的内容表单和纯页面应用不触发自动准备,继续允许 0 个业务对象。
  • 主界面统一使用“表单数据”“数据存储”等用户语言。手工新建/导入/关联对象、对象角色和数据源切换保留在“高级数据设置”;自动准备失败时显示单层就地恢复提示和重试入口,不再自动打开嵌套抽屉。
  • 保存成功反馈应合并为“表单和数据存储已准备完成”。若表单草稿已保存但自动准备失败,必须明确说明草稿仍已保存,并给出可重试原因;不能把失败伪装成整次表单保存失败。

15.7 自动准备后的草稿 CRUD 预览

2026-07-28 实测反馈:保存表单并自动回绑托管对象后,应用设计器立即请求正式 CRUD 运行接口,因对象尚未发布而提示“低代码应用尚未发布”。

  • edit=1draft=1 属于设计态,加载对象渲染配置及页面内 CRUD 数据接口时必须统一携带既有 designPreview=1 协议,允许具备设计权限的用户使用最新草稿配置;不得要求先发布对象或应用才能继续保存和配置页面。
  • 草稿预览标记必须覆盖列表、详情、新增、修改、删除、导入和导出等实际端点;仅给渲染配置接口添加标记不足以避免 AiCrudPage 自动加载列表时触发正式运行门禁。
  • 普通正式运行态不得携带设计预览标记,继续只读取发布快照和已发布 CRUD 配置,不能借本修复绕过发布隔离。
  • 设计预览只准备和编译草稿运行元数据,不自动执行数据库 DDL、对象发布或应用发布。

15.8 自动生成稳定编码并统一模型编码边界

2026-07-28 实际保存表单时,自动准备服务生成了超过数据库 varchar(48)model_code,导致托管数据存储创建事务回滚;同时普通用户仍被要求手工填写应用编码。

  • ai_business_object.model_codeai_lowcode_model.model_code 的统一运行契约为最多 48 个字符。后端所有模型编码归一化和“业务域 + 对象”组合都必须使用同一 48 位上限;前端对象创建辅助函数也必须遵循该上限,不通过扩大数据库字段掩盖命名规则漂移。
  • 新建应用的普通路径只要求应用名称和所属业务域。applicationCode 为空时由后端根据业务域与应用名称生成符合“字母开头,仅含字母、数字和下划线,2-64 字符”的编码;中文名称无法形成可读单词时使用稳定短摘要,不得生成空编码。
  • 自动生成编码在当前租户内按 _2_3 等稳定后缀避让已有有效应用;显式填写的编码仍按原规则校验并在重名时失败。数据库唯一索引继续作为并发竞争的最终失败关闭边界。
  • 创建接口必须返回应用 ID 和后端最终采用的应用编码,前端不得根据提交草稿猜测跳转路由。普通新建界面把应用编码收进“高级设置”,留空即自动生成;编辑态只读展示且继续禁止修改。
  • 本节的编码修复不修改既有元数据表字段。表单数据准备接口已有事务边界,模型编码插入失败时不保留半条业务对象数据;自动托管表单的数据表 DDL 另按 15.9 的受控规则执行,修复并重启后允许用户直接重新保存表单。

15.9 自动托管表单保存后创建数据表

2026-07-28 用户实测反馈:表单保存并显示“数据存储已准备完成”后,真实 CRUD 仍报“数据表不存在”。本节覆盖 15.5~15.8 中“自动准备不执行 DDL”的旧约束,仅针对系统自动托管的页面表单执行受控数据库同步。

  • 当且仅当对象 options.managedBy=PAGE_FORM,且来源应用、表单资产与本次保存请求一致时,表单数据准备接口在元数据事务成功提交后自动创建对应数据表;后续保存新增字段时自动追加缺失列。
  • 自动托管对象必须选择启用、可写、非只读且 allowRuntimeDdl=1LOWCODE_RUNTIME 数据源。没有符合条件的数据源时,不创建半成品托管对象,并用普通用户语言提示“当前数据存储未允许自动建表”。
  • 自动同步必须以数据源当前真实配置和 DDL 预检结果为准,不能被托管对象中历史保存的 allowDdl 快照误阻断;管理员开启自动建表后,用户重新保存原表单即可复用原对象补建表。
  • 自动同步继续复用 BusinessObjectTableMappingService + LowcodeDdlService 的差异预览、数据源解析和安全语句白名单;只允许 CREATE TABLEADD COLUMN 与既有安全追加式索引/注释语句。字段删除、重命名、类型/长度/必填调整等非追加式变更不自动执行,保留到高级数据设置人工处理。
  • 普通业务对象、手工绑定已有对象、数据库导入对象和外部表仍使用独立的数据库差异预览/确认同步流程,不得因本节放宽 ai:lowcode:deploy-ddl 权限或显式确认门禁。
  • 元数据保存与 DDL 必须拆分事务边界:先提交应用关联、托管对象、字段和表单设计,再执行 DDL。MySQL DDL 隐式提交,禁止宣称元数据与 DDL 可以原子回滚。
  • DDL 执行失败时保留已提交的表单设计和托管对象,接口返回“数据表创建失败,已保留表单设计”的可重试错误,前端统一补充“表单草稿已保存”;下一次保存复用同一托管对象并重新同步,不重复创建对象。
  • 保存成功文案只有在数据库结构已同步后才能使用“表单和数据存储已准备完成”;不得再把仅完成元数据保存表述为数据表已经可用。

15.10 查询字段、真实数据预览与发布同步收敛

2026-07-28 用户实测反馈:自动托管表单已经绑定后,画布仍提示“绑定真实数据接口”;已配置的查询条件刷新后有时只剩 ID;发布检查又以 OUT_OF_SYNC 阻断。三者必须以同一个表单字段和托管数据表状态为准。

  • AiCrudPage 查询区必须使用区块显式保存的 props.searchFieldRefs,不能复用列表列的 fieldRefs;只有旧区块没有查询字段属性时才回退到列表字段。显式配置多少个查询字段就按顺序回显多少个,折叠数量继续由组件现有参数控制。
  • 页面字段目录必须合并页面表单字段与异步运行字段:运行字段可以补充类型、字典和系统字段,但短暂只返回 ID、空目录或加载失败时不得删除表单字段及已保存的查询引用。字段真正从表单删除时,仍由保存表单后的稳定目录清理失效引用。
  • 系统自动准备并绑定 PAGE_FORM 数据存储后,首次把对应 CRUD 区块切换为真实草稿预览并持久化初始化标记;用户之后主动关闭真实预览时不得在下次保存被强制重开。已配置接口但主动使用静态预览时,提示应说明“可在右侧开启真实数据预览”,不得再误报“尚未绑定真实数据接口”。
  • 执行应用发布检查和最终发布前,系统应重新同步当前应用内来源匹配的 PAGE_FORM 托管数据表。CREATE TABLEADD COLUMN 等既有安全白名单差异自动处理,已同步结构刷新为当前设计版本后不再因查询/页面布局变化误报 OUT_OF_SYNC
  • 发布前自动同步仍只接受当前应用自身的自动托管对象;手工对象、导入表和已有表不自动执行 DDL。字段删除、重命名、类型/长度/必填调整以及数据源不允许 DDL 等情况继续阻断,并返回可定位的数据库调整原因。
  • 发布检查接口因此属于显式“准备并检查”动作,操作日志按更新类记录;普通工作台概览和对象列表查询不得隐式执行 DDL。

15.11 真实预览请求去环与发布操作去重

2026-07-28 用户实测反馈:开启真实数据预览后列表接口持续循环调用;打开发布面板和正式发布期间又出现大量重复数据库查询与更新。

  • CRUD 预览重新加载只能由真实请求条件变化触发,包括是否启用真实预览、预览模式、预览记录和列表端点。lastPreviewStatuslastPreviewMessage、选择状态、组件位置等展示态写回不得再次触发列表请求。
  • 监听区块配置时必须比较稳定叶子值或稳定请求签名,不能用每次都新建的数组/对象作为单一监听返回值;预览成功或失败状态写回后最多结束当前请求,不得形成“请求 → 状态写回 → 请求”的闭环。
  • 打开发布抽屉只加载轻量发布历史,不自动执行完整发布预检。用户可显式点击“执行发布检查”;直接点击“发布应用”时由最终发布接口执行一次权威检查,避免默认连续执行两次相同 readiness 扫描。
  • 发布前托管表自动同步入口应复用同一设计版本的 IN_SYNC 证据。只有 OUT_OF_SYNCTABLE_MISSINGFAILEDUNKNOWN 或设计版本变化时才额外进入自动 DDL 差异同步;已经同步且设计未变化时不再由该入口重复扫描或写回同步状态。对象发布自身的最终表完整性校验继续保留。
  • 发布运行步骤的预留、认领、步骤开始/成功和失败恢复更新属于幂等与断点恢复证据,继续保留;本节只消除无业务状态变化的重复预检、重复 DDL 差异检查和预览循环请求。

15.12 页面查询配置与动态数据接口协议一致

2026-07-28 用户实测反馈:动态页面已经配置查询字段,但输入条件后列表不筛选;页面配置中的查询方式、查询组件和映射字段也没有进入真实请求。

  • 页面 AiCrudPage 选择查询字段后,运行 Schema 必须同时应用 searchFieldSettings。查询方式、查询组件和映射字段不能只停留在属性面板 JSON 中;映射字段有效时,请求键使用目标字段,标签继续使用页面选择字段的业务名称。
  • 页面独立查询字段可以来自同一动态对象的列表或编辑字段目录,不应被对象原始 searchSchema 白名单静默丢弃。后端允许范围继续限定在动态配置已经公开的查询、列表、编辑字段及真实列映射内,不接受任意列名。
  • 页面查询方式通过保留控制参数随列表和导出请求传递;控制参数不得被当作业务字段生成 SQL。后端只接受固定查询操作符,并且只允许覆盖本次配置白名单内字段的查询方式。
  • 原对象 searchSchema 继续作为默认查询协议;没有页面级覆盖的传统动态页面保持兼容。页面级查询配置只改变当前页面的筛选呈现和请求,不反向修改共享业务对象设计,也不要求普通用户理解对象查询白名单。
  • 查询参数仍使用命名参数和真实列映射生成 SQL。非法字段、非法操作符和损坏的查询元数据必须安全忽略或回退到对象默认配置,不能拼接到 SQL,也不能导致整个列表接口失败。