mirror of https://gitee.com/stylefeng/roses
【8.0】【sys】【role】更新查询角色菜单增加缓存
parent
e33b663dcf
commit
73998513a1
|
@ -17,6 +17,13 @@
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|
||||||
|
<!-- 事件模块 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.stylefeng.roses</groupId>
|
||||||
|
<artifactId>event-spring-boot-starter</artifactId>
|
||||||
|
<version>${roses.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!--参数校验模块的api-->
|
<!--参数校验模块的api-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.stylefeng.roses</groupId>
|
<groupId>cn.stylefeng.roses</groupId>
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
package cn.stylefeng.roses.kernel.sys.modular.role.cache;
|
|
@ -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<List<Long>> {
|
||||||
|
|
||||||
|
public RoleMenuMemoryCache(TimedCache<String, List<Long>> timedCache) {
|
||||||
|
super(timedCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCommonKeyPrefix() {
|
||||||
|
return RoleConstants.ROLE_MENU_CACHE_PREFIX;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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<List<Long>> {
|
||||||
|
|
||||||
|
public RoleMenuRedisCache(RedisTemplate<String, List<Long>> redisTemplate) {
|
||||||
|
super(redisTemplate);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCommonKeyPrefix() {
|
||||||
|
return RoleConstants.ROLE_MENU_CACHE_PREFIX;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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<List<Long>> roleMenuCache;
|
||||||
|
|
||||||
|
}
|
|
@ -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:";
|
||||||
|
|
||||||
|
}
|
|
@ -1,9 +1,7 @@
|
||||||
package cn.stylefeng.roses.kernel.sys.modular.role.service;
|
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.menu.entity.SysMenu;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRoleMenu;
|
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 com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -16,62 +14,6 @@ import java.util.List;
|
||||||
*/
|
*/
|
||||||
public interface SysRoleMenuService extends IService<SysRoleMenu> {
|
public interface SysRoleMenuService extends IService<SysRoleMenu> {
|
||||||
|
|
||||||
/**
|
|
||||||
* 新增
|
|
||||||
*
|
|
||||||
* @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<SysRoleMenu> 返回结果
|
|
||||||
* @author fengshuonan
|
|
||||||
* @date 2023/06/10 21:29
|
|
||||||
*/
|
|
||||||
List<SysRoleMenu> findList(SysRoleMenuRequest sysRoleMenuRequest);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取列表(带分页)
|
|
||||||
*
|
|
||||||
* @param sysRoleMenuRequest 请求参数
|
|
||||||
* @return PageResult<SysRoleMenu> 返回结果
|
|
||||||
* @author fengshuonan
|
|
||||||
* @date 2023/06/10 21:29
|
|
||||||
*/
|
|
||||||
PageResult<SysRoleMenu> findPage(SysRoleMenuRequest sysRoleMenuRequest);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 给角色绑定某些菜单
|
* 给角色绑定某些菜单
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,14 +1,11 @@
|
||||||
package cn.stylefeng.roses.kernel.sys.modular.role.service.impl;
|
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.collection.ListUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
|
import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
|
||||||
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.sys.api.callback.RemoveMenuCallbackApi;
|
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.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.SysMenu;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenuOptions;
|
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.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.SysRoleMenu;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRoleMenuOptions;
|
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.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.mapper.SysRoleMenuMapper;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleBindPermissionRequest;
|
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.SysRoleMenuOptionsService;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.role.service.SysRoleMenuService;
|
import cn.stylefeng.roses.kernel.sys.modular.role.service.SysRoleMenuService;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
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 com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@ -54,37 +48,8 @@ public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRo
|
||||||
@Resource
|
@Resource
|
||||||
private SysMenuService sysMenuService;
|
private SysMenuService sysMenuService;
|
||||||
|
|
||||||
@Override
|
@Resource(name = "roleMenuCache")
|
||||||
public void add(SysRoleMenuRequest sysRoleMenuRequest) {
|
private CacheOperatorApi<List<Long>> roleMenuCache;
|
||||||
SysRoleMenu sysRoleMenu = new SysRoleMenu();
|
|
||||||
BeanUtil.copyProperties(sysRoleMenuRequest, sysRoleMenu);
|
|
||||||
this.save(sysRoleMenu);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void del(SysRoleMenuRequest sysRoleMenuRequest) {
|
|
||||||
SysRoleMenu sysRoleMenu = this.querySysRoleMenu(sysRoleMenuRequest);
|
|
||||||
this.removeById(sysRoleMenu.getRoleMenuId());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void edit(SysRoleMenuRequest sysRoleMenuRequest) {
|
|
||||||
SysRoleMenu sysRoleMenu = this.querySysRoleMenu(sysRoleMenuRequest);
|
|
||||||
BeanUtil.copyProperties(sysRoleMenuRequest, sysRoleMenu);
|
|
||||||
this.updateById(sysRoleMenu);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SysRoleMenu detail(SysRoleMenuRequest sysRoleMenuRequest) {
|
|
||||||
return this.querySysRoleMenu(sysRoleMenuRequest);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PageResult<SysRoleMenu> findPage(SysRoleMenuRequest sysRoleMenuRequest) {
|
|
||||||
LambdaQueryWrapper<SysRoleMenu> wrapper = createWrapper(sysRoleMenuRequest);
|
|
||||||
Page<SysRoleMenu> sysRolePage = this.page(PageFactory.defaultPage(), wrapper);
|
|
||||||
return PageResultFactory.createPageResult(sysRolePage);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void bindRoleMenus(Long roleId, List<SysMenu> menuList) {
|
public void bindRoleMenus(Long roleId, List<SysMenu> menuList) {
|
||||||
|
@ -113,19 +78,40 @@ public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRo
|
||||||
@Override
|
@Override
|
||||||
public List<Long> getRoleBindMenuIdList(List<Long> roleIdList) {
|
public List<Long> getRoleBindMenuIdList(List<Long> roleIdList) {
|
||||||
|
|
||||||
|
List<Long> result = new ArrayList<>();
|
||||||
|
|
||||||
if (ObjectUtil.isEmpty(roleIdList)) {
|
if (ObjectUtil.isEmpty(roleIdList)) {
|
||||||
return new ArrayList<>();
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
LambdaQueryWrapper<SysRoleMenu> sysRoleMenuLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
for (Long roleId : roleIdList) {
|
||||||
sysRoleMenuLambdaQueryWrapper.in(SysRoleMenu::getRoleId, roleIdList);
|
|
||||||
sysRoleMenuLambdaQueryWrapper.select(SysRoleMenu::getMenuId);
|
String roleIdKey = String.valueOf(roleId);
|
||||||
List<SysRoleMenu> sysRoleMenuList = this.list(sysRoleMenuLambdaQueryWrapper);
|
|
||||||
if (ObjectUtil.isEmpty(sysRoleMenuList)) {
|
// 先从缓存中获取,是否有绑定的菜单
|
||||||
return new ArrayList<>();
|
List<Long> cacheMenuIdList = roleMenuCache.get(roleIdKey);
|
||||||
|
|
||||||
|
if (ObjectUtil.isNotEmpty(cacheMenuIdList)) {
|
||||||
|
result.addAll(cacheMenuIdList);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 缓存中没有,则从数据库中查询
|
||||||
|
LambdaQueryWrapper<SysRoleMenu> sysRoleMenuLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
sysRoleMenuLambdaQueryWrapper.eq(SysRoleMenu::getRoleId, roleId);
|
||||||
|
sysRoleMenuLambdaQueryWrapper.select(SysRoleMenu::getMenuId);
|
||||||
|
List<SysRoleMenu> sysRoleMenuList = this.list(sysRoleMenuLambdaQueryWrapper);
|
||||||
|
if (ObjectUtil.isNotEmpty(sysRoleMenuList)) {
|
||||||
|
|
||||||
|
List<Long> 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
|
@Override
|
||||||
|
@ -136,12 +122,6 @@ public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRo
|
||||||
return this.count(sysRoleMenuLambdaQueryWrapper) > 0;
|
return this.count(sysRoleMenuLambdaQueryWrapper) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<SysRoleMenu> findList(SysRoleMenuRequest sysRoleMenuRequest) {
|
|
||||||
LambdaQueryWrapper<SysRoleMenu> wrapper = this.createWrapper(sysRoleMenuRequest);
|
|
||||||
return this.list(wrapper);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void validateHaveRoleBind(Set<Long> beRemovedRoleIdList) {
|
public void validateHaveRoleBind(Set<Long> beRemovedRoleIdList) {
|
||||||
// none
|
// none
|
||||||
|
@ -224,36 +204,4 @@ public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRo
|
||||||
this.remove(queryWrapper);
|
this.remove(queryWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取信息
|
|
||||||
*
|
|
||||||
* @author fengshuonan
|
|
||||||
* @date 2023/06/10 21:29
|
|
||||||
*/
|
|
||||||
private SysRoleMenu querySysRoleMenu(SysRoleMenuRequest sysRoleMenuRequest) {
|
|
||||||
SysRoleMenu sysRoleMenu = this.getById(sysRoleMenuRequest.getRoleMenuId());
|
|
||||||
if (ObjectUtil.isEmpty(sysRoleMenu)) {
|
|
||||||
throw new ServiceException(SysRoleMenuExceptionEnum.SYS_ROLE_MENU_NOT_EXISTED);
|
|
||||||
}
|
|
||||||
return sysRoleMenu;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建查询wrapper
|
|
||||||
*
|
|
||||||
* @author fengshuonan
|
|
||||||
* @date 2023/06/10 21:29
|
|
||||||
*/
|
|
||||||
private LambdaQueryWrapper<SysRoleMenu> createWrapper(SysRoleMenuRequest sysRoleMenuRequest) {
|
|
||||||
LambdaQueryWrapper<SysRoleMenu> 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue