From 08771e831ae00909ebcaab3370fd8cb96ee9adb7 Mon Sep 17 00:00:00 2001 From: smallchill Date: Thu, 4 Jun 2020 22:44:03 +0800 Subject: [PATCH] =?UTF-8?q?:zap:=20=E8=A7=92=E8=89=B2=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E8=8B=A5=E5=8F=96=E6=B6=88=E8=8F=9C=E5=8D=95=E6=9D=83=E9=99=90?= =?UTF-8?q?=EF=BC=8C=E4=BC=9A=E5=90=8C=E6=AD=A5=E5=8F=96=E6=B6=88=E5=85=B6?= =?UTF-8?q?=E5=AD=90=E8=A7=92=E8=89=B2=E5=AF=B9=E5=BA=94=E7=9A=84=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/service/impl/RoleServiceImpl.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) 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; }