From 1b01a31252a89eb0b2e5d1b7cffeaa3060ac422e Mon Sep 17 00:00:00 2001 From: oneao Date: Fri, 4 Sep 2026 23:24:45 +0800 Subject: [PATCH] 20260904232445 --- code/fms/FMS新系统核心表结构设计.md | 1042 +++++------------ code/fms/FMS新系统核心表结构设计.pdf | Bin 0 -> 152099 bytes .../fms-vue/src/components/ui/tree/index.scss | 2 + .../src/components/ui/tree/tree-node.vue | 46 +- .../src/layouts/components/AppSidebar.vue | 80 +- .../src/layouts/components/NavMenuItem.vue | 19 +- code/fms/fms-vue/src/router/index.js | 131 +-- code/fms/fms-vue/src/router/routes.js | 151 +++ code/fms/fms-vue/src/stores/menus.js | 120 ++ .../module/menu-management/MenuBasicPanel.vue | 26 +- .../views/module/menu-management/index.vue | 6 +- code/fms/fms-vue/src/views/test/TestPage.vue | 83 -- code/fms/fms-vue/tests/README.md | 1 - code/fms/fms-vue/tests/menus.spec.js | 150 +++ code/fms/fms-vue/tests/router-auth.spec.js | 4 +- .../fms-vue/tests/router-menu-guard.spec.js | 44 + .../tests/unit/router-nested-groups.spec.js | 45 + .../tests/views/keepalive-cache.spec.js | 3 +- code/fms/历史记录选择器配置设计讨论.md | 159 ++- 19 files changed, 1099 insertions(+), 1013 deletions(-) create mode 100644 code/fms/FMS新系统核心表结构设计.pdf create mode 100644 code/fms/fms-vue/src/router/routes.js create mode 100644 code/fms/fms-vue/src/stores/menus.js delete mode 100644 code/fms/fms-vue/src/views/test/TestPage.vue create mode 100644 code/fms/fms-vue/tests/menus.spec.js create mode 100644 code/fms/fms-vue/tests/router-menu-guard.spec.js create mode 100644 code/fms/fms-vue/tests/unit/router-nested-groups.spec.js diff --git a/code/fms/FMS新系统核心表结构设计.md b/code/fms/FMS新系统核心表结构设计.md index 9bc30352..c339482f 100644 --- a/code/fms/FMS新系统核心表结构设计.md +++ b/code/fms/FMS新系统核心表结构设计.md @@ -1,781 +1,373 @@ -# FMS 新系统模块核心表结构设计 +# FMS 新系统核心表结构 -> 本方案沿用旧系统以 `s_module` 为核心的元数据模型,删除独立的 `s_entity`;分类节点、数据模块和查询模块统一由 `s_module` 自关联树表达。 -> 平台表以 `s_` 开头,字段以 `b_` 开头,复合词采用驼峰拼接(如 `b_viewtable`、`b_inputdatetime`),逻辑关联字段使用 `b_xxx_id`。 +> 目标结构基于 2026-09-04 只读拉取的 `FMS-NEW` 数据库整理。 +> 平台配置使用字符串业务键;未来业务数据表使用 `bigint` 雪花 ID。 -## 1. 设计原则 - -本方案坚持五项原则: - -1. **沿用模块主体**:`s_module` 继续作为旧系统的数据配置主体,分类节点和数据节点在同一棵树中维护,不再增加 `s_entity`。 -2. **模块与字段分离**:`data/query` 模块声明查询源、保存源和主键字段;字段挂模块保存物理列名、字段类型和数据库列约束,列表、表单、查询行为由字段配置子表承载。 -3. **菜单与模块分离**:`s_menu` 是纯导航树,页面菜单引用数据模块,外链菜单保存外链地址;本方案只恢复旧系统的模块数据主体,不把菜单、路由和角色授权重新塞回 `s_module`。 -4. **字段定义与视图配置分责**:字段定义、列表、表单、查询是四类不同职责;本方案保留 `s_field` 作为字段定义表,并将列表、表单、查询行为分别放入 `s_field_view`、`s_field_edit`、`s_field_query`,避免一张宽表充满互不相关的空字段。 -5. **配置入口与存储职责分离**:管理员可从模块树或菜单树定位数据模块,在一个配置工作台内完成数据源、字段、列表、表单、查询、编码和权限配置;底层仍按模块、菜单和权限分别存储。 - -其余约定: - -- 内部主键 `b_id bigint` 由应用层雪花算法生成(全局唯一、带时间序,配置跨系统导出/导入时引用原样保留、无需重映射);跨环境稳定标识使用 `b_code`(参考旧系统)。 -- 全系统不建立物理外键;关联字段保留索引,引用完整性、跨模块一致性、停用与删除保护统一由服务层维护。 -- 布尔语义使用 `int`(0/1),与旧系统 `s_module` 风格一致。 -- 时间统一使用 UTC:字段类型为 `datetime2`,默认 `sysutcdatetime()`;前端按用户时区转换显示。 -- 审计字段:定义类表保留 `b_inputuser_id / b_inputdatetime / b_updateuser_id / b_updatedatetime`;关联类表只保留 `b_inputdatetime`。 -- `s_module.b_parent_id` 只表达模块树位置;模块间真实的引用、主从、外键和级联关系由 `s_relation` 表达。 -- `b_module_type` 使用 `category/data/query`:分类节点不配置数据源,数据节点可查可存,查询节点只读。 -- 一个数据模块默认只有一套字段和页面配置;菜单只是模块的导航入口,不额外引入菜单级字段覆盖层。 - -## 2. 表清单 - -| # | 表名 | 说明 | -| --- | --- | --- | -| 1 | `s_module` | 模块树(分类/数据/查询节点,数据所有者) | -| 2 | `s_field` | 字段定义(数据库列与通用控件元数据) | -| 3 | `s_field_group` | 字段分组(模块级) | -| 4 | `s_field_view` | 字段视图配置(列表显示、排序、列宽、分组) | -| 5 | `s_field_edit` | 字段表单配置(显示、排序、分组、必填、只读、禁用) | -| 6 | `s_field_query` | 字段查询配置(关联字段、操作符、默认值) | -| 7 | `s_relation` | 模块关系(引用/主从/多对多,驱动外键校验与级联) | -| 8 | `s_menu` | 菜单/页面导航(页面菜单绑定数据模块) | -| 9 | `s_autocode` | 自动编码规则 | -| 10 | `s_role` | 角色 | -| 11 | `s_user_role` | 用户-角色 | -| 12 | `s_power` | 权限点(menu/module/action/field) | -| 13 | `s_role_power` | 角色-权限(允许/拒绝) | -| 14 | `s_role_scope` | 角色-模块数据范围 | -| 15 | `s_i18n` | 多语言资源 | -| 16 | `s_log_technical` | 技术日志(请求链路/SQL/异常/性能) | -| 17 | `s_log_login` | 登录日志(登录/退出/失败/锁定) | -| 18 | `s_log_audit` | 业务审计事件 | -| 19 | `s_log_audit_field` | 审计字段变更明细 | -## 3. 各表结构 - -### 3.1 s_module 模块 - -沿用旧系统核心语义:`s_module` 既是模块树节点,也是数据配置主体。`category` 节点只负责分类;`data` 节点可查询和保存;`query` 节点只查询不保存。菜单、角色和权限仍由独立表维护。 +## 1. 用户表 ```sql -create table s_module ( - b_id bigint not null, -- 雪花主键(应用层生成,全局唯一) - b_code varchar(50) not null, -- 模块编码(全局唯一) - b_parent_id bigint null, -- 父模块(配置树位置) - b_name nvarchar(100) not null, -- 模块名称 - b_i18n varchar(150) null, -- 显示名多语言 key - b_module_type varchar(20) not null, -- category/data/query - b_viewtable varchar(128) null, -- 查询数据源(data/query 使用) - b_savetable varchar(128) null, -- 保存目标(data 可用,query 必须为空) - b_keyfield varchar(50) null, -- 主键字段(data/query 使用) - b_orderfield varchar(500) null, -- 默认排序表达式 - b_delete_policy varchar(20) null, -- restrict/lifecycle/hard;级联由 s_relation 表达 - b_canuse int not null default 1, -- 是否启用 - b_xh int not null default 0, -- 排序号 - b_bz nvarchar(1000) null, -- 描述 - b_inputuser_id bigint null, - b_inputdatetime datetime2 null default sysutcdatetime(), - b_updateuser_id bigint null, - b_updatedatetime datetime2 null, - constraint pk_s_module primary key (b_id), - constraint ux_s_module_code unique (b_code), - constraint ck_s_module_type check (b_module_type in ('category', 'data', 'query')), - constraint ck_s_module_delete_policy check (b_delete_policy is null or b_delete_policy in ('restrict', 'lifecycle', 'hard')), - constraint ck_s_module_config check ( - (b_module_type = 'category' and b_viewtable is null and b_savetable is null and b_keyfield is null and b_orderfield is null and b_delete_policy is null) - or (b_module_type = 'data' and b_viewtable is not null and b_savetable is not null and b_keyfield is not null and b_delete_policy is not null) - or (b_module_type = 'query' and b_viewtable is not null and b_savetable is null and b_delete_policy is null) - ), - constraint ck_s_module_parent check (b_parent_id is null or b_parent_id <> b_id), - -- constraint fk_s_module_parent foreign key (b_parent_id) references s_module (b_id) -); - -create index ix_s_module_parent on s_module (b_parent_id, b_xh, b_canuse, b_id); -create index ix_s_module_savetable on s_module (b_savetable); -``` - -模块的查/存配置方式: - -```text -分类模块: b_module_type = category, 查/存/主键/排序/删除策略全部为空 -数据模块: b_module_type = data, b_viewtable/b_savetable/b_keyfield/b_delete_policy 必填 -查询模块: b_module_type = query, b_viewtable 必填, b_savetable/b_delete_policy 必须为空;汇总查询可不填 b_keyfield -``` - -数据库约束只能判断空值,服务层还必须拒绝空字符串,并校验表、视图、主键和排序字段真实存在。模块树、菜单树和字段分组树在修改父节点时必须检查完整祖先链,禁止 `A -> B -> C -> A` 形式的间接循环。 - -删除策略取值(`b_delete_policy`): - -```text -restrict 主数据:有引用时拒绝删除,只能停用或合并 -lifecycle 业务单据:草稿且无下游时可删,正式后只能取消/作废 -hard 临时记录:校验权限后直接物理删除 -``` - -模块删除策略只控制“直接删除当前模块记录”是否允许;主记录删除时如何处理从记录由具体 `s_relation.b_delete_policy` 决定,因此模块层不再重复设置 `cascade`。 - -### 3.2 s_field 字段 - -只保存字段本身的规范定义,不混入列表、表单和查询布局。字段同步、数据库列校验和业务审计均以本表为准;三类界面行为分别放在后续配置表中。 - -```sql -create table s_field ( - b_id bigint not null, -- 雪花主键(应用层生成,全局唯一) - b_module_id bigint not null, -- 所属数据模块 - b_field varchar(50) not null, -- 物理列名(与真实表列一致) - b_name nvarchar(100) not null, -- 字段名称 - b_i18n varchar(150) null, -- 显示名多语言 key - b_type varchar(30) not null, -- 字段类型(input/textarea/number/money/date/datetime/checkbox/select/selectId...) - b_dbtype varchar(30) not null, -- 数据库存储类型(varchar/nvarchar/int/bigint/decimal/date/datetime2/bit/text) - b_length int null, -- 长度 - b_precision int null, -- 数值精度(总位数) - b_scale int null, -- 数值小数位 - b_nullable int not null default 1, -- 数据库层是否可空 - b_default_value nvarchar(500) null, -- 固定业务/UI 默认值(文本或 JSON 表达) - b_db_default nvarchar(500) null, -- 数据库列默认表达式(结构同步得到) - b_writemode varchar(20) not null default 'direct', -- direct/createOnly/readOnly/computed/system - b_options nvarchar(max) null, -- 字段类型配置(JSON;静态选项或 selectId 选择器配置) - b_canuse int not null default 1, -- 是否启用(停用隐藏并保留数据) - b_inputuser_id bigint null, - b_inputdatetime datetime2 null default sysutcdatetime(), - b_updateuser_id bigint null, - b_updatedatetime datetime2 null, - constraint pk_s_field primary key (b_id), - constraint ux_s_field_module_field unique (b_module_id, b_field), - constraint ux_s_field_module_id unique (b_module_id, b_id), - -- constraint fk_s_field_module foreign key (b_module_id) references s_module (b_id), - constraint ck_s_field_type check (b_type in ('input', 'textarea', 'number', 'money', 'date', 'datetime', 'checkbox', 'select', 'selectId')), - constraint ck_s_field_dbtype check (b_dbtype in ('varchar', 'nvarchar', 'char', 'nchar', 'int', 'bigint', 'smallint', 'tinyint', 'decimal', 'numeric', 'float', 'real', 'date', 'datetime', 'datetime2', 'bit', 'text', 'ntext', 'uniqueidentifier')), - constraint ck_s_field_writemode check (b_writemode in ('direct', 'createOnly', 'readOnly', 'computed', 'system')) -); - -create index ix_s_field_module on s_field (b_module_id, b_canuse, b_id); -``` - -`b_type` 沿用旧系统语义,直接指定字段的业务/控件类型,而不是数据库字段类型。数据库真实列类型记录在 `b_dbtype`,用于同步和结构校验;前端默认控件、值转换和展示规则由 `b_type` 决定。服务层必须执行类型兼容校验:`checkbox` 只能映射 `bit/int`;`number` 映射整数或数值类型;`money` 映射 `decimal/numeric`;`date` 映射 `date/datetime/datetime2`;`datetime` 映射 `datetime/datetime2`;`selectId` 映射可承载目标 ID 的整数、字符或 `uniqueidentifier`;`input/textarea` 映射字符类型;`select` 可映射字符或整数类型。`b_default_value` 只表示新增表单时可直接使用的固定默认值,`b_db_default` 是数据库列默认表达式,两者不能混用。 - -`b_writemode` 是通用保存服务的强制规则:`direct` 可新增可修改,`createOnly` 仅新增时写入,`readOnly/computed` 永不接收客户端写入,`system` 仅允许受信任的系统逻辑写入。查询视图中的显示列、计算列和 `v_xxx` 字段必须标记为 `readOnly/computed`,即使它们出现在 `s_field_edit` 中也不能被保存接口写入。 - -依赖其他业务数据的默认值不在 `s_field` 中配置通用规则,也不增加默认值类型字段。此类值由具体业务模块的服务逻辑处理:例如新增业务单据时,根据单据币种和业务日期查询汇率模块,将汇率写入单据作为当时的业务快照;用户修改币种或日期时,由该业务服务重新计算,是否覆盖人工修改由具体业务规则决定。 - -第一阶段沿用旧系统已有类型: - -```text -input 单行文本 -textarea 多行文本 -number 数字 -money 金额 -date 日期 -datetime 日期时间 -checkbox 布尔/复选框 -select 静态枚举下拉选择,直接保存选项值 -selectId 关联模块选择器,保存目标记录 ID -``` - -`select` 的静态选项直接放在 `b_options`。`selectId` 必须对应一条以当前字段作为外键端的启用 `s_relation`;`b_options` 只保存选择器展示配置,例如 `relationCode`、`labelField`、`searchFields` 和是否允许清空,不保存目标模块的动态数据。服务层保存配置时必须校验 relation、目标模块以及显示/搜索字段真实存在且已启用。后续增加人员选择、附件、级联选择等自定义类型时,继续扩展 `b_type` 的受控枚举,并在 `b_options` 保存该类型的专用配置。 - -示例: - -```json -{ - "relationCode": "booking.customer", - "labelField": "b_name", - "searchFields": ["b_code", "b_name"], - "allowClear": true -} -``` - -### 3.3 s_field_group 字段分组 - -分组是模块级独立定义,支持分组树。列表和表单可以分别通过自己的配置表引用同一个分组,也可以选择不同分组。配置表冗余保存 `b_module_id`,通过复合外键保证字段、分组和配置始终属于同一个模块。 - -```sql -create table s_field_group ( - b_id bigint not null, -- 雪花主键(应用层生成,全局唯一) - b_module_id bigint not null, -- 所属数据模块 - b_parent_id bigint null, -- 父分组(分组树) - b_title nvarchar(100) not null, -- 分组标题 - b_i18n varchar(150) null, -- 标题多语言 key - b_layout_direction varchar(10) null, -- 分组内字段排列方向(vertical/horizontal) - b_colspan int not null default 48, -- 分组在外层 48 宫格中的占格数(默认 48 独占一行) - b_xh int not null default 0, -- 分组排序 - b_canuse int not null default 1, -- 是否启用(停用整组隐藏) - constraint pk_s_field_group primary key (b_id), - constraint ux_s_field_group_module_id unique (b_module_id, b_id), - constraint ck_s_field_group_parent check (b_parent_id is null or b_parent_id <> b_id), - -- constraint fk_s_field_group_module foreign key (b_module_id) references s_module (b_id), - -- constraint fk_s_field_group_parent foreign key (b_module_id, b_parent_id) references s_field_group (b_module_id, b_id) -); - -create index ix_s_field_group_module on s_field_group (b_module_id, b_xh, b_canuse); -``` - -### 3.4 s_field_view 字段视图配置 - -保存字段在列表中的显示、顺序、宽度和分组。每个模块字段最多一条列表配置;未创建配置记录表示该字段不进入列表。 - -```sql -create table s_field_view ( - b_id bigint not null, - b_module_id bigint not null, -- 所属数据模块(与字段、分组一致) - b_field_id bigint not null, -- 字段 - b_group_id bigint null, -- 列表分组 - b_i18n varchar(150) null, -- 列表标题多语言 key(空则继承字段) - b_visible int not null default 1, -- 是否显示 - b_xh int not null default 0, -- 列表排序 - b_width int null, -- 列宽(px) - constraint pk_s_field_view primary key (b_id), - constraint ux_s_field_view_field unique (b_module_id, b_field_id), - -- constraint fk_s_field_view_module foreign key (b_module_id) references s_module (b_id), - -- constraint fk_s_field_view_field foreign key (b_module_id, b_field_id) references s_field (b_module_id, b_id), - -- constraint fk_s_field_view_group foreign key (b_module_id, b_group_id) references s_field_group (b_module_id, b_id) -); - -create index ix_s_field_view_order on s_field_view (b_xh, b_id); -``` - -### 3.5 s_field_edit 字段表单配置 - -保存字段在新增、编辑表单中的布局和交互行为。每个模块字段最多一条表单配置;字段的默认控件类型由 `s_field.b_type` 决定,本表只配置当前表单中的显示、必填、只读和禁用状态。 - -```sql -create table s_field_edit ( - b_id bigint not null, - b_module_id bigint not null, -- 所属数据模块(与字段、分组一致) - b_field_id bigint not null, -- 字段 - b_group_id bigint null, -- 表单分组 - b_visible int not null default 1, -- 是否显示 - b_required int not null default 0, -- 是否必填 - b_readonly int not null default 0, -- 是否只读 - b_disabled int not null default 0, -- 是否禁用 - b_xh int not null default 0, -- 表单排序 - constraint pk_s_field_edit primary key (b_id), - constraint ux_s_field_edit_field unique (b_module_id, b_field_id), - -- constraint fk_s_field_edit_module foreign key (b_module_id) references s_module (b_id), - -- constraint fk_s_field_edit_field foreign key (b_module_id, b_field_id) references s_field (b_module_id, b_id), - -- constraint fk_s_field_edit_group foreign key (b_module_id, b_group_id) references s_field_group (b_module_id, b_id) -); - -create index ix_s_field_edit_order on s_field_edit (b_xh, b_id); -``` - -数据库可空性以 `s_field.b_nullable` 为准,数据库默认值以 `s_field.b_db_default` 为准,表单必填以 `s_field_edit.b_required` 为准;表单组件直接按 `s_field.b_type` 选择,不在 `s_field_edit` 重复配置。元数据校验器应保证:数据库不可空、无数据库默认值且允许客户端写入的字段,新增表单不能配置为非必填;`readOnly/computed/system` 字段不能配置为客户端必填。 - -### 3.6 s_field_query 字段查询配置 - -查询条件是可选集合,只有需要进入查询区的字段才创建记录。第一阶段所有启用条件按 `b_xh` 排序,并统一使用 `AND` 组合;暂不支持 `OR`、嵌套括号和条件组。同一字段可以配置多个不同操作符,也允许通过 `b_condition_no` 配置多个相同操作符的条件。`b_module_id` 表示查询所属模块,`b_field_module_id` 表示条件字段实际所属模块;查询本模块字段时二者相同,关联查询时必须通过 `b_relation_id` 指向一条从查询模块可达的启用关系。查询组件优先使用配置中的 `b_component`;为空时再根据 `s_field.b_type` 和操作符推导。 - -```sql -create table s_field_query ( - b_id bigint not null, - b_module_id bigint not null, -- 查询所属模块 - b_field_module_id bigint not null, -- 条件字段所属模块 - b_field_id bigint not null, -- 条件字段 - b_relation_id bigint null, -- 关联字段使用的模块关系 - b_component varchar(30) null, -- 查询控件覆盖(input/select/date/datetime/number/checkbox...) - b_condition_no int not null default 1, -- 同模块同字段同操作符的条件序号 - b_operator varchar(20) not null, -- eq/like/gt/ge/lt/le/in/between - b_default_value nvarchar(500) null, -- 默认查询值 - b_canuse int not null default 1, -- 是否启用 - b_xh int not null default 0, -- 查询条件排序 - constraint pk_s_field_query primary key (b_id), - constraint ux_s_field_query_condition unique (b_module_id, b_field_module_id, b_field_id, b_relation_id, b_operator, b_condition_no), - -- constraint fk_s_field_query_module foreign key (b_module_id) references s_module (b_id), - -- constraint fk_s_field_query_field foreign key (b_field_module_id, b_field_id) references s_field (b_module_id, b_id) -); - -create index ix_s_field_query_order on s_field_query (b_canuse, b_xh, b_id); -``` - -`b_operator` 表达查询条件的比较语义,默认控件由字段定义和操作符组合推导:`b_options` 非空时优先使用下拉/多选,`datetime` 使用日期或日期时间控件,数值和日期字段在 `between` 操作符下使用范围控件。服务层必须校验操作符与字段类型匹配,并将 `in`/`between` 的默认值按约定 JSON/数组格式解析。若 `b_relation_id` 为空,字段必须属于查询模块;若不为空,关系必须连接查询模块与字段模块,并验证字段确实位于关系指定的一侧。第一阶段运行时对所有启用条件追加 `AND`,未来如需 `OR` 或括号,再增加独立的条件组模型。 - -### 3.7 s_relation 模块关系 - -描述模块间的引用与主子关系,运行时据此执行外键校验、主子事务与级联删除。`b_module_id` 和 `b_target_module_id` 是关系两端,不预设哪一端保存外键;`b_foreign_side` 明确外键位于哪一端,两个端点字段都使用 `s_field` 主键引用,避免只写物理列名导致跨模块歧义。 - -```sql -create table s_relation ( - b_id bigint not null, -- 雪花主键(应用层生成,全局唯一) - b_code varchar(50) not null, -- 跨环境稳定关系编码 - b_module_id bigint not null, -- 关系端 A 模块 - b_target_module_id bigint not null, -- 关系端 B 模块 - b_relation_type varchar(20) not null, -- one-to-one/one-to-many/many-to-one/many-to-many - b_module_field_id bigint not null, -- 端 A 关联字段 - b_target_field_id bigint not null, -- 端 B 关联字段 - b_foreign_side varchar(10) null, -- 普通关系外键所在端:module/target - b_junction_module_id bigint null, -- many-to-many 中间模块 - b_junction_module_field_id bigint null, -- 中间模块指向端 A 字段 - b_junction_target_field_id bigint null, -- 中间模块指向端 B 字段 - b_ownership varchar(20) not null default 'reference', -- reference 引用/owned 主从 - b_owner_side varchar(10) null, -- owned 时主/拥有者端:module/target - b_delete_policy varchar(20) null, -- restrict/set-null/cascade/archive - b_order_module_id bigint null, -- 从/被拥有模块 - b_order_field_id bigint null, -- 从模块排序字段 - b_canuse int not null default 1, -- 是否启用 - b_xh int not null default 0, -- 排序号 - constraint pk_s_relation primary key (b_id), - constraint ux_s_relation_code unique (b_code), - -- constraint fk_s_relation_module foreign key (b_module_id) references s_module (b_id), - -- constraint fk_s_relation_target_module foreign key (b_target_module_id) references s_module (b_id), - -- constraint fk_s_relation_module_field foreign key (b_module_id, b_module_field_id) references s_field (b_module_id, b_id), - -- constraint fk_s_relation_target_field foreign key (b_target_module_id, b_target_field_id) references s_field (b_module_id, b_id), - -- constraint fk_s_relation_junction_module foreign key (b_junction_module_id) references s_module (b_id), - -- constraint fk_s_relation_junction_module_field foreign key (b_junction_module_id, b_junction_module_field_id) references s_field (b_module_id, b_id), - -- constraint fk_s_relation_junction_target_field foreign key (b_junction_module_id, b_junction_target_field_id) references s_field (b_module_id, b_id), - -- constraint fk_s_relation_order_module foreign key (b_order_module_id) references s_module (b_id), - -- constraint fk_s_relation_order_field foreign key (b_order_module_id, b_order_field_id) references s_field (b_module_id, b_id), - constraint ux_s_relation_key unique (b_module_id, b_target_module_id, b_module_field_id, b_target_field_id), - constraint ck_s_relation_self_fields check (b_module_id <> b_target_module_id or b_module_field_id <> b_target_field_id), - constraint ck_s_relation_type check (b_relation_type in ('one-to-one', 'one-to-many', 'many-to-one', 'many-to-many')), - constraint ck_s_relation_foreign_side check (b_foreign_side is null or b_foreign_side in ('module', 'target')), - constraint ck_s_relation_ownership check (b_ownership in ('reference', 'owned')), - constraint ck_s_relation_owner_side check (b_owner_side is null or b_owner_side in ('module', 'target')), - constraint ck_s_relation_shape check ( - (b_relation_type = 'many-to-many' and b_foreign_side is null and b_junction_module_id is not null and b_junction_module_field_id is not null and b_junction_target_field_id is not null) - or (b_relation_type <> 'many-to-many' and b_foreign_side is not null and b_junction_module_id is null and b_junction_module_field_id is null and b_junction_target_field_id is null) - ), - constraint ck_s_relation_owned check ( - (b_ownership = 'reference' and b_owner_side is null) - or (b_ownership = 'owned' and b_owner_side is not null and b_relation_type <> 'many-to-many') - ), - constraint ck_s_relation_order check ( - (b_order_module_id is null and b_order_field_id is null) - or (b_order_module_id is not null and b_order_field_id is not null) - ), - constraint ck_s_relation_delete_policy check (b_delete_policy is null or b_delete_policy in ('restrict', 'set-null', 'cascade', 'archive')) -); - -create index ix_s_relation_target on s_relation (b_target_module_id); - --- 不建物理外键:s_field_query.b_relation_id -> s_relation.b_id 为逻辑外键,由服务层校验 -``` - -关系配置必须满足以下规则: - -- `b_code` 是跨环境稳定标识,`selectId.b_options.relationCode` 和配置导入导出都使用该编码;运行时内部关联仍可使用 `b_id`。 -- 允许同一模块自关联,用于组织树、父子记录等场景;自关联时两端字段不能相同,并仍需通过 `b_foreign_side` 明确父键和外键端。 -- `one-to-one/one-to-many/many-to-one` 不填写中间模块字段且必须明确 `b_foreign_side`;`many-to-many` 必须同时填写中间模块及两个中间外键字段,且不填写 `b_foreign_side`。 -- 普通关系由 `b_foreign_side` 指定哪一端保存外键;外键字段与另一端被引用字段类型必须兼容;`one-to-one` 还要求外键字段具有唯一约束。 -- `one-to-many`/`many-to-one` 必须与 `b_foreign_side` 的方向一致:外键在端 B 时端 A 为“一”,外键在端 A 时端 B 为“一”。`set-null` 仅允许实际外键字段可空时使用。 -- `reference` 不填写 `b_owner_side`,默认删除策略为 `restrict/set-null`;`owned` 必须明确 `b_owner_side`,另一端才是从/被拥有端,只有 owned 关系允许 `cascade/archive`、主从事务保存和从表排序。 -- `b_order_module_id/b_order_field_id` 必须同时为空或同时有值;有值时模块必须是 owned 关系的从端,字段必须属于该模块。 -- 模块自身的 `b_delete_policy` 决定该模块记录能否进入删除流程;关系的 `b_delete_policy` 决定删除发生后如何处理关联记录,两者都必须通过才可执行。 -- 同一对模块可以存在多条关系,但“两端模块 + 两侧字段”必须唯一;配置、导入导出使用关系 `b_code`,运行时和关联查询使用关系 `b_id`。 - -### 3.8 s_menu 菜单/页面 - -菜单是独立导航树,不保存字段、列表或表单配置。`page` 菜单通过 `b_module_id` 绑定一个 `data/query` 模块,并直接使用该模块的字段、列表、表单和查询配置。 - -```sql -create table s_menu ( - b_id bigint not null, -- 雪花主键(应用层生成,全局唯一) - b_parent_id bigint null, -- 父菜单(导航树自引用) - b_code varchar(50) not null, -- 菜单编码 - b_name nvarchar(100) not null, -- 菜单名称 - b_i18n varchar(150) null, -- 显示名多语言 key - b_menu_type varchar(20) not null, -- directory/page/external - b_route varchar(200) null, -- 页面路由或外链地址 - b_module_id bigint null, -- page 页面绑定的数据/查询模块 - b_icon nvarchar(max) null, -- 图标:lucide:Name 引用 lucide 图标;其他字符串视为 SVG 标记 - b_xh int not null default 0, -- 排序号 - b_canuse int not null default 1, -- 是否启用(停用后不显示且不可访问) - constraint pk_s_menu primary key (b_id), - constraint ux_s_menu_code unique (b_code), - -- constraint fk_s_menu_parent foreign key (b_parent_id) references s_menu (b_id), - -- constraint fk_s_menu_module foreign key (b_module_id) references s_module (b_id) -); - -create index ix_s_menu_parent on s_menu (b_parent_id, b_xh, b_canuse); -create index ix_s_menu_module on s_menu (b_module_id); -``` - -菜单类型约束由业务层执行:`directory` 不填业务路由和模块;`page` 必须填 `b_route` 和 `b_module_id`;`external` 必须填 `b_route` 且不绑定模块。已保存菜单不允许修改菜单类型。菜单访问权限由 `b_code` 派生,不再单独配置访问权限编码。目录仅在存在至少一个可访问子页面时显示。 - -菜单配置表单按以下顺序呈现:菜单名称 → 菜单编码 → 菜单类型 → 上级菜单 → 路由/外链地址 → 绑定模块 → 图标 → 排序号。菜单类型、路由和模块关系由菜单管理的业务层校验。 - -没有独立菜单的子模块、费用明细、选择器和公共字典,通过主模块的 `s_relation` 挂在所属数据模块下;它们不需要重复创建菜单,也可以在同一个配置工作台中维护。 - -### 3.9 s_autocode 自动编码 - -挂数据模块 + 目标字段,规则可复用。并发控制:应用层使用原子更新取号(`update ... set b_currentvalue = b_currentvalue + 1 output inserted.b_currentvalue`),避免自增竞争。 - -```sql -create table s_autocode ( - b_id bigint not null, -- 雪花主键(应用层生成,全局唯一) - b_module_id bigint not null, -- 所属数据模块 - b_field_id bigint not null, -- 目标字段 - b_prefix nvarchar(100) not null default '', -- 前缀 - b_dateformat varchar(30) not null default 'yyyyMM', -- 日期格式 - b_separator nvarchar(10) not null default '-', -- 分隔符 - b_seqwidth int not null default 5, -- 流水位宽 - b_resettype varchar(10) not null default 'month', -- 重置周期:none/day/month/year - b_startvalue bigint not null default 1, -- 起始值 - b_currentperiod varchar(8) null, -- 当前周期 - b_currentvalue bigint not null default 0, -- 当前流水值 - b_canuse int not null default 1, -- 是否启用 - constraint pk_s_autocode primary key (b_id), - constraint ux_s_autocode_module_field unique (b_module_id, b_field_id), - -- constraint fk_s_autocode_module foreign key (b_module_id) references s_module (b_id), - -- constraint fk_s_autocode_field foreign key (b_module_id, b_field_id) references s_field (b_module_id, b_id), - constraint ck_s_autocode_resettype check (b_resettype in ('none', 'day', 'month', 'year')), - constraint ck_s_autocode_values check (b_seqwidth > 0 and b_startvalue >= 0 and b_currentvalue >= 0) +create table dbo.b_user ( + b_id varchar(50) not null primary key, -- 用户账号本身 + b_name nvarchar(100) null, + b_department nvarchar(100) null, + b_subcode nvarchar(100) null, + b_machineid nvarchar(100) null, + b_bz nvarchar(400) null, + b_password nvarchar(255) not null, + b_canuse tinyint not null default 1, + b_othermachinelogin tinyint not null default 0, + b_salesman tinyint not null default 0, + b_docman tinyint not null default 0, + b_dealman tinyint not null default 0, + b_receivelevel tinyint null, + b_paylevel tinyint null, + b_visible_customer tinyint not null default 0, + b_visible_supply tinyint not null default 0, + b_levelvisible tinyint not null default 0, + b_fromcustomer tinyint not null default 0, + b_logintime tinyint not null default 0, + b_checkxy tinyint not null default 0, + b_loginfee tinyint not null default 0, + b_phone nvarchar(100) null ); ``` -自动编码目标字段必须是当前模块的可写字符字段;服务层还需校验目标字段未配置为 `computed/system/readOnly`,并保证业务字段上的唯一性约束。规则周期切换、取号和业务保存必须在同一事务内完成。 - -### 3.10 s_role 角色 +## 2. 模块 ```sql -create table s_role ( - b_id bigint not null, -- 雪花主键(应用层生成,全局唯一) - b_code varchar(50) not null, -- 角色编码 - b_name nvarchar(100) not null, -- 角色名称 - b_i18n varchar(150) null, -- 显示名多语言 key - b_remark nvarchar(500) null, -- 描述 - b_is_system int not null default 0, -- 系统内置角色(禁止普通管理员删除) - b_bypass_power int not null default 0, -- 是否绕过业务权限校验(仅超级管理员) - b_canuse int not null default 1, -- 是否启用 - b_inputuser_id bigint null, - b_inputdatetime datetime2 null default sysutcdatetime(), - b_updateuser_id bigint null, - b_updatedatetime datetime2 null, - constraint pk_s_role primary key (b_id), - constraint ux_s_role_code unique (b_code), - constraint ck_s_role_system_bypass check (b_bypass_power = 0 or b_is_system = 1) -); -``` - -### 3.11 s_user_role 用户-角色 - -```sql -create table s_user_role ( - b_id bigint not null, -- 雪花主键(应用层生成,全局唯一) - b_user_id bigint not null, -- 用户(逻辑外键,当前身份系统) - b_role_id bigint not null, -- 角色 - b_canuse int not null default 1, -- 是否启用该关系 - b_inputdatetime datetime2 null default sysutcdatetime(), - constraint pk_s_user_role primary key (b_id), - constraint ux_s_user_role unique (b_user_id, b_role_id), - -- constraint fk_s_user_role_role foreign key (b_role_id) references s_role (b_id) -); - -create index ix_s_user_role_role on s_user_role (b_role_id, b_canuse); -``` - -### 3.12 s_power 权限点 - -```sql -create table s_power ( - b_id bigint not null, -- 雪花主键(应用层生成,全局唯一) - b_code varchar(50) not null, -- 权限编码(如 booking.confirm) - b_name nvarchar(100) not null, -- 权限名称 - b_i18n varchar(150) null, -- 显示名多语言 key - b_power_type varchar(20) not null, -- menu/module/action/field - b_resource varchar(128) null, -- 菜单 code 或扩展资源 code - b_module_id bigint null, -- module/action/field 所属模块 - b_field_id bigint null, -- field 权限对应字段 - b_operation varchar(30) not null, -- access/read/create/update/delete/export/execute/view/edit - b_canuse int not null default 1, -- 是否启用 - b_xh int not null default 0, -- 排序号 - constraint pk_s_power primary key (b_id), - constraint ux_s_power_code unique (b_code), - -- constraint fk_s_power_module foreign key (b_module_id) references s_module (b_id), - -- constraint fk_s_power_field foreign key (b_module_id, b_field_id) references s_field (b_module_id, b_id), - constraint ck_s_power_type check (b_power_type in ('menu', 'module', 'action', 'field')), - constraint ck_s_power_shape check ( - (b_power_type = 'menu' and b_resource is not null and b_module_id is null and b_field_id is null and b_operation = 'access') - or (b_power_type = 'module' and b_resource is null and b_module_id is not null and b_field_id is null and b_operation in ('read', 'create', 'update', 'delete', 'export')) - or (b_power_type = 'action' and b_resource is not null and b_module_id is not null and b_field_id is null and b_operation = 'execute') - or (b_power_type = 'field' and b_resource is null and b_module_id is not null and b_field_id is not null and b_operation in ('view', 'edit')) - ) -); - -create index ix_s_power_resource on s_power (b_power_type, b_resource, b_canuse); -``` - -权限点的资源约束由服务层补充:`menu` 使用菜单编码且操作只能为 `access`;`module` 必须填写 `b_module_id` 且操作为 `read/create/update/delete/export`;`action` 必须填写模块和动作编码且操作为 `execute`;`field` 必须同时填写模块、字段且操作为 `view/edit`。权限编码 `b_code` 在全库唯一,资源停用后对应权限自动失效。 - -### 3.13 s_role_power 角色-权限 - -```sql -create table s_role_power ( - b_id bigint not null, -- 雪花主键(应用层生成,全局唯一) - b_role_id bigint not null, -- 角色 - b_power_id bigint not null, -- 权限点 - b_effect varchar(10) not null default 'allow', -- allow/deny - b_canuse int not null default 1, -- 是否启用 - b_inputdatetime datetime2 null default sysutcdatetime(), - constraint pk_s_role_power primary key (b_id), - constraint ux_s_role_power unique (b_role_id, b_power_id), - -- constraint fk_s_role_power_role foreign key (b_role_id) references s_role (b_id), - -- constraint fk_s_role_power_power foreign key (b_power_id) references s_power (b_id), - constraint ck_s_role_power_effect check (b_effect in ('allow', 'deny')) -); - -create index ix_s_role_power_power on s_role_power (b_power_id, b_canuse); -``` - -### 3.14 s_role_scope 角色-模块数据范围 - -数据范围控制用户通过某个模块操作时可访问哪些业务记录。范围按角色、模块和操作配置,不承担租户隔离;本系统采用一个租户一个数据库,数据范围只解决租户内部的本人、部门、负责人等业务授权。 - -```sql -create table s_role_scope ( - b_id bigint not null, - b_role_id bigint not null, -- 角色 - b_module_id bigint not null, -- 数据模块 - b_operation varchar(20) not null, -- read/update/delete/export - b_scope_type varchar(30) not null, -- all/creator/owner/department/department-tree/custom - b_scope_no int not null default 1, -- 同角色同模块同操作的范围序号 - b_scope_field_id bigint null, -- owner/department/custom 用于匹配的业务字段 - b_scope_value nvarchar(max) null, -- 固定值或自定义条件(JSON) +create table dbo.s_module ( + b_id varchar(50) not null primary key, -- 模块编码本身,创建后不可修改 + b_parent_id varchar(50) null, + b_name nvarchar(200) not null, + b_i18n varchar(150) null, + b_module_type varchar(20) not null, + b_viewtable varchar(128) null, + b_savetable varchar(128) null, + b_keyfield varchar(50) null, + b_orderfield varchar(500) null, + b_delete_policy varchar(20) null, b_canuse int not null default 1, - b_inputdatetime datetime2 null default sysutcdatetime(), - constraint pk_s_role_scope primary key (b_id), - constraint ux_s_role_scope unique (b_role_id, b_module_id, b_operation, b_scope_type, b_scope_field_id, b_scope_no), - -- constraint fk_s_role_scope_role foreign key (b_role_id) references s_role (b_id), - -- constraint fk_s_role_scope_module foreign key (b_module_id) references s_module (b_id), - -- constraint fk_s_role_scope_field foreign key (b_module_id, b_scope_field_id) references s_field (b_module_id, b_id), - constraint ck_s_role_scope_operation check (b_operation in ('read', 'update', 'delete', 'export')), - constraint ck_s_role_scope_type check (b_scope_type in ('all', 'creator', 'owner', 'department', 'department-tree', 'custom')), - constraint ck_s_role_scope_no check (b_scope_no > 0), - constraint ck_s_role_scope_shape check ( - (b_scope_type in ('all', 'creator') and b_scope_field_id is null and b_scope_value is null) - or (b_scope_type in ('owner', 'department', 'department-tree') and b_scope_field_id is not null) - or (b_scope_type = 'custom' and b_scope_value is not null) - ) + b_xh int not null default 0, + b_bz nvarchar(2000) null, + b_inputuser_id varchar(50) null, + b_inputdatetime datetime2 default sysutcdatetime(), + b_updateuser_id varchar(50) null, + b_updatedatetime datetime2 null, + b_edit_mode varchar(10) null ); -create index ix_s_role_scope_role on s_role_scope (b_role_id, b_module_id, b_operation, b_canuse); +create index ix_s_module_parent + on dbo.s_module (b_parent_id, b_xh, b_canuse, b_id); + +create index ix_s_module_savetable + on dbo.s_module (b_savetable); ``` -权限运行规则: - -- 默认拒绝:用户必须通过至少一个启用角色取得权限;`b_bypass_power = 1` 的受保护系统角色除外。 -- 多角色权限先合并,任一有效 `deny` 优先于所有 `allow`;没有 `allow` 视为无权。超级管理员角色只能由受保护的系统管理接口分配,不能通过普通角色维护接口创建或提权。 -- 访问数据页需要同时具备菜单 `access`、模块 `read` 和对应操作权限;前端只负责隐藏,后端接口必须按同一权限编码再次校验。 -- 字段权限区分 `view` 与 `edit`。未配置字段权限时继承模块权限;存在字段级 `deny` 时,查询结果必须移除或脱敏该字段,保存接口必须忽略并拒绝提交无编辑权限的字段。 -- 数据范围在操作权限通过后追加。`creator` 匹配记录创建人,`owner/department/department-tree` 通过 `b_scope_field_id` 与当前登录上下文匹配;`custom` 使用结构化 JSON 条件并只允许引用当前模块字段。 -- 用户拥有多个角色时,同一操作的数据范围取并集;同一角色内多个范围记录也取并集,任一角色/范围为 `all` 即不再追加范围条件。没有有效范围记录时,即使拥有操作权限也默认无数据,避免误放开全表。 - -菜单显示继承页面访问权限:用户拥有由 `s_menu.b_code` 派生的菜单访问权限时菜单才显示;前端只控制显示,后端运行时必须再次校验同一个权限编码。 - -### 3.15 s_i18n 多语言 +## 3. 字段和字段布局 ```sql -create table s_i18n ( - b_id bigint not null, -- 雪花主键(应用层生成,全局唯一) - b_key varchar(150) not null, -- 资源 key(如 booking.name) - b_locale varchar(20) not null, -- 语言区域(如 zh-CN/en-US) - b_value nvarchar(500) not null, -- 该语言下的显示文本 - b_i18ntype varchar(20) null, -- 资源类型:module/field/menu/action - b_canuse int not null default 1, -- 是否启用 - constraint pk_s_i18n primary key (b_id), - constraint ux_s_i18n_key_locale unique (b_key, b_locale) +create table dbo.s_field ( + b_module_id varchar(50) not null, + b_field varchar(50) not null, + b_name nvarchar(200) not null, + b_i18n varchar(150) null, + b_type varchar(30) not null, + b_dbtype varchar(30) not null, + b_length int null, + b_precision int null, + b_scale int null, + b_nullable int not null default 1, + b_default_value nvarchar(1000) null, + b_db_default nvarchar(1000) null, + b_writemode varchar(20) not null default 'direct', + b_options nvarchar(max) null, + b_canuse int not null default 1, + b_inputuser_id varchar(50) null, + b_inputdatetime datetime2 default sysutcdatetime(), + b_updateuser_id varchar(50) null, + b_updatedatetime datetime2 null, + primary key (b_module_id, b_field) ); -create index ix_s_i18n_locale on s_i18n (b_locale, b_canuse); +create table dbo.s_field_group ( + b_id uniqueidentifier not null primary key, -- 应用层生成的 UUID + b_module_id varchar(50) not null, + b_parent_id uniqueidentifier null, + b_title nvarchar(200) not null, + b_i18n varchar(150) null, + b_xh int not null default 0, + b_canuse int not null default 1, + b_colspan int not null default 48, + b_layout_direction varchar(10) null default 'vertical' +); + +create index ix_s_field_group_module + on dbo.s_field_group (b_module_id, b_parent_id, b_xh, b_canuse, b_id); + +create table dbo.s_field_view ( + b_module_id varchar(50) not null, + b_field varchar(50) not null, + b_group_id uniqueidentifier null, + b_visible int not null default 1, + b_xh int not null default 0, + b_width int null, + primary key (b_module_id, b_field) +); + +create table dbo.s_field_edit ( + b_module_id varchar(50) not null, + b_field varchar(50) not null, + b_group_id uniqueidentifier null, + b_visible int not null default 1, + b_required int not null default 0, + b_readonly int not null default 0, + b_disabled int not null default 0, + b_xh int not null default 0, + b_width int null, + b_placeholder nvarchar(400) null, + b_colspan int not null default 12, + b_height int null, + primary key (b_module_id, b_field) +); + +create table dbo.s_field_query ( + b_module_id varchar(50) not null, + b_field varchar(50) not null, + b_component varchar(30) null, + b_condition_no int not null default 1, + b_operator varchar(20) not null, + b_default_value nvarchar(1000) null, + b_canuse int not null default 1, + b_xh int not null default 0, + primary key (b_module_id, b_field, b_condition_no) +); ``` -### 3.16 s_log_technical 技术日志 - -用于请求链路、SQL、异常、性能与外部接口排查。高频日志推荐写入 Loki/OpenSearch/Elasticsearch 等日志平台,本表用于集中日志库或短期数据库兜底,不建议长期写入租户业务库。 +## 4. 自动编码 ```sql -create table s_log_technical ( - b_id bigint not null, -- 雪花主键(应用层生成,全局唯一) - b_user_id bigint null, -- 操作用户(逻辑外键) - b_account nvarchar(50) null, -- 登录名快照 - b_sourcetype varchar(20) null, -- 来源类型:web/api - b_loglevel varchar(16) not null, -- 级别:INFO/WARN/ERROR - b_logcategory varchar(64) null, -- 分类:sql/exception/performance - b_operation varchar(100) null, -- 操作名(如 loadData/saveObject) - b_module_code varchar(50) null, -- 相关模块编码 - b_request_id varchar(64) null, -- 请求 ID - b_trace_id varchar(64) null, -- 追踪 ID(串联链路) - b_server_node varchar(128) null, -- 服务节点标识 - b_duration_ms bigint null, -- 耗时(毫秒) - b_result_code varchar(50) null, -- 结果码 - b_error_code varchar(50) null, -- 错误码 - b_error_message nvarchar(2000) null, -- 错误信息 - b_exception_text nvarchar(max) null, -- 异常堆栈(文本) - b_context_text nvarchar(max) null, -- 上下文信息(文本) - b_occurdatetime datetime2 null default sysutcdatetime(), -- 发生时间(UTC) - constraint pk_s_log_technical primary key (b_id) +create table dbo.s_autocode ( + b_module_id varchar(50) not null, + b_field varchar(50) not null, + b_prefix nvarchar(200) not null default N'', + b_dateformat varchar(30) not null default 'yyyyMM', + b_separator nvarchar(20) not null default N'-', + b_seqwidth int not null default 5, + b_resettype varchar(10) not null default 'month', + b_startvalue bigint not null default 1, + b_currentperiod varchar(8) null, + b_currentvalue bigint not null default 0, + b_canuse int not null default 1, + primary key (b_module_id, b_field) ); - -create index ix_s_log_technical_trace on s_log_technical (b_trace_id, b_occurdatetime desc); -create index ix_s_log_technical_level on s_log_technical (b_loglevel, b_occurdatetime desc); ``` -### 3.17 s_log_login 登录日志 - -记录登录成功、失败、退出、刷新令牌与账号锁定等安全事件,可通过 `b_request_id` / `b_trace_id` 与技术日志关联。 +## 5. 模块关系 ```sql -create table s_log_login ( - b_id bigint not null, -- 雪花主键(应用层生成,全局唯一) - b_user_id bigint null, -- 用户(逻辑外键) - b_account nvarchar(50) null, -- 登录名 - b_login_type varchar(20) not null, -- 登录类型:password/token/oidc/ldap - b_login_result int not null default 0, -- 登录结果:0失败/1成功 - b_fail_reason nvarchar(200) null, -- 失败原因 - b_ip varchar(50) null, -- 登录 IP - b_ip_location nvarchar(200) null, -- IP 归属地 - b_browser varchar(100) null, -- 浏览器 - b_browser_version varchar(50) null, -- 浏览器版本 - b_os varchar(100) null, -- 操作系统 - b_os_version varchar(50) null, -- 系统版本 - b_device_type varchar(20) null, -- 设备类型:pc/mobile/tablet - b_user_agent nvarchar(max) null, -- 完整 UA - b_session_id varchar(50) null, -- 会话 ID - b_request_id varchar(64) null, -- 请求 ID - b_trace_id varchar(64) null, -- 追踪 ID - b_occurdatetime datetime2 null default sysutcdatetime(), -- 登录时间(UTC) - constraint pk_s_log_login primary key (b_id) +create table dbo.s_relation ( + b_module_id varchar(50) not null, + b_target_module_id varchar(50) not null, + b_relation_type varchar(20) not null, + b_field varchar(50) not null, + b_target_field varchar(50) not null, + b_foreign_side varchar(10) null, + b_junction_module_id varchar(50) null, + b_junction_field varchar(50) null, + b_junction_target_field varchar(50) null, + b_ownership varchar(20) not null default 'reference', + b_owner_side varchar(10) null, + b_delete_policy varchar(20) null, + b_order_module_id varchar(50) null, + b_order_field varchar(50) null, + b_canuse int not null default 1, + b_xh int not null default 0, + primary key (b_module_id, b_field, b_target_module_id, b_target_field) ); -create index ix_s_log_login_user on s_log_login (b_user_id, b_occurdatetime desc); -create index ix_s_log_login_account on s_log_login (b_account, b_occurdatetime desc); -create index ix_s_log_login_result on s_log_login (b_login_result, b_occurdatetime desc); +create index ix_s_relation_module + on dbo.s_relation (b_module_id, b_canuse, b_xh, b_field, b_target_module_id); + +create index ix_s_relation_target + on dbo.s_relation (b_target_module_id); ``` -### 3.18 业务审计事件与字段变更 - -审计事件与字段变更分表存储:事件一条、字段变更多条,通过 `b_event_id` 关联。字段级明细是**面向客户的硬需求**(客户可在门户查看某个单号发生过哪些字段变更),**字段一旦发生修改即写入明细**,不按字段配置开关;`b_visibility` 控制内部/客户可见。 +## 6. 菜单 ```sql -create table s_log_audit ( - b_id bigint not null, -- 雪花主键(应用层生成,全局唯一) - b_event_code varchar(50) not null, -- 业务事件编码(如 booking.submit) - b_module_code varchar(50) null, -- 模块编码 - b_data_id varchar(50) null, -- 被审计的业务数据 ID - b_business_no varchar(50) null, -- 业务单号(如订舱号) - b_operation varchar(100) null, -- 操作 key(如 saveObject.submit) - b_operator_id bigint null, -- 操作人(逻辑外键) - b_operator_name nvarchar(100) null, -- 操作人名称(快照) - b_source_type varchar(20) not null default 'user', -- 来源类型:user/ai/api - b_visibility varchar(20) not null default 'internal', -- 可见性:internal 内部/customer 客户可见 - b_request_id varchar(64) null, -- 请求 ID - b_trace_id varchar(64) null, -- 追踪 ID(关联技术日志) - b_payload_text nvarchar(max) null, -- 事件载荷(文本,如前后快照) - b_occurdatetime datetime2 null default sysutcdatetime(), -- 发生时间(UTC) - constraint pk_s_log_audit primary key (b_id) +create table dbo.s_menu ( + b_id varchar(50) not null primary key, -- 菜单编码本身 + b_parent_id varchar(50) null, + b_name nvarchar(200) not null, + b_i18n varchar(150) null, + b_menu_type varchar(20) not null, + b_route varchar(200) null, + b_module_id varchar(50) null, + b_icon varchar(50) null, + b_xh int not null default 0, + b_canuse int not null default 1 ); -create index ix_s_log_audit_module on s_log_audit (b_module_code, b_data_id, b_occurdatetime desc); -create index ix_s_log_audit_trace on s_log_audit (b_trace_id); +create index ix_s_menu_parent + on dbo.s_menu (b_parent_id, b_xh, b_canuse, b_id); + +create index ix_s_menu_module + on dbo.s_menu (b_module_id); ``` -字段级变更明细表 `s_log_audit_field`:`b_event_id` 关联审计事件;客户门户查询按单号 + 客户可见过滤。 +## 7. 权限 ```sql -create table s_log_audit_field ( - b_id bigint not null, -- 雪花主键(应用层生成,全局唯一) - b_event_id bigint not null, -- 所属审计事件 - b_module_code varchar(50) null, -- 模块编码 - b_data_id varchar(50) null, -- 业务数据 ID - b_field varchar(50) not null, -- 变更字段(物理列名) - b_field_label nvarchar(100) null, -- 字段标签快照 - b_before_value nvarchar(max) null, -- 变更前原始值 - b_after_value nvarchar(max) null, -- 变更后原始值 - b_before_display nvarchar(500) null, -- 变更前显示值(如引用字段 label) - b_after_display nvarchar(500) null, -- 变更后显示值 - b_visibility varchar(20) not null default 'internal', -- 可见性:internal 内部/customer 客户可见 - constraint pk_s_log_audit_field primary key (b_id), - -- constraint fk_s_log_audit_field_event foreign key (b_event_id) references s_log_audit (b_id) +create table dbo.s_power ( + b_id varchar(50) not null primary key, -- 权限编码本身 + b_name nvarchar(200) not null, + b_i18n varchar(150) null, + b_power_type varchar(20) not null, + b_resource varchar(128) null, + b_module_id varchar(50) null, + b_field varchar(50) null, + b_operation varchar(30) not null, + b_canuse int not null default 1, + b_xh int not null default 0 ); -create index ix_s_log_audit_field_event on s_log_audit_field (b_event_id); -create index ix_s_log_audit_field_customer on s_log_audit_field (b_module_code, b_data_id, b_visibility, b_event_id); +create index ix_s_power_module + on dbo.s_power (b_module_id, b_field, b_canuse); + +create index ix_s_power_resource + on dbo.s_power (b_power_type, b_resource, b_canuse); ``` -## 4. 关键设计决策说明 +## 8. 多语言 -### 4.1 为什么保留 s_module 并删除 s_entity -旧系统已经以 `s_module` 作为配置、查询和保存的核心主体,现有接口、字段表和迁移工具也普遍使用 `b_module_id`。继续拆出 `s_entity` 会增加概念、外键和迁移成本,却没有形成足够独立的业务职责。因此新方案保留 `s_module` 自关联树,由 `category/data/query` 区分分类节点和数据节点;菜单和权限仍保持独立,避免恢复旧系统全部职责混杂的问题。 +```sql +-- b_i18n / b_key 保存完整资源键,不追加 .name 或 .title 后缀: +-- s_module.b_i18n = module. +-- s_field.b_i18n = field.. +-- s_field_group.b_i18n = field_group.. +-- s_menu.b_i18n = menu. -### 4.2 为什么不设置模块依赖表 -当前 `s_module` 不是可独立安装、发布的软件包,因此不额外维护模块依赖 DAG。数据模块之间的引用和主从关系由 `s_relation` 表达,数据库对象依赖由实际表、视图和 Schema Compiler 校验,部署依赖由构建或插件系统管理。 +create table dbo.s_i18n_type ( + b_id varchar(20) not null primary key, -- 语言编码本身 + b_name nvarchar(200) not null, + b_canuse int not null default 1, + b_default int not null default 0, + b_xh int not null default 0 +); -### 4.3 为什么字段定义与页面行为分表 -旧系统的字段、列表、编辑、查询虽然都挂在 `b_module_id` 下,但运行时和管理端都把它们当作四类独立配置。列表与表单的显示、排序、分组并不相同,查询条件也只覆盖部分字段。强行并入 `s_field` 会形成宽表,并混淆数据库列定义与页面行为。因此本方案保留字段定义、列表、表单和查询条件等职责明确的表;列表、表单通过模块 + 字段/分组复合外键保证同模块,查询条件允许通过明确的 `s_relation` 引用关联模块字段。第一阶段查询条件统一使用 `AND`,暂不增加条件组。 +create table dbo.s_i18n ( + b_id varchar(200) not null primary key, -- b_key + ':' + b_locale + b_key varchar(150) not null, + b_locale varchar(20) not null, + b_value nvarchar(1000) not null, + b_i18ntype varchar(20) null, + b_canuse int not null default 1, + b_module_id varchar(50) null, + unique (b_key, b_locale) +); -### 4.4 为什么菜单独立且引用模块 -导航是展示层概念,数据模块是业务数据概念。`s_menu` 引用 `b_module_id`,不重复保存数据源;同一数据模块可以被多个菜单入口引用,但默认共享模块上的同一套字段、列表、表单和查询配置。 +create index ix_s_i18n_module_id + on dbo.s_i18n (b_module_id); -### 4.5 为什么暂不增加页面配置档 -旧系统实际以一个 `data` 模块承载一套字段、列表、编辑和查询配置,没有菜单级字段覆盖机制。当前若再增加 `s_page_profile`、`s_page_field`,会与字段配置表重复,并引入菜单、配置档、模块三者的一致性维护成本。因此第一阶段规定一个数据模块只有一套页面配置。 - -### 4.6 为什么权限引入角色层 -旧系统 `b_user_power` 是用户直挂权限,用户一多授权矩阵爆炸。本方案使用 `s_role` + `s_user_role` + `s_role_power` 管理角色权限,并通过 `s_role_scope` 补充模块级数据范围。权限点 `s_power` 支持 menu/module/action/field 四级粒度,角色权限支持 allow/deny,字段权限支持 view/edit;数据范围按角色取并集,显式 deny 优先,后端在每次请求中重新计算有效权限。 - - -### 4.7 自动编码的并发处理 -`b_currentvalue` 若采用"读-改-写"必然在并发下产生重号。方案要求应用层用原子自增语句取号(`update ... set b_currentvalue = b_currentvalue + 1 output inserted.b_currentvalue`),并把取号与业务保存放同一事务,确保单号不重不漏。 - -### 4.8 日志的写入去向 -三类日志职责不同、量级不同,不建议全部落租户业务库: -- 技术日志高频(每条请求、SQL、异常),推荐写 Loki/ES 等日志平台,`s_log_technical` 仅作集中日志库或短期兜底。 -- 登录日志与业务审计属于安全与合规数据,低频但必须长期留存,落库保存;审计字段明细在字段发生修改时全量写入,不做按字段开关,数据量按变更频率自然收敛。 -- 三类日志统一以 `b_request_id` / `b_trace_id` 串联,便于从业务审计反查技术日志。 - -### 4.9 为什么元数据表主键采用雪花 ID - -配置数据(模块、字段、关系、菜单、权限等)需要跨系统导入导出与搬迁。若使用数据库自增主键,两个系统各自从 1 计数,搬入目标系统后必然 ID 冲突,模块子树下所有引用字段(`b_module_id`、`b_field_id`、`b_relation_id` 等 30+ 处)都必须重映射,而重映射正是搬迁工具中 bug 的高发区。雪花 ID 全局唯一,导出/导入时子树引用原样保留,无需重映射。元数据表行数少,雪花随机写入对聚簇索引的影响可忽略;`b_code` 仍作为跨环境稳定业务键,负责冲突检测与 dev/prod 对齐。业务数据表(模块生成的物理表)和用户表不在此列,用户表见 5.1。 - -## 5. 逻辑外键清单 - -全系统(含元数据表)不建立物理外键;DDL 中的 `fk_*` 约束以注释形式保留,仅作逻辑关系参考,建表时不创建。以下引用统一由服务层校验: - -| 表 | 字段 | 逻辑目标 | -| --- | --- | --- | -| `s_user_role` | `b_user_id` | 当前身份系统的用户 `b_id` | -| `s_menu` | `b_module_id` | 绑定的数据/查询模块 `s_module.b_id` | -| `s_field_group` | `b_parent_id` | 父分组必须与当前分组属于同一数据模块 | -| `s_field_query` | `b_relation_id` | 关联关系必须从查询模块可达条件字段所属模块 | -| `s_menu` | `b_code` | 菜单访问权限资源编码(由菜单编码派生) | -| `s_power` | `b_resource` / `b_operation` | 权限类型、资源和操作必须匹配;field 权限必须引用对应模块字段 | -| `s_role_scope` | `b_scope_field_id` / `b_scope_value` | 数据范围字段和范围值必须与模块及范围类型匹配 | -| `s_relation` | 关系类型与字段组合 | 多对多必须有中间模块;两侧字段必须属于声明的模块 | -| `s_module` | `b_viewtable` / `b_savetable` | Schema Compiler 生成的物理表/视图 | -| `s_log_technical` | `b_user_id` | 当前身份系统的用户 `b_id` | -| `s_log_login` | `b_user_id` | 当前身份系统的用户 `b_id` | -| `s_log_audit` | `b_operator_id` | 当前身份系统的用户 `b_id` | - -逻辑外键写入时应执行以下校验: - -```text -引用是否已启用 --> 目标资源是否存在且类型匹配 --> 字段、分组和关系是否属于正确的数据模块 --> 权限类型、操作、字段和数据范围规则是否匹配 --> 删除或停用前是否仍被其他资源引用 +create index ix_s_i18n_locale + on dbo.s_i18n (b_locale, b_canuse); ``` -### 5.1 用户与身份系统(b_user) +## 9. 日志 -`b_user` 不属于 FMS 业务库,由独立的身份系统维护;FMS 侧只保存用户引用 `b_user_id`(bigint,不透明 ID),不解析账号,也不关心身份系统内部的 ID 生成方案。 +```sql +create table dbo.s_log_technical ( + b_id uniqueidentifier not null primary key, -- 应用层生成的 UUID + b_user_id varchar(50) null, + b_account varchar(50) null, + b_sourcetype varchar(20) null, + b_loglevel varchar(16) not null, + b_logcategory varchar(64) null, + b_operation varchar(100) null, + b_module_id varchar(50) null, + b_request_id varchar(64) null, + b_trace_id varchar(64) null, + b_server_node varchar(128) null, + b_duration_ms bigint null, + b_result_code varchar(50) null, + b_error_code varchar(50) null, + b_error_message nvarchar(4000) null, + b_exception_text nvarchar(max) null, + b_context_text nvarchar(max) null, + b_occurdatetime datetime2 default sysutcdatetime() +); -身份系统用户表约定: +create table dbo.s_log_login ( + b_id uniqueidentifier not null primary key, -- 应用层生成的 UUID + b_user_id varchar(50) null, + b_account varchar(50) null, + b_login_type varchar(20) not null, + b_login_result int not null default 0, + b_fail_reason nvarchar(400) null, + b_ip varchar(50) null, + b_ip_location nvarchar(400) null, + b_browser varchar(100) null, + b_browser_version varchar(50) null, + b_os varchar(100) null, + b_os_version varchar(50) null, + b_device_type varchar(20) null, + b_user_agent nvarchar(max) null, + b_session_id varchar(50) null, + b_request_id varchar(64) null, + b_trace_id varchar(64) null, + b_occurdatetime datetime2 default sysutcdatetime() +); -- `b_id` bigint 主键:单库自增 `identity(1,1)` 即可;若未来用户需要跨系统迁移或合并,再改为全局唯一 ID(如雪花),FMS 侧无需任何改动。 -- `b_account` nvarchar(50) 唯一键:账号是自然键,允许改名;**绝不用账号做主键**。 -- 账号改名只更新用户表自身,引用 `b_user_id` 的业务数据(`s_user_role`、`s_log_*`)不受影响。 -- 日志表冗余保存 `b_account` 快照(`s_log_login.b_account`、`s_log_technical.b_account`),保证改名后历史日志仍可读、可追溯。 +create table dbo.s_log_audit ( + b_id uniqueidentifier not null primary key, -- 应用层生成的 UUID + b_event_code varchar(50) not null, + b_module_id varchar(50) null, + b_data_id varchar(50) null, + b_business_no varchar(50) null, + b_operation varchar(100) null, + b_operator_id varchar(50) null, + b_operator_name nvarchar(200) null, + b_source_type varchar(20) not null default 'user', + b_visibility varchar(20) not null default 'internal', + b_request_id varchar(64) null, + b_trace_id varchar(64) null, + b_payload_text nvarchar(max) null, + b_occurdatetime datetime2 default sysutcdatetime() +); -## 6. 与旧系统的映射对照 +create table dbo.s_log_audit_field ( + b_id uniqueidentifier not null primary key, -- 应用层生成的 UUID + b_event_id uniqueidentifier not null, + b_module_id varchar(50) null, + b_data_id varchar(50) null, + b_field varchar(50) not null, + b_field_label nvarchar(200) null, + b_before_value nvarchar(max) null, + b_after_value nvarchar(max) null, + b_before_display nvarchar(1000) null, + b_after_display nvarchar(1000) null, + b_visibility varchar(20) not null default 'internal' +); -| 旧系统 | 本方案 | 变化 | -| --- | --- | --- | -| `s_module`(含表/路由/菜单/权限) | `s_module` + `s_menu` | 保留模块数据主体,拆出导航与角色权限 | -| `s_module_field` | `s_field` | 字段挂模块 | -| `s_module_field_list` | `s_field_view` | 改为通过字段关联模块 | -| `s_module_field_edit` | `s_field_edit` | 改为通过字段关联模块 | -| `s_module_field_query` | `s_field_query` | 保留平铺查询配置,增加关联字段与同字段多条件 | -| `s_module_field_group` | `s_field_group` | 分组挂模块 | -| `s_module_auto_code` | `s_autocode` | 挂模块+字段,原子取号 | -| `s_module_power` + `b_user_power` | `s_power` + `s_role` + `s_user_role` + `s_role_power` + `s_role_scope` | 引入角色、允许/拒绝和数据范围 | -| `b_i18n` | `s_i18n` | 增加资源类型维度 | -| `s_login_log` | `s_log_login` | 字段扩充(设备/UA/请求链路) | -| (无) | `s_relation` | 新增模块关系 | -| (无) | `s_log_technical` | 新增技术日志(旧系统无) | -| (无) | `s_log_audit` + `s_log_audit_field` | 新增业务审计与字段变更(旧系统无) | +create index ix_s_log_technical_trace + on dbo.s_log_technical (b_trace_id, b_occurdatetime); +create index ix_s_log_login_user + on dbo.s_log_login (b_user_id, b_occurdatetime); + +create index ix_s_log_audit_module + on dbo.s_log_audit (b_module_id, b_data_id, b_occurdatetime); + +create index ix_s_log_audit_field_event + on dbo.s_log_audit_field (b_event_id); +``` + +## 10. 业务表主键约定 + +```sql +create table dbo.b_example ( + b_id bigint not null primary key, -- 应用层雪花 ID + b_inputuser_id varchar(50) null, -- 引用 b_user.b_id + b_inputdatetime datetime2 default sysutcdatetime() +); +``` diff --git a/code/fms/FMS新系统核心表结构设计.pdf b/code/fms/FMS新系统核心表结构设计.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0763050b03e5b97ec33788b1d56df3ab29aee9b5 GIT binary patch literal 152099 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 + ctx.props.draggable && !disabled.value && gripArmed.value ? 'true' : 'false', +) + +/** grip 按下:武装本行拖拽(同步写 DOM,dragstart 可能早于 Vue 的 patch) */ +function armDrag() { + if (disabled.value || !ctx.props.draggable) return + gripArmed.value = true + rowRef.value?.setAttribute('draggable', 'true') + // 按下但没真拖(不会产生 dragend)时的兜底解除 + document.addEventListener('mouseup', disarmDrag, { once: true }) +} +function disarmDrag() { + if (!gripArmed.value) return + gripArmed.value = false + rowRef.value?.setAttribute('draggable', 'false') +} function onDragStart(e) { - if (disabled.value) { + if (disabled.value || !gripArmed.value) { e.preventDefault() return } ctx.onDragStart(props.node, e) } +/** 拖拽结束(无论是否落在合法落点):先解除武装,再让容器清理拖拽态 */ +function onDragEnd(e) { + disarmDrag() + ctx.onDragEnd(e) +} +onBeforeUnmount(() => document.removeEventListener('mouseup', disarmDrag)) + function onDragOver(e) { ctx.onDragOver(props.node, e) } @@ -143,16 +172,23 @@ function onContextMenu(e) { :aria-expanded="leaf ? undefined : expanded" :aria-disabled="disabled || undefined" :tabindex="tabindex" - :draggable="ctx.props.draggable && !disabled ? 'true' : undefined" + :draggable="draggableAttr" @dragstart="onDragStart" @dragover="onDragOver" @dragleave="onDragLeave" @drop="onDrop" + @dragend="onDragEnd" @contextmenu.stop="onContextMenu" > - + + + + appStore.sidebarCollapsed) /* ---- 团队切换 ---- */ @@ -29,76 +27,44 @@ const teams = [ ] const activeTeam = ref(teams[0]) -/* ---- 动态导航菜单(权限模块构建树) ---- */ +/* ---- 导航菜单:固定入口(工作台/组件库)+ s_menu 动态菜单 ---- */ const navMain = computed(() => { const items = [ { title: '工作台', url: '/dashboard', icon: LayoutGrid }, { title: '组件库', url: '/demo', icon: Component }, ] - // 测试页分组:方便演练 Tabs 导航(无权限依赖) - items.push({ - title: '测试页面', - icon: LayoutGrid, - items: [ - { title: '列表', url: '/test/list' }, - { title: '表单', url: '/test/form' }, - { title: '详情', url: '/test/detail' }, - { title: '图表', url: '/test/chart' }, - { title: '表格', url: '/test/table' }, - { title: '设置', url: '/test/settings' }, - ], - }) - - // 系统管理分组(先静态配置,动态菜单/权限后续接入) - items.push({ - title: '系统管理', - icon: Settings, - items: [ - { title: '模块管理', url: '/module/module-management' }, - { title: '菜单管理', url: '/module/menu-management' }, - { title: '多语言类型', url: '/module/i18n-type' }, - ], - }) - - const menuModules = permissionStore.modules.filter( - (m) => m.b_canmenu === 1 && m.b_canuse === 1 && ['directory', 'page'].includes(m.b_module_type), - ) - - if (!menuModules.length) return items - - // 仅保留父节点(若有)也在菜单中的模块 - const allowedIds = new Set(menuModules.map((m) => String(m.b_id))) - const valid = menuModules.filter( - (m) => m.b_parent_id == null || allowedIds.has(String(m.b_parent_id)), - ) - - const cloned = JSON.parse(JSON.stringify(valid)) - const tree = buildTree(cloned) - sortTree(tree) - - for (const node of tree) { - const item = toNavItem(node) + // 动态菜单(s_menu):由「菜单管理」维护的导航树追加渲染。 + // 可见性已在菜单 store 裁剪:非 g3soft 隐藏编码 module 的菜单,空目录不显示 + for (const node of menuStore.visibleMenus) { + const item = toMenuItem(node) if (item) items.push(item) } return items }) -function toNavItem(node) { - const isDir = node.b_module_type === 'directory' - // 与旧系统一致:仅目录项读取图标,页面项只显示文字 - const icon = isDir ? getIcon(node.b_icon) : null +/** s_menu 动态菜单节点 → NavMenuItem 结构(目录/页面/外链,见 NavMenuItem.vue JSDoc) */ +function toMenuItem(node) { + const type = node.b_menu_type + // 页面/外链缺路由地址时不可导航,不渲染(菜单管理保存时已校验必填,这里兜底) + if ((type === 'page' || type === 'external') && !String(node.b_route || '').trim()) return null - const item = { - title: node.b_name || node.b_code, - url: node.b_route ? String(node.b_route) : `#${node.b_code}`, + const item = { title: node.b_name || node.b_code } + if (type === 'external') { + item.external = true + item.url = String(node.b_route).trim() + } else { + item.url = type === 'directory' ? '#' : String(node.b_route).trim() } + if (node.b_code) item.code = String(node.b_code) + + const icon = getIcon(node.b_icon) if (icon) item.icon = icon - if (!isDir && node.b_code) item.moduleId = String(node.b_code) if (node.children?.length) { - item.items = node.children.map((c) => toNavItem(c)).filter(Boolean) + const children = node.children.map((c) => toMenuItem(c)).filter(Boolean) + if (children.length) item.items = children } return item diff --git a/code/fms/fms-vue/src/layouts/components/NavMenuItem.vue b/code/fms/fms-vue/src/layouts/components/NavMenuItem.vue index 3ca7b5c2..637e6be1 100644 --- a/code/fms/fms-vue/src/layouts/components/NavMenuItem.vue +++ b/code/fms/fms-vue/src/layouts/components/NavMenuItem.vue @@ -24,7 +24,8 @@ const appStore = useAppStore() const collapsed = computed(() => appStore.sidebarCollapsed) const isDir = computed(() => Boolean(props.item.items?.length)) -const active = computed(() => !isDir.value && isActive(props.item.url)) +const isExternal = computed(() => props.item.external === true) +const active = computed(() => !isDir.value && !isExternal.value && isActive(props.item.url)) function isActive(url) { if (!url || url === '#') return false @@ -75,6 +76,22 @@ function onToggle() { + + + + {{ + item.title.slice(0, 1) + }} + {{ item.title }} + + import('@/views/login/index.vue'), - meta: { title: '登录' }, - }, - { - path: '/', - component: DefaultLayout, - redirect: '/dashboard', - meta: { requiresAuth: true }, - children: [ - { - path: '/dashboard', - name: 'dashboard', - component: () => import('@/views/dashboard/index.vue'), - meta: { title: '工作台', componentName: 'Dashboard' }, - }, - // 测试页:用于演练 Tabs 导航(无需权限,纯布局验证) - { - path: '/test/list', - name: 'test-list', - component: () => import('@/views/test/TestPage.vue'), - meta: { title: '测试-列表', componentName: 'TestPage' }, - }, - { - path: '/test/form', - name: 'test-form', - component: () => import('@/views/test/TestPage.vue'), - meta: { title: '测试-表单', componentName: 'TestPage' }, - }, - { - path: '/test/detail', - name: 'test-detail', - component: () => import('@/views/test/TestPage.vue'), - meta: { title: '测试-详情', componentName: 'TestPage' }, - }, - { - path: '/test/chart', - name: 'test-chart', - component: () => import('@/views/test/TestPage.vue'), - meta: { title: '测试-图表', componentName: 'TestPage' }, - }, - { - path: '/test/table', - name: 'test-table', - component: () => import('@/views/test/TestPage.vue'), - meta: { title: '测试-表格', componentName: 'TestPage' }, - }, - { - path: '/test/settings', - name: 'test-settings', - component: () => import('@/views/test/TestPage.vue'), - meta: { title: '测试-设置', componentName: 'TestPage' }, - }, - // 组件库演练场:纳入业务布局(带侧栏 / 顶栏 / Tabs) - { - path: '/demo', - name: 'demo', - component: () => import('@/views/demo/index.vue'), - meta: { title: '组件库', componentName: 'Demo' }, - }, - // 附件组件演示 - { - path: '/file-demo', - name: 'file-demo', - component: () => import('@/views/file-demo/index.vue'), - meta: { title: '附件组件演示', componentName: 'FileDemo' }, - }, - // 详情页:同一组件按参数复用,但每个 fullPath 独立缓存、关闭即销毁 - // (per-param 的命名组件由 DefaultLayout 的 getPageWrapper 按路由动态生成) - { - path: '/detail/:id', - name: 'detail', - component: () => import('@/views/detail/DetailPage.vue'), - meta: { title: '详情', cacheByKey: true }, - }, - // 模块管理:元数据驱动的模块配置中心(先静态路由,权限/动态菜单后续接入) - { - path: '/module/module-management', - name: 'module-module-management', - component: () => import('@/views/module/module-management/index.vue'), - meta: { title: '模块管理', componentName: 'ModuleManagement' }, - }, - // 菜单管理:占位页面,待实现 - { - path: '/module/menu-management', - name: 'module-menu-management', - component: () => import('@/views/module/menu-management/index.vue'), - meta: { title: '菜单管理', componentName: 'MenuManagement' }, - }, - // 多语言类型:系统支持的语言清单维护(s_i18n_type) - { - path: '/module/i18n-type', - name: 'module-i18n-type', - component: () => import('@/views/module/i18n-type/index.vue'), - meta: { title: '多语言类型', componentName: 'I18nTypeManagement' }, - }, - // 业务页面后续在此追加,配置 meta.moduleId 后自动走权限校验 - ], - }, - { - path: '/:pathMatch(.*)*', - redirect: '/dashboard', - }, - ], + routes, }) // 登录守卫:未登录访问受保护页跳 /login?redirect=xxx;已登录访问 /login 跳 /dashboard @@ -135,10 +35,14 @@ router.beforeEach(async (to) => { return { path: '/login', query: { redirect: to.fullPath } } } - // 统一在路由守卫加载权限:首屏(/dashboard)与业务页都在挂载前 await 完成, + // 统一在路由守卫加载权限与动态菜单:首屏(/dashboard)与业务页都在挂载前 await 完成, // 菜单一次性到位、不会“跳出”;load 内部按主体去重,重复进入同一主体不重复请求 const permissionStore = usePermissionStore() - await permissionStore.load().catch(() => {}) + const menuStore = useMenuStore() + await Promise.all([ + permissionStore.load().catch(() => {}), + menuStore.load().catch(() => {}), + ]) // 业务数据多语言配置(s_i18n_type 语言清单):随权限一并加载, // 供菜单/模块等多语言编辑读取;内部去重、失败不阻断页面 @@ -149,6 +53,13 @@ router.beforeEach(async (to) => { if (moduleId && !permissionStore.canAccess(moduleId)) { return '/dashboard' } + + // 模块中心(/module/*)是系统管理员的专用页面:非 g3soft 一律拦回工作台。 + // 这是路由层的特殊判断,与菜单树无关(菜单隐藏与路由放行由同一管理员判定决定), + // 避免「菜单上看不见、手输地址却能进」的越权。 + if (to.path.startsWith('/module/') && !permissionStore.isG3soft) { + return '/dashboard' + } } }) diff --git a/code/fms/fms-vue/src/router/routes.js b/code/fms/fms-vue/src/router/routes.js new file mode 100644 index 00000000..83961d58 --- /dev/null +++ b/code/fms/fms-vue/src/router/routes.js @@ -0,0 +1,151 @@ +/** + * 静态路由表(唯一定义处)。 + * + * 单独拆出本文件的原因:「菜单管理」的「路由地址」需要从这里派生可选页面路由, + * 若路由表仍写在 index.js 里,页面组件就会反向依赖「路由实例 + 守卫」模块, + * 形成 页面 → router/index → 守卫 → store 的循环依赖风险。 + * 约定: + * - routes.js :只声明路由表与由其派生的纯数据(无副作用、可被任意模块安全 import) + * - index.js :只负责创建 router 实例、注册守卫、导出默认实例 + */ +import DefaultLayout from '@/layouts/DefaultLayout.vue' + +/** + * 路由表。 + * 受保护页面挂在 DefaultLayout 下(layout 的 meta.requiresAuth 由守卫统一校验); + * 需要按业务模块鉴权的页面,在 meta 上配 moduleId,守卫校验无权限时跳 /dashboard。 + * + * 路由分组(/module、/test):父节点只写 path + redirect + children,**不写 component**。 + * vue-router 的 RouterView 会跳过 matched 中没有 components 的记录,子页面因此仍渲染在 + * DefaultLayout 的那个 router-view 上,keep-alive 层级不变。 + * 切勿给分组节点配「内部再放一个 router-view」的容器组件:那样页面会下沉一层, + * 直接脱离 DefaultLayout 的 keep-alive,页面缓存失效。 + * 子路由 path 写相对路径('module-management'),完整路径由父级拼接, + * 调整分组前缀时只需改父节点一处。 + */ +export const routes = [ + { + path: '/login', + name: 'login', + component: () => import('@/views/login/index.vue'), + meta: { title: '登录' }, + }, + { + path: '/', + component: DefaultLayout, + redirect: '/dashboard', + meta: { requiresAuth: true }, + children: [ + { + path: '/dashboard', + name: 'dashboard', + component: () => import('@/views/dashboard/index.vue'), + meta: { title: '工作台', componentName: 'Dashboard' }, + }, + // 组件库演练场:纳入业务布局(带侧栏 / 顶栏 / Tabs) + { + path: '/demo', + name: 'demo', + component: () => import('@/views/demo/index.vue'), + meta: { title: '组件库', componentName: 'Demo' }, + }, + // 附件组件演示 + { + path: '/file-demo', + name: 'file-demo', + component: () => import('@/views/file-demo/index.vue'), + meta: { title: '附件组件演示', componentName: 'FileDemo' }, + }, + // 详情页:同一组件按参数复用,但每个 fullPath 独立缓存、关闭即销毁 + // (per-param 的命名组件由 DefaultLayout 的 getPageWrapper 按路由动态生成) + { + path: '/detail/:id', + name: 'detail', + component: () => import('@/views/detail/DetailPage.vue'), + meta: { title: '详情', cacheByKey: true }, + }, + // 模块中心:元数据驱动的配置页集合 + // 分组节点(见上方「路由分组」注释:不写 component,子页写相对路径) + { + path: '/module', + redirect: '/module/module-management', + children: [ + // 模块管理:元数据驱动的模块配置中心(先静态路由,权限/动态菜单后续接入) + { + path: 'module-management', + name: 'module-module-management', + component: () => import('@/views/module/module-management/index.vue'), + meta: { title: '模块管理', componentName: 'ModuleManagement' }, + }, + // 菜单管理:占位页面,待实现 + { + path: 'menu-management', + name: 'module-menu-management', + component: () => import('@/views/module/menu-management/index.vue'), + meta: { title: '菜单管理', componentName: 'MenuManagement' }, + }, + // 多语言类型:系统支持的语言清单维护(s_i18n_type) + { + path: 'i18n-type', + name: 'module-i18n-type', + component: () => import('@/views/module/i18n-type/index.vue'), + meta: { title: '多语言类型', componentName: 'I18nTypeManagement' }, + }, + ], + }, + // 业务页面后续在此追加,配置 meta.moduleId 后自动走权限校验 + ], + }, + { + path: '/:pathMatch(.*)*', + redirect: '/dashboard', + }, +] + +/** 不作为菜单入口的路由:独立布局、无需登录即可访问的页面 */ +const EXCLUDED_PATHS = new Set(['/login']) + +/** + * 收集可作为菜单入口的页面路由(递归展开布局容器与分组节点)。 + * 过滤规则: + * - 含 children 的节点(布局容器 / 分组节点)不是最终页面,只向下递归; + * - 含动态段(:id)或通配(*)的路由无法作为固定菜单入口; + * - 登录页等独立布局页排除在外。 + * @param {Array} list 路由节点数组,默认整张路由表 + * @param {string} parentPath 父节点完整路径,用于拼接分组内子路由的相对路径 + * @returns {{ value: string, label: string }[]} 选项(value 为完整 path) + */ +export function collectMenuRoutes(list = routes, parentPath = '') { + const result = [] + for (const route of list || []) { + const rawPath = route.path || '' + // 绝对路径原样使用;相对路径(分组节点的 children)拼到父路径上 + const path = rawPath.startsWith('/') ? rawPath : joinPath(parentPath, rawPath) + if (Array.isArray(route.children) && route.children.length) { + result.push(...collectMenuRoutes(route.children, path)) + continue + } + if (!path.startsWith('/')) continue + if (path.includes(':') || path.includes('*')) continue + if (EXCLUDED_PATHS.has(path)) continue + const title = route.meta?.title + result.push({ value: path, label: title ? `${path}(${title})` : path }) + } + return result +} + +/** 拼接父路径与子路径(相对路径形态):'/module' + 'i18n-type' → '/module/i18n-type' */ +function joinPath(parentPath, childPath) { + const parent = String(parentPath || '').replace(/\/+$/, '') + const child = String(childPath || '').replace(/^\/+/, '') + if (!parent) return child ? `/${child}` : '' + return child ? `${parent}/${child}` : parent +} + +/** + * 菜单管理「路由地址」下拉选项:按路径排序,配合 Select 的本地包含匹配(like)筛选。 + * label 同时含路径与标题,输入 "/module" 或 "模块" 都能命中。 + */ +export const menuRouteOptions = collectMenuRoutes().toSorted((a, b) => + a.value.localeCompare(b.value, 'zh-Hans-CN'), +) diff --git a/code/fms/fms-vue/src/stores/menus.js b/code/fms/fms-vue/src/stores/menus.js new file mode 100644 index 00000000..f3a6bbd2 --- /dev/null +++ b/code/fms/fms-vue/src/stores/menus.js @@ -0,0 +1,120 @@ +import { computed, ref, watch } from 'vue' +import { defineStore } from 'pinia' +import { loadDataApi } from '@/services/api' +import { useAuthStore } from './auth' +import { buildTree, sortTree } from '@/utils/tree' + +/** + * 动态导航菜单 store(侧栏菜单数据源)。 + * + * 菜单树由「菜单管理」维护在 s_menu 表,含目录 / 页面 / 外链三类节点。 + * 可见性规则由前端执行(不改后端): + * - g3soft(管理员)可见全部启用菜单; + * - 其他账号隐藏编码为 module 的菜单(模块管理入口)及其整棵子树; + * - 目录仅当存在可见子菜单时渲染(空目录不显示)。 + * 与权限 store 一致:同一登录主体加载去重、并发请求复用、登录主体切换清空缓存。 + */ +export const useMenuStore = defineStore('menus', () => { + const authStore = useAuthStore() + /** s_menu 原始记录(b_canuse = 1,接口按 b_xh / b_id 排序返回) */ + const rawMenus = ref([]) + const loadedPrincipalKey = ref('') + let loadingPromise = null + let loadingPrincipalKey = '' + let loadVersion = 0 + + const isG3soft = computed(() => { + return ( + String(authStore.loginInfo.user?.account || '') + .trim() + .toLowerCase() === 'g3soft' + ) + }) + + /** + * 加载菜单数据;同一主体重复调用去重,并发调用共享同一请求。 + */ + async function load() { + const userId = String(authStore.loginInfo.user?.id || '') + const principalKey = `${String(authStore.userInfo.orgId || '')}:${userId}` + + if (!authStore.isAuthenticated) return + if (loadedPrincipalKey.value === principalKey) return + if (loadingPromise && loadingPrincipalKey === principalKey) return loadingPromise + + const requestVersion = ++loadVersion + loadingPrincipalKey = principalKey + const request = loadDataApi('s_menu', 'b_canuse = 1', 'b_xh ASC, b_id ASC') + .then((res) => { + if (requestVersion !== loadVersion) return + rawMenus.value = res.data || [] + loadedPrincipalKey.value = principalKey + }) + .finally(() => { + if (requestVersion !== loadVersion) return + loadingPromise = null + loadingPrincipalKey = '' + }) + loadingPromise = request + return request + } + + /** + * 当前主体可见的菜单树(s_menu 原始行结构,含 children 子树)。 + */ + const visibleMenus = computed(() => { + if (!rawMenus.value.length) return [] + const tree = sortTree(buildTree(JSON.parse(JSON.stringify(rawMenus.value)))) + return pruneByAccess(tree) + }) + + /** 递归按可见性裁剪菜单树:非 g3soft 隐藏 module 菜单(含其整棵子树),并剪掉空目录 */ + function pruneByAccess(nodes) { + const result = [] + for (const node of nodes) { + // 模块管理(菜单编码 module)仅 g3soft 可见 + if (!isG3soft.value && String(node.b_code || '').toLowerCase() === 'module') continue + const children = node.children?.length ? pruneByAccess(node.children) : [] + // 目录:没有可访问子菜单时不渲染 + if (node.b_menu_type === 'directory') { + if (children.length) result.push({ ...node, children }) + continue + } + result.push(children.length ? { ...node, children } : { ...node }) + } + return result + } + + function clear() { + // 仅当“正在进行中的请求属于别的主体”时才作废它(如切换账号), + // 否则保留进行中请求、只清空已加载数据,交由后续 load 结果填充。 + const userId = String(authStore.loginInfo.user?.id || '') + const principalKey = `${String(authStore.userInfo.orgId || '')}:${userId}` + if (loadingPrincipalKey && loadingPrincipalKey !== principalKey) { + loadVersion++ + loadingPromise = null + loadingPrincipalKey = '' + } + loadedPrincipalKey.value = '' + rawMenus.value = [] + } + + // 登录主体变化(退出/切换账号)时清空菜单缓存 + watch( + () => [ + authStore.userInfo.orgId, + authStore.loginInfo.user?.id, + authStore.loginInfo.user?.account, + authStore.loginInfo.token, + ], + clear, + ) + + return { + load, + clear, + isG3soft, + rawMenus, + visibleMenus, + } +}) diff --git a/code/fms/fms-vue/src/views/module/menu-management/MenuBasicPanel.vue b/code/fms/fms-vue/src/views/module/menu-management/MenuBasicPanel.vue index c220dc62..30a5ef30 100644 --- a/code/fms/fms-vue/src/views/module/menu-management/MenuBasicPanel.vue +++ b/code/fms/fms-vue/src/views/module/menu-management/MenuBasicPanel.vue @@ -11,6 +11,7 @@ import { computed, ref } from 'vue' import { Languages } from '@lucide/vue' import { Button, Form, FormItem, Input, Select } from '@/components/ui' import IconPicker from '@/components/icon-picker/IconPicker.vue' +import { menuRouteOptions } from '@/router/routes' import { MENU_TYPE_OPTIONS } from './utils' const props = defineProps({ @@ -30,6 +31,21 @@ const maindata = defineModel({ type: Object, default: null }) const isPage = computed(() => maindata.value?.b_menu_type === 'page') const isExternal = computed(() => maindata.value?.b_menu_type === 'external') +/** + * 路由地址候选:由静态路由表(@/router/routes)派生的页面路由, + * Select 的默认筛选即对 label / value 做包含匹配,等价于 like '%关键词%', + * 输入 "/module" 命中路径、输入 "模块" 命中标题。 + * 库里已存但已不在路由表中的旧值(历史数据 / 路由已下线)补进首项, + * 否则它会变成下拉里选不到的孤立值。 + */ +const routeOptions = computed(() => { + const current = String(maindata.value?.b_route ?? '').trim() + if (!current) return menuRouteOptions + return menuRouteOptions.some((option) => option.value === current) + ? menuRouteOptions + : [{ value: current, label: `${current}(已不在路由表中)` }, ...menuRouteOptions] +}) + /* ---------- 校验规则:错误直接显示在对应 FormItem 下方 ---------- */ const formRules = computed(() => ({ b_code: [{ required: true, message: '请填写菜单编码' }], @@ -107,9 +123,15 @@ function onMenuTypeChange(menuType) { @update:model-value="onMenuTypeChange" /> - + - +