|
@@ -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()));
|
|
|
+ }
|
|
|
+
|
|
|
}
|