# 角色权限迁移说明 ## 概述 将角色权限从关系表 `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 [] ```