【8.0】【sys】【role】更新查询角色菜单增加缓存

pull/57/head
fengshuonan 2023-07-14 23:03:56 +08:00
parent e33b663dcf
commit 73998513a1
8 changed files with 130 additions and 143 deletions

View File

@ -17,6 +17,13 @@
<dependencies>
<!-- 事件模块 -->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>event-spring-boot-starter</artifactId>
<version>${roses.version}</version>
</dependency>
<!--参数校验模块的api-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>

View File

@ -0,0 +1 @@
package cn.stylefeng.roses.kernel.sys.modular.role.cache;

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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:";
}

View File

@ -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<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);
/**
*
*

View File

@ -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<SysRoleMenuMapper, SysRo
@Resource
private SysMenuService sysMenuService;
@Override
public void add(SysRoleMenuRequest sysRoleMenuRequest) {
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);
}
@Resource(name = "roleMenuCache")
private CacheOperatorApi<List<Long>> roleMenuCache;
@Override
public void bindRoleMenus(Long roleId, List<SysMenu> menuList) {
@ -113,19 +78,40 @@ public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRo
@Override
public List<Long> getRoleBindMenuIdList(List<Long> roleIdList) {
List<Long> result = new ArrayList<>();
if (ObjectUtil.isEmpty(roleIdList)) {
return new ArrayList<>();
return result;
}
LambdaQueryWrapper<SysRoleMenu> sysRoleMenuLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysRoleMenuLambdaQueryWrapper.in(SysRoleMenu::getRoleId, roleIdList);
sysRoleMenuLambdaQueryWrapper.select(SysRoleMenu::getMenuId);
List<SysRoleMenu> sysRoleMenuList = this.list(sysRoleMenuLambdaQueryWrapper);
if (ObjectUtil.isEmpty(sysRoleMenuList)) {
return new ArrayList<>();
for (Long roleId : roleIdList) {
String roleIdKey = String.valueOf(roleId);
// 先从缓存中获取,是否有绑定的菜单
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
@ -136,12 +122,6 @@ public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRo
return this.count(sysRoleMenuLambdaQueryWrapper) > 0;
}
@Override
public List<SysRoleMenu> findList(SysRoleMenuRequest sysRoleMenuRequest) {
LambdaQueryWrapper<SysRoleMenu> wrapper = this.createWrapper(sysRoleMenuRequest);
return this.list(wrapper);
}
@Override
public void validateHaveRoleBind(Set<Long> beRemovedRoleIdList) {
// none
@ -224,36 +204,4 @@ public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRo
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;
}
}