热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java多级菜单排序并返回树结构菜单列表

Java多级菜单排序并返回树结

Java多级菜单排序并返回树结构菜单列表

  • 前言
  • 一、数据表
  • 二、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 -> item.getParentId().equals("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 -> item.getParentId().equals(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
}



总结

如果这篇博客对你有帮助的话,记得给我点个赞,你的鼓励是对我最大的支持!谢谢。◕‿◕。


推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 标题: ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
author-avatar
823825lml
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有