Files
workspace/code/fms/sql/fms_module_user.sql
T
2026-09-27 21:59:13 +08:00

229 lines
11 KiB
Transact-SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================================
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