回显菜单树(后端)

实体类,含parentId,这个的 List

children上面加 @TableField(exist = false)注解是由于表中没有此字段。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Menu {
    Long id;
    Long parentId;
    String name;
    String  url;
    String  perms ;
       Integer type ;
       String icon ;
       Integer orderNum ;
       String createBy ;
       String createTime ;
       String lastUpdateBy ;
       String lastUpdateTime ;
       Integer delFlag ;
       String parentName ;
       Integer level ;
       @TableField(exist = false)
       List<Menu> children;
}


业务逻辑

@Override
    public List<Menu> findMenuTree() {
        //拿到总资源
        List<Menu> tree = menuMapper.findMenuTree();
        // 最后要返回的结果
        List<Menu> newMenuList = new ArrayList<>();
        // 先找到所有的一级菜单
        for (int i = 0; i < tree.size(); i++){
            Menu menu=tree.get(i);
            Long parentId=menu.getParentId();
            // 如果是顶级菜单,没有父菜单,直接放入返回结果集
            if (parentId==0){
                newMenuList.add(menu);
            }
        }
        // 为菜单设置子菜单,getChild是递归调用的,若子菜单有子菜单则一直递归,直到子菜单的children为空
        for (Menu menu : newMenuList) {
            menu.setChildren(getChild(menu.getId(), tree));
        }
        return newMenuList;
    }

递归调用的方法

//    递归查找子菜单
    private List<Menu> getChild(long id, List<Menu> rootMenu) {
        // 子菜单集合
        List<Menu> childList = new ArrayList<>();
        for (Menu menu : rootMenu) {
            // 遍历所有节点,将父菜单id与传过来的id比较
            if (menu.getParentId()==id) {
                childList.add(menu);
            }
        }
        // 把子菜单的子菜单再循环一遍
        for (Menu menu : childList) {
                // 递归
                menu.setChildren(getChild(menu.getId(), rootMenu));

        } // 递归退出条件
        if (childList.size() == 0) {
            return null;
        }
        return childList;

    }

一开始自己的想法是用表的自联结查出然后塞进Children中,但是@进击的小王666https://blog.csdn.net/m0_56033865?spm=1001.2014.3001.5512的想法更简单

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值