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 ...
随机推荐
- 全面解读 AWS Private 5G 的革新理念
目录 目录 目录 前言 近几年 AWS 在 5G ICT 领域的部署 AWS 与 Verizon 合作推出的 Private MEC 解决方案 AWS 与 Vodafone Business 合作推出 ...
- BSOJ6310题解
互不相同,太困难啦!!!!!! 考虑可以相同的情况.可以容斥. \[ans=(1+1+1+1)-(2+1+1)+(3+1)+(2+2)-(4) \] 有点抽象,看看就好() \[ans=(a,b,c, ...
- web服务器-nginx虚拟主机
web服务器-nginx虚拟主机 一 虚拟主机介绍 就是把一台物理服务器划分成多个虚拟的服务器, 每一个虚拟主机都可以有独立的域名和独立的目录,同时发布俩个网站. 二. 基于IP的虚拟主机 应用场景: ...
- 磁盘管理--如何在VMware上给centos7增加一块磁盘
一. 实验环境 VMware Workstaion + Centos7 二.实验步骤 1.关闭虚拟机,添加磁盘 2.添加硬件向导 硬件类型 你要安装哪类硬件? 点击完成观察到已经成功添加磁盘 3.开启 ...
- vue2.x版本中computed和watch的使用入门详解-watch篇
前言 watch顾名思义,属于vue2.x版本中,监听和观察组件状态变化的钩子函数,常见的应用场景有监听路由变化,以及父组件传递给子组件的props数据的变化等 基本使用 在使用watch的时候,需要 ...
- go语言学习入门篇 3-- 程序执行流程
先看下 Go 语言的程序结构: package main // 当前包名 import "fmt" // 导入程序中使用到的包 // 初始化函数 func init() { // ...
- 知识点简单总结——minmax容斥
知识点简单总结--minmax容斥 minmax容斥 好像也有个叫法叫最值反演? 就是这样的一个柿子: \[max(S) = \sum\limits_{ T \subseteq S } min(T) ...
- VT 入门番外篇——初识 VT
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- Rabbitmq安装与部署
一:安装依赖软件Erlang 安装包otp_src_22.3.tar.gz,下载到部署服务器tar -zxvf解压 mv otp_src_22.3 ./erlang变更文件夹名字 可能需要安装的依赖包 ...
- 多线程常用代码 Future Callable Runable
public class ThreadPoolTest { public static void main(String[] args) throws InterruptedException { E ...