Java多级菜单排序并返回树结构菜单列表方式
更新时间:2026年06月15日 09:57:55 作者:TheTsing
本文详细介绍了使用SpringBoot和MybatisPlus对数据库中的菜单进行排序,并以树形结构返回Json菜单列表的方法,涵盖数据库表结构设计、Java实体类定义及Service层实现等内容
前言
SpringBoot+MybatisPlus 对数据表中的菜单进行排序并返回树形Json格式的菜单列表
一、数据表
- 菜单表:t_menu
- 字段说明:name:菜单名称; status:1表示启用,表示停用; level:菜单级别说明; parent_id:父级菜单id,0表示一级菜单; sort_order:排序序号

二、Java实体
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_menu")
public class Menu implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id")
private String id; //菜单ID
@JSONField(ordinal = 1)
private String name;//菜单名称
@JSONField(ordinal = 2)
private Boolean status; //菜单状态 0表示禁用 1表示启用
@JSONField(ordinal = 3)
private String level; //菜单级别 例如:一级菜单、二级菜单
@JSONField(ordinal = 4)
private String parentId; //父级ID 一级菜单
@JSONField(ordinal = 5)
private Integer sortOrder; //排序 0表示最前面
//存放子菜单目录
@JSONField(ordinal = 6)
@TableField(exist = false)
private List<Menu> children;
}
三、Service层
@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {
@Override
public List<Menu> getMenu() {
List<Menu> allMenu = baseMapper.selectList(null);//查出全部菜单
return allMenu.stream()
.filter(item -> Objects.equals(item.getParentId(), "0"))
.map(item -> item.setChildren(getChild(item.getId(), allMenu)))
.sorted(Comparator.comparingInt(menu -> (menu.getSortOrder() == null ? 0 : menu.getSortOrder())))
.collect(Collectors.toList());
}
private List<Menu> getChild(String id, List<Menu> allMenu) {
return allMenu.stream()
.filter(item -> Objects.equals(item.getParentId(), id))
.map(item -> item.setChildren(getChild(item.getId(), allMenu)))
.sorted(Comparator.comparingInt(menu -> (menu.getSortOrder() == null ? 0 : menu.getSortOrder())))
.collect(Collectors.toList());
}
}
四、结果
{
"code": 2000,
"data": [
{
"id": "1402904218656530433",
"name": "位置管理",
"status": true,
"level": "一级菜单",
"parentId": "0",
"sortOrder": 0,
"children": []
},
{
"id": "1402904118723043329",
"name": "日志管理",
"status": true,
"level": "一级菜单",
"parentId": "0",
"sortOrder": 5,
"children": [
{
"id": "1402905060906328066",
"name": "查看日志",
"status": true,
"level": "二级菜单",
"parentId": "1402904118723043329",
"sortOrder": 0,
"children": []
}
]
},
{
"id": "1402903753264885762",
"name": "用户管理",
"status": true,
"level": "一级菜单",
"parentId": "0",
"sortOrder": 7,
"children": [
{
"id": "1402904547628376065",
"name": "账号管理",
"status": true,
"level": "二级菜单",
"parentId": "1402903753264885762",
"sortOrder": 5,
"children": []
},
{
"id": "1402904663936425985",
"name": "权限管理",
"status": true,
"level": "二级菜单",
"parentId": "1402903753264885762",
"sortOrder": 12,
"children": [
{
"id": "1402904949253955585",
"name": "修改权限",
"status": true,
"level": "三级菜单",
"parentId": "1402904663936425985",
"sortOrder": 2,
"children": []
},
{
"id": "1402904920229371906",
"name": "添加权限",
"status": true,
"level": "三级菜单",
"parentId": "1402904663936425985",
"sortOrder": 10,
"children": [
{
"id": "1402922502042918914",
"name": "测试一",
"status": true,
"level": "四级菜单",
"parentId": "1402904920229371906",
"sortOrder": 0,
"children": []
},
{
"id": "1402922463040086018",
"name": "测试二",
"status": true,
"level": "四级菜单",
"parentId": "1402904920229371906",
"sortOrder": 4,
"children": []
}
]
},
{
"id": "1402904973903880194",
"name": "删除权限",
"status": true,
"level": "三级菜单",
"parentId": "1402904663936425985",
"sortOrder": 10,
"children": []
}
]
},
{
"id": "1402904645955444738",
"name": "角色管理",
"status": true,
"level": "二级菜单",
"parentId": "1402903753264885762",
"sortOrder": 14,
"children": []
},
{
"id": "1402904723365519361",
"name": "菜单管理",
"status": true,
"level": "二级菜单",
"parentId": "1402903753264885762",
"sortOrder": 30,
"children": []
}
]
}
],
"date": 1623480149457,
"msg": "success",
"success": true
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java编写时间工具类ZTDateTimeUtil的示例代码
这篇文章主要为大家详细介绍了如何利用Java编写时间工具类ZTDateTimeUtil,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下2023-11-11
Java使用BigDecimal确保数值计算精度的最佳实践指南
这篇文章主要为大家详细介绍了Java使用BigDecimal确保数值计算精度的相关知识,BigDecimal一般适用于金融计算、高精度运算等对数值准确性要求高的场景,下面小编就和大家详细介绍一下吧2026-01-01


最新评论