java生成多级菜单树
使用java实现一个多级菜单树结构
先上数据库
ps_pid
字段很重要,是父级菜单的id
Menu类
Menu类要新增一个字段,用来存放子菜单
/**
* 子菜单列表
*/
private List<Menu> children;
用mybatis实现
生成菜单树第一种方式可以利用mybatis
的collection
查询实现
<collection property="children" ofType="com.example.springbootvue.entity.Menu"
column="ps_id" select="findMenuByParentId"/>
column="ps_id"
表示传到findMenuByParentId
这个方法中去的参数,是父ID
mybatis
会再进行一次查询,把ps_pid=ps_id
的Menu
回添到children
列表中,自动递归
不过这样会导致mybatis N+1问题
官方建议不使用这种写法
使用java算法实现
最开始获取全部菜单我使用的mybatis
实现生成菜单树,后来写用户权限管理模块的时候,用户的权限不再是所有菜单,而是部分菜单,使用mybatis还没想到解决办法,手动狗头,
然后看了一个大佬写的java生成树代码,真的太妙了,先把获取全部菜单,然后再对菜单进行装配,生成树形结构,话不多说,上代码
//获取菜单树
public List<Menu> getMenuList() {
//获取所有菜单
List<Menu> menuList = menuMapper.getMenuList();
//返回的菜单树列表
List<Menu> menuTree = new ArrayList<>();
// 先找到所有的一级菜单,放入菜单树列表中
for (Menu menu : menuList) {
if (menu.getPsLevel().equals("0")) {
menuTree.add(menu);
}
}
//遍历一级菜单,开始查找子菜单
for (Menu menu : menuTree) {
menu.setChildren(getChildren(menu.getPsId(),menuList));
}
return menuList;
}
private List<Menu> getChildren(Short psId, List<Menu> menuList) {
// 查找二级子菜单
List<Menu> childList = new ArrayList<>();
for (Menu menu : menuList) {
if (menu.getPsPid().equals(psId)) {
childList.add(menu);
}
}
//递归查找查找二级菜单的子菜单
for (Menu menu : childList) {
menu.setChildren(getChildren(menu.getPsId(),menuList));
}
return childList;
}
这样会导致很多重复操作,如果使用java的stream进行过滤性能会更好,等有时间了再更一下
java生成多级菜单树的更多相关文章
- MVC5+EF6 入门完整教程13 -- 动态生成多级菜单
稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据mode ...
- java递归构建菜单树
package testSimple; import java.util.ArrayList; import java.util.List; public class BuildTree { publ ...
- Java生成菜单树(目录树)的几种方式
本文介绍两种不同生成多级目录树的方式:1. 递归生成,2. map+list 集合生成.最下方会附上完整代码. 生成树的基本规则:子节点的par_id等于父节点的id. 1. 实体类 import ...
- 原生JS封装创建多级菜单函数
手写一个使用原生JS封装的多级菜单的函数,满足以下几点需求. 子类层级不确定,可根据数据自动生成多级菜单. 操作便捷,只需传入一个HTML标签. 缺点: 需要满足特定的数据结构 废话不多说,展示代码. ...
- java实现的可以无限级别添加子节点的菜单树
网上大部分菜单树,都是单独用js代码来实现的,这样做的缺点是:用户无法动态的设置菜单项,比如,超级管理员可能需要根据每个用户的权限,赋予他们不同的系统功能,不同的功能对应着不同数量的菜单项. 对于此问 ...
- vue中组件之间的相互调用,及通用后台管理系统左侧菜单树的迭代生成
由于本人近期开始学习使用vue搭建一个后端管理系统的前端项目,在左侧生成菜单树的时候遇到了一些问题.在这里记录下 分析:由于本人设定的菜单可以使多级结构,直接使用vue的v-for 遍历并不是很方便. ...
- java 24 - 7 GUI之 创建多级菜单窗体
需求: 创建多级菜单 步骤: A:创建窗体对象(并设置属性和布局) B:创建菜单栏 C:创建菜单和子菜单 D:逐步添加菜单(子菜单添加到菜单中,菜单添加到菜单栏中) E:窗体中设置菜单栏(菜单栏并不是 ...
- 用C#从数据库动态生成AdminLTE菜单的一种方法
当前的应用设计风格趋于Flat扁平化,很多基于BootStrap实现了很多UI非常漂亮的管理界面(Bootstrap admin template). 此核心文件开源在Github:https://g ...
- jquery easyui菜单树显示
目前做了一个easyui项目需要显示多级菜单,菜单配置到数据库中,因此每级菜单都需要到数据库中取,用了jQuery EasyUI方便多了. 效果体验:http://hovertree.com/texi ...
随机推荐
- 【图文并茂】 做开发这么久了,还不会搭建服务器Maven私有仓库?这也太Low了吧
大家好,我是冰河~~ 最近不少小伙伴想在自己公司的内网搭建一套Maven私服环境,可自己搭建的过程中,或多过少的总会出现一些问题,问我可不可以出一篇如何搭建Maven私服的文章.这不,就有了这篇文章嘛 ...
- linux下更改文件字符格式为uft-8
liunx下发布的.net Core 程序,发现短信签名不错误不能发出.后来检查发现配配文件中的字符为乱码才知道是因为字符格式问题. 因为服务器批较多,还是使用命令来解决比较快.使用iconv来更改. ...
- springboot Redistemplate的execute和 executePipelined
springboot 的 RedisTemplate 的 execute 和 executePipelined 功能的区别 1.execute 以下是 springboot 官网原文: Redis p ...
- MM32F0020 UART1空闲中断接收
目录: 1.MM32F0020简介 2.初始化MM32F0020 UART1空闲中断和NVIC中断 3.编写MM32F0020 UART1中断接收和空闲中断函数 4.编写MM32F0020 UART1 ...
- 【黑马程序员C++ STL】学习记录
黑马程序员 2017 C++ STL 教程(STL 部分已完结) 基于黑马STL课程整理:黑马程序员2017C++STL教程 视频链接 专栏:本STL专栏目录 文章目录 黑马程序员 2017 C++ ...
- (acwing蓝桥杯c++AB组)2.1 二分
二分与前缀和 文章目录 二分与前缀和 二分 整数二分核心思想 整数二分模板 整数二分步骤总结: 题目链接 实数二分核心思想: 题目链接 三分法思想: 二分 难点:二分的边界问题 整数二分核心思想 确定 ...
- Create Table 实例
1 USE databaseWeb; 2 DROP TABLE IF EXISTS tb_person; 3 CREATE TABLE tb_person( 4 id INTEGER AUTO_INC ...
- Docker——dockerfile
dockerFile介绍 dockerFile是用来构建docker镜像的文件!命令参数脚本! 步骤: 编写dockerFile文件 docker build构建成为一个镜像 docker run运行 ...
- Redis+Caffeine两级缓存,让访问速度纵享丝滑
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 在高性能的服务架构设计中,缓存是一个不可或缺的环节.在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中, ...
- ThreadPoolTaskExecutor原理、详解及案例
为什么要用线程池? 服务器应用程序中经常出现的情况是:单个任务处理的时间很短而请求的数目却是巨大的. 构建服务器应用程序的一个过于简单的模型应该是:每当一个请求到达就创建一个新线程,然后在新线程中为请 ...