tasks.md 23 KB

任务清单:app-mode-code-download-consolidation

status: completed created: 2026-06-14 拆分顺序:契约与迁移 → 后端应用模式 → 应用代码接口 → 代码生成模板 → 前端应用管理 → 旧入口下线 → 术语清理 → 验证 原则:先完成 spec/tasks 再编码;不回滚无关工作区改动;查询 SQL 写 Mapper XML;分页参数使用 pageNum/pageSize;内置数据 tenant_id=1;用户可见文案不出现 CRUD。

阶段总览

阶段 目标 包含任务 交付结果
Phase 0 规格冻结 Task 0 确认接口前缀、旧入口兼容策略和术语表
Phase 1 后端模型 Task 1-2 应用模式字段、options 解析、权限和迁移
Phase 2 代码能力 Task 3-5 应用管理代码预览、下载、业务接口生成、完整 zip
Phase 3 前端应用管理 Task 6-8 应用模式选择、代码面板、应用总览操作收敛
Phase 4 旧入口和术语 Task 9-10 旧配置入口下线,高级配置隐藏技术入口
Phase 5 验证收尾 Task 11-12 自动化验证、执行日志、文档回填

任务总览

Task 阶段 名称 状态 优先级
Task 0 Phase 0 规格确认与实现边界冻结 completed P0
Task 1 Phase 1 应用模式后端字段与 options 映射 completed P0
Task 2 Phase 1 字典、菜单和权限迁移脚本 completed P0
Task 3 Phase 2 应用管理代码预览/下载后端接口 completed P0
Task 4 Phase 2 业务专属接口路径解析与校验 completed P0
Task 5 Phase 2 代码生成模板标准化与完整 zip completed P0
Task 6 Phase 3 前端 API 迁移到应用管理 completed P0
Task 7 Phase 3 应用编辑抽屉新增使用模式 completed P0
Task 8 Phase 3 应用总览入口操作和代码面板整合 completed P0
Task 9 Phase 4 /ai/crud-config 入口下线 completed P0
Task 10 Phase 4 高级配置和终端用户术语清理 completed P0
Task 11 Phase 5 自动化测试与构建验证 completed P0
Task 12 Phase 5 变更文档、执行日志和验收回填 completed P1

Phase 0:规格冻结

Task 0: 规格确认与实现边界冻结

目标: 在编码前确认本阶段只做“应用管理收敛 + 双模式 + 下载代码业务接口 + 旧入口下线”,不重写动态运行时。

涉及文件:

  • code-copilot/changes/app-mode-code-download-consolidation/spec.md
  • code-copilot/changes/app-mode-code-download-consolidation/tasks.md

执行步骤:

  • 确认下载代码模式默认业务接口前缀:/{suiteCode-kebab}/{objectCode-kebab}
  • 确认旧 /ai/crud-config/codegen/download/{configKey} 的后端兼容策略:短期保留但加权限和废弃提示,前端不再调用。
  • 确认生成 Controller 本次保持 Forge 生成器安全调用风格,详情、更新和删除继续使用 POST。
  • 确认用户可见术语表:业务域、业务单元、访问入口、在线运行、下载代码、功能代码、代码包设置。
  • 将确认结果回填到 spec.md 第 11 章。

验收标准:

  • 待确认项有明确结论。
  • 后续任务不再出现“是否要做”的开放项。

Phase 1:后端模型

Task 1: 应用模式后端字段与 options 映射

目标: 应用保存、详情、列表都能读写 appMode,历史应用默认在线运行。

涉及文件:

  • forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/BusinessAppDTO.java
  • forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessAppVO.java
  • forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessAppService.java
  • 可选新增:forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/constant/BusinessAppMode.java

执行步骤:

  • 新增 BusinessAppDTO.appModeBusinessAppVO.appMode
  • 新增常量:
    • DYNAMIC_RENDER
    • CODE_DOWNLOAD
  • BusinessAppService 的 DTO → Entity 保存逻辑中,将 appMode 写入 options.appMode
  • 在 Entity → VO 转换逻辑中,从 options.appMode 解析 appMode
  • entryMode != RUNTIME 的入口保存时移除 options.appMode,VO 默认返回 DYNAMIC_RENDER 或空值需保持前端可识别。
  • entryMode = RUNTIME 且未传 appMode 的历史数据默认 DYNAMIC_RENDER
  • 保存 CODE_DOWNLOAD 时校验必须有关联 suiteCodeobjectCodeconfigKey

