20260720172840

This commit is contained in:
oneao committed 2026-07-20 17:28:47 +08:00
1 parent cda7f16d3a
commit 94207c77ff
3117 files changed
+201407 -1236

No files matched your search

+245
View File
@@ -0,0 +1,245 @@
# 模块管理实施计划
## 目标
使用 `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
```
按以下顺序建立表:
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` 直接使用模块代码,不调用取号接口。
### 模块保存
前端维护服务器快照和编辑副本,计算 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`。
- 没有新增模块管理专用后端接口。
- 所有查询、保存、取号均复用现有通用接口。
- 模块、字段、操作权限和多语言可以真实保存并重新加载。
- 模块管理页面不提供用户授权功能。
- 前端权限控制正常。