路由接口返回状态
This commit is contained in:
@@ -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()
|
|
||||||
.map(UserRouteMenuStock::getRouteId)
|
|
||||||
.forEach(needIds::add);
|
|
||||||
}
|
|
||||||
|
|
||||||
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();
|
RouteMenuVo vo = new RouteMenuVo();
|
||||||
BeanUtils.copyProperties(menu, vo);
|
BeanUtils.copyProperties(menu, vo);
|
||||||
|
vo.setAccessible(menu.getOpenAccess() != null && menu.getOpenAccess() == 1 || stockRouteIds.contains(menu.getId()));
|
||||||
return vo;
|
return vo;
|
||||||
})
|
}).toList();
|
||||||
.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());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user