From 62f71b198d22ad784f73681c8f3a138d65fb2750 Mon Sep 17 00:00:00 2001 From: fengshuonan Date: Fri, 8 Sep 2023 15:26:12 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=908.0=E3=80=91=E3=80=90sys=E3=80=91?= =?UTF-8?q?=E3=80=90role=E3=80=91=E6=9D=83=E9=99=90=E9=99=90=E5=88=B6?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=EF=BC=9A=E7=BB=91=E5=AE=9A=E5=BA=94=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../role/service/impl/RoleBindAppImpl.java | 126 +++++++++++++++--- 1 file changed, 111 insertions(+), 15 deletions(-) diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/RoleBindAppImpl.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/RoleBindAppImpl.java index 56a83ced9..7fe483bac 100644 --- a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/RoleBindAppImpl.java +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/RoleBindAppImpl.java @@ -1,15 +1,20 @@ package cn.stylefeng.roses.kernel.sys.modular.role.service.impl; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenu; import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenuOptions; import cn.stylefeng.roses.kernel.sys.modular.menu.service.SysMenuOptionsService; import cn.stylefeng.roses.kernel.sys.modular.menu.service.SysMenuService; import cn.stylefeng.roses.kernel.sys.modular.role.action.RoleAssignOperateAction; +import cn.stylefeng.roses.kernel.sys.modular.role.action.RoleBindLimitAction; +import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRoleLimit; import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRoleMenu; import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRoleMenuOptions; import cn.stylefeng.roses.kernel.sys.modular.role.enums.PermissionNodeTypeEnum; +import cn.stylefeng.roses.kernel.sys.modular.role.enums.RoleLimitTypeEnum; import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleBindPermissionRequest; +import cn.stylefeng.roses.kernel.sys.modular.role.service.SysRoleLimitService; import cn.stylefeng.roses.kernel.sys.modular.role.service.SysRoleMenuOptionsService; import cn.stylefeng.roses.kernel.sys.modular.role.service.SysRoleMenuService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -17,6 +22,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -28,7 +34,8 @@ import java.util.stream.Collectors; * @since 2023/6/14 14:13 */ @Service -public class RoleBindAppImpl implements RoleAssignOperateAction { +@SuppressWarnings("all") +public class RoleBindAppImpl implements RoleAssignOperateAction, RoleBindLimitAction { @Resource private SysMenuService sysMenuService; @@ -42,6 +49,9 @@ public class RoleBindAppImpl implements RoleAssignOperateAction { @Resource private SysRoleMenuOptionsService sysRoleMenuOptionsService; + @Resource + private SysRoleLimitService sysRoleLimitService; + @Override public PermissionNodeTypeEnum getNodeType() { return PermissionNodeTypeEnum.APP; @@ -54,27 +64,19 @@ public class RoleBindAppImpl implements RoleAssignOperateAction { Long appId = roleBindPermissionRequest.getNodeId(); // 找到所选应用的对应的所有菜单 - LambdaQueryWrapper menuLambdaQueryWrapper = new LambdaQueryWrapper<>(); - menuLambdaQueryWrapper.eq(SysMenu::getAppId, appId); - menuLambdaQueryWrapper.select(SysMenu::getMenuId, SysMenu::getMenuName, SysMenu::getMenuParentId); - List totalMenus = sysMenuService.list(menuLambdaQueryWrapper); - Set totalMenuIds = totalMenus.stream().map(SysMenu::getMenuId).collect(Collectors.toSet()); - - if (ObjectUtil.isEmpty(totalMenus)) { + Set appMenuIds = this.getAppMenuIds(appId); + if (ObjectUtil.isEmpty(appMenuIds)) { return; } // 找到所选应用的对应的所有菜单功能 - LambdaQueryWrapper menuOptionsLambdaQueryWrapper = new LambdaQueryWrapper<>(); - menuOptionsLambdaQueryWrapper.eq(SysMenuOptions::getAppId, appId); - menuOptionsLambdaQueryWrapper.select(SysMenuOptions::getMenuOptionId, SysMenuOptions::getOptionName, SysMenuOptions::getMenuId); - List totalMenuOptions = sysMenuOptionsService.list(menuOptionsLambdaQueryWrapper); + List totalMenuOptions = this.getAppMenuOptions(appId); Set totalMenuOptionIds = totalMenuOptions.stream().map(SysMenuOptions::getMenuOptionId).collect(Collectors.toSet()); // 先删除角色绑定的这些菜单 LambdaQueryWrapper sysRoleMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); sysRoleMenuLambdaQueryWrapper.eq(SysRoleMenu::getRoleId, roleId); - sysRoleMenuLambdaQueryWrapper.in(SysRoleMenu::getMenuId, totalMenuIds); + sysRoleMenuLambdaQueryWrapper.in(SysRoleMenu::getMenuId, appMenuIds); sysRoleMenuService.remove(sysRoleMenuLambdaQueryWrapper); // 删除角色绑定的这些菜单功能 @@ -88,11 +90,11 @@ public class RoleBindAppImpl implements RoleAssignOperateAction { // 如果是选中了应用,则从新绑定这些菜单和功能 if (roleBindPermissionRequest.getChecked()) { List sysRoleMenuList = new ArrayList<>(); - for (SysMenu menuItem : totalMenus) { + for (Long menuId : appMenuIds) { SysRoleMenu sysRoleMenu = new SysRoleMenu(); sysRoleMenu.setRoleId(roleId); sysRoleMenu.setAppId(appId); - sysRoleMenu.setMenuId(menuItem.getMenuId()); + sysRoleMenu.setMenuId(menuId); sysRoleMenuList.add(sysRoleMenu); } this.sysRoleMenuService.saveBatch(sysRoleMenuList); @@ -110,4 +112,98 @@ public class RoleBindAppImpl implements RoleAssignOperateAction { } } + @Override + public PermissionNodeTypeEnum getRoleBindLimitNodeType() { + return this.getNodeType(); + } + + @Override + public void doRoleBindLimitAction(RoleBindPermissionRequest roleBindPermissionRequest) { + + Long roleId = roleBindPermissionRequest.getRoleId(); + Long appId = roleBindPermissionRequest.getNodeId(); + + // 找到所选应用的对应的所有菜单 + Set menuIds = this.getAppMenuIds(appId); + + // 菜单为空,则直接返回 + if (ObjectUtil.isEmpty(menuIds)) { + return; + } + + // 找到所选应用的对应的所有菜单功能 + List totalMenuOptions = this.getAppMenuOptions(appId); + Set menuOptionIds = totalMenuOptions.stream().map(SysMenuOptions::getMenuOptionId).collect(Collectors.toSet()); + + // 组装菜单id和功能id的集合 + List totalBusinessId = ListUtil.list(false, menuIds); + if (ObjectUtil.isNotEmpty(menuOptionIds)) { + totalBusinessId.addAll(menuOptionIds); + } + + // 删除角色绑定的这些菜单限制,以及菜单功能限制 + LambdaQueryWrapper sysRoleLimitLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysRoleLimitLambdaQueryWrapper.eq(SysRoleLimit::getRoleId, roleId); + sysRoleLimitLambdaQueryWrapper.in(SysRoleLimit::getBusinessId, totalBusinessId); + sysRoleLimitService.remove(sysRoleLimitLambdaQueryWrapper); + + // 如果是选中了应用,则从新绑定这些菜单和功能 + if (roleBindPermissionRequest.getChecked()) { + List totalRoleLimit = new ArrayList<>(); + + // 绑定菜单id + for (Long menuId : menuIds) { + SysRoleLimit sysRoleLimit = new SysRoleLimit(); + sysRoleLimit.setRoleId(roleId); + sysRoleLimit.setLimitType(RoleLimitTypeEnum.MENU.getCode()); + sysRoleLimit.setBusinessId(menuId); + totalRoleLimit.add(sysRoleLimit); + } + + // 绑定菜单功能id + if (ObjectUtil.isNotEmpty(menuOptionIds)) { + for (Long optionsId : menuOptionIds) { + SysRoleLimit sysRoleLimit = new SysRoleLimit(); + sysRoleLimit.setRoleId(roleId); + sysRoleLimit.setLimitType(RoleLimitTypeEnum.MENU_OPTIONS.getCode()); + sysRoleLimit.setBusinessId(optionsId); + totalRoleLimit.add(sysRoleLimit); + } + } + + this.sysRoleLimitService.saveBatch(totalRoleLimit); + } + + } + + /** + * 获取应用下的所有菜单id + * + * @author fengshuonan + * @since 2023/9/8 15:03 + */ + private Set getAppMenuIds(Long appId) { + LambdaQueryWrapper menuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + menuLambdaQueryWrapper.eq(SysMenu::getAppId, appId); + menuLambdaQueryWrapper.select(SysMenu::getMenuId); + List totalMenus = sysMenuService.list(menuLambdaQueryWrapper); + if (ObjectUtil.isEmpty(totalMenus)) { + return new HashSet<>(); + } + return totalMenus.stream().map(SysMenu::getMenuId).collect(Collectors.toSet()); + } + + /** + * 获取应用下的所有菜单功能 + * + * @author fengshuonan + * @since 2023/9/8 15:13 + */ + private List getAppMenuOptions(Long appId) { + LambdaQueryWrapper menuOptionsLambdaQueryWrapper = new LambdaQueryWrapper<>(); + menuOptionsLambdaQueryWrapper.eq(SysMenuOptions::getAppId, appId); + menuOptionsLambdaQueryWrapper.select(SysMenuOptions::getMenuOptionId, SysMenuOptions::getMenuId); + return sysMenuOptionsService.list(menuOptionsLambdaQueryWrapper); + } + }