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

249 lines
8.2 KiB
Markdown
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-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 设计。
## 第一阶段:建立数据库
### 建表脚本
新增:
```text
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. `b_module`
2. `b_module_field`
3. `b_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` 初始化按钮:
```text
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_id`
- `b_module_power.b_id`
- `b_i18n.b_id`
- `b_module.b_id`
`b_module.b_id` 使用不可变雪花 ID;可修改的小写模块编码保存在 `b_module.b_code`。
### 模块保存
前端维护服务器快照和编辑副本,计算 inserts、updates、deletes,然后一次调用 `/data/saveobjt` 保存:
```text
b_module
b_module_field
b_module_power
b_i18n
```
通用保存请求示意:
```json
[
{
"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` 按依赖顺序删除:
```text
b_user_power
b_user_module
b_module_power
b_module_field
b_i18n
b_module
```
## 第四阶段:将 Demo 改为真实页面
### 页面结构
路由由 `/demo/modules` 改为 `/system/modules`,删除“前端原型”标识和 mock 数据。
建议拆分:
```text
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 验收
1. 使用管理员账号登录 G3HD。
2. 进入 `/system/modules`。
3. 新建临时模块,配置两个字段和新增、修改、删除操作权限。
4. 保存并刷新,确认所有配置重新加载。
5. 删除临时模块,确认相关明细和已有个人权限全部清理。
## 完成标准
- 六张表已建立在 `g3hd.properties` 指向的新数据库。
- 页面不再依赖 `moduleDemo.js`。
- 没有新增模块管理专用后端接口。
- 所有查询、保存、取号均复用现有通用接口。
- 模块、字段、操作权限和多语言可以真实保存并重新加载。
- 模块管理页面不提供用户授权功能。
- 前端权限控制正常。