From 4b0b03750124dea198dd811fa18bb013530bd63b Mon Sep 17 00:00:00 2001 From: fengshuonan Date: Tue, 23 Jan 2024 14:42:12 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=908.1.0=E3=80=91=E3=80=90role=E3=80=91?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=80=E4=B8=AA=E5=88=B7=E6=96=B0=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E6=9D=83=E9=99=90=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../role/service/SysRoleLimitService.java | 10 +++++ .../modular/role/service/SysRoleService.java | 9 ++++ .../service/impl/SysRoleLimitServiceImpl.java | 44 +++++++++++++++++-- .../role/service/impl/SysRoleServiceImpl.java | 38 +++++++++++++++- 4 files changed, 95 insertions(+), 6 deletions(-) diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/SysRoleLimitService.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/SysRoleLimitService.java index cc0c9d345..a7a2e163c 100644 --- a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/SysRoleLimitService.java +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/SysRoleLimitService.java @@ -6,6 +6,8 @@ import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleBindPermissio import cn.stylefeng.roses.kernel.sys.modular.role.pojo.response.RoleBindPermissionResponse; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.Set; + /** * 角色权限限制 服务类 * @@ -30,4 +32,12 @@ public interface SysRoleLimitService extends IService, SysRoleLimi */ void updateRoleBindLimit(RoleBindPermissionRequest roleBindPermissionRequest); + /** + * 更新角色的权限范围 + * + * @author fengshuonan + * @since 2024-01-23 14:22 + */ + void updateRoleLimit(Long roleId, Set menuIdList, Set menuOptionIdList); + } \ No newline at end of file diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/SysRoleService.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/SysRoleService.java index 2aaf2add9..f41bf58bb 100644 --- a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/SysRoleService.java +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/SysRoleService.java @@ -8,6 +8,7 @@ import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.SysRoleRequest; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; +import java.util.Set; /** * 系统角色 服务类 @@ -119,4 +120,12 @@ public interface SysRoleService extends IService, SysRoleServiceApi { */ List userAssignRoleList(SysRoleRequest sysRoleRequest); + /** + * 将指定角色id,进行权限刷新,从新绑定对应的菜单和功能,并将角色权限范围也绑定指定的功能id + * + * @author fengshuonan + * @since 2024-01-23 13:59 + */ + void refreshRoleAuth(Set roleIdList, Set menuIdList, Set menuOptionIdList); + } \ No newline at end of file diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleLimitServiceImpl.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleLimitServiceImpl.java index 1992e3115..41bf8e9ba 100644 --- a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleLimitServiceImpl.java +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleLimitServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; 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.enums.RoleLimitTypeEnum; import cn.stylefeng.roses.kernel.sys.modular.role.factory.PermissionAssignFactory; import cn.stylefeng.roses.kernel.sys.modular.role.mapper.SysRoleLimitMapper; import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleBindPermissionRequest; @@ -14,12 +15,10 @@ import cn.stylefeng.roses.kernel.sys.modular.role.service.SysRoleLimitService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -58,6 +57,43 @@ public class SysRoleLimitServiceImpl extends ServiceImpl menuIdList, Set menuOptionIdList) { + + // 删除角色所绑定的权限范围 + LambdaQueryWrapper sysRoleLimitLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysRoleLimitLambdaQueryWrapper.eq(SysRoleLimit::getRoleId, roleId); + this.remove(sysRoleLimitLambdaQueryWrapper); + + // 初始化菜单id列表数据 + List sysRoleLimits = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(menuIdList)) { + for (Long menuId : menuIdList) { + SysRoleLimit sysRoleLimit = new SysRoleLimit(); + sysRoleLimit.setRoleId(roleId); + sysRoleLimit.setLimitType(RoleLimitTypeEnum.MENU.getCode()); + sysRoleLimit.setBusinessId(menuId); + sysRoleLimits.add(sysRoleLimit); + } + } + + // 初始化菜单功能id列表的数据 + if (ObjectUtil.isNotEmpty(menuOptionIdList)) { + for (Long menuOptionId : menuOptionIdList) { + SysRoleLimit sysRoleLimit = new SysRoleLimit(); + sysRoleLimit.setRoleId(roleId); + sysRoleLimit.setLimitType(RoleLimitTypeEnum.MENU_OPTIONS.getCode()); + sysRoleLimit.setBusinessId(menuOptionId); + sysRoleLimits.add(sysRoleLimit); + } + } + + if (ObjectUtil.isNotEmpty(sysRoleLimits)) { + this.saveBatch(sysRoleLimits); + } + } + /** * 获取角色绑定的限制列表(包含限制的菜单id和限制的菜单功能id) * diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleServiceImpl.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleServiceImpl.java index 9de0d285a..6d5a72055 100644 --- a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleServiceImpl.java +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleServiceImpl.java @@ -18,12 +18,17 @@ import cn.stylefeng.roses.kernel.sys.api.constants.SysConstants; import cn.stylefeng.roses.kernel.sys.api.enums.permission.DataScopeTypeEnum; import cn.stylefeng.roses.kernel.sys.api.enums.role.RoleTypeEnum; import cn.stylefeng.roses.kernel.sys.api.pojo.role.SysRoleDTO; +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.entity.SysRole; import cn.stylefeng.roses.kernel.sys.modular.role.enums.exception.SysRoleExceptionEnum; import cn.stylefeng.roses.kernel.sys.modular.role.mapper.SysRoleMapper; import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.SysRoleRequest; +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 cn.stylefeng.roses.kernel.sys.modular.role.service.SysRoleService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -53,6 +58,15 @@ public class SysRoleServiceImpl extends ServiceImpl impl @Resource private SysMenuOptionsService sysMenuOptionsService; + @Resource + private SysRoleMenuService sysRoleMenuService; + + @Resource + private SysMenuService sysMenuService; + + @Resource + private SysRoleLimitService sysRoleLimitService; + @Override public void add(SysRoleRequest sysRoleRequest) { @@ -169,8 +183,7 @@ public class SysRoleServiceImpl extends ServiceImpl impl LambdaQueryWrapper wrapper = createWrapper(sysRoleRequest); // 只查询需要的字段 - wrapper.select(SysRole::getRoleName, SysRole::getRoleCode, SysRole::getRoleSort, SysRole::getRoleId, BaseEntity::getCreateTime, - SysRole::getRoleType, SysRole::getRoleCompanyId); + wrapper.select(SysRole::getRoleName, SysRole::getRoleCode, SysRole::getRoleSort, SysRole::getRoleId, BaseEntity::getCreateTime, SysRole::getRoleType, SysRole::getRoleCompanyId); // 非管理员用户只能查看自己创建的角色 this.filterRolePermission(wrapper, sysRoleRequest); @@ -255,6 +268,27 @@ public class SysRoleServiceImpl extends ServiceImpl impl return this.list(wrapper); } + @Override + public void refreshRoleAuth(Set roleIdList, Set menuIdList, Set menuOptionIdList) { + + // 获取菜单的appId和menuId + List totalMenus = sysMenuService.getTotalMenus(menuIdList); + + // 获取菜单功能的填充信息 + List totalMenuOptionsList = sysMenuOptionsService.getTotalMenuOptionsList(menuOptionIdList); + + for (Long roleId : roleIdList) { + // 绑定角色的菜单 + sysRoleMenuService.bindRoleMenus(roleId, totalMenus); + + // 绑定角色菜单功能 + sysRoleMenuOptionsService.bindRoleMenuOptions(roleId, totalMenuOptionsList); + + // 更新角色的权限范围 + this.sysRoleLimitService.updateRoleLimit(roleId, menuIdList, menuOptionIdList); + } + } + @Override public List permissionGetRoleList(SysRoleRequest sysRoleRequest) { LambdaQueryWrapper wrapper = this.createWrapper(sysRoleRequest);