修复权限操作
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user