From 73998513a1aa1a4c648be31233332a0f2fc164e7 Mon Sep 17 00:00:00 2001 From: fengshuonan Date: Fri, 14 Jul 2023 23:03:56 +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=9B=B4=E6=96=B0=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E8=8F=9C=E5=8D=95=E5=A2=9E=E5=8A=A0=E7=BC=93?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system-business-permission/pom.xml | 7 ++ .../sys/modular/role/cache/package-info.java | 1 + .../cache/rolemenu/RoleMenuMemoryCache.java | 26 ++++ .../cache/rolemenu/RoleMenuRedisCache.java | 26 ++++ .../rolemenu/clear/RoleMenuClearListener.java | 21 ++++ .../modular/role/constants/RoleConstants.java | 16 +++ .../role/service/SysRoleMenuService.java | 58 --------- .../service/impl/SysRoleMenuServiceImpl.java | 118 +++++------------- 8 files changed, 130 insertions(+), 143 deletions(-) create mode 100644 kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/cache/package-info.java create mode 100644 kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/cache/rolemenu/RoleMenuMemoryCache.java create mode 100644 kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/cache/rolemenu/RoleMenuRedisCache.java create mode 100644 kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/cache/rolemenu/clear/RoleMenuClearListener.java create mode 100644 kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/constants/RoleConstants.java diff --git a/kernel-s-system/system-business-permission/pom.xml b/kernel-s-system/system-business-permission/pom.xml index 655972b2e..b14218e44 100644 --- a/kernel-s-system/system-business-permission/pom.xml +++ b/kernel-s-system/system-business-permission/pom.xml @@ -17,6 +17,13 @@ + + + cn.stylefeng.roses + event-spring-boot-starter + ${roses.version} + + cn.stylefeng.roses diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/cache/package-info.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/cache/package-info.java new file mode 100644 index 000000000..cde9dc9aa --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/cache/package-info.java @@ -0,0 +1 @@ +package cn.stylefeng.roses.kernel.sys.modular.role.cache; \ 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/cache/rolemenu/RoleMenuMemoryCache.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/cache/rolemenu/RoleMenuMemoryCache.java new file mode 100644 index 000000000..66ec901d3 --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/cache/rolemenu/RoleMenuMemoryCache.java @@ -0,0 +1,26 @@ +package cn.stylefeng.roses.kernel.sys.modular.role.cache.rolemenu; + +import cn.hutool.cache.impl.TimedCache; +import cn.stylefeng.roses.kernel.cache.memory.AbstractMemoryCacheOperator; +import cn.stylefeng.roses.kernel.sys.modular.role.constants.RoleConstants; + +import java.util.List; + +/** + * 角色绑定菜单的缓存 + * + * @author fengshuonan + * @since 2023/7/14 22:43 + */ +public class RoleMenuMemoryCache extends AbstractMemoryCacheOperator> { + + public RoleMenuMemoryCache(TimedCache> timedCache) { + super(timedCache); + } + + @Override + public String getCommonKeyPrefix() { + return RoleConstants.ROLE_MENU_CACHE_PREFIX; + } + +} \ 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/cache/rolemenu/RoleMenuRedisCache.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/cache/rolemenu/RoleMenuRedisCache.java new file mode 100644 index 000000000..555696c7d --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/cache/rolemenu/RoleMenuRedisCache.java @@ -0,0 +1,26 @@ +package cn.stylefeng.roses.kernel.sys.modular.role.cache.rolemenu; + +import cn.stylefeng.roses.kernel.cache.redis.AbstractRedisCacheOperator; +import cn.stylefeng.roses.kernel.sys.modular.role.constants.RoleConstants; +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.List; + +/** + * 角色绑定菜单的缓存 + * + * @author fengshuonan + * @since 2023/7/14 22:42 + */ +public class RoleMenuRedisCache extends AbstractRedisCacheOperator> { + + public RoleMenuRedisCache(RedisTemplate> redisTemplate) { + super(redisTemplate); + } + + @Override + public String getCommonKeyPrefix() { + return RoleConstants.ROLE_MENU_CACHE_PREFIX; + } + +} diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/cache/rolemenu/clear/RoleMenuClearListener.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/cache/rolemenu/clear/RoleMenuClearListener.java new file mode 100644 index 000000000..73d0fbf15 --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/cache/rolemenu/clear/RoleMenuClearListener.java @@ -0,0 +1,21 @@ +package cn.stylefeng.roses.kernel.sys.modular.role.cache.rolemenu.clear; + +import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 监听角色绑定菜单的事件 + * + * @author fengshuonan + * @since 2023/7/14 22:48 + */ +@Service +public class RoleMenuClearListener { + + @Resource(name = "roleMenuCache") + private CacheOperatorApi> roleMenuCache; + +} diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/constants/RoleConstants.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/constants/RoleConstants.java new file mode 100644 index 000000000..dad474fba --- /dev/null +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/constants/RoleConstants.java @@ -0,0 +1,16 @@ +package cn.stylefeng.roses.kernel.sys.modular.role.constants; + +/** + * 角色的常量 + * + * @author fengshuonan + * @since 2023/7/14 22:37 + */ +public interface RoleConstants { + + /** + * 角色绑定菜单的缓存常量前缀 + */ + String ROLE_MENU_CACHE_PREFIX = "ROLE:MENU:"; + +} diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/SysRoleMenuService.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/SysRoleMenuService.java index 4f7ce7014..8808cd28d 100644 --- a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/SysRoleMenuService.java +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/SysRoleMenuService.java @@ -1,9 +1,7 @@ package cn.stylefeng.roses.kernel.sys.modular.role.service; -import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenu; import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRoleMenu; -import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.SysRoleMenuRequest; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -16,62 +14,6 @@ import java.util.List; */ public interface SysRoleMenuService extends IService { - /** - * 新增 - * - * @param sysRoleMenuRequest 请求参数 - * @author fengshuonan - * @date 2023/06/10 21:29 - */ - void add(SysRoleMenuRequest sysRoleMenuRequest); - - /** - * 删除 - * - * @param sysRoleMenuRequest 请求参数 - * @author fengshuonan - * @date 2023/06/10 21:29 - */ - void del(SysRoleMenuRequest sysRoleMenuRequest); - - /** - * 编辑 - * - * @param sysRoleMenuRequest 请求参数 - * @author fengshuonan - * @date 2023/06/10 21:29 - */ - void edit(SysRoleMenuRequest sysRoleMenuRequest); - - /** - * 查询详情 - * - * @param sysRoleMenuRequest 请求参数 - * @author fengshuonan - * @date 2023/06/10 21:29 - */ - SysRoleMenu detail(SysRoleMenuRequest sysRoleMenuRequest); - - /** - * 获取列表 - * - * @param sysRoleMenuRequest 请求参数 - * @return List 返回结果 - * @author fengshuonan - * @date 2023/06/10 21:29 - */ - List findList(SysRoleMenuRequest sysRoleMenuRequest); - - /** - * 获取列表(带分页) - * - * @param sysRoleMenuRequest 请求参数 - * @return PageResult 返回结果 - * @author fengshuonan - * @date 2023/06/10 21:29 - */ - PageResult findPage(SysRoleMenuRequest sysRoleMenuRequest); - /** * 给角色绑定某些菜单 * diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleMenuServiceImpl.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleMenuServiceImpl.java index 8d65342fb..5d7449492 100644 --- a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleMenuServiceImpl.java +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleMenuServiceImpl.java @@ -1,14 +1,11 @@ package cn.stylefeng.roses.kernel.sys.modular.role.service.impl; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; -import cn.stylefeng.roses.kernel.db.api.factory.PageFactory; -import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory; -import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; -import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException; +import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; import cn.stylefeng.roses.kernel.sys.api.callback.RemoveMenuCallbackApi; import cn.stylefeng.roses.kernel.sys.api.callback.RemoveRoleCallbackApi; +import cn.stylefeng.roses.kernel.sys.api.constants.SysConstants; 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; @@ -17,14 +14,11 @@ import cn.stylefeng.roses.kernel.sys.modular.role.action.RoleAssignOperateAction 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.exception.SysRoleMenuExceptionEnum; import cn.stylefeng.roses.kernel.sys.modular.role.mapper.SysRoleMenuMapper; import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleBindPermissionRequest; -import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.SysRoleMenuRequest; 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; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; @@ -54,37 +48,8 @@ public class SysRoleMenuServiceImpl extends ServiceImpl findPage(SysRoleMenuRequest sysRoleMenuRequest) { - LambdaQueryWrapper wrapper = createWrapper(sysRoleMenuRequest); - Page sysRolePage = this.page(PageFactory.defaultPage(), wrapper); - return PageResultFactory.createPageResult(sysRolePage); - } + @Resource(name = "roleMenuCache") + private CacheOperatorApi> roleMenuCache; @Override public void bindRoleMenus(Long roleId, List menuList) { @@ -113,19 +78,40 @@ public class SysRoleMenuServiceImpl extends ServiceImpl getRoleBindMenuIdList(List roleIdList) { + List result = new ArrayList<>(); + if (ObjectUtil.isEmpty(roleIdList)) { - return new ArrayList<>(); + return result; } - LambdaQueryWrapper sysRoleMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); - sysRoleMenuLambdaQueryWrapper.in(SysRoleMenu::getRoleId, roleIdList); - sysRoleMenuLambdaQueryWrapper.select(SysRoleMenu::getMenuId); - List sysRoleMenuList = this.list(sysRoleMenuLambdaQueryWrapper); - if (ObjectUtil.isEmpty(sysRoleMenuList)) { - return new ArrayList<>(); + for (Long roleId : roleIdList) { + + String roleIdKey = String.valueOf(roleId); + + // 先从缓存中获取,是否有绑定的菜单 + List cacheMenuIdList = roleMenuCache.get(roleIdKey); + + if (ObjectUtil.isNotEmpty(cacheMenuIdList)) { + result.addAll(cacheMenuIdList); + continue; + } + + // 缓存中没有,则从数据库中查询 + LambdaQueryWrapper sysRoleMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysRoleMenuLambdaQueryWrapper.eq(SysRoleMenu::getRoleId, roleId); + sysRoleMenuLambdaQueryWrapper.select(SysRoleMenu::getMenuId); + List sysRoleMenuList = this.list(sysRoleMenuLambdaQueryWrapper); + if (ObjectUtil.isNotEmpty(sysRoleMenuList)) { + + List menuIdListQueryResult = sysRoleMenuList.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList()); + result.addAll(menuIdListQueryResult); + + // 将查询结果加入到缓存中 + roleMenuCache.put(roleIdKey, menuIdListQueryResult, SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS); + } } - return sysRoleMenuList.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList()); + return result; } @Override @@ -136,12 +122,6 @@ public class SysRoleMenuServiceImpl extends ServiceImpl 0; } - @Override - public List findList(SysRoleMenuRequest sysRoleMenuRequest) { - LambdaQueryWrapper wrapper = this.createWrapper(sysRoleMenuRequest); - return this.list(wrapper); - } - @Override public void validateHaveRoleBind(Set beRemovedRoleIdList) { // none @@ -224,36 +204,4 @@ public class SysRoleMenuServiceImpl extends ServiceImpl createWrapper(SysRoleMenuRequest sysRoleMenuRequest) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - - Long roleId = sysRoleMenuRequest.getRoleId(); - queryWrapper.eq(ObjectUtil.isNotNull(roleId), SysRoleMenu::getRoleId, roleId); - - Long menuId = sysRoleMenuRequest.getMenuId(); - queryWrapper.eq(ObjectUtil.isNotNull(menuId), SysRoleMenu::getMenuId, menuId); - - return queryWrapper; - } - } \ No newline at end of file