ruoyi实现
根据用户 ID 查询菜单树
public List<SysMenu> selectMenuTreeByUserId(String useNo) {
List<SysMenu> menus = null;
if (SecurityUtils.isAdmin(useNo))
{
menus = menuMapper.selectMenuTreeAll();
}
else
{
menus = menuMapper.selectMenuTreeByUseNo(useNo);
}
return getChildPerms(menus, 0);
}
根据给定的父节点ID构建出树形结构的子菜单。
public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId) {
List<SysMenu> returnList = new ArrayList<SysMenu>();
for (SysMenu t : list) {
if (t.getParentId() == parentId) {
recursionFn(list, t);
returnList.add(t);
}
}
return returnList;
}
递归地为当前菜单节点构建完整的子树结构
private void recursionFn(List<SysMenu> list, SysMenu t) {
List<SysMenu> childList = getChildList(list, t);
t.setChildren(childList);
for (SysMenu tChild : childList) {
if (hasChild(list, tChild)) {
recursionFn(list, tChild);
}
}
}
查找特定父节点所有直接子节点
private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t) {
List<SysMenu> tlist = new ArrayList<SysMenu>();
for (SysMenu n : list) {
if (n.getParentId().longValue() == t.getMenuId().longValue()) {
tlist.add(n);
}
}
return tlist;
}
判断是否有子节点
private boolean hasChild(List<SysMenu> list, SysMenu t) {
return getChildList(list, t).size() > 0;
}
简化
public List<SysMenu> selectMenuTreeByUserId(String useNo) {
List<SysMenu> menus = null;
if (useNo.equals("P059569")) {
return selectMenuTree() ;
} else {
return selectMenuTree() ;
}
}
@Override
public List<SysMenu> selectMenuTree() {
LambdaQueryWrapper<SysMenu> wrapper = new LambdaQueryWrapper<>();
wrapper.in(SysMenu::getMenuType, Arrays.asList("M", "C"))
.eq(SysMenu::getStatus, 0)
.orderByAsc(SysMenu::getParentId, SysMenu::getOrderNum);
List<SysMenu> menus = menuMapper.selectList(wrapper);
Map<Long, SysMenu> menuMap = menus.stream()
.peek(menu -> menu.setChildren(new ArrayList<>()))
.collect(Collectors.toMap(SysMenu::getMenuId, Function.identity()));
menus.forEach(menu -> {
if (menu.getParentId() != 0) {
SysMenu parent = menuMap.get(menu.getParentId());
if (parent != null) {
parent.getChildren().add(menu);
}
}
});
return menus.stream()
.filter(menu -> menu.getParentId() == 0)
.peek(root ->
root.getChildren().sort(Comparator.comparingInt(SysMenu::getOrderNum)))
.sorted(Comparator.comparingInt(SysMenu::getOrderNum))
.collect(Collectors.toList());
}