Files
workspace/code/fms/模块管理实施计划.md
T
2026-07-26 22:52:21 +08:00

8.2 KiB
Raw Blame History

模块管理实施计划

目标

使用 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
fms-api/config/migrations/002_module_order_condition.sql
fms-api/config/migrations/003_module_surrogate_key.sql

按以下顺序建立表:

  1. s_module
  2. s_module_field
  3. s_module_power
  4. b_user_module
  5. b_user_power
  6. b_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 s_module
模块字段 /data/loaddata s_module_field
操作权限定义 /data/loaddata s_module_power
多语言 /data/loaddata b_i18n
删除依赖检查 /data/loaddata b_user_module、b_user_power

配置数据量较小,模块、字段和操作权限可以一次加载后在前端按 b_module_id 分组,减少来回请求。

雪花 ID

新增以下数据前调用 /data/nextid:

  • s_module_field.b_id
  • s_module_power.b_id
  • b_i18n.b_id
  • s_module.b_id

s_module.b_id 使用不可变雪花 ID;可修改的小写模块编码保存在 s_module.b_code。

模块保存

前端维护服务器快照和编辑副本,计算 inserts、updates、deletes,然后一次调用 /data/saveobjt 保存:

s_module
s_module_field
s_module_power
b_i18n

通用保存请求示意:

[
  {
    "table": "s_module",
    "key_field": "b_id",
    "updates": []
  },
  {
    "table": "s_module_field",
    "key_field": "b_id",
    "inserts": [],
    "updates": [],
    "deletes": []
  }
]

前端保存前校验:

  • 模块代码使用小写字母、数字和下划线,且在模块间唯一。
  • 父节点存在且不会形成循环。
  • 目录、页面、数据模块字段组合合法。
  • 同一模块字段名和按钮编码不重复。
  • 表名、视图名和字段名只允许合法数据库标识符。

数据库外键、唯一约束和检查约束负责最后兜底,任一表失败时由现有 DataSaveService 回滚整个请求。

模块删除

  • m_system 和 m_module 在前端禁止删除。
  • 存在下级模块时禁止删除。
  • 普通模块删除时,一次 /data/saveobjt 按依赖顺序删除:
b_user_power
b_user_module
s_module_power
s_module_field
b_i18n
s_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 和可用的 s_module,在前端构建菜单树。

  • 只显示 b_canmenu = 1、b_canuse = 1 且用户有权限的页面。
  • 上级目录根据可访问下级页面自动显示。
  • 路由组件仍由前端白名单注册,数据库路由不能动态加载任意组件文件。
  • 通用接口加载失败时保留现有静态菜单作为降级。

前端权限

  • 路由通过 meta.moduleCode 声明页面对应的模块代码。
  • 用户没有 b_user_module 记录时禁止进入对应页面。
  • 页面操作根据 b_user_power 中的 create、update、delete 权限禁用。
  • 本阶段不改通用后端接口,也不做后端权限拦截;后端校验后续单独实施。

第五阶段:测试与验收

后端

  • JWT 能正确取得用户雪花 ID。
  • 多表保存失败时整体回滚。
  • 非法表名和字段名被现有通用接口拒绝,权限引用由数据库外键约束兜底。
  • bigint 仍以字符串返回前端。

前端

  • 模块、字段、操作权限和多语言可以新增、修改、删除并刷新恢复。
  • 模块树搜索、切换和取消操作正常。
  • 加载失败、保存失败和空状态显示正确。

G3HD 验收

  1. 使用管理员账号登录 G3HD。
  2. 进入 /system/modules。
  3. 新建临时模块,配置两个字段和新增、修改、删除操作权限。
  4. 保存并刷新,确认所有配置重新加载。
  5. 删除临时模块,确认相关明细和已有个人权限全部清理。

完成标准

  • 六张表已建立在 g3hd.properties 指向的新数据库。
  • 页面不再依赖 moduleDemo.js。
  • 没有新增模块管理专用后端接口。
  • 所有查询、保存、取号均复用现有通用接口。
  • 模块、字段、操作权限和多语言可以真实保存并重新加载。
  • 模块管理页面不提供用户授权功能。
  • 前端权限控制正常。