execution-log.md 7.8 KB

执行日志

2026-06-21

  • 创建变更目录:code-copilot/changes/lowcode-runtime-tab-workspace-unique-validation/
  • 初始任务:运行态平铺/多页签录入、通用唯一性校验。

增量验证

变更范围:

  • 前端:AiCrudPage 新增 flat/tabWorkspace 运行态录入方式,低代码运行页和设计器透传 formOpenMode/tabWorkspace,字段属性增加唯一校验开关。
  • 后端:低代码模型协议增加唯一约束,动态 CRUD 新增/编辑保存前执行租户内唯一校验。

执行命令与结果:

  • git diff --check
    • 结果:通过,无空白错误输出。
  • source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/components/ai-form/AiCrudPage.vue src/components/ai-form/AiCrudPageProps.js src/views/ai/crud-page.vue src/components/lowcode-builder/page/ListPageGridDesigner.vue src/components/lowcode-builder/page/StructuredListPageDesigner.vue src/views/app-center/components/designer/forge-form-designer/ForgePropertyPanel.vue
    • 结果:通过,仅输出 Node 版本切换信息 Now using node v20.19.0
  • JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests
    • 执行目录:forge-server
    • 结果:通过,BUILD SUCCESS。编译期间存在既有 deprecation / unchecked 提示,不阻断。
  • source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
    • 结果:通过,built in 53.21s
    • 警告:存在既有 CSS // 注释 minify 警告,以及 src/store/index.js 同时动态/静态导入导致的 chunk 提示,不阻断本次构建。

跳过项:

  • 未启动本地前后端服务,未执行浏览器交互和真实数据库接口验证;原因是本轮先完成代码级闭环,服务级验证需要依赖本地后端、MySQL 和已发布低代码客户对象配置。

服务清理:

  • 本轮未启动长期运行服务,无需清理 PID。

平铺录入与唯一校验入口修正

问题:

  • flat 初版仍把表单放在列表下方,复杂表单录入空间不足。
  • 唯一校验入口只在字段资产/字段属性面板和新增字段弹窗中可见,表单设计器选中字段时不直观。

修正:

  • flat 改为当前页内单表单视图:新增/编辑后隐藏搜索区和列表,表单独占主内容区,右上角提供“返回列表”。
  • 表单设计器右侧属性面板的字段“状态”页新增“唯一校验”开关。
  • 表单组件 schema 归一化保留 advancedProps,自动字段资产创建和字段同步时会把 advancedProps.unique 写入模型字段,后端动态 CRUD 保存时据此校验重复。

执行命令与结果:

  • source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/components/ai-form/AiCrudPage.vue src/views/app-center/components/designer/forge-form-designer/ForgePropertyPanel.vue src/views/app-center/components/designer/form-first/formDesignerSchema.js src/views/app-center/components/designer/form-first/autoFieldRegistry.js src/views/app-center/components/designer/BusinessFormDesigner.vue
    • 结果:通过,仅输出 Node 版本切换信息。
  • source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
    • 结果:通过,built in 1m 15s
    • 警告:仍存在既有 CSS // 注释 minify 警告,以及 src/store/index.js 动静态导入 chunk 提示,不阻断。

服务清理:

  • 本轮未启动长期运行服务,无需清理 PID。

多页签工作区改为列表同级页签

问题:

  • 将表单面板放在列表下方后,复杂表单可视空间不足,用户需要在页面和表单内频繁滚动,录入效率差。

修正:

  • tabWorkspace 改为“列表 + 表单草稿”的同级页签工作区。
  • 激活“列表”页签时显示搜索区和表格;激活表单页签时隐藏搜索区和表格,整块主内容区展示表单。
  • flat 模式仍保留列表下方单面板,避免改变单面板语义。
  • 表单页签关闭逻辑同步调整:关闭当前表单后切到相邻表单,关闭最后一个表单后回到“列表”页签。

执行命令与结果:

  • source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/components/ai-form/AiCrudPage.vue
    • 结果:通过,仅输出 Node 版本切换信息。
  • source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
    • 结果:通过,built in 1m 3s
    • 警告:仍存在既有 CSS // 注释 minify 警告,以及 src/store/index.js 动静态导入 chunk 提示,不阻断。

服务清理:

  • 本轮未启动长期运行服务,无需清理 PID。

多页签样式修正

问题:

  • 初版多页签工作区跟表格同级直接追加,表格 flex: 1 和主区域滚动策略会让表单区域撑开页面,视觉上像覆盖当前页面。
  • 页签使用空的 n-tab-pane 承载 tab 标题,内容实际在外部面板,样式不符合“同页工作台”预期。

修正:

  • AiCrudPage 主区域在工作区打开时增加 has-inline-workspace 状态,表格和表单工作台改为明确的上下分区。
  • 多页签改为轻量自绘页签条,支持激活态、脏标记和单页签关闭。
  • 表单面板增加 inline-form-panel-body 内部滚动,页签条、头部和底部按钮固定在工作台内,避免撑满整页。

执行命令与结果:

  • source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/components/ai-form/AiCrudPage.vue
    • 结果:通过,仅输出 Node 版本切换信息。
  • source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
    • 结果:通过,built in 1m 4s
    • 警告:仍存在既有 CSS // 注释 minify 警告,以及 src/store/index.js 动静态导入 chunk 提示,不阻断。

服务清理:

  • 本轮未启动长期运行服务,无需清理 PID。

唯一校验保存分支补漏

问题:

  • 用户反馈“唯一性校验没生效,设置了唯一后数据仍能重复新增”。
  • 排查发现普通单表新增/编辑已执行 validateUniqueConstraints,但主子表和关联运行态会在 insertMasterDetailData / insertJoinedData / updateMasterDetailData / updateJoinedData 分支内提前返回,绕过后续单表唯一校验。
  • 旧运行配置如果 modelSchema 缺失但 editSchema.advancedProps.unique 已存在,fallback 追加约束时会拿到不可变空列表,存在边界风险。

修正:

  • 主子表和关联运行态新增/编辑在写库前统一执行主表唯一校验。
  • 唯一校验内部统一读取主表 payload,兼容 { main, children } 请求结构。
  • 唯一约束解析结果改为始终可追加的 ArrayList,确保旧配置可从 editSchema fallback 生成唯一约束。

执行命令与结果:

  • git diff --check
    • 结果:通过,无空白错误输出。
  • JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests
    • 执行目录:forge-server
    • 结果:通过,BUILD SUCCESS,总耗时 12.434 s
    • 警告:存在既有 deprecation / unchecked 提示,不阻断。

跳过项:

  • 未启动本地后端和 MySQL 做真实客户新增接口验证;原因是本轮先完成后端分支补漏和编译闭环,真实数据验证依赖已发布低代码客户对象配置。

服务清理:

  • 本轮未启动长期运行服务,无需清理 PID。