72 lines
1.9 KiB
Markdown
72 lines
1.9 KiB
Markdown
# 角色权限迁移说明
|
||
|
||
## 概述
|
||
将角色权限从关系表 `yz_role_menus` 迁移到 `yz_roles` 表的 JSON 数组字段 `menu_ids`。
|
||
|
||
## 迁移步骤
|
||
|
||
### 1. 执行迁移脚本
|
||
```bash
|
||
mysql -u gotest -p gotest < server/database/migrate_role_permissions_to_json.sql
|
||
```
|
||
|
||
或者在 MySQL 客户端中执行:
|
||
```sql
|
||
source server/database/migrate_role_permissions_to_json.sql
|
||
```
|
||
|
||
### 2. 验证迁移结果
|
||
迁移脚本会自动:
|
||
- 在 `yz_roles` 表中添加 `menu_ids` JSON 字段
|
||
- 从 `yz_role_menus` 表迁移数据到 `menu_ids` 字段
|
||
- 创建备份表 `yz_role_menus_backup`
|
||
- 验证迁移结果
|
||
|
||
### 3. 确认数据正确性
|
||
执行以下查询验证数据:
|
||
```sql
|
||
SELECT
|
||
r.role_id,
|
||
r.role_name,
|
||
r.menu_ids,
|
||
JSON_LENGTH(r.menu_ids) as menu_count,
|
||
(SELECT COUNT(*) FROM yz_role_menus_backup WHERE role_id = r.role_id) as old_count
|
||
FROM yz_roles r
|
||
WHERE r.delete_time IS NULL
|
||
ORDER BY r.role_id;
|
||
```
|
||
|
||
### 4. 删除旧表(可选)
|
||
确认数据迁移正确后,可以删除旧的关系表:
|
||
```sql
|
||
DROP TABLE IF EXISTS yz_role_menus;
|
||
```
|
||
|
||
## 回滚方案
|
||
如果迁移出现问题,可以使用回滚脚本:
|
||
```bash
|
||
mysql -u gotest -p gotest < server/database/rollback_role_permissions.sql
|
||
```
|
||
|
||
## 代码变更
|
||
- `server/models/role.go`: 添加 `MenuIds` 字段和 JSON 序列化/反序列化方法
|
||
- `server/models/permission.go`: 更新 `GetRoleMenus` 和 `AssignRolePermissions` 函数
|
||
|
||
## 注意事项
|
||
1. **备份数据**:迁移前请确保已备份数据库
|
||
2. **测试环境**:建议先在测试环境执行迁移
|
||
3. **数据一致性**:迁移后请验证权限分配功能是否正常
|
||
4. **性能影响**:JSON 字段查询性能可能略低于关系表,但简化了数据结构
|
||
|
||
## JSON 字段格式
|
||
`menu_ids` 字段存储格式为 JSON 数组,例如:
|
||
```json
|
||
[1, 2, 3, 4, 5]
|
||
```
|
||
|
||
空数组表示该角色没有任何权限:
|
||
```json
|
||
[]
|
||
```
|
||
|