mirror of
https://github.com/continew-org/continew-admin.git
synced 2025-09-12 03:00:53 +08:00
perf: 对获取路由信息接口增加缓存处理
1.优化 Spring Cache 配置 2.暂时移除 Jackson 针对数值类型:Long、BigInteger、BigDecimal 的 toString 处理(TreeUtil 疑似在字符串类型 parentId 时会出现转换异常)
This commit is contained in:
@@ -16,9 +16,8 @@
|
||||
|
||||
package top.charles7c.cnadmin.auth.service.impl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
@@ -44,7 +43,6 @@ import top.charles7c.cnadmin.common.util.TreeUtils;
|
||||
import top.charles7c.cnadmin.common.util.helper.LoginHelper;
|
||||
import top.charles7c.cnadmin.common.util.validate.CheckUtils;
|
||||
import top.charles7c.cnadmin.system.model.entity.UserDO;
|
||||
import top.charles7c.cnadmin.system.model.query.MenuQuery;
|
||||
import top.charles7c.cnadmin.system.model.vo.DeptDetailVO;
|
||||
import top.charles7c.cnadmin.system.model.vo.MenuVO;
|
||||
import top.charles7c.cnadmin.system.service.DeptService;
|
||||
@@ -91,21 +89,20 @@ public class LoginServiceImpl implements LoginService {
|
||||
|
||||
@Override
|
||||
public List<RouteVO> buildRouteTree(Long userId) {
|
||||
Set<String> roleSet = permissionService.listRoleCodeByUserId(userId);
|
||||
if (CollUtil.isEmpty(roleSet)) {
|
||||
Set<String> roleCodeSet = permissionService.listRoleCodeByUserId(userId);
|
||||
if (CollUtil.isEmpty(roleCodeSet)) {
|
||||
return new ArrayList<>(0);
|
||||
}
|
||||
|
||||
// 查询菜单列表
|
||||
List<MenuVO> menuList;
|
||||
if (roleSet.contains(SysConsts.ADMIN_ROLE_CODE)) {
|
||||
MenuQuery menuQuery = new MenuQuery();
|
||||
menuQuery.setStatus(DisEnableStatusEnum.ENABLE.getValue());
|
||||
menuList = menuService.list(menuQuery, null);
|
||||
Set<MenuVO> menuSet = new LinkedHashSet<>();
|
||||
if (roleCodeSet.contains(SysConsts.ADMIN_ROLE_CODE)) {
|
||||
menuSet.addAll(menuService.list());
|
||||
} else {
|
||||
menuList = menuService.listByUserId(userId);
|
||||
roleCodeSet.forEach(roleCode -> menuSet.addAll(menuService.listByRoleCode(roleCode)));
|
||||
}
|
||||
menuList.removeIf(m -> MenuTypeEnum.BUTTON.equals(m.getType()));
|
||||
List<MenuVO> menuList =
|
||||
menuSet.stream().filter(m -> !MenuTypeEnum.BUTTON.equals(m.getType())).collect(Collectors.toList());
|
||||
|
||||
// 构建路由树
|
||||
TreeField treeField = MenuVO.class.getDeclaredAnnotation(TreeField.class);
|
||||
|
@@ -42,11 +42,11 @@ public interface MenuMapper extends BaseMapper<MenuDO> {
|
||||
Set<String> selectPermissionByUserId(@Param("userId") Long userId);
|
||||
|
||||
/**
|
||||
* 根据用户 ID 查询
|
||||
* 根据角色编码查询
|
||||
*
|
||||
* @param userId
|
||||
* 用户 ID
|
||||
* @param roleCode
|
||||
* 角色编码
|
||||
* @return 菜单列表
|
||||
*/
|
||||
List<MenuDO> selectListByUserId(@Param("userId") Long userId);
|
||||
List<MenuDO> selectListByRoleCode(@Param("roleCode") String roleCode);
|
||||
}
|
||||
|
@@ -42,11 +42,18 @@ public interface MenuService extends BaseService<MenuVO, MenuVO, MenuQuery, Menu
|
||||
Set<String> listPermissionByUserId(Long userId);
|
||||
|
||||
/**
|
||||
* 根据用户 ID 查询
|
||||
* 根据角色编码查询
|
||||
*
|
||||
* @param userId
|
||||
* 用户 ID
|
||||
* @param roleCode
|
||||
* 角色编码
|
||||
* @return 菜单列表
|
||||
*/
|
||||
List<MenuVO> listByUserId(Long userId);
|
||||
List<MenuVO> listByRoleCode(String roleCode);
|
||||
|
||||
/**
|
||||
* 查询所有菜单
|
||||
*
|
||||
* @return 菜单列表
|
||||
*/
|
||||
List<MenuVO> list();
|
||||
}
|
||||
|
@@ -20,12 +20,16 @@ import java.util.*;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import org.springframework.cache.annotation.CacheConfig;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
|
||||
import top.charles7c.cnadmin.common.base.BaseServiceImpl;
|
||||
import top.charles7c.cnadmin.common.constant.CacheConsts;
|
||||
import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
|
||||
import top.charles7c.cnadmin.common.util.validate.CheckUtils;
|
||||
import top.charles7c.cnadmin.system.mapper.MenuMapper;
|
||||
@@ -43,10 +47,12 @@ import top.charles7c.cnadmin.system.service.MenuService;
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@CacheConfig(cacheNames = CacheConsts.MENU_KEY_PREFIX)
|
||||
public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuVO, MenuVO, MenuQuery, MenuRequest>
|
||||
implements MenuService {
|
||||
|
||||
@Override
|
||||
@CacheEvict(allEntries = true)
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Long add(MenuRequest request) {
|
||||
String title = request.getTitle();
|
||||
@@ -58,6 +64,7 @@ public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuVO,
|
||||
}
|
||||
|
||||
@Override
|
||||
@CacheEvict(allEntries = true)
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void update(MenuRequest request, Long id) {
|
||||
String title = request.getTitle();
|
||||
@@ -68,6 +75,7 @@ public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuVO,
|
||||
}
|
||||
|
||||
@Override
|
||||
@CacheEvict(allEntries = true)
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void delete(List<Long> ids) {
|
||||
baseMapper.lambdaUpdate().in(MenuDO::getParentId, ids).remove();
|
||||
@@ -80,13 +88,22 @@ public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuVO,
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MenuVO> listByUserId(Long userId) {
|
||||
List<MenuDO> menuList = baseMapper.selectListByUserId(userId);
|
||||
@Cacheable(key = "#roleCode")
|
||||
public List<MenuVO> listByRoleCode(String roleCode) {
|
||||
List<MenuDO> menuList = baseMapper.selectListByRoleCode(roleCode);
|
||||
List<MenuVO> list = BeanUtil.copyToList(menuList, MenuVO.class);
|
||||
list.forEach(this::fill);
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Cacheable(key = "'ALL'")
|
||||
public List<MenuVO> list() {
|
||||
MenuQuery menuQuery = new MenuQuery();
|
||||
menuQuery.setStatus(DisEnableStatusEnum.ENABLE.getValue());
|
||||
return super.list(menuQuery, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查名称是否存在
|
||||
*
|
||||
|
@@ -21,6 +21,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
@@ -30,6 +31,7 @@ import cn.hutool.core.util.ObjectUtil;
|
||||
|
||||
import top.charles7c.cnadmin.auth.service.OnlineUserService;
|
||||
import top.charles7c.cnadmin.common.base.BaseServiceImpl;
|
||||
import top.charles7c.cnadmin.common.constant.CacheConsts;
|
||||
import top.charles7c.cnadmin.common.constant.SysConsts;
|
||||
import top.charles7c.cnadmin.common.enums.DataScopeEnum;
|
||||
import top.charles7c.cnadmin.common.enums.DataTypeEnum;
|
||||
@@ -82,6 +84,7 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
|
||||
}
|
||||
|
||||
@Override
|
||||
@CacheEvict(cacheNames = CacheConsts.MENU_KEY_PREFIX, key = "#request.code == 'admin' ? 'ALL' : #request.code")
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void update(RoleRequest request, Long id) {
|
||||
String name = request.getName();
|
||||
@@ -167,15 +170,15 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
|
||||
|
||||
@Override
|
||||
public Set<String> listCodeByUserId(Long userId) {
|
||||
List<Long> roleIds = userRoleService.listRoleIdByUserId(userId);
|
||||
List<RoleDO> roleList = baseMapper.lambdaQuery().select(RoleDO::getCode).in(RoleDO::getId, roleIds).list();
|
||||
List<Long> roleIdList = userRoleService.listRoleIdByUserId(userId);
|
||||
List<RoleDO> roleList = baseMapper.lambdaQuery().select(RoleDO::getCode).in(RoleDO::getId, roleIdList).list();
|
||||
return roleList.stream().map(RoleDO::getCode).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<RoleDTO> listByUserId(Long userId) {
|
||||
List<Long> roleIds = userRoleService.listRoleIdByUserId(userId);
|
||||
List<RoleDO> roleList = baseMapper.lambdaQuery().in(RoleDO::getId, roleIds).list();
|
||||
List<Long> roleIdList = userRoleService.listRoleIdByUserId(userId);
|
||||
List<RoleDO> roleList = baseMapper.lambdaQuery().in(RoleDO::getId, roleIdList).list();
|
||||
return new HashSet<>(BeanUtil.copyToList(roleList, RoleDTO.class));
|
||||
}
|
||||
|
||||
|
@@ -14,14 +14,12 @@
|
||||
AND t3.`status` = 1
|
||||
</select>
|
||||
|
||||
<select id="selectListByUserId" resultType="top.charles7c.cnadmin.system.model.entity.MenuDO">
|
||||
<select id="selectListByRoleCode" resultType="top.charles7c.cnadmin.system.model.entity.MenuDO">
|
||||
SELECT t1.*
|
||||
FROM `sys_menu` AS t1
|
||||
LEFT JOIN `sys_role_menu` AS t2 ON t2.`menu_id` = t1.`id`
|
||||
LEFT JOIN `sys_role` AS t3 ON t3.`id` = t2.`role_id`
|
||||
LEFT JOIN `sys_user_role` AS t4 ON t4.`role_id` = t3.`id`
|
||||
LEFT JOIN `sys_user` AS t5 ON t5.`id` = t4.`user_id`
|
||||
WHERE t5.`id` = #{userId}
|
||||
WHERE t3.`code` = #{roleCode}
|
||||
AND t1.`status` = 1
|
||||
AND t3.`status` = 1
|
||||
</select>
|
||||
|
Reference in New Issue
Block a user