验收标准:

  • 应用列表、详情接口返回 appMode
  • 创建/编辑应用后 options 中包含正确 appMode
  • 历史 RUNTIME 应用不需要数据迁移即可显示为在线运行。

Task 2: 字典、菜单和权限迁移脚本

目标: 补齐应用模式字典、应用代码权限,并隐藏旧终端用户入口。

涉及文件:

  • 新增:forge-server/db/migration/V1.0.70__consolidate_app_codegen_mode.sql
  • 可能同步:forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/resources/sql/ai_crud_config.sql
  • 可能同步:forge-server/forge-admin-server/sql/初始化脚本.sql

执行步骤:

  • 检查 forge-server/db/migration/ 当前最大版本号,选择下一个版本。
  • 插入字典类型 ai_business_app_modetenant_id=1,带 NOT EXISTS
  • 插入字典项 DYNAMIC_RENDERCODE_DOWNLOADtenant_id=1,带 NOT EXISTS
  • 在应用管理资源下补齐按钮权限:
    • ai:businessApp:code
    • ai:businessApp:codePreview
    • ai:businessApp:codeDownload
  • 将旧菜单资源设置为普通用户不可见或停用:
    • /ai/crud-config
    • /ai/crud-generator
    • /ai/lowcode-builder
    • /ai/lowcode-models
  • 兼容历史 tenant_id=0tenant_id=1 资源条件,但新增内置数据必须用 tenant_id=1
  • 更新初始化 SQL 中用户可见文案,避免新增安装仍暴露旧菜单。

验收标准:

  • Flyway 脚本可重复执行。
  • 新装环境应用管理有代码相关权限。
  • 普通菜单中不出现旧配置入口。

Phase 2:代码能力

Task 3: 应用管理代码预览/下载后端接口

目标: 代码能力从低代码应用入口迁移到业务应用入口。

涉及文件:

  • forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/BusinessAppController.java
  • 新增:forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessAppCodegenService.java
  • forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/lowcode/LowcodeCodegenRequest.java
  • 复用:forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/lowcode/LowcodeCodePreviewVO.java

执行步骤:

  • BusinessAppController 新增:
    • GET /{id}/code/options
    • PUT /{id}/code/options
    • GET /{id}/code/preview
    • GET /{id}/code/download
  • 接口增加 @SaCheckPermission
    • options 使用 ai:businessApp:code
    • preview 使用 ai:businessApp:codePreview
    • download 使用 ai:businessApp:codeDownload
  • BusinessAppCodegenService 读取应用详情,校验应用存在、租户可见、entryMode=RUNTIMEappMode=CODE_DOWNLOAD
  • 根据 configKey 读取 AiCrudConfig,不存在时抛出业务异常“访问入口尚未发布,不能生成代码”。
  • code/optionsai_business_app.options.codegen 读写,不再写入旧配置入口的 UI 状态。
  • code/preview 返回文件 Map、文件数量、应用 ID、configKey、sourceType。
  • code/download 输出 zip,文件名使用 {appCode-kebab}-code.zip{configKey}-code.zip

验收标准:

  • 前端可通过 /ai/business/app/{id}/code/preview 获取代码预览。
  • 前端可通过 /ai/business/app/{id}/code/download 下载 zip。
  • 非下载代码模式调用代码接口返回明确业务错误。

Task 4: 业务专属接口路径解析与校验

目标: 下载代码模式生成前统一覆盖旧通用接口,保证代码包和预览不含 /ai/crud/

涉及文件:

  • BusinessAppCodegenService.java
  • LowcodeCodegenRequest.java
  • 可能修改:forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/codegen/VelocityCodegenStrategy.java

执行步骤:

  • LowcodeCodegenRequest 增加 businessApiBase 字段,说明“下载代码模式业务接口前缀”。
  • 实现默认接口前缀:
    • suiteCodeobjectCode 转小写 kebab 或小写下划线统一格式。
    • 默认形态为 /{suite}/{object},例如 /crm/customer
  • 校验接口前缀:
    • 必须以 / 开头。
    • 不能以 /ai/crud//ai/crud-config/ai/lowcode//rest/ 开头。
    • 不能包含 {configKey}
    • 用户可见配置中不能写 crud
  • 在生成配置副本中覆盖 apiConfig,更新和删除必须使用 POST:
    • list: get@{base}/page
    • detail: post@{base}/getById
    • add: post@{base}/add
    • update: post@{base}/edit
    • delete: post@{base}/remove/:id
    • 导入导出如本次保留,则同样使用 {base}/import-template{base}/import{base}/export
  • businessApiBase 同步写入 options.codegen.businessApiBase
  • VelocityCodegenStrategy 中优先读取 options.codegen.businessApiBase,再读取 apiConfig.list,最后才按 configKey 兜底。

