/* ============================================================================ FMS 模块注册脚本 — 用户管理(v_b_user) 目标库:FMS 前置条件: b_user / b_dept 已由 sql/fms_core.sql 建表(核心表,本脚本不重复建表)。 本脚本写入: 1. 查询视图 dbo.v_b_user(含派生列 v_dept_name) 2. s_module 模块行(b_id = v_b_user,挂在 system 目录下) 3. s_field 字段行(12 个) 4. s_module_schema 界面配置(view / edit / query) 5. s_menu_module 绑定(user 菜单 → v_b_user 模块),使侧栏入口具备权限范围 可重复执行:先清理本模块的元数据行,再重建。 ============================================================================ */ SET NOCOUNT ON; GO /* ---------------------------------------------------------------------------- 1. 查询视图 b_view_table 指向本视图;s_field.b_field 必须是视图中真实存在的列。 v_dept_name 为派生列(v_ 前缀约定 => 只读,不参与保存), 写库仍走 s_module.b_save_table = b_user。 ---------------------------------------------------------------------------- */ create or alter view dbo.v_b_user as -- 注意:视图含 b_password(明文),供用户管理页的「查看密码」按钮按需展示。 -- 该列在 view 配置里默认 visible:false,列表默认不显示;点按钮才由前端放开。 -- b_password 只读:保存仍走 b_user,编辑表单的密码字段来源于 s_field 定义。 select u.b_id, u.b_name, u.b_dept_id, d.b_name as v_dept_name, -- 所属部门名称(派生,只读) u.b_password, u.b_bz, u.b_canuse, u.b_logincount, u.b_created_by, u.b_created_at, u.b_updated_by, u.b_updated_at from dbo.b_user u left join dbo.b_dept d on d.b_id = u.b_dept_id; GO /* ---------------------------------------------------------------------------- 2. 模块定义(先清理,保证可重复执行) ---------------------------------------------------------------------------- */ delete from dbo.s_menu_module where b_module_id = 'v_b_user'; GO delete from dbo.s_module_schema where b_module_id = 'v_b_user'; GO delete from dbo.s_field where b_module_id = 'v_b_user'; GO delete from dbo.s_module where b_id = 'v_b_user'; GO /* b_id 即模块编码,前端 usePermissionStore 用 b_id 做权限范围: canPower('v_b_user', 'create') => powerSet.has('v_b_user.create') 因此 b_id 必须与 src/views/system/user/index.vue 里的 MODULE_CODE 一致。 s_module 本身是树:system 为 depth 0,本模块挂其下 depth 1。 b_order_sql 留空表示按主键默认排序。 */ insert into dbo.s_module (b_id, b_parent_id, b_depth, b_path, b_name, b_i18n, b_module_type, b_view_table, b_save_table, b_key_field, b_order_sql, b_canuse, b_xh, b_bz) values ('v_b_user', 'system', 1, '/system/v_b_user/', N'用户管理', 'module.v_b_user', 'data', 'v_b_user', 'b_user', 'b_id', null, 1, 10, N'系统管理 —— 用户列表(部门树过滤由页面负责)'); GO /* ---------------------------------------------------------------------------- 3. 字段定义 b_field 必须存在于 v_b_user;b_type 决定单元格渲染与编辑器: input / number / checkbox / datetime / date(与已有模块保持一致) b_xh 决定默认列顺序,b_name 为中文标题。 ---------------------------------------------------------------------------- */ insert into dbo.s_field (b_module_id, b_field, b_name, b_i18n, b_type, b_canuse, b_xh) values ('v_b_user', 'b_id', N'用户编码', null, 'input', 1, 10), ('v_b_user', 'b_name', N'用户名', null, 'input', 1, 20), ('v_b_user', 'b_dept_id', N'部门编码', null, 'input', 1, 30), ('v_b_user', 'v_dept_name', N'所属部门', null, 'input', 1, 40), -- b_type = password:编辑弹窗渲染为掩码输入框(FmsField 的 typeDefaults 提供 type=password) ('v_b_user', 'b_password', N'密码', null, 'password', 1, 50), ('v_b_user', 'b_canuse', N'是否启用', null, 'checkbox', 1, 60), ('v_b_user', 'b_logincount', N'登录次数', null, 'number', 1, 70), ('v_b_user', 'b_bz', N'备注', null, 'input', 1, 80), ('v_b_user', 'b_created_by', N'创建人', null, 'input', 1, 90), ('v_b_user', 'b_created_at', N'创建时间', null, 'datetime', 1, 100), ('v_b_user', 'b_updated_by', N'最后修改人', null, 'input', 1, 110), ('v_b_user', 'b_updated_at', N'最后修改时间', null, 'datetime', 1, 120); GO /* ---------------------------------------------------------------------------- 4. 界面配置(s_module_schema):view / edit / query 主键为 (b_module_id, b_schema_type)。JSON 结构需与 schemaRender.js 解析一致: view :{ schemaVersion, columns: [ { field, width } | { type:'group', title, children } ] } edit :{ schemaVersion: 2, children: [ RowNode | GroupNode ] } RowNode = { type:'row', children: [ { field, span, required, readonly, defaultValue } ... ] } (行是显式结构:一个行节点 = 表单的一行,行内 sum(span) ≤ 24;不再有 newline 属性) GroupNode = { type:'group', id, title, colspan, cols, children: [ RowNode | GroupNode ] } query :{ schemaVersion: 2, defaultViewCode, views: [ { code, label, order, showCount, conditions } ], keywordSearch: { placeholder, trigger, fields }, quickFilters: [ { field, order } ], filterGroups: [ { code, label, order, fields } ], queryFields: { [field]: { component, operator, defaultValue } } } 这些是「系统默认值」;模块管理页面调整会覆盖它们, 用户个人调整另存于 s_user_module_pref。 ---------------------------------------------------------------------------- */ insert into dbo.s_module_schema (b_module_id, b_schema_type, b_schema_json, b_canuse) values ('v_b_user', 'view', N'{ "schemaVersion": 1, "columns": [ { "field": "b_id", "width": 140 }, { "field": "b_password", "width": 140, "visible": false }, { "field": "b_name", "width": 140 }, { "field": "v_dept_name", "width": 160 }, { "field": "b_canuse", "width": 90 }, { "field": "b_logincount", "width": 100 }, { "field": "b_bz", "width": 200, "visible": false }, { "field": "b_updated_at", "width": 170 } ] }', 1), ('v_b_user', 'edit', N'{ "schemaVersion": 2, "children": [ { "type": "group", "id": "group1", "title": "基本信息", "colspan": 24, "children": [ { "type": "row", "children": [ { "field": "b_id", "span": 24, "required": true } ] }, { "type": "row", "children": [ { "field": "b_name", "span": 24, "required": true } ] }, { "type": "row", "children": [ { "field": "b_dept_id", "span": 24 } ] }, { "type": "row", "children": [ { "field": "b_password", "span": 24, "placeholder": "新增必填;编辑时留空表示不修改" } ] }, { "type": "row", "children": [ { "field": "b_canuse", "span": 24, "defaultValue": 1 } ] }, { "type": "row", "children": [ { "field": "b_bz", "span": 24 } ] } ] } ] }', 1), ('v_b_user', 'query', N'{ "schemaVersion": 2, "defaultViewCode": "all", "views": [ { "code": "all", "label": "全部", "order": 10 }, { "code": "enabled", "label": "启用", "order": 20, "showCount": true, "conditions": [ { "field": "b_canuse", "operator": "eq", "value": 1 } ] }, { "code": "disabled", "label": "停用", "order": 30, "showCount": true, "conditions": [ { "field": "b_canuse", "operator": "eq", "value": 0 } ] }, { "code": "recent", "label": "近三个月变更", "order": 40, "conditions": [ { "field": "b_updated_at", "operator": "between", "value": { "preset": "recent_3_months" } } ] } ], "keywordSearch": { "placeholder": "搜索账号、姓名", "trigger": "enter_or_debounce", "fields": ["b_id", "b_name"] }, "quickFilters": [ { "field": "b_updated_at", "order": 10 }, { "field": "b_canuse", "order": 20 } ], "filterGroups": [ { "code": "basic", "label": "基础信息", "order": 10, "fields": ["b_id", "b_name", "b_dept_id"] } ], "queryFields": { "b_id": { "component": "input", "operator": "like" }, "b_name": { "component": "input", "operator": "like" }, "b_dept_id": { "component": "select", "operator": "eq" }, "b_canuse": { "component": "checkbox", "operator": "eq" }, "b_updated_at": { "component": "datetime", "operator": "between" } } }', 1); GO /* ---------------------------------------------------------------------------- 5. 菜单绑定(s_menu_module) s_menu 中已存在 b_id = 'user' 的 page 菜单(b_route = /system/user)。 这里把该菜单与 v_b_user 模块关联, 使其出现在角色的「菜单权限」树中,可被授权。 若菜单不存在则跳过(不擅自新建菜单行;菜单请用「菜单管理」维护)。 ---------------------------------------------------------------------------- */ if exists (select 1 from dbo.s_menu where b_id = 'user') begin insert into dbo.s_menu_module (b_menu_id, b_module_id, b_xh, b_canuse) values ('user', 'v_b_user', 10, 1); update dbo.s_menu set b_route = '/system/user', b_path = '/system/user/', b_canuse = 1 where b_id = 'user'; print 's_menu_module:已绑定 user 菜单 -> v_b_user 模块'; end else begin print '未发现 b_id = user 的菜单:如需侧栏入口,请在「菜单管理」新建 page 菜单,路由填 /system/user'; end GO /* ---------------------------------------------------------------------------- 6. 自检 ---------------------------------------------------------------------------- */ select N'模块 s_module' as 项, count(*) as 行数 from dbo.s_module where b_id = 'v_b_user' union all select N'字段 s_field', count(*) from dbo.s_field where b_module_id = 'v_b_user' union all select N'界面配置 s_module_schema', count(*) from dbo.s_module_schema where b_module_id = 'v_b_user' union all select N'菜单绑定 s_menu_module', count(*) from dbo.s_menu_module where b_module_id = 'v_b_user' union all select N'视图列 v_b_user', count(*) from sys.columns where object_id = object_id('dbo.v_b_user') union all select N'视图数据行', count(*) from dbo.v_b_user; GO -- 视图内容抽样(确认 v_dept_name 关联可用) select b_id, b_name, b_dept_id, v_dept_name, b_canuse, b_logincount from dbo.v_b_user; GO