status: apply created: 2026-07-13 complexity: 🔴复杂 change:
app-first-lowcode-workbench
Forge 当前“应用总览”以业务对象分组为主,再把访问入口折叠到对象下面。用户需要先理解“业务域、主对象、明细对象、引用对象、入口”的多层关系,才能找到自己要开发或运行的应用。这使页面虽然叫“应用总览”,实际上并未以应用作为主体。
用户同时明确提出第二个核心诉求:低代码开发者进入设计态后,应先看见数据库表、字段、数据源和同步状态;表结构、表单、列表、详情、动作、JS/CSS/服务端增强、发布和历史应围绕同一设计上下文集中管理。
本变更参考 JeeLowCode /lowdev/tableDesign 背后的表驱动组织方式,但不照搬其页面样式和高风险在线执行机制。最终目标是建立如下产品层级:
业务域
└── 应用
├── 数据对象 / 数据库表
├── 页面与访问入口
├── 表单 / 列表 / 详情
├── 流程与自动化
├── 动作与增强
├── 权限
└── 发布版本
完成后必须达到以下可验证结果:
ai_business_app 数据、API 和运行入口保持兼容,不做破坏性重命名。forge-admin-ui/src/views/app-center/index.vue 的主区标题为“业务对象分组”,并同时加载业务域、业务对象、访问入口和对象关系。forge-admin-ui/src/views/app-center/components/BusinessObjectTable.vue 以主对象、明细/引用对象为行,再把访问入口折叠在对象行下。forge-admin-ui/src/views/app-center/index.vue 的创建菜单是“新建业务域 / 新建业务单元 / 新建访问入口”,没有“新建应用”。forge-admin-ui/src/api/business-app.js 的 businessApp* 方法实际调用 /ai/business/app 访问入口 API。forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiBusinessApp.java 同时包含 objectCode、entryMode、entryUrl 和 configKey,实体注释已经明确为“应用入口”。forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/BusinessAppController.java 的日志、权限和接口描述也统一称为“访问入口”。结论:ai_business_app 是页面/渠道入口资产,不是真正的应用聚合。直接把它改名为应用会破坏已有运行、代码下载和入口打开语义。
forge-admin-ui/src/views/app-center/object-designer.[objectCode].vue 与 designer/BusinessObjectDesignerShell.vue 已提供业务对象设计入口和设计器壳层。designer/BusinessFieldManager.vue 已维护字段资产;designer/BusinessAdvancedConfig.vue 已承载技术配置,但数据库表信息目前过深。forge-form-designer/ForgeFieldShelf.vue、现有 fcDesigner 适配层和已归档的 form-first-business-object-designer 变更已建立表单画布、字段注册表、视图投影和运行态编译链路。components/lowcode-builder/page/CrudHookRulesEditor.vue 已有部分 CRUD 钩子/规则编辑能力。AiBusinessObjectDesignVersion、BusinessObjectDesignVersionMapper 已提供对象设计版本基础,不能另建一套互不兼容的对象历史。BusinessAppController、BusinessAppService 和 BusinessAppMapper.xml 已稳定服务访问入口,必须保留。本地参考项目:/Users/yaomindong/Desktop/project/github/JeeLowCode。该仓库不包含 /lowdev/tableDesign 的前端源码,因此本次结论以本地后端、菜单配置和项目截图所体现的产品结构为依据,不假定其前端内部实现。
jeelowcode-core/.../params/DbFormAddOrUpdateParam.java 用一个 dbformId 聚合基本信息、数据库字段、字典、导出、外键、页面字段、查询、索引和统计配置。jeelowcode-core/.../controller/DbFormController.java 提供独立的 /sync-db/{dbformId},把“保存设计”和“同步数据库”拆成两个明确动作。FormFieldEntity.java 与 FormFieldWebEntity.java 分离物理字段属性和页面展示属性,避免把数据库事实与视图配置混为一体。EnhanceJavaEntity.java、EnhanceJsEntity.java、EnhanceSqlEntity.java 把增强统一挂到表单设计上下文。jeelowcode-framework/.../EnhanceConstant.java 固化新增、修改、删除、导入、导出、列表、详情、统计、分页及开始/结束等标准钩子。HistoryController.java 为表单设计和 JS/SQL/Java 增强提供历史查询。可借鉴:稳定表/对象锚点、集中配置、保存与同步分离、标准钩子、编辑锁、版本和历史。
不照搬:任意 Java 在线编译、任意 SQL 执行、缺少隔离的脚本运行、密集配置堆叠、把物理表当成唯一业务事实、复制多套不能互相编译的配置模型。
本变更不否定已完成的表单优先设计层,而是补齐开发者视角:
| 中文术语 | 代码语义 | 说明 |
|---|---|---|
| 业务域 | BusinessSuite / ai_business_suite |
应用的目录和业务边界,可形成树 |
| 应用 | 新增 BusinessApplication / ai_business_application |
用户认知中的可交付业务应用聚合 |
| 业务对象 | BusinessObject / ai_business_object |
可复用的数据模型和设计资产,通常映射数据库表 |
| 页面入口 / 访问入口 | 现有 BusinessApp / ai_business_app |
RUNTIME、ROUTE、IFRAME、H5、API 等打开方式 |
| 应用对象关系 | 新增 ai_business_application_object |
应用与可复用业务对象的多对多关系 |
| 扩展 | 新增 BusinessExtension |
JS、作用域 CSS、服务端能力绑定或可视化规则 |
| 发布版本 | 新增应用版本快照 | 应用级协调发布的不可变快照 |
新代码、页面和文档不得再把 ai_business_app 称为“应用”。旧 API 名和旧数据库表名仅作为兼容标识保留。
应用总览保留左侧业务域树,右侧只展示应用列表,不再展示业务对象分组。
┌────────业务域树────────┬────────────────应用列表────────────────┐
│ + 新建业务域 │ 应用总览 [搜索] [新建应用] │
│ 全部应用 │ 状态 / 类型筛选 │
│ ├─ 客户管理 │ 应用名称 | 状态 | 对象 | 页面 | 流程 | 更新 │
│ ├─ 供应链 │ 客户经营 | 已发布 | 6 | 4 | 2 | ... │
│ └─ 人力资源 │ 采购管理 | 有变更 | 8 | 5 | 1 | ... │
└────────────────────────┴──────────────────────────────────────────┘
交互约束:
新建流程控制在两步:
保存后立即创建应用草稿并进入工作台;后续对象或表导入失败不得回滚已经创建的应用,而应保留明确的待配置状态和重试入口。
选择“从数据库表开始”时,运行数据源和数据表必须在本向导内直接选择;创建草稿后自动导入业务对象并建立 PRIMARY 关联,不得再跳转到数据对象分区要求用户重复打开导入向导。数据对象分区仍保留数据库表导入,供已有应用追加对象使用。
新增路由建议:/app-center/application/:applicationCode。
工作台一级分区:
工作台使用左侧或顶部紧凑分区导航,不把所有配置一次性纵向铺开。每个分区显示完成状态和问题数量。
新建访问入口采用“选择场景 → 配置入口”两步:应用、业务域和应用内主对象由工作台上下文自动带入;入口名称、编码、页面配置和单一默认表单根据场景与对象自动生成。只有存在多个对象、页面或表单时才要求用户选择。普通菜单配置只显示“添加到管理端菜单”开关,父菜单、排序及技术参数放入高级编辑。
新建对象流程:
对象设计页必须持续显示:数据源、物理表、同步状态、最近同步时间和未同步变更数量。数据库表信息不得只放在“高级配置”。
数据库表导入必须以物理列为基线初始化字段的数据类型、长度、decimal 精度、是否必填和页面控件;后续表单控件归一化不得反向覆盖已经存在的物理字段类型。已有 NOT NULL 列导入后继续保持必填,不得因为没有默认值而生成改为 NULL 的 DDL。
二级索引采用完全显式配置:系统不得再根据“作为查询条件”、对象关系、租户字段或审计字段自动推导索引。用户在数据结构页明确填写索引名称、类型、字段和用途并保存设计后,索引才进入数据库差异预览;旧版 auto=true 索引只保留兼容读取,不参与 DDL 生成。主键约束不受此规则影响。
兼容表单优先的规则:
ai_business_app、/ai/business/app 及其现有权限。BusinessApp* 类保持兼容,但新 UI 文案只能称“访问入口”。BusinessApplication* 命名,禁止再使用含糊的第二套 BusinessApp*。/ai/business/app/** API、权限、运行和代码下载行为。ai_business_object 可复用语义。阶段门:术语、表结构、回填策略、安全边界经用户确认后,才可进入 Phase 1 编码。
PRIMARY、DETAIL、REFERENCE、SHARED。PRIMARY 对象才能达到 READY,但草稿应用允许暂时没有主对象。ai_business_app 新增可空 application_id。ai_business_binding.target_type 新增 APPLICATION。APP 继续表示访问入口,不改变语义。阶段门:迁移脚本静态检查、后端聚合 CRUD 测试和存量兼容测试通过后,才能进入 Phase 2。
pageNum/pageSize 分页。BusinessObjectTable 作为应用总览主内容。阶段门:应用总览不再依赖对象分组、聚合 API 无 N+1、关键筛选和新建流程浏览器验收通过。
阶段门:数据库映射可见、保存/同步边界验证、现有表单优先对象兼容和至少一个存量对象浏览器回归通过。
implementation-status:
completed-static(代码与安全自动化用例已实现;真实 Flyway/API/浏览器验证待用户执行)
首期支持:
VISUAL_RULE:优先面向业务人员的条件和动作配置。CLIENT_JS:运行在受限沙箱、只获得白名单上下文 API 的客户端脚本。SCOPED_CSS:只作用于指定应用/页面/组件根节点的样式。SERVER_BINDING:绑定已注册的 Spring Bean、Capability 或受控 HTTP 适配器。READONLY_SQL 仅保留模型枚举位置,不在本变更启用;未来启用必须单独立项并通过参数化、只读数据源、SQL AST 校验、行数/耗时限制和审计硬门。
对象级标准钩子:
BEFORE_CREATE / AFTER_CREATEBEFORE_UPDATE / AFTER_UPDATEBEFORE_DELETE / AFTER_DELETEBEFORE_IMPORT / AFTER_IMPORTBEFORE_EXPORT / AFTER_EXPORTBEFORE_LIST / AFTER_LISTBEFORE_DETAIL / AFTER_DETAILBEFORE_SUMMARY / AFTER_SUMMARY页面级钩子:PAGE_INIT、FORM_CHANGE、BEFORE_SUBMIT、AFTER_SUBMIT、ROW_ACTION。
钩子编码由平台字典维护;执行顺序由 sort_order 决定,同顺序按扩展编码稳定排序。
DRAFT、TESTED、ENABLED、DISABLED。TESTED/ENABLED 回到 DRAFT,已发布运行态继续使用上一已发布版本。window、document、Cookie、LocalStorage、访问令牌或任意网络请求。eval 或 new Function 在主页面上下文执行存储脚本。@import、全局 html/body/:root 覆盖、外部 URL、表达式和越界选择器。BLOCK、WARN、IGNORE,高风险前置钩子只能使用 BLOCK。阶段门:沙箱逃逸负例、CSS 越界负例、未注册服务绑定负例、版本回滚和审计测试全部通过。
implementation-status:
completed-static(发布、恢复、回滚和前端工作台已实现;本轮按用户要求不执行验证)
snapshot_json、selection_json 等大型字段。阶段门:发布失败可恢复、快照不可变、版本回滚边界和兼容入口回归通过后才可标记整体完成。
应用同时维护启停状态和设计状态:
status:1 启用、0 停用。design_status:DRAFT、READY、PUBLISHED、CHANGED。状态规则:
DRAFT。READY。PUBLISHED。CHANGED,运行态继续使用最近发布版本。AGENTS.md。sys_dict_type/sys_dict_data。useDict、DictSelect、DictTag,禁止硬编码展示映射。ai_business_application| 字段 | 类型建议 | 规则 |
|---|---|---|
id |
bigint | 雪花 ID |
tenant_id |
bigint | 必填,默认租户内置数据为 1 |
application_code |
varchar(128) | 租户内未删除唯一,创建后不可修改 |
application_name |
varchar(128) | 必填 |
suite_code |
varchar(128) | 必填,逻辑关联业务域 |
icon |
varchar(255) | 可空 |
description |
varchar(500) | 可空 |
status |
tinyint | 1 启用、0 停用 |
design_status |
varchar(32) | DRAFT/READY/PUBLISHED/CHANGED |
last_publish_version |
int | 可空 |
last_publish_time |
datetime | 可空 |
options |
json | 非核心扩展配置,不保存密钥 |
del_flag |
char(1) | 0 正常、1 删除,实体显式 @TableLogic |
| 审计字段 | 标准字段 | create_by/create_time/create_dept/update_by/update_time |
唯一键使用生成列 logic_delete_active,仅约束未删除记录:
UNIQUE (tenant_id, application_code, logic_delete_active)。
ai_business_application_object| 字段 | 类型建议 | 规则 |
|---|---|---|
id |
bigint | 雪花 ID |
tenant_id |
bigint | 必填 |
application_id |
bigint | 逻辑关联应用 |
object_id |
bigint | 逻辑关联业务对象 |
object_role |
varchar(32) | PRIMARY/DETAIL/REFERENCE/SHARED |
sort_order |
int | 默认 0 |
options |
json | 应用内对象展示配置 |
del_flag |
char(1) | 显式逻辑删除 |
| 审计字段 | 标准字段 | 完整审计字段 |
唯一键:UNIQUE (tenant_id, application_id, object_id, logic_delete_active);并通过服务层保证一个应用最多一个未删除 PRIMARY。
ai_business_app 兼容扩展新增可空 application_id bigint 和索引 (tenant_id, application_id, status, sort_order)。实体、DTO、VO、Query 和 Mapper XML 同步补充字段,所有自定义 XML 查询继续显式过滤 del_flag='0'。
ai_business_extension 保存扩展身份、所属应用/对象/入口、类型、钩子、作用域、排序、失败策略、状态、当前草稿版本、当前发布版本、编辑锁和逻辑删除字段。
ai_business_extension_version 保存不可覆盖的版本内容、内容摘要、校验结果、测试结果、创建人和审计字段。敏感引用只保存安全配置 ID。
两个表都必须有 tenant_id、完整审计字段、del_flag、显式 @TableLogic 和未删除唯一键语义。
ai_business_application_version 至少包含:application_id、version_no、snapshot_json、snapshot_hash、publish_status、publish_summary、published_by、published_time、标准审计字段和 del_flag。
版本记录创建后禁止 update;修复只能生成新版本。唯一键为应用内未删除 version_no。
当前正式迁移目录最新为 V1.0.26__add_capability_high_risk_approval.sql。Phase 1 实施时先重新检查版本;若仍可用,建议:
V1.0.27__add_business_application_aggregate.sql已经执行过的脚本不得修改;脚本必须通过 information_schema 和 NOT EXISTS 做防重复保护。
每个租户、业务域内按以下顺序识别默认应用主对象:
object_type 为 MASTER 或 TRANSACTION。DETAIL/CHILD 目标的对象。PRIMARY。DETAIL。REFERENCE,允许复用到多个应用。(tenant_id, suite_code, object_code) 绑定到对应应用。application_id 保持可空,旧版本后端仍可忽略新关系。| 方法 | 路径 | 权限建议 | 说明 |
|---|---|---|---|
| GET | /ai/business/application/page |
ai:businessApplication:list |
聚合分页,参数 pageNum/pageSize |
| GET | /ai/business/application/list |
ai:businessApplication:list |
轻量选择列表 |
| GET | /ai/business/application/{id} |
ai:businessApplication:list |
详情 |
| GET | /ai/business/application/by-code/{applicationCode} |
ai:businessApplication:list |
工作台按编码解析 |
| POST | /ai/business/application |
ai:businessApplication:add |
新建 |
| PUT | /ai/business/application |
ai:businessApplication:edit |
修改 |
| PUT | /ai/business/application/{id}/status |
ai:businessApplication:status |
启停 |
| DELETE | /ai/business/application/{id} |
ai:businessApplication:delete |
逻辑删除 |
| GET | /ai/business/application/{id}/objects |
ai:businessApplication:list |
对象关联列表 |
| PUT | /ai/business/application/{id}/objects |
ai:businessApplication:edit |
批量保存关联 |
所有接口使用 @ApiEncrypt/@ApiDecrypt 与 RespInfo,分页命名严格使用 pageNum/pageSize。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /ai/business/application/{id}/workspace |
应用摘要、计数、问题数 |
| GET | /ai/business/application/{id}/readiness |
发布就绪度 |
| GET | /ai/business/object/{id}/table-mapping |
数据源、物理表、字段映射和同步状态 |
| POST | /ai/business/object/{id}/database-diff |
计算结构化差异和 DDL 预览,不执行 |
| POST | /ai/business/object/{id}/database-sync |
显式确认同步,独立高权限 |
数据库同步接口必须带设计版本或 ETag;版本不一致返回冲突,不允许覆盖他人新设计。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /ai/business/extension/page |
按应用、对象、类型、钩子和状态分页 |
| POST/PUT/DELETE | /ai/business/extension |
扩展草稿 CRUD 和逻辑删除 |
| POST | /ai/business/extension/{id}/validate |
静态校验 |
| POST | /ai/business/extension/{id}/test |
受限测试,不影响正式运行 |
| PUT | /ai/business/extension/{id}/status |
启停,校验状态机 |
| GET | /ai/business/extension/{id}/versions |
版本列表和差异 |
| POST | /ai/business/extension/{id}/rollback/{version} |
回滚为新草稿版本 |
| POST/DELETE | /ai/business/extension/{id}/lock |
获取/释放编辑锁 |
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /ai/business/application/{id}/publish/check |
发布预检查 |
| POST | /ai/business/application/{id}/publish |
协调发布,带幂等键 |
| GET | /ai/business/application/{id}/versions |
应用版本列表 |
| GET | /ai/business/application/{id}/versions/{version} |
快照和差异摘要 |
| POST | /ai/business/application/{id}/rollback/{version} |
兼容检查后回滚 |
建议新增:
domain/entity/AiBusinessApplication.javadomain/entity/AiBusinessApplicationObject.javadto/businessapp/BusinessApplicationDTO.javadto/businessapp/BusinessApplicationQueryDTO.javavo/businessapp/BusinessApplicationVO.javavo/businessapp/BusinessApplicationWorkspaceVO.javamapper/BusinessApplicationMapper.java 与 XMLmapper/BusinessApplicationObjectMapper.java 与 XMLservice/businessapp/BusinessApplicationService.javaservice/businessapp/BusinessApplicationWorkspaceService.javacontroller/BusinessApplicationController.java建议修改:
AiBusinessApp.java 及对应 DTO/VO/Query、Service、Mapper XML,补 applicationId。BusinessBinding* 目标类型校验,新增 APPLICATION 且保留 APP。BusinessSuite* 或工作台聚合服务,复用业务域子树解析。所有复杂查询写在 Mapper XML,显式过滤逻辑删除;Service 不用 LambdaQueryWrapper 拼查询 SQL。
建议新增:
forge-admin-ui/src/views/app-center/application.[applicationCode].vueforge-admin-ui/src/views/app-center/components/ApplicationTable.vueforge-admin-ui/src/views/app-center/components/ApplicationEditorDrawer.vueforge-admin-ui/src/views/app-center/application-workspace/*forge-admin-ui/src/api/business-application.js建议修改:
forge-admin-ui/src/views/app-center/index.vue:总览只加载应用聚合分页。forge-admin-ui/src/views/app-center/components/AppFilterBar.vue:筛选语义改为应用。forge-admin-ui/src/router/index.js:新增应用工作台路由。object-designer.[objectCode].vue 与设计器壳层:提升表映射摘要和数据结构入口。business-app.js:保留为访问入口 API,不继续承载新应用聚合 API。BusinessObjectTable.vue 不立即删除,可供旧页面或应用内对象编排临时复用;总览不再引用后再评估清理。
tenantId 不得覆盖当前登录租户。@TableLogic。application_id;新后端可处理未归属旧入口。application_id 可空,旧入口继续按原逻辑运行。test-spec.md。git diff --check、链接和状态一致性检查,不启动服务、不修改数据库。v20.19.0;后端使用 JDK 17。ai_business_application 和关联表具备完整租户、审计、逻辑删除和未删除唯一键语义。ai_business_app.application_id 可空且所有旧 API 回归通过。del_flag。eval/new Function 执行。RUNTIME 或全大写下划线编码作为主文案。| 风险 | 影响 | 应对 |
|---|---|---|
“应用”和旧 BusinessApp 名称冲突 |
代码和产品继续混乱 | 新聚合统一使用 BusinessApplication;旧类只称访问入口 |
| 存量对象关系无法准确合并成应用 | 回填错误 | 保守拆分;歧义入口进入确定性历史应用;提供计数报告 |
| 对象被多个应用复用 | 修改影响扩大 | 显示影响应用、发布检查传播、禁止应用删除级联对象 |
| 表优先与表单优先冲突 | 用户路径割裂 | 应用/创建流程表可见;业务表单深链保留;共享同一 Schema 编译链路 |
| 在线 DDL 造成数据损失 | 生产事故 | 保存/同步分离,高风险 DDL 默认只导出迁移脚本 |
| JS/CSS 扩展越权 | XSS、Token 泄漏、全局样式污染 | 沙箱、受限 API、CSS AST/作用域、功能开关和负例测试 |
| 服务端扩展成为任意执行入口 | RCE/越权 | 注册白名单、声明式 Schema、权限、超时、审计,禁止在线 Java |
| 应用级发布跨度过大 | 部分失败 | 幂等步骤、不可变快照、明确部分结果和补偿,不伪装全局事务 |
ai_business_app。ai_business_object 增加强制单一 application_id。ai_business_app 新增可空 application_id 作为入口归属,保留全部旧接口。APPLICATION 目标类型,旧 APP 仍表示访问入口。ui-ux-pro-max。以下内容已在本 Spec 给出推荐默认值,不阻塞文档评审;进入 /apply 前由用户一次性确认:
BusinessApplication 聚合,而不是重命名 ai_business_app。| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| Proposal 文档 | completed | spec.md、tasks.md、test-spec.md、execution-log.md |
仅形成方案,未改代码和数据库 |
| Phase 0 兼容冻结 | completed | 访问入口兼容契约测试、四份 SDD 文档 | 用户已确认 HARD-GATE,旧 /ai/business/app 语义保持不变 |
| Phase 1 应用聚合基础 | completed | V1.0.27、BusinessApplication*、入口/Binding 兼容改造及目标测试 |
37 个目标测试、XML/SQL 静态门禁和 Admin 聚合构建通过;未执行真实迁移 |
| Phase 2 应用优先总览 | completed-static | 应用聚合计数/父域子树、前端 API/路由、应用列表、两步新建和失败重试 | 41 个目标测试、定向 ESLint、前端 build、XML/SQL 静态检查和 Admin 聚合构建通过;浏览器/API/性能待真实环境回填 |
| Phase 3 应用工作台与表优先设计 | completed-static | 七分区工作台、对象编排、表映射首屏、数据库差异预览和显式同步 | 56 个 Phase 1~3/兼容测试、定向 ESLint、前端 build、Mapper XML 和 Admin 聚合构建通过;真实数据库/API/浏览器待回填 |
| Phase 4 受治理扩展中心 | completed-static | V1.0.28/V1.0.32、扩展实体/版本/锁/状态机、Worker 沙箱、CSS 作用域、Java 服务增强白名单、钩子矩阵、JS/CSS 引导式代码工作台和开发指南 |
历史证据包含后端 75 tests、前端安全 26 tests、Admin 42 模块和前端生产构建;本次钩子矩阵、代码工作台和 Java 契约增量按用户要求未执行验证,真实 Flyway/API/浏览器待用户验证 |
| Phase 5 应用级协调发布 | completed-static | V1.0.29、不可变应用版本、发布运行单、就绪度、六步发布、恢复/回滚和发布历史前端 |
代码与自动化契约已完成;按用户要求未运行 Phase 5 测试、构建、Flyway、API 或浏览器验证 |
| Phase 6 工作台体验修复 | completed-static | 轻量快照、分区缓存、入口中文化、应用内嵌对象设计器、应用数据库表初始化合并、访问入口两步向导和 V1.0.31 入口类型字典 |
历史前端 ESLint/build、后端生产源码编译及 XML/SQL 静态检查通过;本轮易用性增量按用户要求只做静态检查,真实浏览器/API/Flyway 待用户验收 |
| Phase 7 模板化快速搭建与无入口预览 | completed-static | 三套模板及资产来源选择、统一模板事务服务、模型菜单收口、无入口发布、真实 CRUD 草稿预览和工作台顶部压缩 | 仅完成目标引用、迁移 placeholder/版本和差异空白静态检查;按用户分工未运行构建、测试、Flyway、API 或浏览器 |
| Phase 10 应用级完整代码包 | completed-static | 应用级批量组装、最新 Schema 重编译、三类布局模板、Mapper XML/SQL 补全、复用代码预览面板和 V1.0.35 权限 |
完成目标引用、模板指令、Mapper XML、迁移 placeholder 和差异空白静态检查;真实代码生成、ZIP 解压、构建和页面运行待用户验证 |
completed-static。APPLICATION 能力挂接、父业务域子树筛选和应用聚合计数。/apply 条件:用户明确回复同意本 Spec,或指出需要修改的条款并完成修订。LowcodeModelSchema + LowcodePageSchema + BusinessObjectRelation,生成后继续进入同一业务对象设计器修改。tree-crud 页面。CHILD_LIST 关系并初始化 master-detail-crud 页面。/ai/crud-page/:configKey 页面并复用完整 AiCrudPage 运行组件,不再进入自建线框/草稿预览页。designPreview=1 读取设计草稿;配置渲染和动态 CRUD 数据请求都必须校验 ai:businessObject:design,正常运行入口仍只允许已发布配置。configKey 时不打开空预览页,留在工作台给出明确提示并切换到数据对象分区。/app-center/application/:applicationCode 删除重复的页面内命令栏,将返回动作并入应用头部。tree-crud 页面。master-detail-crud 页面。searchSchema/columnsSchema/editSchema/apiConfig;只要存在最新 modelSchema + pageSchema,必须重新构建草稿运行配置。modelRefs,避免子对象字段变化后主对象仍持有旧字段快照。ai:businessObject:design;正常运行请求继续只读取不可变发布版本,不放宽权限或发布门禁。0,日期/日期时间为当前值,复选/文件/图片为 [],文本为 -。LowcodeErDiagram,不引入第二套画布库或修改后端关系协议。DETAIL 关系。pending-user。1180px 最小宽度的表格。BusinessApplication 为生成范围,不再要求用户先创建或定位某个访问入口。LowcodeRuntimeConfigBuilder + AiCrudCodegenService + VelocityCodegenStrategy,不建设第二套生成器、模板目录或对象协议。layoutType 必须覆盖旧配置,不得沿用旧的 layoutType/searchSchema/columnsSchema/editSchema/options 覆盖当前设计。simple-crud 生成单表 CRUD;tree-crud 生成左树右表页面、树查询和树对象 Mapper;master-detail-crud 生成主子表提交 DTO、明细独立 Service,以及主 Service 中的明细读取、事务新增、替换更新和级联清理逻辑。masterDetailConfig.children,配置缺失或不完整时必须从 pageSchema.modelRefs 的对象关系恢复主外键;两处都无法解析时阻断生成,不得静默退化为单表 CRUD。$.../${...} 引用,发现残留或任一模板渲染异常时整体失败,不得跳过文件后继续返回 ZIP。README.md 和 config/application-manifest.json,记录应用、对象角色、布局类型、接口前缀和本次生成范围。TreeCrudTemplate 页面配置。MasterDetailCrudTemplate。${table.className}、${child.className} 等未解析模板变量;模板异常不会返回不完整代码包。runtime-config.json、后端 META-INF/forge-lowcode/<configKey>.json、config/<configKey>-protocol.json 和 config/<configKey>-coverage.json。modelSchema、pageSchema、编译后的 search/columns/edit/api/options,以及 dict/desensitize/encrypt/trans 配置;嵌套 JSON 以对象保存,不得再次降级为不可审查字符串。AiCrudConfig 可反序列化结构,并强制使用独立 generated_* 运行配置键、mode=CONFIG、buildMode=LOWCODE、publishStatus=PUBLISHED,避免与平台数据库中的设计配置冲突。META-INF/forge-lowcode/*.json,同一配置键内容冲突时启动失败关闭;动态 CRUD 服务优先解析 generated_* 内嵌配置,普通平台配置仍按数据库读取。shared-runtime + protocol-passthrough 自动适配策略,并记录模型、页面、表单、视图、联动、运行 Schema、安全配置和业务 API 的承载方式;不得用“忽略未知字段”作为兼容策略。crud-page.vue 增加外部 runtimeConfig 输入,在提供内嵌配置时跳过 /ai/crud-config/.../render 请求,其余多页面、表单资产、字段渲染、联动、动作、Hook、详情面板、树形和主子表逻辑保持同一执行路径。LowcodeRuntimePage 组件出口,在线路由页和生成页面均复用该出口;生成模板只导入同目录 runtime-config.json 并传给共享组件。transformColumns、transformFields、字典预加载、树节点归一化或主子表 props 转换副本;这些能力只允许存在于共享运行解释器。GET /page、GET /tree、POST /getById、POST /add、POST /edit、POST /remove/{id}、POST /removeBatch。DynamicCrudService 和 DynamicCrudExcelService,使用内嵌生成配置键执行;新增、修改、删除继续发布既有业务事件,确保触发器、流程和业务动作不因下载代码入口变化而失效。apiBase,前端和生成代码中不得出现 /ai/crud/ 通用接口地址。generated_* 配置键,不覆盖或误读取数据库同名设计配置。pending-user。GeneratedLowcodeRuntimeConfigBuilder,应用级、访问入口、低代码应用和旧 configKey 下载入口均派生独立 generated_* 运行键;源配置键只保留为追溯信息和原输出目录,不再作为 classpath 运行键。/ai/crud/... 改写为业务 API,/ai/crud-page/... 改写为生成前端路由,无法确定归属的其它平台通用接口失败关闭。DynamicCrudService”不利于专业开发人员修改复杂查询、复杂新增和领域事务,因此该后端交付决策自本阶段起废止。DynamicCrudService;下载源码不改变在线运行链路,也不删除动态运行能力。LowcodeRuntimePage + runtime-config.json,保证新增前端协议能力在共享解释器升级并重新下载后自动生效。Generated Controller
-> I<Object>Service
-> <Object>ServiceImpl extends ServiceImpl<Mapper, Entity>
-> Mapper + Mapper XML
GET /page、GET /tree、POST /getById、POST /add、POST /edit、POST /remove/{id}、POST /removeBatch 契约。selectById/insert/updateById/deleteById/deleteBatchIds 使用 MyBatis-Plus;分页、列表、树、主子明细和可扩展复杂查询必须落在 Mapper XML,Service 禁止拼装 LambdaQueryWrapper。DynamicCrudExcelService 间接回到动态 CRUD。下载代码改用 forge-starter-excel 元数据能力,导出数据源指向生成 Service,导入解析成功后进入生成 Service 的事务新增链路。ServiceExtension 接口,分页、列表、树、详情、新增、修改、删除、批量删除和导入均提供 around 扩展点;没有扩展 Bean 时执行生成的默认 MyBatis-Plus/Mapper XML 实现。@Order 排序;扩展可在默认逻辑前后增加校验/编排,也可不调用 operation.proceed() 完全替换默认查询或写入逻辑。.java.example 示例和文件所有权清单,用户复制后的正式扩展类属于 USER_OWNED,后续重新下载不得要求覆盖。FRONTEND_RUNTIME、BACKEND_STATIC_COMPILED 和 REQUIRES_EXTENSION,禁止把仅保存 JSON 误报为后端已实现。META-INF/forge-lowcode/*.json 运行依赖;协议文件只用于审查、追溯和后续重新生成,不在下载应用运行时驱动 CRUD。GENERATED 可由新包替换,CREATE_ONCE_SAMPLE 仅供首次复制,用户自行创建的实现文件为 USER_OWNED 且不进入生成文件集合。I<Object>Service 和标准 Excel 能力,不引用 DynamicCrudService、DynamicCrudExcelService 或 classpath 低代码配置注册器。ServiceImpl,分页/列表/树/主子查询来自 Mapper XML,新增/修改/删除使用 MP 基础方法并保留事务。/ai/crud/** 动态运行保持原行为,删除下载 classpath 注册能力不影响设计态预览和已发布低代码应用。pending-user。NONE 时,实体字段不得生成 @Desensitize;当全部字段都没有真实脱敏策略时,也不得生成 Desensitize 和 DesensitizeType import。NONE 策略才打开实体级 hasDesensitize 开关,不能因失效或未知字段产生无用 import。entityPrefix 和 stripTablePrefixes。类名统一按“物理表名 -> 删除第一个匹配的配置表前缀 -> PascalCase -> 追加规范化实体前缀”派生;Entity、DTO、Query、Mapper、Service、Controller、主子关联类型和文件名必须共享同一个最终 className。entityPrefix 允许为空;非空值按 PascalCase 规范化,最终必须是合法 Java 标识符。禁止只在 Entity 模板追加前缀,避免 Mapper、Service 和关联类型引用错位。stripTablePrefixes 是有序字符串列表,支持用户清空以保留完整表名;未配置时默认 sys_、ai_、t_、tb_。只删除首个匹配项,不做中间字符串替换。backendBasePath、Mapper XML 根目录 mapperXmlBasePath、前端 API 根目录 frontendApiBasePath;现有 frontendBasePath 明确表示前端页面根目录。所有路径都归一化为 ZIP 内相对路径,拒绝空路径、.、.. 路径段和绝对路径逃逸。includeBackend、includeFrontend 和 includeExcelSql;后端关闭时不生成 Java、Mapper XML 和扩展示例,前端关闭时不生成页面、API 和页面侧 runtime config,Excel SQL 可在总 SQL 开关开启时独立关闭。includeSql 总开关约束。字典 SQL 仅在存在真实字典配置时生成。options.codegen 协议,并由 BusinessCodegenConfigAssembler 镜像到公共生成入口。NONE 脱敏字段的实体不包含脱敏注解及 import;真实 PHONE 等策略仍正确生成。tf_customer + strip=tf_ + entityPrefix=Biz 的全部类型和文件统一为 BizCustomer*,主子表和左树对象同样生效。pending-user。