# 元数据设计 **本文引用的文件** - [100_initialize_fms_new.sql](file://fms-api/config/migrations/100_initialize_fms_new.sql) - [ModuleFieldsPanel.vue](file://fms-vue/src/views/system/module-management/components/ModuleFieldsPanel.vue) - [ModuleEditConfigPanel.vue](file://fms-vue/src/views/system/module-management/components/ModuleEditConfigPanel.vue) - [moduleListUtils.js](file://fms-vue-old1/src/components/fms-module-list/moduleListUtils.js) - [FmsModuleTable.vue](file://fms-vue-old1/src/components/fms-module-list/FmsModuleTable.vue) - [validate.js.html](file://fms-vue/coverage/src/components/ui/form/validate.js.html) - [index.vue(模块管理)](file://fms-vue-old2/src/views/system/module-management/index.vue) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考虑](#性能考虑) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件系统性阐述 FMS 的“元数据驱动”架构:通过 s_module、s_field、s_field_group、s_field_edit、s_field_view、s_field_query 等配置表,实现动态表单与表格生成。文档覆盖字段类型映射机制、编辑/视图/查询配置、分组布局、验证规则与完整性约束、性能优化策略,以及自定义字段类型的扩展方法。读者可据此理解从数据库元数据到前端渲染的完整链路,并安全地扩展系统能力。 ## 项目结构 - 后端元数据表定义集中在迁移脚本中,定义了模块、字段、分组、编辑/视图/查询配置、关系、权限、日志等基础表结构及约束。 - 前端在“模块管理”页面提供可视化维护界面:字段定义面板、表单设计面板(编辑配置)、列表与查询配置同步等。 - 运行时渲染由通用表格/表单组件根据元数据动态生成 UI,并通过工具函数将前端值转换为 SQL 字面量以构建查询条件。 ```mermaid graph TB subgraph "后端元数据" M["s_module"] F["s_field"] G["s_field_group"] E["s_field_edit"] V["s_field_view"] Q["s_field_query"] end subgraph "前端管理界面" MF["ModuleFieldsPanel.vue"] ME["ModuleEditConfigPanel.vue"] end subgraph "运行时渲染" RT["通用表格/表单组件"] UTL["SQL 字面量/查询构建"] end M --> F F --> E F --> V F --> Q G --> E MF --> F ME --> E RT --> F RT --> E RT --> V RT --> Q UTL --> Q ``` 图表来源 - [100_initialize_fms_new.sql:56-203](file://fms-api/config/migrations/100_initialize_fms_new.sql#L56-L203) - [ModuleFieldsPanel.vue:1-182](file://fms-vue/src/views/system/module-management/components/ModuleFieldsPanel.vue#L1-L182) - [ModuleEditConfigPanel.vue:1-800](file://fms-vue/src/views/system/module-management/components/ModuleEditConfigPanel.vue#L1-L800) 章节来源 - [100_initialize_fms_new.sql:56-203](file://fms-api/config/migrations/100_initialize_fms_new.sql#L56-L203) - [ModuleFieldsPanel.vue:1-182](file://fms-vue/src/views/system/module-management/components/ModuleFieldsPanel.vue#L1-L182) - [ModuleEditConfigPanel.vue:1-800](file://fms-vue/src/views/system/module-management/components/ModuleEditConfigPanel.vue#L1-L800) ## 核心组件 - s_module:模块元数据,定义业务模块、视图表、保存表、主键字段、排序字段、删除策略等。 - s_field:字段元数据,定义字段名、显示名、控件类型、数据库类型、长度/精度/小数位、是否可空、默认值、写入模式、选项、启用状态等。 - s_field_group:字段分组,支持父子分组、标题、多语言、布局方向(垂直/水平)、排序、启用。 - s_field_edit:编辑配置,控制字段在表单中的可见性、必填、只读、禁用、栅格宽度、高度、占位符、排序等。 - s_field_view:视图配置,控制字段在列表/详情中的可见性、分组归属、多语言、排序、列宽等。 - s_field_query:查询配置,控制字段在查询面板中的组件、操作符、默认值、排序、启用等。 章节来源 - [100_initialize_fms_new.sql:56-203](file://fms-api/config/migrations/100_initialize_fms_new.sql#L56-L203) ## 架构总览 元数据驱动的典型流程: - 设计期:管理员在“模块管理”中维护 s_module/s_field/s_field_group/s_field_edit/s_field_view/s_field_query。 - 运行期:前端根据 s_field 的 b_type 选择对应控件;根据 s_field_edit 决定表单布局与校验;根据 s_field_view 决定列表展示;根据 s_field_query 生成查询条件。 - 数据层:b_dbtype 与 b_type 共同决定存储类型与前后端转换逻辑;写模式 b_writemode 控制字段写入行为。 ```mermaid sequenceDiagram participant Admin as "管理员" participant UI as "模块管理界面" participant Meta as "元数据表(s_*)" participant Runtime as "运行时渲染" participant DB as "业务表" Admin->>UI : 维护字段/分组/编辑/视图/查询配置 UI->>Meta : 持久化 s_field / s_field_edit / s_field_view / s_field_query Runtime->>Meta : 读取 s_field, s_field_edit, s_field_view, s_field_query Runtime-->>Runtime : 根据 b_type/b_dbtype 渲染控件/格式化 Runtime->>DB : 提交数据/执行查询 DB-->>Runtime : 返回结果 Runtime-->>Admin : 展示表单/列表/查询结果 ``` 图表来源 - [ModuleFieldsPanel.vue:1-182](file://fms-vue/src/views/system/module-management/components/ModuleFieldsPanel.vue#L1-L182) - [ModuleEditConfigPanel.vue:1-800](file://fms-vue/src/views/system/module-management/components/ModuleEditConfigPanel.vue#L1-L800) - [100_initialize_fms_new.sql:56-203](file://fms-api/config/migrations/100_initialize_fms_new.sql#L56-L203) ## 详细组件分析 ### 字段类型与数据库映射 - 支持的控件类型(b_type):input、textarea、number、money、date、datetime、checkbox、select、selectId。 - 支持的数据库类型(b_dbtype):varchar、nvarchar、char、nchar、int、bigint、smallint、tinyint、decimal、numeric、float、real、date、datetime、datetime2、bit、text、ntext、uniqueidentifier。 - 写模式(b_writemode):direct、createOnly、readOnly、computed、system,用于控制字段写入行为。 - 前端渲染: - ModuleFieldsPanel 暴露控件类型与数据库类型下拉项,供管理员配置。 - 运行时根据 b_type 选择输入控件,并根据 b_dbtype 进行数值/日期/布尔等格式化处理。 - 查询构建: - moduleListUtils 中 sqlLiteral 根据 b_type 将前端值转为 SQL 字面量(数字、金额、日期时间、复选框等)。 - buildQueryCondition 根据 s_field_query 的操作符(如 =、like、in、范围)拼接 SQL 条件。 ```mermaid flowchart TD Start(["开始"]) --> ReadField["读取 s_field
b_type / b_dbtype / b_writemode"] ReadField --> Render{"渲染场景?"} Render --> |表单| EditCfg["读取 s_field_edit
可见/必填/只读/禁用/栅格/高度/占位"] Render --> |列表| ViewCfg["读取 s_field_view
可见/分组/排序/列宽"] Render --> |查询| QueryCfg["读取 s_field_query
组件/操作符/默认值/排序"] EditCfg --> BuildValue["根据 b_type/b_dbtype 转换值"] ViewCfg --> FormatDisplay["格式化显示"] QueryCfg --> BuildSQL["构建 SQL 条件"] BuildValue --> Save["写入业务表"] FormatDisplay --> Show["展示列表/详情"] BuildSQL --> Exec["执行查询"] ``` 图表来源 - [ModuleFieldsPanel.vue:21-42](file://fms-vue/src/views/system/module-management/components/ModuleFieldsPanel.vue#L21-L42) - [ModuleEditConfigPanel.vue:283-363](file://fms-vue/src/views/system/module-management/components/ModuleEditConfigPanel.vue#L283-L363) - [moduleListUtils.js:96-176](file://fms-vue-old1/src/components/fms-module-list/moduleListUtils.js#L96-L176) - [100_initialize_fms_new.sql:92-123](file://fms-api/config/migrations/100_initialize_fms_new.sql#L92-L123) 章节来源 - [ModuleFieldsPanel.vue:21-42](file://fms-vue/src/views/system/module-management/components/ModuleFieldsPanel.vue#L21-L42) - [moduleListUtils.js:96-176](file://fms-vue-old1/src/components/fms-module-list/moduleListUtils.js#L96-L176) - [100_initialize_fms_new.sql:92-123](file://fms-api/config/migrations/100_initialize_fms_new.sql#L92-L123) ### 字段编辑配置(s_field_edit) - 作用:控制字段在表单中的行为与布局,包括可见性、必填、只读、禁用、栅格宽度(1-24)、文本域高度(64-480)、占位符、排序等。 - 前端设计器: - 支持拖拽字段到画布、跨分组移动、自动栅格分配、说明文字行、批量同步到列表/查询配置。 - 属性面板可调整必填、只读、禁用、栅格宽度、占位符、文本域高度等。 - 数据视图:提供高密度表格编辑,便于批量修改可见性与排序。 ```mermaid classDiagram class SFieldEdit { +bigint b_id +bigint b_module_id +bigint b_field_id +bigint b_group_id +int b_visible +int b_required +int b_readonly +int b_disabled +int b_colspan +int b_height +nvarchar b_placeholder +int b_xh } class ModuleEditConfigPanel { +insertField() +rebalanceInsert() +syncToList() +syncToQuery() } ModuleEditConfigPanel --> SFieldEdit : "维护/渲染" ``` 图表来源 - [ModuleEditConfigPanel.vue:1-800](file://fms-vue/src/views/system/module-management/components/ModuleEditConfigPanel.vue#L1-L800) - [100_initialize_fms_new.sql:161-182](file://fms-api/config/migrations/100_initialize_fms_new.sql#L161-L182) 章节来源 - [ModuleEditConfigPanel.vue:1-800](file://fms-vue/src/views/system/module-management/components/ModuleEditConfigPanel.vue#L1-L800) - [100_initialize_fms_new.sql:161-182](file://fms-api/config/migrations/100_initialize_fms_new.sql#L161-L182) ### 视图配置(s_field_view) - 作用:控制字段在列表/详情中的可见性、分组归属、多语言、排序、列宽等。 - 与编辑配置的联动:可通过“同步到列表”将编辑配置的可见性快速复制到视图配置,减少重复维护。 章节来源 - [100_initialize_fms_new.sql:144-159](file://fms-api/config/migrations/100_initialize_fms_new.sql#L144-L159) - [ModuleEditConfigPanel.vue:177-226](file://fms-vue/src/views/system/module-management/components/ModuleEditConfigPanel.vue#L177-L226) ### 查询配置(s_field_query) - 作用:为每个字段定义查询组件、操作符(=、like、in、范围等)、默认值、排序、启用状态。 - 查询构建: - 根据 b_operator 与前端输入值,调用 sqlLiteral 生成安全的 SQL 字面量。 - 支持范围查询(BETWEEN)、多选(IN)、模糊匹配(LIKE)等。 ```mermaid sequenceDiagram participant User as "用户" participant Form as "查询表单" participant Cfg as "s_field_query" participant Utils as "sqlLiteral/buildQueryCondition" participant DB as "业务表" User->>Form : 输入查询条件 Form->>Cfg : 读取字段查询配置 Form->>Utils : 转换值并构建条件 Utils-->>Form : 返回 SQL 片段 Form->>DB : 执行查询 DB-->>Form : 返回结果 Form-->>User : 展示结果 ``` 图表来源 - [moduleListUtils.js:96-176](file://fms-vue-old1/src/components/fms-module-list/moduleListUtils.js#L96-L176) - [100_initialize_fms_new.sql:184-203](file://fms-api/config/migrations/100_initialize_fms_new.sql#L184-L203) 章节来源 - [moduleListUtils.js:96-176](file://fms-vue-old1/src/components/fms-module-list/moduleListUtils.js#L96-L176) - [100_initialize_fms_new.sql:184-203](file://fms-api/config/migrations/100_initialize_fms_new.sql#L184-L203) ### 字段分组(s_field_group)与布局 - 分组支持父子层级、标题、多语言、布局方向(vertical/horizontal)、排序、启用。 - 表单设计器: - 支持按分组组织字段,统一切换整体布局方向。 - 画布内支持拖拽字段到不同分组,自动维护顺序与栅格宽度。 - 新增说明文字行作为非字段占位,提升表单可读性。 章节来源 - [100_initialize_fms_new.sql:125-142](file://fms-api/config/migrations/100_initialize_fms_new.sql#L125-L142) - [ModuleEditConfigPanel.vue:364-377](file://fms-vue/src/views/system/module-management/components/ModuleEditConfigPanel.vue#L364-L377) - [ModuleEditConfigPanel.vue:459-500](file://fms-vue/src/views/system/module-management/components/ModuleEditConfigPanel.vue#L459-L500) ### 元数据验证规则与数据完整性约束 - 数据库级约束: - s_field 的 b_type、b_dbtype、b_writemode 使用 CHECK 约束限制取值范围。 - s_field_edit 的 b_colspan 限制 1-24,b_height 限制 64-480。 - s_field_query 的 b_condition_no > 0。 - s_module 的 b_module_type 与相关字段组合约束,确保不同类型模块的字段一致性。 - 前端校验: - 表单验证框架支持静态规则与自定义 validator,可在字段级别聚合多条规则并返回错误信息。 - 数据同步: - 模块管理页面在同步字段时,会对比视图列与现有字段,增删改合并后批量更新 s_field,并清理不在视图中的字段关联配置。 章节来源 - [100_initialize_fms_new.sql:56-203](file://fms-api/config/migrations/100_initialize_fms_new.sql#L56-L203) - [validate.js.html:445-455](file://fms-vue/coverage/src/components/ui/form/validate.js.html#L445-L455) - [index.vue(模块管理):780-858](file://fms-vue-old2/src/views/system/module-management/index.vue#L780-L858) ### 性能优化策略 - 索引设计: - s_field、s_field_edit、s_field_view、s_field_query、s_module 等均建立常用查询索引(如按模块、排序号、启用状态)。 - 前端交互优化: - 设计器采用局部重算与缓存(sectionRowCache),避免全量重建。 - 栅格宽度动态分配仅在必要时触发,减少不必要的重排。 - 查询构建优化: - 使用 sqlLiteral 对值进行安全且高效的转换,避免字符串拼接错误与注入风险。 - 数据同步优化: - 增量 diff 与临时 ID 分配,减少无谓的插入/更新/删除。 章节来源 - [100_initialize_fms_new.sql:88-203](file://fms-api/config/migrations/100_initialize_fms_new.sql#L88-L203) - [ModuleEditConfigPanel.vue:409-433](file://fms-vue/src/views/system/module-management/components/ModuleEditConfigPanel.vue#L409-L433) - [moduleListUtils.js:96-176](file://fms-vue-old1/src/components/fms-module-list/moduleListUtils.js#L96-L176) - [index.vue(模块管理):780-858](file://fms-vue-old2/src/views/system/module-management/index.vue#L780-L858) ### 自定义字段类型扩展指南 - 步骤建议: 1. 在后端迁移中扩展 s_field.b_type 的允许值(如需新增类型),或在前端扩展控件映射。 2. 在 ModuleFieldsPanel 中添加新控件类型选项,并在运行时组件中实现对应的渲染逻辑。 3. 在 moduleListUtils 中为 sqlLiteral 添加对新类型的值转换逻辑。 4. 在 s_field_query 中为新类型配置合适的组件与操作符。 5. 在 s_field_edit 中为新类型设置合理的默认宽度/高度/占位符。 - 注意事项: - 保持 b_dbtype 与新类型的语义一致,确保存储与展示正确。 - 为查询构建提供安全转换,避免 SQL 注入。 - 在表单验证中为新类型添加必要规则(如必填、范围、格式)。 章节来源 - [ModuleFieldsPanel.vue:21-42](file://fms-vue/src/views/system/module-management/components/ModuleFieldsPanel.vue#L21-L42) - [moduleListUtils.js:96-176](file://fms-vue-old1/src/components/fms-module-list/moduleListUtils.js#L96-L176) - [100_initialize_fms_new.sql:92-123](file://fms-api/config/migrations/100_initialize_fms_new.sql#L92-L123) ## 依赖关系分析 - s_module 与 s_field:一个模块包含多个字段,字段通过 b_module_id 关联。 - s_field 与 s_field_edit/s_field_view/s_field_query:同一字段在不同场景下的配置独立维护,通过 b_field_id 关联。 - s_field_group 与 s_field_edit:字段在表单中的分组归属由 s_field_edit.b_group_id 指定。 - 前端组件依赖: - ModuleFieldsPanel 负责字段定义的可视化维护。 - ModuleEditConfigPanel 负责编辑配置的设计与数据视图编辑,并与列表/查询配置联动。 - FmsModuleTable 根据字段类型与编辑配置生成行内编辑器。 ```mermaid graph LR SM["s_module"] --> SF["s_field"] SF --> SE["s_field_edit"] SF --> SV["s_field_view"] SF --> SQ["s_field_query"] SG["s_field_group"] --> SE MFP["ModuleFieldsPanel.vue"] --> SF MEP["ModuleEditConfigPanel.vue"] --> SE FMT["FmsModuleTable.vue"] --> SF FMT --> SE ``` 图表来源 - [100_initialize_fms_new.sql:56-203](file://fms-api/config/migrations/100_initialize_fms_new.sql#L56-L203) - [ModuleFieldsPanel.vue:1-182](file://fms-vue/src/views/system/module-management/components/ModuleFieldsPanel.vue#L1-L182) - [ModuleEditConfigPanel.vue:1-800](file://fms-vue/src/views/system/module-management/components/ModuleEditConfigPanel.vue#L1-L800) - [FmsModuleTable.vue:76-113](file://fms-vue-old1/src/components/fms-module-list/FmsModuleTable.vue#L76-L113) 章节来源 - [100_initialize_fms_new.sql:56-203](file://fms-api/config/migrations/100_initialize_fms_new.sql#L56-L203) - [ModuleFieldsPanel.vue:1-182](file://fms-vue/src/views/system/module-management/components/ModuleFieldsPanel.vue#L1-L182) - [ModuleEditConfigPanel.vue:1-800](file://fms-vue/src/views/system/module-management/components/ModuleEditConfigPanel.vue#L1-L800) - [FmsModuleTable.vue:76-113](file://fms-vue-old1/src/components/fms-module-list/FmsModuleTable.vue#L76-L113) ## 性能考虑 - 数据库层面: - 合理使用索引(模块、排序、启用状态)提升查询效率。 - 使用 CHECK 约束保证数据合法性,减少应用层校验开销。 - 前端层面: - 设计器局部更新与缓存,避免全量重绘。 - 栅格宽度计算仅在必要时触发,减少 DOM 重排。 - 查询层面: - 使用安全的字面量转换,避免复杂字符串处理带来的性能损耗。 - 合理配置查询操作符,避免过度使用 LIKE 或 IN 导致扫描放大。 [本节为通用指导,不直接分析具体文件] ## 故障排查指南 - 字段类型不匹配: - 检查 s_field.b_type 与 s_field.b_dbtype 是否一致,确保前端渲染与后端存储兼容。 - 查询结果为空: - 检查 s_field_query 的操作符与默认值是否正确,确认 sqlLiteral 转换是否符合预期。 - 表单布局错乱: - 检查 s_field_edit.b_colspan 总和是否超过 24,必要时重新分配栅格宽度。 - 验证失败: - 查看表单验证规则,确认必填、格式、范围等规则是否合理。 - 数据同步异常: - 检查模块管理页面的字段同步逻辑,确认视图列与现有字段的一致性。 章节来源 - [moduleListUtils.js:96-176](file://fms-vue-old1/src/components/fms-module-list/moduleListUtils.js#L96-L176) - [ModuleEditConfigPanel.vue:317-363](file://fms-vue/src/views/system/module-management/components/ModuleEditConfigPanel.vue#L317-L363) - [validate.js.html:445-455](file://fms-vue/coverage/src/components/ui/form/validate.js.html#L445-L455) - [index.vue(模块管理):780-858](file://fms-vue-old2/src/views/system/module-management/index.vue#L780-L858) ## 结论 FMS 的元数据驱动架构通过清晰的表结构与严格约束,实现了高内聚、低耦合的动态表单与表格生成能力。管理员仅需维护少量配置即可快速迭代业务界面,开发者则可基于统一的字段类型与查询构建机制扩展新功能。结合索引设计与前端优化,系统在易用性与性能之间取得良好平衡。 [本节为总结性内容,不直接分析具体文件] ## 附录 - 关键表字段速查: - s_module:模块编码、名称、类型、视图表、保存表、主键字段、排序字段、删除策略。 - s_field:字段名、显示名、控件类型、数据库类型、长度/精度/小数位、是否可空、默认值、写模式、选项、启用。 - s_field_group:分组标题、多语言、布局方向、排序、启用。 - s_field_edit:可见性、必填、只读、禁用、栅格宽度、高度、占位符、排序。 - s_field_view:可见性、分组归属、多语言、排序、列宽。 - s_field_query:组件、操作符、默认值、排序、启用。 [本节为概览性内容,不直接分析具体文件]