status: apply change:
in-app-lowcode-builderdependency:app-first-lowcode-workbench原则:前端优先;复用既有页面/表单/列表/规则/流程设计资产;不改后端、不改 Flyway、不改全局sys_resource;一个任务一个可独立提交的原子变更。
spec.md 第 9 章的路由、组件范围、外部页面边界和发布快照结论。GET .../workspace 返回 application.options,且 PUT /ai/business/application 能无损保存未知的 options.inAppBuilder 键。options;若不包含,先更新 Spec 范围,不进入实现。code-copilot/rules/automated-testing-standard.md,并创建本变更的 test-spec.md、execution-log.md 后再执行任何编码任务。app-first-lowcode-workbench 的既有未提交/用户变更不被覆盖;本变更只叠加新的前端文件和明确关联的入口文件。| 阶段 | 目标 | Task |
|---|---|---|
| Phase 0 | 编排模型与兼容基线 | 1-2 |
| Phase 1 | 应用运行壳与入口 | 3-4 |
| Phase 2 | 页面组、页面与空态搭建 | 5-6 |
| Phase 3 | 组件插入、属性与业务深链 | 7-9 |
| Phase 4 | 草稿、预览、权限和验证 | 10-12 |
status: completed
options.inAppBuilder 的前端 Schema、默认首页、旧配置归一化和节点 ID/排序工具,作为所有应用内导航和页面操作的唯一前端模型。forge-admin-ui/src/views/app-center/in-app-builder/in-app-builder-schema.js — 新增编排常量、默认首页、normalize、create/move/remove node、组件插入位置和引用校验纯函数。forge-admin-ui/src/views/app-center/in-app-builder/__tests__/in-app-builder-schema.spec.js — 新增默认首页、目录移动、删除处理、失效对象引用和插入位置单测。forge-admin-ui/src/components/lowcode-builder/page/page-schema.js — 仅在需要公开现有默认组件工厂时补充无副作用导出;不得改变旧 Schema 输出。js
export function normalizeInAppBuilder(raw, application, objects) {}
export function createNavigationNode(schema, input) {}
export function moveNavigationNode(schema, nodeId, targetParentId, targetIndex) {}
export function removeNavigationNode(schema, nodeId, strategy) {}
export function insertPageComponent(schema, pageId, component, target) {}
status: completed
options.inAppBuilder,并按既有应用更新接口保存草稿。forge-admin-ui/src/api/business-application.js — 复用现有应用读取/更新 API,新增纯前端 options 解析/合并辅助函数(如需要)。forge-admin-ui/src/views/app-center/in-app-builder/useInAppBuilderDraft.js — 新增加载、脏状态、保存、丢弃、冲突提示和 options 合并 composable。forge-admin-ui/src/views/app-center/in-app-builder/__tests__/useInAppBuilderDraft.spec.js — 新增未知 options 保留、首次保存、保存失败和丢弃草稿用例。forge-admin-ui/src/views/app-center/application.[applicationCode].vue — 仅增加进入搭建器的上下文参数/返回路径,不重复加载应用聚合。js
export function mergeInAppBuilderOptions(applicationOptions, builderSchema) {}
export function useInAppBuilderDraft(applicationCode) {}
status: in_progress
forge-admin-ui/src/router/index.js — 新增应用运行壳和编辑态路由,保留现有工作台/预览路由。forge-admin-ui/src/views/app-center/application-runtime.[applicationCode].vue — 新增应用运行壳,加载已发布/可用应用编排并负责页面切换。forge-admin-ui/src/views/app-center/in-app-builder/ApplicationRuntimeShell.vue — 新增统一顶栏、应用导航区和内容区壳层。forge-admin-ui/src/views/app-center/in-app-builder/ApplicationRuntimePageRenderer.vue — 新增首页、内容页、对象页和既有入口页的受控渲染/占位逻辑。/ai/crud-page/:configKey、对象设计器和工作台路由不受影响。forge-admin-ui/src/views/app-center/application-workspace/ApplicationWorkspaceHeader.vue — 增加“进入应用/编辑应用”操作与状态文案。forge-admin-ui/src/views/app-center/application.[applicationCode].vue — 编排工作台、运行壳、编辑态之间的跳转和返回路径。forge-admin-ui/src/views/app-center/in-app-builder/ApplicationRuntimeShell.vue — 显示编辑入口、返回工作台入口和权限不足提示。forge-admin-ui/src/composables/usePermission.js 或既有权限工具 — 复用当前应用编辑权限判断;仅在确有缺口时修改。status: completed-static
forge-admin-ui/src/views/app-center/in-app-builder/ApplicationNavigationTree.vue — 新增树渲染、展开、空目录动作和节点更多菜单。forge-admin-ui/src/views/app-center/in-app-builder/PageNodeCreateModal.vue — 新增页面组/页面创建表单、所属目录选择和模板选择。forge-admin-ui/src/views/app-center/in-app-builder/MoveNavigationNodeModal.vue — 新增“移动到”目录选择交互。forge-admin-ui/src/views/app-center/in-app-builder/InAppBuilder.vue — 连接树操作与草稿状态。forge-admin-ui/src/views/app-center/in-app-builder/__tests__/ApplicationNavigationTree.spec.js — 覆盖目录空态、创建默认父级、移动和删除确认。createNavigationNode、moveNavigationNode、removeNavigationNode;支持在页面组内新建页面/页面组、重命名、移动到、上移、下移和删除。删除包含子项的页面组时,弹窗要求选择“同时删除子项”或“移动到指定页面组/顶级菜单”。首页不显示删除操作。status: in_progress
forge-admin-ui/src/views/app-center/in-app-builder/ApplicationPageCanvas.vue — 新增中间页面画布容器与编辑选择态。forge-admin-ui/src/views/app-center/in-app-builder/EmptyPageGuide.vue — 新增空白/介绍页引导、常用组件推荐和页面模板卡片。forge-admin-ui/src/views/app-center/in-app-builder/page-template-catalog.js — 新增首页、介绍、业务数据、空白内容和入口页的轻量模板定义。forge-admin-ui/src/views/app-center/in-app-builder/InAppBuilder.vue — 连接创建页、模板落地与选中状态。gridLayout.items,空白页仍显示不超过六个的组件推荐,不复制业务对象 Schema。status: completed-static
forge-admin-ui/src/views/app-center/in-app-builder/ComponentInsertPopover.vue — 新增悬浮 +、搜索、分类和点击插入弹窗。forge-admin-ui/src/views/app-center/in-app-builder/component-insert-catalog.js — 从现有组件目录映射常用/业务/内容/高级分组,不复制组件定义。forge-admin-ui/src/views/app-center/in-app-builder/ApplicationPageCanvas.vue — 提供页面/容器/组件后的插入锚点,并复用 BuilderCanvas 或已注册 renderer。forge-admin-ui/src/components/lowcode-builder/page/ComponentPalette.vue — 仅抽取可复用目录筛选/拖拽数据逻辑或暴露必要 props,保持旧设计器行为。forge-admin-ui/src/views/app-center/in-app-builder/__tests__/ComponentInsertPopover.spec.js — 覆盖搜索、分类、插入锚点优先级和空页插入。application/x-lowcode-component 拖拽协议仍可在高级场景工作。NPopover,固定在页面树右缘;组件目录直接读取 listPageBlockCatalog。中间区域使用 GridBlockRenderer 渲染为最终页面流,编辑态复用列表设计器的拖拽手柄、八向尺寸锚点、选中框、原位占位阴影与更多操作层;不渲染网格背景或完整自由画布工作台。status: completed-static
forge-admin-ui/src/views/app-center/in-app-builder/BuilderContextPanel.vue — 新增状态切换、面板标题和统一操作区。forge-admin-ui/src/views/app-center/in-app-builder/PageSettingsPanel.vue — 新增页面标题、图标、说明、目录与轻量可见性预留配置。forge-admin-ui/src/components/lowcode-builder/page/ComponentPropertyPanel.vue — 以适配方式复用;仅补充必要的受控 props/emit,不改变现有页面设计器契约。forge-admin-ui/src/views/app-center/in-app-builder/InAppBuilder.vue — 统一选中页面/组件、插入目标和草稿更新。status: in_progress
forge-admin-ui/src/views/app-center/in-app-builder/BusinessPageSetupPanel.vue — 新增对象选择、运行模式、pageKey、默认参数和快捷配置入口。forge-admin-ui/src/views/app-center/in-app-builder/ApplicationRuntimePageRenderer.vue — 对象页引用既有 AiCrudPage/页面运行逻辑或受控深链。forge-admin-ui/src/views/app-center/object-designer.[objectCode].vue — 接收并保留应用返回上下文,必要时支持打开指定 list/form/detail 分区。forge-admin-ui/src/views/app-center/components/designer/BusinessObjectDesignerShell.vue — 仅在需要时适配“从应用搭建器进入”的返回动作。forge-admin-ui/src/views/app-center/in-app-builder/__tests__/BusinessPageSetupPanel.spec.js — 覆盖对象引用、失效 pageKey、深链参数与不复制 Schema。objectRef;对象页提供“配置列表 / 配置表单 / 配置详情 / 配置流程”入口,均跳转既有对象设计器并携带 objectId、目标面板和 returnTo,不写入对象 Schema。status: in_progress
forge-admin-ui/src/views/app-center/in-app-builder/InAppBuilderHeader.vue — 新增保存草稿、预览、发布、退出和脏状态提示。forge-admin-ui/src/views/app-center/in-app-builder/InAppBuilder.vue — 编排草稿预览与发布跳转。forge-admin-ui/src/views/app-center/application-workspace/ApplicationPublishPanel.vue — 增加应用内编排会随应用版本发布的可见提示(如既有快照确认支持)。forge-admin-ui/src/views/app-center/in-app-builder/__tests__/InAppBuilderHeader.spec.js — 覆盖保存、退出确认、预览和发布跳转。options 重建前端编排模型。forge-admin-ui/src/views/app-center/in-app-builder/in-app-builder.css — 新增局部样式 token、三栏布局、紧凑状态和响应式降级。forge-admin-ui/src/views/app-center/in-app-builder/ApplicationRuntimeShell.vue — 应用主题根节点、键盘/焦点与窄屏菜单折叠。forge-admin-ui/src/views/app-center/in-app-builder/InAppBuilder.vue — 三栏尺寸、空态和 loading/error 状态。forge-admin-ui/src/views/app-center/in-app-builder/ApplicationNavigationTree.vue — aria 标签、可见焦点和键盘可操作的更多菜单。code-copilot/changes/in-app-lowcode-builder/test-spec.md — 新增测试矩阵、已有基线和浏览器验收脚本。code-copilot/changes/in-app-lowcode-builder/execution-log.md — 追加每次命令、结果、警告、服务清理和人工验收。code-copilot/changes/in-app-lowcode-builder/spec.md — 回填已决待澄清项、实际接口契约和审查结论。code-copilot/changes/in-app-lowcode-builder/tasks.md — 更新任务状态和实际文件。automated-testing-standard.md 和实际 package scripts 为准,至少包括新增 Vitest 定向用例、相关 Vue/JS ESLint 与 pnpm --dir forge-admin-ui build;如启动服务和浏览器验收,必须记录启动/停止状态。用户已于 2026-07-21 明确确认开始实施。按 Task 1 顺序执行;若第 1~2 Task 发现 options 保存或版本快照契约不成立,立即暂停并将所需后端工作拆为新提案。
status: in_progress
sys_resource,并按页面访问范围同步角色资源授权;草稿保存不修改系统菜单。BusinessApplicationPublishService、新增页面运行/菜单同步服务、MenuRegisterAdapter 及 Admin 实现、发布步骤、应用发布快照、必要 Flyway/Mapper/DTO/VO。status: completed
PRIMARY;多对象显式绑定允许无主对象。/by-code/:applicationCode/runtime 接口;edit=1/draft=1 继续读取草稿。PAGE_MENUS 发布步骤名称及部分失败副作用语义。pageId 真正回退到可访问首页;同应用系统菜单切换 pageId 会即时响应,超级管理员不受页面角色筛选限制。status: pending
status: pending
status: pending
status: in_progress
git diff --check 已通过;真实角色、发布菜单和数据库 E2E 按用户分工保留人工验收。status: completed
status: completed
ApplicationPublishPanel 在页面设计器内完成检查、阻断项定位、发布和历史查看;工作台发布页保留为高级配置兼容入口。status: completed
AiCrudPage 内完成业务对象创建与绑定。forge-admin-ui/src/components/lowcode-builder/page/page-schema.js — 提供页面字段覆盖稳定模型字段的同步模型构造器。forge-admin-ui/src/components/lowcode-builder/page/ListPageGridDesigner.vue — 布局回写使用当前 fields 清洗字段引用。forge-admin-ui/src/views/app-center/in-app-builder/page-form-object-promotion.js — 将页面表单转换为业务对象字段/表单设计保存载荷。forge-admin-ui/src/views/app-center/application-runtime.[applicationCode].vue — AiCrudPage 无对象引导、已有对象直绑、新对象自动回绑及设计草稿字段兜底。forge-admin-ui/src/views/app-center/application-workspace/ApplicationObjectsPanel.vue — 页面表单升级入口和创建后关联事件。forge-admin-ui/src/views/app-center/components/BusinessObjectWizardDrawer.vue — 支持由页面表单预填对象名称与说明。modelSchema.fields 清空当前字段目录以及页面表单转换载荷。git diff --check,回填结果。objectRef;不自动执行 DDL 或发布。fields 构造字段清洗模型,页面表单字段回写不再被空稳定模型删除;未绑定 CRUD 显示业务数据源引导和字段草稿说明;可选择已有对象,或将当前页面表单转换为业务对象字段/表单设计草稿,创建后自动加入应用并回绑当前区块;对象未发布时编辑态可读取设计草稿字段。未执行数据库同步和对象发布。status: completed
forge-server/.../dto/businessapp/BusinessApplicationFormDataProvisionDTO.java、vo/businessapp/BusinessApplicationFormDataVO.java — 自动准备请求与稳定对象引用响应。forge-server/.../service/businessapp/BusinessApplicationFormDataService.java — 原子选择默认可写 LOWCODE_RUNTIME 数据源、创建/复用托管对象、同步设计并关联应用。forge-server/.../controller/BusinessApplicationController.java — 提供应用编辑权限下的表单数据准备接口。forge-admin-ui/src/api/business-application.js — 封装表单数据准备请求。forge-admin-ui/src/views/app-center/in-app-builder/page-form-data-provisioning.js — 识别需要准备数据的表单、构造请求并为所有未绑定 CRUD 写回对象引用。forge-admin-ui/src/views/app-center/application-runtime.[applicationCode].vue — 保存后自动准备、合并反馈、就地失败重试和高级设置入口。ApplicationObjectsPanel.vue 与 BusinessObjectWizardDrawer.vue — 移除页面表单手工升级的主路径预填协议,保留高级对象管理。git diff --check,回填测试记录。status: completed
AiCrudPage 自动加载正式运行接口而提示“低代码应用尚未发布”。designPreview,并为回绑对象的所有 CRUD 端点统一追加设计预览参数;正式运行模式保持发布门禁不变。designPreview 协议读取对象草稿渲染配置,所有 CRUD 端点统一追加 designPreview=1,正式运行端点保持不变。设计画布默认使用静态结构预览并阻止提交,不再在托管对象尚未发布或数据库尚未同步时自动加载列表;显式开启真实数据预览后才请求带设计授权标记的草稿接口。ESLint、9 个定向 Vitest、生产构建和 git diff --check 均通过。status: completed
model_code 超过 48 位导致的数据存储创建失败,并让普通用户新建应用时不再手工维护技术编码。BusinessNamingService.java 与对应 JUnit — 统一模型编码最大长度为 48,覆盖长业务域/对象组合和前缀去重。BusinessApplicationFormDataServiceTest.java — 覆盖长应用编码自动创建托管对象时的模型编码边界。BusinessApplicationService.java、创建响应 VO、Controller 与 Service 测试 — 后端生成租户内唯一应用编码并返回最终 ID/编码。ApplicationEditorDrawer.vue — 普通路径隐藏应用编码,高级设置可选填写,创建后使用服务端最终编码跳转。namingUtils.js 与 Vitest — 前端手工对象创建同样限制模型编码为 48 位。test-compile、定向 JUnit、前端 ESLint/Vitest/生产构建和差异检查,回填结果。modelCode.length <= 48;应用编码留空可创建并在租户内自动避重;显式非法或重复编码仍失败;创建后路由使用后端最终编码;不修改数据库结构、不启动真实服务或执行 DDL。status: completed
AiCrudPage 报“数据表不存在”的半完成状态。BusinessApplicationFormDataService.java — 使用显式事务模板先提交托管对象/字段/表单元数据,再触发数据库同步;筛选允许自动建表的数据源并转换用户友好错误。BusinessObjectTableMappingService.java — 增加仅接受 PAGE_FORM 托管对象的内部自动同步入口,复用差异预览、安全 DDL 白名单和同步结果记录,不放宽手工同步门禁。BusinessApplicationFormDataServiceTest.java — 覆盖首次建表、重复保存同步新增字段、元数据提交先于 DDL、DDL 失败后可复用重试、无自动建表数据源失败关闭。BusinessObjectDatabaseSyncServiceTest.java — 覆盖托管对象自动同步无需手工确认、非托管对象拒绝、禁用 DDL/非追加变更拒绝以及安全 CREATE/ADD 执行。provision() 没有同步数据表,并覆盖事务提交发生在 DDL 调用之前。managedBy=PAGE_FORM,只执行现有安全追加式 DDL。allowRuntimeDdl=1,普通业务对象和手工数据库同步协议保持不变。test-compile,再执行定向 Surefire;最后执行 git diff --check 并回填结果。PAGE_FORM 托管对象执行安全建表/追加字段;DDL 失败保留表单设计并允许原位重试。新对象只选择允许自动建表的数据源,历史对象则以数据源当前真实能力和 DDL 预检为准,开启开关后可直接重新保存补建表。生成器 29 模块 test-compile 成功,定向 21 个 JUnit 用例全部通过;未启动真实数据库或执行 DDL。status: completed
OUT_OF_SYNC 误阻断。page-form-data-provisioning.js 及 Vitest — 自动绑定时一次性启用真实预览,复用既有托管对象时补齐旧区块且不覆盖手工对象/用户后续选择。application-runtime.[applicationCode].vue — 合并表单字段与异步运行字段,避免只返回 ID 的瞬态目录清理查询配置。GridBlockRenderer.vue 与可测试纯函数 — 查询 Schema 使用 searchFieldRefs,静态预览提示区分“未绑定接口”和“主动关闭真实预览”。BusinessApplicationFormDataService.java — 提供应用级托管表单安全数据库重同步入口。BusinessApplicationPublishService.java、Controller 与 JUnit — 发布检查和最终发布前调用托管数据表重同步,手工对象门禁保持不变。v20.19.0 执行定向测试、后端测试编译、前端 ESLint/构建和差异检查。searchFieldRefs,并覆盖显式空配置、旧页面回退及遗留初始化标记修复。发布检查与最终发布都会先同步当前应用自己的 PAGE_FORM 托管表,手工对象、其它应用对象和非追加式 DDL 仍受原门禁约束。前端 15 个 Vitest、后端 32 个 JUnit、目标 ESLint、生产构建和 git diff --check 均通过;未启动真实数据库或执行 DDL。status: completed
IN_SYNC 的自动托管表不重复扫描数据库结构。runtime-crud-props.js 与 Vitest — 生成稳定预览请求签名,证明状态文案变化不改变请求身份。GridBlockRenderer.vue — 以稳定签名监听真实预览,其他运行数据监听改为叶子 source,消除区块对象替换造成的误触发。application-runtime.[applicationCode].vue — 发布抽屉只负责打开,不再自动调用完整发布检查。BusinessApplicationFormDataService.java 与 JUnit — 复用相同设计版本的 IN_SYNC 证据,只同步真正需要检查的托管表。test-compile、定向 JUnit、生产构建和差异检查。loadList();其余运行数据监听也改为逐项叶子 source。打开发布抽屉只加载历史,显式检查与直接发布分离;相同设计版本 IN_SYNC 的自动托管表跳过额外同步,失同步表仍进入安全同步。Node v20.19.0 下 17 个 Vitest、目标 ESLint、8792 模块生产构建通过;JDK 17 下 29 模块测试编译和 23 个 JUnit 通过;git diff --check 无输出。status: completed
runtime-crud-props.js 与 Vitest — 合并 searchFieldRefs 和 searchFieldSettings,生成稳定、安全的页面查询 Schema 及查询方式请求元数据。GridBlockRenderer.vue — 将页面查询 Schema 用于 AiCrudPage,并把查询方式元数据合入动态列表和导出公共请求参数。DynamicCrudQuery.java、DynamicCrudController.java — 解析并隔离查询方式控制参数,保留现有平铺查询字段协议。DynamicCrudService.java — 查询白名单覆盖动态配置已公开的查询/列表/编辑字段,并校验页面请求的查询方式覆盖。test-compile、定向 JUnit、生产构建和差异检查。searchFieldRefs 与 searchFieldSettings,查询方式、查询组件及映射字段会进入当前 AiCrudPage;列表和导出通过独立 _searchTypes 控制参数传输查询方式。后端将控制参数与业务字段隔离,只允许动态配置已公开的查询/列表/编辑字段及固定操作符,传统对象查询配置继续作为默认协议。Node v20.19.0 下目标 ESLint 0 error/0 warning、3 个 Vitest 文件 19 tests、8792 模块生产构建通过;JDK 17 下生成器 reactor 29 模块测试编译和 2 类 6 个 JUnit 通过;git diff --check 无输出。未启动数据库、后端、Vite 或浏览器,真实 Network 与数据库筛选结果留人工验收。