验收标准:

  • 用历史 /ai/crud/{configKey} 配置下载代码时,生成结果自动变成业务路径。
  • 保存非法接口前缀时后端返回业务错误。
  • 代码预览内容中搜索不到 /ai/crud/

Task 5: 代码生成模板标准化与完整 zip

目标: 下载代码模式输出完整且符合 Forge 标准的代码包。

涉及文件:

  • forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/resources/templates/vm/controller.java.vm
  • forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/resources/templates/vm/ai-crud/api.js.vm
  • forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/resources/templates/vm/ai-crud/index.vue.vm
  • forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/codegen/VelocityCodegenStrategy.java
  • 新增模板:forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/resources/templates/vm/README.md.vm

执行步骤:

  • 将生成 Controller 的详情、新增、修改、删除映射调整为 Forge 代码生成器安全调用风格:
    • POST /getById
    • POST /add
    • POST /edit
    • POST /remove/{id}
  • 前端 api.js.vm 调整为业务专属接口调用,更新和删除继续使用 POST。
  • 前端 index.vue.vmbaseApiConfig 调整为:
    • list: 'get@${apiBase}/page'
    • detail: 'post@${apiBase}/getById'
    • add: 'post@${apiBase}/add'
    • update: 'post@${apiBase}/edit'
    • delete: 'post@${apiBase}/remove/:${pkColumn.javaField}'
  • 模板注释和用户可见文案使用“数据管理”“业务页面”“功能代码”,不使用 CRUD。
  • 生成 README.md,说明:
    • 后端代码放置路径。
    • 前端代码放置路径。
    • SQL 导入顺序。
    • 接口前缀。
    • 二次开发注意事项。
  • VelocityCodegenStrategy 将 README 加入 zip 文件列表。
  • 保持 Entity、Mapper、Mapper XML、Service、DTO、Query、SQL、前端页面和 API 均在 zip 中。

验收标准:

  • zip 包文件完整。
  • 生成 Controller 和前端页面使用业务路径。
  • zip 内不出现 /ai/crud/
  • 生成的前端 apiConfig 使用冒号占位符,不使用 {id}

Phase 3:前端应用管理

Task 6: 前端 API 迁移到应用管理

目标: 前端代码预览、下载和设置全部调用 /ai/business/app

涉及文件:

  • forge-admin-ui/src/api/business-app.js
  • forge-admin-ui/src/api/lowcode-crud.js

执行步骤:

  • business-app.js 新增:
    • businessAppCodePreview(id, params)
    • businessAppCodeOptions(id)
    • businessSaveAppCodeOptions(id, data)
    • businessDownloadAppCode(id, params)
  • 下载方法沿用当前 fetch + Authorization + nonce 方式,URL 改成 /ai/business/app/{id}/code/download
  • syncPublishedCrudConfigs 对外导出名改为 syncPublishedApps,旧函数可保留兼容但不在 UI 使用。
  • dynamicCrudImportTemplate/export/import 的用户可见调用点改名或隔离,不在应用管理主界面暴露 CRUD 命名。
  • 保留 lowcode-crud.js 中低代码内部能力,但应用管理页面不再依赖它下载代码。

