多级菜单构建
创建菜单类
@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;
}
别说差点,差点就是永远
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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编程运行原理