diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java index 76143b51..50aaee47 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java @@ -41,6 +41,7 @@ import org.springframework.validation.annotation.Validated; import javax.validation.constraints.NotEmpty; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -78,6 +79,10 @@ public class RoleServiceImpl extends ServiceImpl implements IR @Override @Transactional(rollbackFor = Exception.class) public boolean grant(@NotEmpty List roleIds, List menuIds, List dataScopeIds, List apiScopeIds) { + return grantRoleMenu(roleIds, menuIds) && grantDataScope(roleIds, dataScopeIds) && grantApiScope(roleIds, apiScopeIds); + } + + private boolean grantRoleMenu(List roleIds, List menuIds) { // 删除角色配置的菜单集合 roleMenuService.remove(Wrappers.update().lambda().in(RoleMenu::getRoleId, roleIds)); // 组装配置 @@ -90,7 +95,26 @@ public class RoleServiceImpl extends ServiceImpl implements IR })); // 新增配置 roleMenuService.saveBatch(roleMenus); + // 递归设置下属角色菜单集合 + recursionRoleMenu(roleIds, menuIds); + return true; + } + private void recursionRoleMenu(List roleIds, List menuIds) { + roleIds.forEach(roleId -> baseMapper.selectList(Wrappers.query().lambda().eq(Role::getParentId, roleId)).forEach(role -> { + List roleMenuList = roleMenuService.list(Wrappers.query().lambda().eq(RoleMenu::getRoleId, role.getId())); + // 子节点过滤出父节点删除的菜单集合 + List collectRoleMenuIds = roleMenuList.stream().map(RoleMenu::getMenuId).filter(menuId -> !menuIds.contains(menuId)).collect(Collectors.toList()); + if (collectRoleMenuIds.size() > 0) { + // 删除子节点权限外的菜单集合 + roleMenuService.remove(Wrappers.update().lambda().eq(RoleMenu::getRoleId, role.getId()).in(RoleMenu::getMenuId, collectRoleMenuIds)); + // 递归设置下属角色菜单集合 + recursionRoleMenu(Collections.singletonList(role.getId()), menuIds); + } + })); + } + + private boolean grantDataScope(List roleIds, List dataScopeIds) { // 删除角色配置的数据权限集合 roleScopeService.remove(Wrappers.update().lambda().eq(RoleScope::getScopeCategory, DATA_SCOPE_CATEGORY).in(RoleScope::getRoleId, roleIds)); // 组装配置 @@ -104,7 +128,10 @@ public class RoleServiceImpl extends ServiceImpl implements IR })); // 新增配置 roleScopeService.saveBatch(roleDataScopes); + return true; + } + private boolean grantApiScope(List roleIds, List apiScopeIds) { // 删除角色配置的接口权限集合 roleScopeService.remove(Wrappers.update().lambda().eq(RoleScope::getScopeCategory, API_SCOPE_CATEGORY).in(RoleScope::getRoleId, roleIds)); // 组装配置 @@ -118,7 +145,6 @@ public class RoleServiceImpl extends ServiceImpl implements IR })); // 新增配置 roleScopeService.saveBatch(roleApiScopes); - return true; }