树形菜单过滤
2023-08-30 本文已影响0人
不积小流_无以成江海
树形菜单根据name进行过滤,假如name对应的节点是叶子节点,就展示该叶子节点的所有父节点,如果name对应的节点是非叶子节点,就把该节点的父节点以及所有的子节点都展示出来
public JsonResult<List<Menu>> treeSerach(Menu Menu) {
String searchName = Menu.getMenuName();
LambdaQueryWrapper<Menu> queryWrapper = new LambdaQueryWrapper<>();
// 查出所有的节点
List<Menu> Menus = MenuService.list(queryWrapper);
Map<Long, Menu> menuMap = Menus.stream().collect(Collectors.toMap(Menu::getId, Function.identity(), (key1, key2) -> key2));
List<Menu> leaves = new ArrayList<>();
for (Menu menu : Menus) {
// 先找到所有符合条件的菜单 ps:假设这里全是叶子节点
if (menu.getMenuName().contains(searchName)) {
leaves.add(menu);
}
}
if (ObjectUtil.isEmpty(leaves)) {
return JsonResult.success();
}
// 遍历所有叶子节点,找他们父节点,用递归
List<Menu> parents = new ArrayList<>();
for (Menu leaf : leaves) {
// 向上遍历所有叶子节点,找他们父节点,用递归
upSearch(menuMap, parents, leaf);
// 向下遍历所有的子节点,用递归
downSearch(Menus, parents, leaf);
}
leaves.addAll(parents);
List<Menu> distinctMenuList = leaves.stream()
.distinct()
.collect(Collectors.toList());
Menus = buildTree(distinctMenuList);
return JsonResult.success(Menus);
}
public void upSearch(Map<Long, Menu> menuMap, List<Menu> parents, Menu leaf) {
// 叶子节点的父节点
Long leafParentId = leaf.getParentId();
if (menuMap.containsKey(leafParentId)) {
Menu parentMenu = menuMap.get(leafParentId);
if (!parents.contains(parentMenu)) {
parents.add(parentMenu);
}
upSearch(menuMap, parents, parentMenu);
}
}
public void downSearch(List<Menu> Menus, List<Menu> parents, Menu current) {
Long currentId = current.getId();
for (Menu Menu : Menus) {
if (currentId.intValue() == Menu.getParentId().intValue()) {
parents.add(Menu);
downSearch(Menus, parents, Menu);
}
}
}
public List<UcMenu> buildTree(List<UcMenu> ucMenuList) {
// 把List转为Map
Map<Long, UcMenu> menuMap = ucMenuList.stream().collect(Collectors.toMap(UcMenu::getId, Function.identity(), (key1, key2) -> key2));
List<UcMenu> finaMenuList = new ArrayList<>();
for (UcMenu ucMenu : ucMenuList) {
Long parentId = ucMenu.getParentId();
if (menuMap.containsKey(parentId)) {
UcMenu menu = menuMap.get(parentId);
if (ObjectUtil.isEmpty(menu.getChildren())) {
menu.setChildren(new ArrayList<>());
}
menu.getChildren().add(ucMenu);
} else {
finaMenuList.add(ucMenu);
}
}
return finaMenuList;
}