路由接口返回状态

This commit is contained in:
zk
2026-05-20 18:43:02 +08:00
parent 2cedfe6227
commit 5d6d0efee4
2 changed files with 23 additions and 62 deletions
@@ -52,6 +52,11 @@ public class RouteMenuVo {
*/ */
private Integer sortOrder; private Integer sortOrder;
/**
* 是否有使用权限:true=可用 false=无权限
*/
private Boolean accessible;
/** /**
* 子菜单 * 子菜单
*/ */
@@ -92,77 +92,37 @@ public class RouteMenuService {
} }
/** /**
* 获取用户有效路由菜单(树形结构,支持多级菜单 * 获取用户路由菜单(树形结构,全量返回,标记权限状态
* <p>1. 查询所有启用菜单 2. 收集公开免费菜单ID 3. 查询用户有效库存合并菜单ID 4. 补充父节点 5. 转VO构建树形结构</p> * <p>1. 查询所有启用菜单 2. 查询用户有效库存转为ID集合 3. 遍历菜单判断accessible 4. 构建树形结构</p>
* *
* @param userId 用户ID * @param userId 用户ID
* @return 树形路由菜单 * @return 树形路由菜单(含权限标记)
*/ */
public List<RouteMenuVo> getUserRoutes(Long userId) { public List<RouteMenuVo> getUserRoutes(Long userId) {
// 一次查出所有启用菜单 // 1. 查所有启用菜单
List<RouteMenu> allMenus = routeMenuMapper.selectList( List<RouteMenu> allMenus = routeMenuMapper.selectList(new LambdaQueryWrapper<RouteMenu>().eq(RouteMenu::getStatus, 1));
new LambdaQueryWrapper<RouteMenu>().eq(RouteMenu::getStatus, 1));
if (allMenus.isEmpty()) { if (allMenus.isEmpty()) {
return Collections.emptyList(); return Collections.emptyList();
} }
Map<Long, RouteMenu> menuMap = allMenus.stream() // 2. 查用户有效库存,转为 routeId 集合
.collect(Collectors.toMap(RouteMenu::getId, m -> m));
// 收集公开菜单ID
Set<Long> needIds = allMenus.stream()
.filter(m -> m.getOpenAccess() != null && m.getOpenAccess() == 1)
.map(RouteMenu::getId)
.collect(Collectors.toSet());
// 查询用户有效库存(不限时 或 未过期)
Instant now = Instant.now(); Instant now = Instant.now();
List<UserRouteMenuStock> stocks = userRouteMenuStockMapper.selectList( List<UserRouteMenuStock> stocks = userRouteMenuStockMapper.selectList(
new LambdaQueryWrapper<UserRouteMenuStock>() new LambdaQueryWrapper<UserRouteMenuStock>()
.eq(UserRouteMenuStock::getUserId, userId) .eq(UserRouteMenuStock::getUserId, userId)
.and(w -> w .and(w -> w.eq(UserRouteMenuStock::getTimeLimit, 0).or().gt(UserRouteMenuStock::getExpireTime, now)));
.eq(UserRouteMenuStock::getTimeLimit, 0) Set<Long> stockRouteIds = stocks == null ? Collections.emptySet() : stocks.stream().map(UserRouteMenuStock::getRouteId).collect(Collectors.toSet());
.or()
.gt(UserRouteMenuStock::getExpireTime, now)
)
);
// 合并库存中有权限的菜单ID // 3. 遍历菜单,判断 accessible
if (stocks != null && !stocks.isEmpty()) { List<RouteMenuVo> voList = allMenus.stream().map(menu -> {
stocks.stream() RouteMenuVo vo = new RouteMenuVo();
.map(UserRouteMenuStock::getRouteId) BeanUtils.copyProperties(menu, vo);
.forEach(needIds::add); vo.setAccessible(menu.getOpenAccess() != null && menu.getOpenAccess() == 1 || stockRouteIds.contains(menu.getId()));
} return vo;
}).toList();
if (needIds.isEmpty()) {
return Collections.emptyList();
}
// 补充父节点
Set<Long> allNeedIds = new HashSet<>(needIds);
for (Long routeId : needIds) {
RouteMenu current = menuMap.get(routeId);
while (current != null && current.getParentId() != 0) {
allNeedIds.add(current.getParentId());
current = menuMap.get(current.getParentId());
}
}
// 转VO
List<RouteMenuVo> voList = allMenus.stream()
.filter(menu -> allNeedIds.contains(menu.getId()))
.map(menu -> {
RouteMenuVo vo = new RouteMenuVo();
BeanUtils.copyProperties(menu, vo);
return vo;
})
.toList();
// 构建树形结构
Map<Long, List<RouteMenuVo>> parentMap = voList.stream()
.collect(Collectors.groupingBy(RouteMenuVo::getParentId));
// 4. 构建树形结构
Map<Long, List<RouteMenuVo>> parentMap = voList.stream().collect(Collectors.groupingBy(RouteMenuVo::getParentId));
voList.forEach(vo -> { voList.forEach(vo -> {
List<RouteMenuVo> children = parentMap.get(vo.getId()); List<RouteMenuVo> children = parentMap.get(vo.getId());
if (children != null) { if (children != null) {
@@ -170,10 +130,6 @@ public class RouteMenuService {
vo.setChildren(children); vo.setChildren(children);
} }
}); });
return voList.stream().filter(vo -> vo.getParentId() == 0).sorted(Comparator.comparingInt(RouteMenuVo::getSortOrder)).collect(Collectors.toList());
return voList.stream()
.filter(vo -> vo.getParentId() == 0)
.sorted(Comparator.comparingInt(RouteMenuVo::getSortOrder))
.collect(Collectors.toList());
} }
} }