树形菜单过滤

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;
    }
上一篇 下一篇

猜你喜欢

热点阅读