低代码 CRUD 前端架构全景报告
一、整体架构定位
该系统有两条平行的 CRUD 建设路径,最终共用同一套运行时渲染器:
路径 A:AI 生成 (useCrudGenerator)
↓ 生成 JSON Schema (searchSchema / columns / editSchema / apiConfig)
↓ 保存为 crud_config 记录
→ 运行时: AiCrudPage + Template Catalog
路径 B:低代码可视化搭建 (LowcodeBuilder)
↓ Step1: LowcodeModelDesigner → modelSchema (字段 + 数据库配置)
↓ Step2: LowcodePageBuilder → pageSchema (zones + fieldRefs + canvas)
↓ Step3: LowcodePreviewPane (前端预览)
↓ Step4: PublishPanel (建表 + 菜单发布)
→ 运行时: 通过 crudConfigRender(configKey) 同样走 AiCrudPage / TreeCrudTemplate
两条路径产出同一种数据格式(configKey 对应的配置记录),共用同一个运行时入口 /ai/crud-page/:configKey。
---
二、目录结构与职责
src/
├── views/ai/
│ ├── crud-config.vue # CRUD 配置管理列表(卡片视图)
│ ├── crud-generator.vue # AI 生成向导(3 面板 + SSE 流)
│ ├── crud-page.vue # 运行时页面入口(动态加载模板)
│ ├── lowcode-apps.vue # 低代码应用列表
│ ├── lowcode-builder.vue # 4 步向导主页面
│ └── components/
│ ├── SchemaFieldEditor.vue # JSON Schema 字段表格编辑器
│ ├── ApiConfigEditor.vue # API 配置编辑
│ ├── DictConfigPanel.vue # 字典配置
│ ├── EncryptConfigPanel.vue
│ ├── DesensitizeConfigPanel.vue
│ ├── TransConfigPanel.vue
│ └── ...
├── components/
│ ├── ai-form/
│ │ ├── AiCrudPage.vue # 核心运行时 CRUD 页面
│ │ ├── AiSearch.vue # 查询栏(含 AiForm + 查询/重置按钮)
│ │ ├── AiForm.vue # 动态表单渲染引擎
│ │ ├── AiFormItem.vue # 单字段渲染(20+ 控件类型)
│ │ ├── AiTable.vue # 数据表格(table/card 双模式)
│ │ ├── AiCrudPageProps.js # AiCrudPage Props 定义
│ │ └── schemaHelper.js # 运行时 Schema 动态更新工具
│ ├── lowcode-builder/
│ │ ├── model/
│ │ │ ├── LowcodeModelDesigner.vue # 数据模型设计器(主容器)
│ │ │ ├── ModelFieldTable.vue # 字段列表表格(可拖排)
│ │ │ ├── ModelFieldPropertyPanel.vue # 字段属性面板
│ │ │ ├── model-schema.js # 字段选项/默认值/工具函数
│ │ │ └── shared/
│ │ │ ├── DictTypeSelect.vue
│ │ │ └── FieldTypeSelect.vue
│ │ ├── page/
│ │ │ ├── LowcodePageBuilder.vue # 页面搭建主容器(2 tab)
│ │ │ ├── StructuredListPageDesigner.vue # 列表页配置(查询集/列表/详情)
│ │ │ ├── FormCreateDesignerAdapter.vue # 编辑表单设计器适配器
│ │ │ └── page-schema.js # 页面 Schema 核心逻辑
│ │ ├── preview/
│ │ │ └── LowcodePreviewPane.vue # 实时预览(前端模拟)
│ │ └── publish/
│ │ └── PublishPanel.vue # DDL + 发布 + 版本回滚
│ └── page-templates/
│ ├── SimpleCrudTemplate.vue # 标准 CRUD 模板
│ └── TreeCrudTemplate.vue # 左树右表模板
├── catalog/
│ └── index.js # templateKey → 异步 Vue 组件注册表
├── api/
│ ├── lowcode-crud.js # 低代码后端 API (9 个接口)
│ └── ...
├── composables/
│ └── useCrudGenerator.js # AI 生成全部状态管理(SSE + 保存)
└── router/
└── index.js # 路由配置
---
三、路由结构
手工注册的关键路由(src/router/index.js):
┌──────────────────────────┬─────────────────────────┬───────────────────────────────────────────────────────────┐
│ 路径 │ 组件 │ 说明 │
├──────────────────────────┼─────────────────────────┼───────────────────────────────────────────────────────────┤
│ /ai/crud-page/:configKey │ AiCrudPageDynamic │ CRUD 运行时入口,支持 configKey/params/query 三种方式注入 │
├──────────────────────────┼─────────────────────────┼───────────────────────────────────────────────────────────┤
│ /ai/lowcode-builder/:id? │ AiLowcodeBuilderDynamic │ 低代码搭建器(id 可选,新建时无 id) │
└──────────────────────────┴─────────────────────────┴───────────────────────────────────────────────────────────┘
其余路由(含 /ai/crud-config、/ai/crud-generator、/ai/lowcode-apps)通过 vue-router/auto-routes 按文件系统自动生成。
---
四、数据模型层(modelSchema)
由 /components/lowcode-builder/model/model-schema.js 定义。字段对象结构:
{
field: 'contractName', // camelCase 字段名
columnName: 'contract_name', // snake_case DB 列名
label: '合同名称',
dataType: 'varchar', // varchar/int/bigint/decimal/tinyint/date/datetime/text/json
componentType: 'input', // input/textarea/select/radio/checkbox/switch/date/datetime/number/upload/imageUpload/fileUpload
length: 255,
precision: 0,
required: false,
searchable: false, // 是否出现在查询集
listVisible: true, // 是否出现在列表列
formVisible: true, // 是否出现在编辑/详情表单
queryType: 'LIKE', // EQ/LIKE/BETWEEN/GT/LT/GTE/LTE/NE/IN
dictType: '', // 绑定字典类型
sensitiveType: '', // 脱敏类型
encryptAlgorithm: '', // SM4/AES
width: null, // 列宽(px)
remark: '',
}
模型容器:
{
businessName: '合同管理',
tableName: 'contract_manage',
tableMode: 'STANDARD', // STANDARD/ARCHIVE
appType: 'NORMAL', // NORMAL/TREE
treeConfig: { keyField, parentField, labelField, childrenField, treeTitle },
fields: [...]
}
---
五、页面 Schema 层(pageSchema)
由 /components/lowcode-builder/page/page-schema.js 定义。完整结构:
{
layoutType: 'simple-crud', // simple-crud / tree-crud
zones: [
{
zoneKey: 'search',
componentKey: 'search-form',
enabled: true,
fieldRefs: ['field1', 'field2'], // 明确排序的字段引用
props: {
canvas: { // 画布布局(内部计算,不暴露给设计器 UI)
width: 1040,
height: 300,
snap: 8,
items: [{
id: 'search_query_set',
componentKey: 'query-set',
fieldRefs: [...],
x: 32, y: 36, w: 700, h: 132, zIndex: 1,
style: { labelWidth: 86, radius: 6, fill: '#fff', stroke: '#cbd5e1' },
props: { fieldRefs: [...] }
}]
}
}
},
{ zoneKey: 'table', ... props: { showImport, showExport, enableCustomQuery, treeConfig, canvas } },
{ zoneKey: 'edit', ... props: { formCreateRule: [...], canvas } }, // @form-create 规则
{ zoneKey: 'detail', enabled: false, ... }
]
}
字段引用解析优先级(resolveFields / resolveFieldRefsFromFormCreateRules):
1. zone.props.formCreateRule(仅 edit zone,@form-create Designer 输出)
2. zone.fieldRefs(StructuredListPageDesigner 维护)
3. zone.props.canvas.items[*].fieldRefs(画布推断)
4. modelSchema.fields 按 flag 过滤(最终兜底)
---
六、组件层次与数据流
低代码搭建器
lowcode-builder.vue (reactive draft: { modelSchema, pageSchema })
├── LowcodeModelDesigner (v-model: draft.modelSchema)
│ ├── ModelFieldTable (vuedraggable 拖排 + inline 编辑)
│ └── ModelFieldPropertyPanel (字段详细属性,右侧面板)
├── LowcodePageBuilder (v-model: draft.pageSchema, :model-schema)
│ ├── StructuredListPageDesigner (列表页 tab)
│ │ ├── ComponentPreviewControl (inline defineComponent, disabled 控件预览)
│ │ └── FieldOrderEditor (inline defineComponent, vuedraggable 字段排序)
│ └── FormCreateDesignerAdapter (编辑表单 tab)
│ └── FcDesigner (@form-create/designer, ElementUI)
├── LowcodePreviewPane (:draft 只读)
└── PublishPanel (:app-id, :draft)
数据流:draft.modelSchema 变化时,syncPageSchemaWithModel 自动清理孤立 fieldRef、补全缺失 zone,保持 pageSchema 与 modelSchema 一致。
运行时渲染
crud-page.vue (resolves configKey → crudConfig)
└── template catalog[layoutType].component (lazy import)
├── SimpleCrudTemplate.vue
│ └── AiCrudPage (searchSchema, columns, editSchema, apiConfig)
│ ├── AiSearch → AiForm → AiFormItem × N
│ ├── AiTable (NDataTable / card 模式)
│ └── AiForm (编辑表单,在 NModal/NDrawer 内)
└── TreeCrudTemplate.vue
├── NTree (左侧树,注入 parentId 到 publicParams)
└── AiCrudPage (右侧,同上)
---
七、AI 生成流程(useCrudGenerator)
SSE 流式 7 阶段生成:
analyzing → generating-meta → generating-search → generating-columns
→ generating-edit → generating-api → generating-sql
- [STAGE:xxx] 标记在流中切换阶段
- thinking-phase 标记分离推理内容与输出内容
- parseRawContentFallback() 在流中 JSON 不完整时做容错解析
- 生成完成后由 saveConfig() 写入后端数据库
- 支持 initWithConfigKey(ck) 从现有配置初始化,复用生成结果
---
八、API 接口层
低代码构建 API(/src/api/lowcode-crud.js):
┌──────────────────────┬──────┬────────────────────────────────────────────────────────────────────────────┐
│ 函数 │ 方法 │ 路径 │
├──────────────────────┼──────┼────────────────────────────────────────────────────────────────────────────┤
│ lowcodeAppPage │ GET │ /ai/lowcode/app/page │
├──────────────────────┼──────┼────────────────────────────────────────────────────────────────────────────┤
│ lowcodeAppDetail │ GET │ /ai/lowcode/app/{id} │
├──────────────────────┼──────┼────────────────────────────────────────────────────────────────────────────┤
│ lowcodeSaveDraft │ POST │ /ai/lowcode/app/draft │
├──────────────────────┼──────┼────────────────────────────────────────────────────────────────────────────┤
│ lowcodePreview │ POST │ /ai/lowcode/app/{id}/preview │
├──────────────────────┼──────┼────────────────────────────────────────────────────────────────────────────┤
│ lowcodePublish │ POST │ /ai/lowcode/app/{id}/publish(deployMode: SKIP_DDL / ONLINE_CREATE_TABLE) │
├──────────────────────┼──────┼────────────────────────────────────────────────────────────────────────────┤
│ lowcodeVersions │ GET │ /ai/lowcode/app/{id}/versions │
├──────────────────────┼──────┼────────────────────────────────────────────────────────────────────────────┤
│ lowcodeRollback │ POST │ /ai/lowcode/app/{id}/rollback/{versionId} │
├──────────────────────┼──────┼────────────────────────────────────────────────────────────────────────────┤
│ lowcodeValidateModel │ POST │ /ai/lowcode/model/validate │
├──────────────────────┼──────┼────────────────────────────────────────────────────────────────────────────┤
│ lowcodeDdlPreview │ POST │ /ai/lowcode/model/ddl/preview │
└──────────────────────┴──────┴────────────────────────────────────────────────────────────────────────────┘
---
九、状态管理方式
无 Vuex/Pinia,完全基于组合式函数:
- lowcode-builder.vue:reactive(draft) 单一状态源,通过 watch 进行三路同步(appName↔businessName↔menuName,appType↔layoutType,modelSchema→pageSchema)
- LowcodePageBuilder.vue:ref(localSchema) + watch(props.modelValue) + watch(props.modelSchema) 实现双向外部同步
- useCrudGenerator.js:自成体系的 composable,内聚所有 AI 生成状态
- AiCrudPage.vue:内部 ref 维护分页/选中/loading 等运行时状态
---
十、关键依赖
┌─────────────────────────┬───────────────────────────────────────────────┐
│ 依赖 │ 用途 │
├─────────────────────────┼───────────────────────────────────────────────┤
│ Naive UI │ 主 UI 库(全体 NaiveUI 组件) │
├─────────────────────────┼───────────────────────────────────────────────┤
│ @form-create/designer │ 编辑表单拖拽设计器(ElementUI 生态) │
├─────────────────────────┼───────────────────────────────────────────────┤
│ @form-create/element-ui │ 配套 form-create 运行时 │
├─────────────────────────┼───────────────────────────────────────────────┤
│ element-plus │ 为 FcDesigner 所需,动态挂载到 app 实例 │
├─────────────────────────┼───────────────────────────────────────────────┤
│ vuedraggable │ 字段拖排(ModelFieldTable、FieldOrderEditor) │
├─────────────────────────┼───────────────────────────────────────────────┤
│ vue-router/auto-routes │ 文件系统路由自动生成 │
├─────────────────────────┼───────────────────────────────────────────────┤
│ @vicons/ionicons5 │ 图标库 │
└─────────────────────────┴───────────────────────────────────────────────┘
混用 UI 库的隔离策略:FormCreateDesignerAdapter 通过检查 app.__lowcodeFormCreateInstalled 标记,仅在首次使用时调用 app.use(ElementPlus) 和 app.use(formCreate),避免重复注册。
---
十一、当前能力 vs 完整低代码平台的差距
已具备
- 数据模型设计(字段 CRUD、类型映射、安全属性)
- 页面 Schema 与模型的自动同步机制
- 查询集字段排序(含 vuedraggable 拖排)
- 列表字段排序与导入/导出/自定义查询开关
- 详情页字段排序
- 编辑表单拖拽设计(借助 @form-create/designer)
- 树形结构(left-tree right-table)内置支持
- canvas 位置数据结构(x/y/w/h/zIndex)已在 page-schema 完整建模
- DDL 预览、在线建表、版本发布、版本回滚
- AI 辅助生成(7 阶段 SSE 流,含推理展示)
- 运行时 20+ 控件类型、字典集成、脱敏/加密
缺口与待建
1. 自由画布设计器未实现:page-schema.js 已建模了完整的 canvas(items 含 x/y/w/h/zIndex),但前端没有对应的可视化拖拽画布 UI,StructuredListPageDesigner 仅做字段排序,不暴露画布。这是当前最大的功能空白。
2. 列表操作列缺乏配置:操作列(编辑/删除/查看详情/自定义按钮)在当前设计器中固定写死,没有可配置的操作按钮 builder。
3. 详情页缺乏启用后的配置入口:detailZone.enabled 默认为 false,StructuredListPageDesigner 提供了 enable 开关和字段排序,但没有更细粒度的详情布局控制。
4. 查询条件类型不可设计器内调整:queryType(EQ/LIKE/BETWEEN 等)只在模型层设置,页面设计器无法覆盖。
5. 条件联动/级联逻辑无可视化配置:schemaHelper.js 提供了 createCascadeUpdater 等运行时工具,但构建阶段没有可视化的联动规则编辑器。
6. 模板体系单薄:catalog/index.js 目前只注册了 simple-crud 和 tree-crud 两种模板,缺少看板、统计图表、日历、表单流程等扩展模板。
7. 发布后的菜单权限配置:PublishPanel 仅处理 DDL 和菜单创建,没有集成权限/角色绑定流程。
8. 多步骤表单 / 标签页表单:FormCreateDesignerAdapter 支持任意 @form-create 布局,但 lowcode builder 入口没有针对多 step 表单的向导辅助。
业务模型设计布局: ┌─────────────────────────────────────────────────────────────────────┐ │ 顶部导航: Logo | 面包屑 | 搜索 | 预览/保存/发布按钮 │ ├──────────┬──────────────────────────────────────────────────────────┤ │ │ ┌────────────┬───────────────────┬──────────────────┐ │ │ 左侧菜单 │ │ 模型基础 │ 字段设计表格-放在模型基础信息下面 │ 字段属性面板 │ │ │ (树形) │ │ 信息 │ (主工作区) │ (右侧抽屉) │ │ │ ~240px │ │ │ │ │ │ │ │ ├────────────┴───────────────────┴──────────────────┤ │ │ │ │ ER 关系图 (可视化) │ │ │ │ ├─────────────────────────────────────────────────────┤ │ │ │ │ 底部工具栏: 添加字段 | 导入 | 生成 | 保存 | 发布 │ │ └──────────┴──────────────────────────────────────────────────────────┘