8.0 KiB
模块管理实施计划
目标
使用 fms-api/config/dbconfigs/g3hd.properties 指向的新数据库建立模块管理表结构,并将 ModuleManageDemo.vue 改造成真实页面。
本阶段只实现《新数据库结构.md》中的六张表,不实现 select 的选项来源和模块关联。
实施原则
- 不新增模块管理专用后端接口。
- 查询复用
/data/loaddata和/data/page。 - 保存复用
/data/saveobjt,一次请求完成多表事务。 - 雪花 ID 复用
/data/nextid。 - 不使用
/data/loaddatabysql拼接模块管理 SQL。 - 只操作
g3hd.properties指向的fms数据库,不修改旧数据库。 - 真实页面沿用 Demo 的左树右工作区和 Antdv Next Tree、Form、Table 设计。
第一阶段:建立数据库
建表脚本
新增:
fms-api/config/migrations/001_module_management.sql
按以下顺序建立表:
b_moduleb_module_fieldb_module_powerb_user_moduleb_user_powerb_i18n
脚本包含:
- 主键、外键、唯一约束和布尔字段
0/1检查约束。 - 模块树、字段列表和个人权限所需索引。
XACT_ABORT ON和显式事务。IF NOT EXISTS,保证脚本可以重复执行。- 不删除、不修改任何已有业务表。
初始化数据
初始化:
| 模块 | 类型 | 路由 |
|---|---|---|
M_SYSTEM |
directory |
- |
M_MODULE |
page |
/system/modules |
为 M_MODULE 初始化按钮:
create 新增模块
update 修改模块
delete 删除模块
grant 用户授权
根据明确的管理员账号从 b_user 取得用户雪花 ID,写入该用户的 b_user_module 和四项 b_user_power。找不到管理员时终止初始化,不能默认给所有用户授权。
执行和验证
- 从
g3hd.properties读取连接信息,密码不打印到日志。 - 使用 PowerShell
.NET SqlClient执行脚本(本机旧版sqlcmd无法完成 TLS 握手)。 - 执行前确认目标为
118.89.70.199:1433 / fms。 - 连续执行两次,第二次不得重复建表或重复初始化。
- 查询 SQL Server 系统表核对字段、约束、外键和索引。
第二阶段:登录用户信息
当前 JWT 使用登录账号,新权限表使用 b_user.b_id,需要调整:
- 登录时同时保留用户雪花 ID、账号和姓名。
- JWT 继续使用账号作为会话标识。
- 登录响应返回
id、account和name。
本阶段不修改通用查询和保存接口的请求格式,也不在后端执行模块权限校验。
第三阶段:使用通用接口完成数据闭环
数据加载
页面通过现有接口加载:
| 数据 | 接口 | 数据源 |
|---|---|---|
| 模块树 | /data/loaddata |
b_module |
| 模块字段 | /data/loaddata |
b_module_field |
| 操作权限定义 | /data/loaddata |
b_module_power |
| 多语言 | /data/loaddata |
b_i18n |
| 删除依赖检查 | /data/loaddata |
b_user_module、b_user_power |
配置数据量较小,模块、字段和操作权限可以一次加载后在前端按 b_module_id 分组,减少来回请求。
雪花 ID
新增以下数据前调用 /data/nextid:
b_module_field.b_idb_module_power.b_idb_i18n.b_id
b_module.b_id 直接使用模块代码,不调用取号接口。
模块保存
前端维护服务器快照和编辑副本,计算 inserts、updates、deletes,然后一次调用 /data/saveobjt 保存:
b_module
b_module_field
b_module_power
b_i18n
通用保存请求示意:
[
{
"table": "b_module",
"key_field": "b_id",
"updates": []
},
{
"table": "b_module_field",
"key_field": "b_id",
"inserts": [],
"updates": [],
"deletes": []
}
]
前端保存前校验:
- 模块代码格式正确且创建后不可修改。
- 父节点存在且不会形成循环。
- 目录、页面、数据模块字段组合合法。
- 同一模块字段名和按钮编码不重复。
- 表名、视图名和字段名只允许合法数据库标识符。
数据库外键、唯一约束和检查约束负责最后兜底,任一表失败时由现有 DataSaveService 回滚整个请求。
模块删除
M_SYSTEM和M_MODULE在前端禁止删除。- 存在下级模块时禁止删除。
- 普通模块删除时,一次
/data/saveobjt按依赖顺序删除:
b_user_power
b_user_module
b_module_power
b_module_field
b_i18n
b_module
第四阶段:将 Demo 改为真实页面
页面结构
路由由 /demo/modules 改为 /system/modules,删除“前端原型”标识和 mock 数据。
建议拆分:
views/module-management/ModuleManagementView.vue
views/module-management/components/ModuleTreePanel.vue
services/moduleManagement.js
services/moduleManagement.js 只组合现有 loadDataApi、saveObjectApi 和 nextIdApi,不增加新的后端地址。
页面功能
- 左侧模块树支持搜索、新增目录和新增模块。
- 左侧模块树只保留单个新增菜单,不直接显示目录、页面、数据三个按钮。
- 模块管理界面只区分目录和普通模块:目录使用独立表单,新增目录使用 Dialog。
- 页面模块和数据模块共用普通模块编辑器;配置页面路由时保存为
page,否则保存为data,不直接编辑模块类型。 - 基本信息、字段、操作权限和多语言全部读取真实数据库。
- 字段、操作权限和多语言内容区独立滚动,页面外层不随数据量滚动。
- 字段和操作权限采用点击行进入编辑、离开行退出编辑的单行编辑方式。
- 字段名称支持在字段行内快速维护多语言文本。
- 增加保存、取消和删除操作,当前阶段不显示未保存提示。
- 保存失败时保留编辑内容并显示后端错误。
- 字段编码、操作权限编码和模块代码使用明确的表单校验。
- 删除字段、操作权限和模块使用确认框。
- 修复 Demo 菜单预览使用不存在
id作为 Vue key 的问题。 - 保存成功后重新加载模块树和当前模块。
菜单
AppSidebar 通过现有通用查询接口读取当前用户的 b_user_module 和可用的 b_module,在前端构建菜单树。
- 只显示
b_canmenu = 1、b_canuse = 1且用户有权限的页面。 - 上级目录根据可访问下级页面自动显示。
- 路由组件仍由前端白名单注册,数据库路由不能动态加载任意组件文件。
- 通用接口加载失败时保留现有静态菜单作为降级。
前端权限
- 路由通过
meta.moduleCode声明页面对应的模块代码。 - 用户没有
b_user_module记录时禁止进入对应页面。 - 页面操作根据
b_user_power中的create、update、delete权限禁用。 - 本阶段不改通用后端接口,也不做后端权限拦截;后端校验后续单独实施。
第五阶段:测试与验收
后端
- JWT 能正确取得用户雪花 ID。
- 多表保存失败时整体回滚。
- 非法表名和字段名被现有通用接口拒绝,权限引用由数据库外键约束兜底。
bigint仍以字符串返回前端。
前端
- 模块、字段、操作权限和多语言可以新增、修改、删除并刷新恢复。
- 模块树搜索、切换和取消操作正常。
- 加载失败、保存失败和空状态显示正确。
G3HD 验收
- 使用管理员账号登录 G3HD。
- 进入
/system/modules。 - 新建临时模块,配置两个字段和新增、修改、删除操作权限。
- 保存并刷新,确认所有配置重新加载。
- 删除临时模块,确认相关明细和已有个人权限全部清理。
完成标准
- 六张表已建立在
g3hd.properties指向的新数据库。 - 页面不再依赖
moduleDemo.js。 - 没有新增模块管理专用后端接口。
- 所有查询、保存、取号均复用现有通用接口。
- 模块、字段、操作权限和多语言可以真实保存并重新加载。
- 模块管理页面不提供用户授权功能。
- 前端权限控制正常。