200 lines
8.6 KiB
Transact-SQL
200 lines
8.6 KiB
Transact-SQL
/* ============================================================================
|
||
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。列表接口按视图 SELECT 返回行,带上密码等于把
|
||
-- 全员口令(现为明文存储)随分页数据一起下发,抓包/DevTools 即可见。
|
||
-- 密码只在编辑表单里录入,来源于 s_field 定义,不需要出现在查询视图里。
|
||
select u.b_id,
|
||
u.b_name,
|
||
u.b_dept_id,
|
||
d.b_name as v_dept_name, -- 所属部门名称(派生,只读)
|
||
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, children: [ { field, span, required, readonly, defaultValue }
|
||
| { type:'group', ... } ] }
|
||
query :{ schemaVersion, groups: [ { conditions: [ { field, operator } ] } ], quick: [field] }
|
||
|
||
这些是「系统默认值」;模块管理页面调整会覆盖它们,
|
||
用户个人调整另存于 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_name", "width": 140 },
|
||
{ "field": "v_dept_name", "width": 160 },
|
||
{ "field": "b_canuse", "width": 90 },
|
||
{ "field": "b_logincount", "width": 100 },
|
||
{ "field": "b_bz", "width": 200 },
|
||
{ "field": "b_updated_at", "width": 170 }
|
||
]
|
||
}', 1),
|
||
('v_b_user', 'edit', N'{
|
||
"schemaVersion": 1,
|
||
"children": [
|
||
{ "type": "group", "title": "基本信息", "span": 48, "children": [
|
||
{ "field": "b_id", "span": 24, "required": true },
|
||
{ "field": "b_name", "span": 24, "required": true },
|
||
{ "field": "b_dept_id", "span": 24 },
|
||
{ "field": "b_password", "span": 24, "placeholder": "新增必填;编辑时留空表示不修改" },
|
||
{ "field": "b_canuse", "span": 24, "defaultValue": 1 },
|
||
{ "field": "b_bz", "span": 48 }
|
||
] }
|
||
]
|
||
}', 1),
|
||
('v_b_user', 'query', N'{
|
||
"schemaVersion": 1,
|
||
"groups": [
|
||
{ "conditions": [
|
||
{ "field": "b_id", "operator": "like" },
|
||
{ "field": "b_name", "operator": "like" }
|
||
] }
|
||
],
|
||
"quick": ["b_id", "b_name"]
|
||
}', 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
|