增加 get-routers 接口的相关方法,未完全完成

This commit is contained in:
YunaiV
2021-01-04 00:47:28 +08:00
parent 162bebf5fb
commit cf93019ce1
11 changed files with 181 additions and 22 deletions

View File

@@ -2,7 +2,9 @@ package cn.iocoder.dashboard.modules.system.service.auth;
import cn.iocoder.dashboard.framework.security.core.service.SecurityFrameworkService;
import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthGetInfoRespVO;
import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthGetRouterRespVO;
import java.util.List;
import java.util.Set;
/**
@@ -28,4 +30,16 @@ public interface SysAuthService extends SecurityFrameworkService {
*/
SysAuthGetInfoRespVO getInfo(Long userId, Set<Long> roleIds);
/**
* 获得用户的菜单 Vue 路由
*
* 这里传输 roleIds 参数的原因,是该参数是从 LoginUser 缓存中获取到的,而我们校验权限时也是从 LoginUser 缓存中获取 roleIds
* 通过这样的方式,保持一致
*
* @param userId 用户编号
* @param roleIds 用户拥有的角色编号数组
* @return 菜单 Vue 路由
*/
List<SysAuthGetRouterRespVO> getRouters(Long userId, Set<Long> roleIds);
}

View File

@@ -5,12 +5,14 @@ import cn.hutool.core.util.StrUtil;
import cn.iocoder.dashboard.framework.security.config.SecurityProperties;
import cn.iocoder.dashboard.framework.security.core.LoginUser;
import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthGetInfoRespVO;
import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthGetRouterRespVO;
import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
import cn.iocoder.dashboard.modules.system.enums.user.UserStatus;
import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
import cn.iocoder.dashboard.modules.system.dal.redis.dao.auth.SysLoginUserRedisDAO;
import cn.iocoder.dashboard.modules.system.enums.permission.MenuIdEnum;
import cn.iocoder.dashboard.modules.system.enums.user.UserStatus;
import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService;
import cn.iocoder.dashboard.modules.system.service.auth.SysTokenService;
import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
@@ -234,4 +236,38 @@ public class SysAuthServiceImpl implements SysAuthService {
return SysAuthConvert.INSTANCE.convert(user, roleList, menuList);
}
@Override
public List<SysAuthGetRouterRespVO> getRouters(Long userId, Set<Long> roleIds) {
// TODO 芋艿:去除 F 的类型,去除 禁用 的
List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(roleIds);
// 转换成 Tree 结构返回
return buildRouterTree(menuList);
}
private static List<SysAuthGetRouterRespVO> buildRouterTree(List<SysMenuDO> menuList) {
// 排序,保证菜单的有序性
menuList = new ArrayList<>(menuList); // 使用 ArrayList 套一下,因为 menuList 是不可修改的 List
menuList.sort(Comparator.comparing(SysMenuDO::getOrderNum));
// 构建菜单树
// 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。
Map<Long, SysAuthGetRouterRespVO> treeNodeMap = new LinkedHashMap<>();
menuList.forEach(menu -> treeNodeMap.put(menu.getMenuId(), SysAuthConvert.INSTANCE.convertTreeNode(menu)));
// 处理父子关系
treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(MenuIdEnum.ROOT.getId())).forEach((childNode) -> {
// 获得父节点
SysAuthGetRouterRespVO parentNode = treeNodeMap.get(childNode.getParentId());
if (parentNode == null) {
log.error("[buildRouterTree][resource({}) 找不到父资源({})]", childNode.getMenuId(), childNode.getParentId());
return;
}
// 将自己添加到父节点中
if (parentNode.getChildren() == null) {
parentNode.setChildren(new ArrayList<>());
}
parentNode.getChildren().add(childNode);
});
// 获得到所有的根节点
return CollectionUtils.filterList(treeNodeMap.values(), node -> MenuIdEnum.ROOT.getId().equals(node.getParentId()));
}
}