修复权限操作

This commit is contained in:
2025-12-08 21:36:03 +08:00
parent a4479971a8
commit 0a3c1a2735
5 changed files with 175 additions and 39 deletions
+34 -14
View File
@@ -1002,8 +1002,12 @@ export default function RolePermissions() {
};
extractDisplayPermissions(routesWithPerms);
// 从 getRolePermissions 结果中提取已分配的权限ID(原始ID)
const assignedPermissionIds = rolePermissions.map(p => p.permission_id);
// v3.5: 修复BUG - 只筛选 grant_type=GRANT 的权限
// BUG说明:之前没有检查 grant_type,导致 DENY 的权限也被显示为勾选
// 修改前:const assignedPermissionIds = rolePermissions.map(p => p.permission_id);
const assignedPermissionIds = rolePermissions
.filter(p => p.grant_type === 'GRANT')
.map(p => p.permission_id);
// 存储状态
setRoutePermissionsMap(displayPermMap); // 用于显示
@@ -1282,6 +1286,7 @@ export default function RolePermissions() {
};
// 保存权限 - v3.3: 同时保存路由权限和API权限,仅省级管理员可操作
// v3.5: 增加事务性操作和回滚机制
const handleSavePermissions = async () => {
if (!selectedRole) return;
@@ -1292,6 +1297,11 @@ export default function RolePermissions() {
}
setSavingPermissions(true);
// v3.5: 开始事务性操作,保存原始状态以便回滚
const originalRouteIds = [...selectedRouteIds];
const originalPermissionIds = [...selectedPermissionIds];
try {
// 1. 保存路由权限
const routeResult = await updateRoleRoutePermissions(selectedRole.id, selectedRouteIds);
@@ -1306,25 +1316,35 @@ export default function RolePermissions() {
return;
}
// v3.5: 只有在路由权限保存成功后才保存API权限
// 2. 保存API权限(如果有选中的权限)
let permResult;
if (selectedPermissionIds.length > 0) {
const permResult = await saveRoleApiPermissions(selectedRole.id, selectedPermissionIds);
if (!permResult.success) {
toastService.error(permResult.message);
return;
}
toastService.success(`路由权限保存成功,${permResult.message}`);
permResult = await saveRoleApiPermissions(selectedRole.id, selectedPermissionIds);
} else {
// 没有选中API权限时,清空该角色的所有API权限
const permResult = await saveRoleApiPermissions(selectedRole.id, []);
toastService.success(routeResult.message);
permResult = await saveRoleApiPermissions(selectedRole.id, []);
}
// v3.5: 处理API权限保存失败的情况
if (!permResult.success) {
console.error('API权限保存失败,正在回滚路由权限...');
// 回滚路由权限到原始状态
await updateRoleRoutePermissions(selectedRole.id, originalRouteIds);
toastService.error('权限保存失败,已自动回滚到原始状态');
// 恢复前端状态
setSelectedRouteIds(originalRouteIds);
setSelectedPermissionIds(originalPermissionIds);
return;
}
toastService.success(`路由权限:${routeResult.message} | API权限:${permResult.message}`);
} catch (error) {
console.error("保存权限失败:", error);
toastService.error("保存权限失败");
toastService.error("保存权限失败,已自动回滚到原始状态");
// 发生异常时回滚到原始状态
setSelectedRouteIds(originalRouteIds);
setSelectedPermissionIds(originalPermissionIds);
} finally {
setSavingPermissions(false);
}