增加 get-routers 接口的相关方法,未完全完成
This commit is contained in:
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user