status: apply created: 2026-05-20 complexity: 🔴复杂
当前低代码 CRUD 已经形成“数据模型设计 → 页面搭建 → 预览 → 发布”的闭环,但顶层抽象仍是单个低代码应用。用户进入系统后只能看到应用列表,再围绕某张表配置字段、页面和菜单;平台缺少“业务领域”的概念,导致以下问题:
configKey、tableName、字段类型,而不是先定义业务域、业务对象和业务流程。目标是把低代码应用开发从“应用/表驱动”调整为“业务领域驱动”:
业务领域 → 数据模型设计 → 应用页面设计 → 预览发布 → 运行时页面
完成后应达到:
modelSchema 从“单表字段协议”升级为“领域内数据模型协议”,模型只维护基础信息、字段、关系和校验规则;查询/列表/表单/排序等页面行为进入 pageSchema。AiCrudPage、TreeCrudTemplate、动态 CRUD、发布版本和菜单注册链路,不重做渲染内核。forge-admin-ui/src/views/ai/lowcode-apps.vue:当前低代码首页是应用卡片列表,支持按关键词和发布状态筛选;无领域、分类、业务模块或应用分组。forge-admin-ui/src/views/ai/lowcode-builder.vue:当前搭建器为四步流程,顶部只配置应用名称、配置键、菜单名称;未选择业务领域,也没有从领域规则推导默认值。forge-admin-ui/src/api/lowcode-crud.js:前端低代码 API 只有 app/model 维度接口,例如 /ai/lowcode/app/page、/ai/lowcode/app/draft、/ai/lowcode/model/validate,没有 domain 维度接口。forge-admin-ui/src/components/lowcode-builder/model/model-schema.js:默认模型只有 appType/tableMode/tableName/businessName/treeConfig/fields,字段默认值和命名规则是全局写死,不支持按领域差异化。AiCrudConfig 当前承载低代码应用草稿和运行时配置,字段包括 configKey/tableName/appName/buildMode/publishStatus/modelSchema/pageSchema/menuParentId/menuResourceId,没有 domainId/domainCode/domainName/objectCode 等领域归属字段。LowcodeAppController 当前接口全部挂在 /ai/lowcode/app 下,面向单个应用草稿、预览、发布、版本和回滚,没有领域工作台、领域详情、领域下应用分页等接口。LowcodeAppService#page 调用 AiCrudConfigMapper.selectLowcodePage,只按租户、build_mode=LOWCODE、关键词和发布状态查询,无法按业务领域过滤。LowcodeAppService#createDraft 保存草稿时由前端直接传入 configKey、menuName、menuSort;缺少领域默认菜单父级、命名前缀和对象编码校验。LowcodePublishService#registerOrUpdateMenu 当前发布时默认使用配置中的 menuParentId,为空时落到默认低代码父菜单;没有按领域挂载到领域菜单目录。LowcodeModelSchema 当前注释为“单表低代码数据模型协议”,只包含 appType/tableMode/tableName/businessName/treeConfig/fields/children,主子表也只是预留,缺少业务域、业务对象、对象关系和领域规则引用。AiCrudConfigMapper.xml#selectLowcodePage 已按 AGENTS 约定将查询 SQL 写在 XML 中,后续新增领域查询也应继续放在 Mapper XML 中。V1.0.4__add_visual_lowcode_crud_builder.sql 已为 ai_crud_config 增加低代码草稿、发布、模型协议和页面协议字段,并初始化“低代码应用/低代码搭建器/发布/在线DDL”菜单权限;本次新表和字段应新增 Flyway 脚本,不能修改已执行迁移。参考 docs/低代码 CRUD 前端架构全景报告.md,现有架构已经具备两条建设路径:
searchSchema/columns/editSchema/apiConfig,保存为 CRUD 配置。LowcodeModelDesigner → LowcodePageBuilder → Preview → Publish,最终同样转换为 AiCrudPage 运行时配置。该方案的缺口主要集中在自由画布、操作列配置、详情页配置、条件联动、模板扩展和菜单权限配置。业务领域化重设计不替代这些能力,而是新增顶层组织模型,使这些能力后续可以按领域复用和治理。
ai_crud_config,如果只增加一个 domain_id 字段,仍无法承载领域规则、通用字段、AI 上下文和领域菜单等能力;需要新增领域主表。/apply 前必须人工确认。configKey 为运行时入口,本期不改变 /ai/crud-page/:configKey 和 /ai/crud/{configKey},避免扩大运行时风险。domainId。LowcodeModelSchema 扩展为领域内业务对象协议,新增 domain/object/relations/policies 信息,兼容旧版模型协议。modelSchema/pageSchema。domainCode 必须小写字母开头,仅允许小写字母、数字、下划线,长度 2-48。domainCode 唯一;领域名称同一父级下唯一。ENABLED 时可创建应用;DISABLED 时禁止新建应用,已发布应用仍可运行。biz_ 开头;自动创建表时生成 领域前缀 + 对象编码。domainCode + '_' + objectCode,仍需满足现有 configKey 规则。objectCode 在同一领域内唯一,长度 2-48,只允许小写字母、数字、下划线。id, tenant_id, create_by, create_time, create_dept, update_by, update_time。AuthImage 或现有文件访问归一化方案。/ai/crud-page/{configKey}。| 操作 | 表名 | 字段/索引 | 说明 |
|---|---|---|---|
| 新增 | ai_lowcode_domain |
id, tenant_id, parent_id, domain_code, domain_name, domain_desc, icon, sort, status, menu_parent_id, table_prefix, config_key_prefix, default_app_type, default_layout_type, default_table_mode, domain_schema, 审计字段 |
业务领域主表,保存领域规则和 AI 上下文 |
| 新增 | ai_lowcode_model |
id, tenant_id, domain_id, domain_code, model_code, model_name, model_desc, status, tenant_enabled, master_data, model_schema, 审计字段 |
业务领域下的数据模型主数据,独立于应用页面 |
| 修改 | ai_crud_config |
domain_id, domain_code, object_code, object_name |
低代码应用绑定领域和业务对象标识 |
| 修改 | ai_crud_config_version |
domain_id, domain_code, object_code, object_name |
发布版本保留领域归属快照 |
| 新增/更新 | sys_resource |
业务领域管理菜单、领域工作台菜单、领域启停/迁移按钮权限 | 初始化资源脚本必须 tenant_id=1 且 NOT EXISTS 防重复 |
ai_lowcode_domain.domain_schema 协议{
"aiContext": {
"description": "销售合同领域,管理客户合同、回款、附件和状态流转",
"terms": ["合同", "客户", "回款", "签约主体"],
"constraints": ["金额字段单位为分", "合同状态必须使用字典 contract_status"]
},
"naming": {
"tablePrefix": "biz_contract_",
"configKeyPrefix": "contract_",
"objectCodeStyle": "lower_snake"
},
"defaults": {
"appType": "SINGLE",
"layoutType": "simple-crud",
"tableMode": "CREATE",
"menuParentId": 1001
},
"fieldTemplates": [
{
"field": "regionCode",
"columnName": "region_code",
"label": "所属区划",
"dataType": "varchar",
"length": 32,
"componentType": "regionTreeSelect",
"searchable": true,
"listVisible": true,
"formVisible": true
}
],
"dictRecommendations": [
{ "fieldPattern": "status", "dictType": "contract_status" }
],
"securityPolicies": [
{ "fieldPattern": "phone", "sensitiveType": "PHONE" },
{ "fieldPattern": "idCard", "sensitiveType": "ID_CARD", "encryptAlgorithm": "SM4" }
]
}
modelSchema 协议{
"schemaVersion": 2,
"domain": {
"id": 100,
"code": "contract",
"name": "合同管理域"
},
"object": {
"code": "contract_archive",
"name": "合同档案",
"description": "管理合同主信息、状态、金额和附件"
},
"appType": "SINGLE",
"tableMode": "CREATE",
"tableName": "biz_contract_archive",
"businessName": "合同档案",
"treeConfig": null,
"fields": [],
"relations": [
{
"relationType": "REFERENCE",
"targetObjectCode": "customer",
"sourceField": "customerId",
"targetField": "id",
"displayField": "customerName"
}
],
"policies": {
"dataScope": "TENANT",
"regionField": "regionCode",
"auditEnabled": true
},
"children": []
}
兼容规则:
modelSchema 时,如果没有 schemaVersion/domain/object,后端按 AiCrudConfig.domainId/domainCode/objectCode 补齐运行时对象;仍无领域时归入“未归属”。relations 只做协议存储、ER 图展示和 AI 上下文,不改变动态 CRUD 查询行为。children 仍保持主子表协议预留,运行时不启用。pageSchema 引用模型协议{
"layoutType": "simple-crud",
"primaryModelId": 1001,
"primaryModelCode": "customer",
"modelRefs": [
{
"modelId": 1001,
"modelCode": "customer",
"modelName": "客户",
"primary": true,
"fields": []
},
{
"modelId": 1002,
"modelCode": "contact",
"modelName": "联系人",
"primary": false,
"fields": []
}
],
"zones": []
}
页面设计规则:
modelRefs 保存应用引用的数据模型快照,页面字段引用以 fieldRef 保存,非主模型字段使用 modelCode__fieldName 避免重名。zones[].fieldRefs 和画布组件的 fieldRef/fieldRefs 保存页面元素绑定字段。| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 新增 | /ai/lowcode/domain/page |
GET | 业务领域分页,参数使用 pageNum/pageSize |
| 新增 | /ai/lowcode/domain/tree |
GET | 业务领域树,用于左侧导航和新建应用选择 |
| 新增 | /ai/lowcode/domain/{id} |
GET | 业务领域详情,包含 domainSchema |
| 新增 | /ai/lowcode/domain |
POST | 新增业务领域 |
| 新增 | /ai/lowcode/domain |
PUT | 修改业务领域 |
| 新增 | /ai/lowcode/domain/{id}/status |
PUT | 启用/停用业务领域 |
| 新增 | /ai/lowcode/domain/{id}/workspace |
GET | 领域工作台概览:应用数量、发布数量、最近版本、对象概览 |
| 新增 | /ai/lowcode/domain/{id}/defaults |
GET | 获取领域默认规则,用于新建应用初始化 |
| 新增 | /ai/lowcode/model/page |
GET | 数据模型分页,按业务领域、关键词、状态、主数据标识过滤 |
| 新增 | /ai/lowcode/model/list |
GET | 数据模型下拉列表,用于应用页面选择数据源 |
| 新增 | /ai/lowcode/model/{id} |
GET | 数据模型详情,包含 modelSchema |
| 新增 | /ai/lowcode/model |
POST | 新增数据模型 |
| 新增 | /ai/lowcode/model |
PUT | 修改数据模型 |
| 新增 | /ai/lowcode/model/{id}/status |
PUT | 启用/停用数据模型 |
| 修改 | /ai/lowcode/app/page |
GET | 新增 domainId/domainCode/unassigned 过滤条件 |
| 修改 | /ai/lowcode/app/draft |
POST | 请求体新增 domainId/objectCode/objectName,保存草稿时绑定领域 |
| 修改 | /ai/lowcode/app/{id}/publish |
POST | 发布时按领域菜单父级和命名规则补齐菜单配置 |
| 新增 | /ai/lowcode/app/{id}/move-domain |
PUT | 将历史或草稿应用迁移到指定领域 |
| 修改 | /ai/crud-generator/stream-generate |
POST | 支持传入 domainId,生成提示词注入领域上下文 |
所有新增查询类 SQL 必须写在 Mapper XML 中,分页参数统一使用 pageNum/pageSize。
低代码入口调整为领域优先:
低代码开发
├── 业务领域
│ ├── 销售域
│ │ ├── 领域工作台
│ │ ├── 应用列表
│ │ ├── 业务对象
│ │ └── 领域规则
│ ├── 采购域
│ └── 未归属
└── 技术配置入口
├── CRUD 配置
└── AI 生成历史
configKey/menuName 默认由领域规则和应用名称推导,允许高级模式手动调整。forge-plugin-generator:新增领域实体、DTO/VO、Mapper XML、Service、Controller;扩展低代码应用草稿、分页、发布、版本快照和 AI 生成上下文。forge-admin-ui:新增领域管理页、领域工作台、领域选择器;调整低代码应用列表和搭建器初始化逻辑。AiCrudConfig / AiCrudConfigVersion:新增领域和业务对象归属字段。LowcodeModelSchema / LowcodeRuntimeConfigBuilder:扩展领域对象协议并兼容旧版 schema。MenuRegisterAdapter:发布菜单默认父级从领域配置读取,保留现有默认父级兜底。information_schema、CREATE TABLE IF NOT EXISTS、NOT EXISTS 防重复。ai:lowcode:deploy-ddl 权限。modelSchema 兼容、AI 生成注入领域上下文。/apply 后补充 code-copilot/changes/lowcode-business-domain-redesign/test-spec.md。mvn -pl forge-admin-server -am compile -DskipTestssource ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm build[ ] 领域关系 relations 第一版是否需要在 UI 中画 ER 图,还是只在详情中以表格维护?
ER图是自动生成的
新增 ai_lowcode_domain 作为领域主表,不把领域规则塞进 ai_crud_config,避免应用表继续膨胀。
ai_crud_config 只保存领域归属和业务对象标识:domain_id/domain_code/object_code/object_name。
领域规则采用 domain_schema JSON 存储,便于逐步扩展 AI 上下文、字段模板、字典推荐和安全策略。
modelSchema 升级为 schemaVersion=2,但运行时转换器必须兼容旧版无版本 schema。
第一版领域关系只用于建模、展示和 AI 上下文,不改变动态 CRUD 的单表查询能力。
发布菜单父级优先级:发布请求显式传入 menuParentId > 领域默认 menuParentId > 现有低代码默认父级。
领域停用不下线已发布应用,只限制新建和迁入。
所有新增管理查询继续走 Mapper XML,遵守 DataScopeInterceptor 可审查规则。
| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| Spec 草案 | done | code-copilot/changes/lowcode-business-domain-redesign/spec.md |
仅设计 Spec,未写实现代码 |
| 阶段 1:数据库与领域后端核心 | done | forge/db/migration/V1.0.7__add_lowcode_business_domain.sql;低代码领域 Entity/DTO/VO/Mapper XML/Service/Controller |
后端编译通过:cd forge && mvn -pl forge-admin-server -am compile -DskipTests |
| 阶段 2:应用领域绑定与模型协议兼容 | done | ai_crud_config / ai_crud_config_version 领域字段映射;modelSchema v2 DTO;草稿保存领域补齐;应用迁移领域接口;V1.0.8__fix_lowcode_domain_workspace_route.sql |
后端编译通过;领域工作台 404 改为迁移修正脚本处理,不新增前端手动路由 |
| 阶段 3:发布菜单与版本快照领域化 | done | 发布菜单父级按领域解析和自动创建;已有菜单更新父级;版本行和快照写入领域/对象信息;回滚恢复领域与菜单快照 | 后端编译通过:cd forge && mvn -pl forge-admin-server -am compile -DskipTests |
| 阶段 4:领域工作台与应用列表前端 | done | 低代码首页重构为领域树、领域工作台、应用列表和迁移入口;补齐领域 API;新增领域编辑抽屉和迁移弹窗 | 前端 lint 通过;前端构建通过:NODE_OPTIONS=--max-old-space-size=4096 pnpm build |
| 阶段 5:搭建器领域优先改造 | done | 搭建器重构为左侧业务领域/领域模型树、中间对象配置和四阶段搭建;模型设计器增加基础信息、字段设计、关联配置、校验规则、触发器、扩展配置;字段属性面板补齐默认值、显示规则、字典和安全推荐;草稿/发布 DTO 接收领域和对象信息 | 前端 ESLint 通过;前端构建通过:NODE_OPTIONS=--max-old-space-size=8192 pnpm build;后端编译通过:cd forge && mvn -pl forge-admin-server -am compile -DskipTests |
已确认,可进入 /apply。