status: implemented created: 2026-06-14 complexity: 🔴复杂
当前低代码能力存在两条用户链路:
/ai/crud-config、低代码搭建器、模型资产等入口中,且代码预览、代码下载、运行配置等能力会暴露 CRUD、Schema、configKey 等技术名词。本次改造目标是把低代码应用的主链路统一收敛到【应用管理】,并把应用配置拆成两种使用模式:
DYNAMIC_RENDER:在线运行模式,保留现有在线搭建、发布和动态渲染能力。CODE_DOWNLOAD:下载代码模式,面向简单单表数据管理等基础场景,用户在应用内预览、下载完整代码包后导入本地工程二次开发,不再依赖在线动态渲染。完成后,终端用户不再看到独立“CRUD 配置”入口,不再在普通业务界面看到 CRUD、低代码搭建器、模型资产、Schema、configKey 等技术词;代码下载模式生成的代码包必须使用当前应用对应的业务专属接口,禁止继续使用 /ai/crud/ 通用运行时接口。
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/AiCrudConfigController.java
@RequestMapping("/ai/crud-config")。/codegen/download/{configKey} 下载代码包。forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/LowcodeAppController.java
GET /ai/lowcode/app/{id}/code/preview、GET /ai/lowcode/app/{id}/code/download、GET/PUT /ai/lowcode/app/{id}/code/options。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/controller/DynamicCrudController.java
/ai/crud/{configKey},动态渲染模式仍依赖该运行时。LowcodeCodegenService 负责根据低代码应用草稿、发布版本或历史版本解析生成配置,并委托 AiCrudCodegenService 输出预览文件或 zip。AiCrudCodegenService 通过 CodegenStrategy 分发到 VelocityCodegenStrategy。VelocityCodegenStrategy 已能生成后端 Controller、Service、Mapper、Mapper XML、DTO、Query、前端页面、前端 API、菜单 SQL、字典 SQL 和原始配置 JSON。VelocityCodegenStrategy#resolveApiBase 已有兜底逻辑:当发现 /ai/crud/{configKey} 或 /rest/ 时,会降级为 /{configKey}。但这只是模板层兜底,不等于应用维度的业务专属接口契约。templates/vm/controller.java.vm 和 templates/vm/ai-crud/index.vue.vm 使用 getById/add/edit/remove 风格接口,其中详情、更新、删除按既有安全约束使用 POST,不能改成 PUT/DELETE。forge-admin-ui/src/views/app-center/index.vue
forge-admin-ui/src/views/app-center/components/AppEditorDrawer.vue
forge-admin-ui/src/views/app-center/components/BusinessUnitCard.vue
forge-admin-ui/src/views/app-center/components/designer/BusinessAdvancedConfig.vue
/ai/crud/{configKey}。forge-admin-ui/src/api/business-app.js
syncPublishedCrudConfigs、dynamicCrudImportTemplate、dynamicCrudExport、dynamicCrudImport 等命名和通用路径。forge-admin-ui/src/api/lowcode-crud.js
forge-server/db/migration/V1.0.19__unify_lowcode_app_codegen_menus.sql、V1.0.34__normalize_lowcode_developer_menus.sql、V1.0.41__add_business_object_designer_menu_permissions.sql 已多次尝试收敛开发者菜单。forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/resources/sql/ai_crud_config.sql 和部分初始化脚本仍包含 /ai/crud-config、CRUD配置、CRUD生成器 等旧资源和文案。/ai/crud-config 独立配置入口:菜单、路由入口、页面跳转和普通用户可见按钮全部下线。/ai/crud/。业务套件 → 业务域业务对象 → 业务单元应用入口 → 访问入口CRUD → 数据管理、业务页面、功能代码代码生成配置 → 代码包设置/ai/crud/{configKey} 内部动态运行接口;在线运行模式仍可继续使用。ai_crud_config 表结构和历史配置含义。应用模式只对 entryMode = RUNTIME 的业务类访问入口生效。
| 模式值 | 用户文案 | 行为 |
|---|---|---|
DYNAMIC_RENDER |
在线运行 | 保持当前在线搭建、发布、动态页面打开能力 |
CODE_DOWNLOAD |
下载代码 | 不打开动态页面,提供代码包设置、代码预览、下载完整代码 |
存储策略:
ai_business_app 表字段,应用模式写入 ai_business_app.options.appMode。BusinessAppDTO 和 BusinessAppVO 增加 appMode 字段,Service 负责从 options 解析和回写。DYNAMIC_RENDER,保证现有入口行为不变。RUNTIME 入口忽略 appMode,保存时移除无效模式。选择 CODE_DOWNLOAD 时必须满足:
configKey 可解析到可用运行配置。/ai/crud-page/{configKey}。sourceType、versionId、domainPackage、moduleName、author、SQL 包含项、前端输出路径。/{suiteCode-kebab}/{objectCode-kebab}。/ 开头。/ai/crud/、/ai/crud-config、/ai/lowcode/、/rest/ 开头。{configKey}、crud 等面向旧运行时的标识。GET /pageGET /listPOST /getByIdPOST /addPOST /editPOST /remove/{id}POST /removeBatch,禁止生成 PUT/DELETE。新增接口统一挂在应用管理:
| 接口 | 方法 | 说明 | 权限 |
|---|---|---|---|
/ai/business/app/{id}/code/options |
GET | 查询代码包设置 | ai:businessApp:code |
/ai/business/app/{id}/code/options |
PUT | 保存代码包设置 | ai:businessApp:code |
/ai/business/app/{id}/code/preview |
GET | 预览代码文件列表和内容 | ai:businessApp:codePreview |
/ai/business/app/{id}/code/download |
GET | 下载完整 zip | ai:businessApp:codeDownload |
实现策略:
BusinessAppCodegenService,以业务应用为入口解析应用、运行配置、应用模式和业务接口前缀。LowcodeCodegenRequest,新增 businessApiBase 字段;也可以新建 BusinessAppCodegenRequest 继承/组合现有字段。AiCrudCodegenService 和 VelocityCodegenStrategy,但输入给模板前必须把 apiConfig 改写为业务专属接口。LowcodeCodePreviewVO 或新增轻量 VO,避免重复定义文件预览结构。/ai/crud-config 相关能力处理如下:
/ai/crud-config.vue 不再作为配置页使用,访问时提示“该配置入口已迁移到应用管理”,并提供跳转到 /app-center。AiCrudConfigController 保留 /render/{configKey} 给动态渲染模式内部使用。page/detail/by-key/create/update/delete/ai-generate/generateFromTable/codegen-download 不再作为普通用户功能入口。/ai/crud-config/codegen/download/{configKey} 标记废弃;前端不再调用。后端可短期保留兼容,但必须增加权限或迁移提示,并在日志中提示使用应用管理代码下载接口。sync-published-crud-configs 等内部方法需要在 UI 文案改名为“同步已发布应用”,避免 CRUD 字样出现在按钮或提示中。普通模式:
开发者模式:
/ai/crud/{configKey};若是在线运行模式,展示为“在线运行接口由平台托管”;若是下载代码模式,展示业务接口前缀。左侧:
右侧:
新增字典类型建议为 ai_business_app_mode:
| value | label | 说明 |
|---|---|---|
DYNAMIC_RENDER |
在线运行 | 动态渲染模式 |
CODE_DOWNLOAD |
下载代码 | 代码包交付模式 |
脚本要求:
forge-server/db/migration/。tenant_id 必须为 1。sys_dict_type 和 sys_dict_data 插入必须具备 NOT EXISTS 防重复。新增或补齐按钮权限:
ai:businessApp:codeai:businessApp:codePreviewai:businessApp:codeDownload隐藏或停用旧资源:
/ai/crud-config/ai/crud-generator/ai/lowcode-builder/ai/lowcode-models迁移脚本必须只调整菜单可见性和状态,不删除历史数据。
应用保存时 options 结构示例:
{
"mountTarget": "ADMIN",
"runtimeOpenMode": "LIST",
"appMode": "CODE_DOWNLOAD",
"codegen": {
"businessApiBase": "/crm/customer",
"domainPackage": "com.mdframe.forge",
"moduleName": "crm",
"author": "Forge Generator",
"includeSql": true,
"includeMenuSql": true,
"includeDictSql": true,
"frontendBasePath": "frontend/src/views"
}
}
下载代码模式 zip 必须包含:
backend/src/main/java/.../entity/*.javabackend/src/main/java/.../dto/*DTO.javabackend/src/main/java/.../dto/*Query.javabackend/src/main/java/.../mapper/*Mapper.javabackend/src/main/java/.../service/I*Service.javabackend/src/main/java/.../service/impl/*ServiceImpl.javabackend/src/main/java/.../controller/*Controller.javabackend/src/main/resources/mapper/*Mapper.xmlfrontend/src/api/*.jsfrontend/src/views/**/index.vuesql/*_menu.sql,当 includeMenuSql=truesql/*_dict.sql,当存在字典配置且 includeDictSql=trueconfig/*-config.jsonREADME.md,说明导入步骤、后端包路径、前端路由、接口前缀和 SQL 导入顺序。代码包验收规则:
/ai/crud/。@RequestMapping。apiConfig 使用业务专属路径。DYNAMIC_RENDER,打开行为不变。/ai/crud-page/{configKey} 和 /ai/crud/{configKey},但不向普通用户暴露。AiCrudConfigController#render 保留,避免动态页面失效。/ai/crud/。/ai/crud-config 不再出现在普通用户菜单、应用总览、应用编辑、高级配置和代码下载入口中。/ai/crud-config 可能破坏动态渲染。
/render/{configKey},只下线配置管理和代码下载主入口。apiConfig 仍带 /ai/crud/。
tenant_id=0。
tenant_id=1,并兼容历史数据条件。/{suiteCode-kebab}/{objectCode-kebab},本次不统一加 /api 前缀;代码包设置允许实施人员覆盖,但后端会拦截 /ai/crud/、/ai/crud-config、/ai/lowcode/、/rest/ 和包含旧配置标识的路径。/ai/crud-config/codegen/download/{configKey} 短期保留管理员兼容能力,已增加权限校验和废弃日志;应用管理前端不再调用该入口。/getById、/add、/edit、/remove/{id};直接使用已校验的 businessApiBase 作为 @RequestMapping,确保前后端生成路径一致。ai_business_app.options.appMode,历史 RUNTIME 访问入口默认 DYNAMIC_RENDER,非 RUNTIME 入口不保留模式配置。