多级菜单构建

创建菜单类

@Data

@ApiModel(value = "Menu对象", description = "Menu对象")
public class Menu implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    private String label;
    private Integer pid;
    private Integer isShow;
    private Integer sort;
    private String path;
    private String type;

    //子菜单列表
    private List<Menu> children;
}

其中子列表为层级关键

讲数据库中满足条件的数据查出
根据条件进行判断并放入childrenList

    public List<Menu> findAll(PowerMenus powerMenus) {
        try {
            LambdaQueryWrapper<PowerMenus> qw = new LambdaQueryWrapper();
            qw.eq(PowerMenus::getDeletedAt, 0);
            List<PowerMenus> list = this.baseMapper.selectList(qw);
            List<Menu> allList = new ArrayList<>();
            for (PowerMenus powerMenus1 : list) {
                Menu one = new Menu();
                one.setId(powerMenus1.getId());
                one.setPid(powerMenus1.getPid());
                one.setLabel(powerMenus1.getName());
                one.setPath(powerMenus1.getPath());
                one.setSort(powerMenus1.getSort());
                one.setType(powerMenus1.getType());
                allList.add(one);
            }
            ArrayList<Menu> menus = new ArrayList<>();

            if (powerMenus != null && powerMenus.getId() != null) {
                //输入有效的根节点,部门id
                for (Menu nav : allList) {
                    //输入id为父节点,找寻下属子节点
                    if (nav.getPid().equals(powerMenus.getId())) {
                        menus.add(nav);
                    }
                }
            } else {
                //父节点是0的,为根节点
                for (Menu nav : menus) {
                    if (nav.getPid().equals(0)) {
                        menus.add(nav);
                    }
                }
            }
            for (Menu nv : menus) {
                //获取根节点下的所有子节点,使用getChild方法
                List<Menu> childList = getChild(nv.getId(), allList);
                //给根节点设置子节点
                nv.setChildren(childList);
            }
            return menus;
        } catch (Exception e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    }

    private List<Menu> getChild(Integer id, List<Menu> allMenu) {
        //子菜单
        List<Menu> childList = new ArrayList<>();
        for (Menu nav : allMenu) {
            //遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
            //相等说明:为该根节点的子节点
            if (nav.getPid().equals(id)) {
                childList.add(nav);
            }
        }
        //递归设置子节点
        for (Menu nav : childList) {
            nav.setChildren(getChild(nav.getId(), allMenu));
        }
        //如果节点下没有子节点,返回一个空List(递归退出)
        if (childList.size() == 0) {
            return new ArrayList<Menu>();
        }
        return childList;
    }

posted @   东楚  阅读(60)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示