验收标准:

  • 应用管理代码功能不再调用 /ai/lowcode/app/{id}/code/*
  • 应用管理代码功能不再调用 /ai/crud-config/codegen/download/*

Task 7: 应用编辑抽屉新增使用模式

目标: 用户在应用配置里明确选择“在线运行”或“下载代码”。

涉及文件:

  • forge-admin-ui/src/views/app-center/components/AppEditorDrawer.vue
  • 可能使用:forge-admin-ui/src/components/DictSelect.vue
  • 字典:ai_business_app_mode

执行步骤:

  • 引入 useDict('ai_business_app_mode') 或本地模式元信息。
  • entryMode=RUNTIME 时展示“使用模式”分段选择或卡片选择:
    • 在线运行:在线搭建并由平台动态运行。
    • 下载代码:下载完整功能代码后导入本地工程二次开发。
  • defaultForm() 增加 appMode: 'DYNAMIC_RENDER'
  • hydrateOptions()props.app.appModeoptions.appMode 读取模式。
  • buildOptions()appMode 写入 options;非 RUNTIME 时删除。
  • 选择下载代码模式时,必须要求关联业务单元和发布配置。
  • 文案中不出现 CRUD、configKey;“发布配置”改成更友好的“业务页面配置”或“运行配置”。

验收标准:

  • 新增/编辑 RUNTIME 入口可保存使用模式。
  • 历史入口打开抽屉默认在线运行。
  • 下载代码模式校验缺失业务单元和配置时给业务化提示。

Task 8: 应用总览入口操作和代码面板整合

目标: 业务单元与访问入口整合展示,重复按钮收敛,下载代码模式提供应用内代码能力。

涉及文件:

  • forge-admin-ui/src/views/app-center/index.vue
  • forge-admin-ui/src/views/app-center/components/BusinessUnitCard.vue
  • 新增:forge-admin-ui/src/views/app-center/components/AppCodePanel.vue
  • 可复用或参考:现有低代码代码预览组件/模态框,如存在则优先复用。

执行步骤:

  • BusinessUnitCard 在访问入口行展示模式标签:
    • 在线运行
    • 下载代码
  • CODE_DOWNLOAD 入口主按钮改为打开代码面板,不触发 open-info 动态页面。
  • 入口更多菜单增加“功能代码”,仅下载代码模式显示;在线运行模式可隐藏或置灰。
  • index.vue 增加 codePanelVisiblecodingApp 状态和打开代码面板方法。
  • AppCodePanel 提供:
    • 代码包设置表单。
    • 代码预览文件列表。
    • 文件内容预览。
    • 下载按钮。
    • 错误提示和加载态。
  • 代码面板调用 Task 6 的业务应用 API。
  • 右侧重复操作收敛:
    • 对象设计/看板/添加入口保留在卡片底部。
    • 入口配置/功能代码/启停/删除放入更多菜单。
  • 左侧继续只展示业务域,业务域增多时保持搜索、滚动、计数和选中态,不新增应用堆叠列表。

验收标准:

  • 下载代码模式入口可在应用总览内完成设置、预览、下载。
  • 在线运行模式入口仍正常打开业务页面。
  • 业务单元和访问入口在同一卡片内展示。
  • 右侧重复按钮明显减少,主要动作路径清晰。

Phase 4:旧入口和术语

Task 9: 旧 /ai/crud-config 入口下线

目标: 独立旧配置页不再作为用户功能入口。

涉及文件:

  • forge-admin-ui/src/views/ai/crud-config.vue
  • forge-admin-ui/src/api/ai.js
  • forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/AiCrudConfigController.java
  • 迁移脚本见 Task 2

执行步骤:

  • crud-config.vue 改为迁移提示页,提示“配置能力已迁移到应用管理”,提供跳转 /app-center
  • 页面文案不出现 CRUD。
  • 移除或隐藏该页内原列表、编辑、AI 生成、代码下载按钮。
  • AiCrudConfigController 对非 /render/{configKey} 的管理接口增加权限或废弃标记,避免前端隐藏但后端裸露。
  • downloadCode(configKey) 增加废弃日志,建议调用 /ai/business/app/{id}/code/download
  • 保留 /render/{configKey} 给动态运行页使用。

验收标准:

  • 普通用户不会从菜单进入旧配置页。
  • 直接访问旧配置页不会看到旧管理功能。
  • 动态在线运行页不受影响。

Task 10: 高级配置和终端用户术语清理

目标: 普通用户界面不暴露旧低代码技术入口和 CRUD 词。

涉及文件:

  • forge-admin-ui/src/views/app-center/components/designer/BusinessAdvancedConfig.vue
  • forge-admin-ui/src/views/app-center/components/designer/form-first/forgeBusinessComponents.js
  • forge-admin-ui/src/router/guards/tab-guard.js
  • forge-admin-ui/src/router/guards/page-title-guard.js
  • forge-admin-ui/src/composables/useMenu.js
  • forge-admin-ui/src/views/app-center/index.vue
  • forge-admin-ui/src/views/app-center/components/AppFilterBar.vue
  • forge-admin-ui/src/views/app-center/components/BusinessUnitCard.vue
  • forge-admin-ui/src/views/app-center/components/AppEditorDrawer.vue

执行步骤:

  • BusinessAdvancedConfig 普通模式仅展示业务摘要,不展示技术入口。
  • BusinessAdvancedConfig 开发者模式移除“模型资产”“低代码搭建器”“CRUD 配置”按钮。
  • API 配置页签不展示 /ai/crud/{configKey};在线运行模式展示“平台托管接口”,下载代码模式展示业务专属接口。
  • 将用户可见“业务套件”替换为“业务域”。
  • 将用户可见“业务对象”替换为“业务单元”。
  • 将用户可见“应用入口”替换为“访问入口”。
  • 将用户可见 “CRUD页面”“CRUD渲染页”“CRUD配置”替换为“业务页面”“数据管理”“运行配置”。
  • 搜索前端可见文本:
    • rg -n "CRUD|crud|业务套件|业务对象|应用入口|低代码搭建器|模型资产|configKey|Schema" forge-admin-ui/src
    • 对命中的终端用户页面逐项清理;内部变量名可暂不强制改。

验收标准:

  • 应用中心、应用编辑、高级配置、标签页标题、菜单标题不出现 CRUD。
  • 普通用户高级配置看不到模型资产、低代码搭建器、旧配置入口。
  • 业务名词更偏用户语言。

Phase 5:验证收尾

Task 11: 自动化测试与构建验证

目标: 按项目标准执行增量验证,记录结果。

涉及文件:

  • code-copilot/rules/automated-testing-standard.md
  • code-copilot/changes/app-mode-code-download-consolidation/test-spec.md
  • code-copilot/changes/app-mode-code-download-consolidation/execution-log.md

执行步骤:

  • 按 AGENTS 要求先读取 code-copilot/rules/automated-testing-standard.md
  • 创建或更新 test-spec.md,只覆盖本次差异:
    • 应用模式保存和详情回显。
    • 代码接口权限和业务错误。
    • 业务接口前缀校验。
    • 代码预览/下载不含 /ai/crud/
    • 旧入口迁移提示。
    • 前端术语扫描。
  • 后端优先运行 generator 模块编译或相关测试:
    • cd forge-server && mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -DskipTests=false
    • 如果耗时或环境缺失,至少运行 mvn -pl ... -am compile 并记录跳过原因。
  • 前端命令前执行:
    • source ~/.nvm/nvm.sh && nvm use v20.19.0
  • 运行前端 lint 或构建:
    • 优先相关文件 eslint。
    • 必要时 cd forge-admin-ui && pnpm build
  • 搜索验证:
    • 生成代码预览内容不含 /ai/crud/
    • 用户可见页面不含 CRUD。
  • 将命令、结果、警告、跳过项和服务清理情况追加到 execution-log.md

验收标准:

  • 后端编译或测试通过,或明确记录外部依赖阻塞。
  • 前端 lint/build 通过,或明确记录既有错误与本次无关。
  • 执行日志完整。

Task 12: 变更文档、执行日志和验收回填

目标: 收尾时让 spec/tasks 与真实实现保持一致。

涉及文件:

  • code-copilot/changes/app-mode-code-download-consolidation/spec.md
  • code-copilot/changes/app-mode-code-download-consolidation/tasks.md
  • code-copilot/changes/app-mode-code-download-consolidation/execution-log.md
  • 可能新增:code-copilot/changes/app-mode-code-download-consolidation/implementation-summary.md

执行步骤:

  • 每完成一个任务,更新任务状态。
  • 如果实现中调整接口、字段或默认路径,回填 spec.md
  • 记录最终修改文件列表和验证结果。
  • 如发现有价值的踩坑或决策,按 AGENTS 写入 code-copilot/memory/pitfalls.mdcode-copilot/memory/decisions.md

验收标准:

  • tasks 状态和实际代码一致。
  • spec 无过期接口。
  • execution-log 有完整验证链路。

执行摘要

  • 已完成应用模式后端契约:BusinessAppDTO/VO.appModeBusinessAppModeBusinessAppService options 映射和下载代码模式校验。
  • 已完成应用管理代码接口:/{id}/code/options/{id}/code/preview/{id}/code/download,并新增 BusinessAppCodegenService 统一解析业务接口前缀、覆盖旧运行接口、校验生成文件不含 /ai/crud/
  • 已完成代码生成模板标准化:Controller 使用 businessApiBase 和 POST 更新/删除风格,前端 API 与页面使用业务路径,zip 增加 README.md
  • 已完成前端应用管理迁移:应用编辑新增“在线运行 / 下载代码”,应用总览和业务域详情页接入 AppCodePanel,下载代码模式入口不再打开动态运行页。
  • 已完成旧入口下线:旧 /ai/crud-config 页面改为迁移提示,旧管理接口加权限,迁移脚本隐藏旧菜单并补齐代码权限。
  • 已完成术语清理:应用管理主链路用户可见文案统一为业务域、业务单元、访问入口、功能代码、代码包设置;高级配置隐藏模型资产、低代码搭建器、旧配置入口。
  • 已完成验证:后端 generator 模块编译通过、前端改动文件 lint 通过、前端生产构建通过、git diff --check 通过,执行证据见 execution-log.md