java实现多级菜单展示(递归)

实体类如下:

package com.ssdl.baize.po;import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;import javax.validation.constraints.NotBlank;
import java.util.Date;import static com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE;@Data
@TableName("baize_sys_menu_entity")
@ApiModel(value = "MenuEntity")
public class MenuEntity {@TableId(value = "id", type = IdType.AUTO)private Long id;private String path;private String name;private String redirect;private String icon;private String title;private Integer rankRank;private String component;private Boolean keepAlive;private String frameSrc;private Long menuPid;@TableField(value = "update_time", fill = INSERT_UPDATE)@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date updateTime;@TableField(value = "create_time", fill = FieldFill.INSERT)@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date createTime;@TableField(fill = FieldFill.INSERT)@JsonIgnoreprivate String createUser;@TableField(fill = FieldFill.INSERT_UPDATE)@JsonIgnoreprivate String updateUser;@TableLogic@TableField(fill = FieldFill.INSERT)@JsonIgnoreprivate Integer isDeleted;}

VO:

package com.ssdl.baize.entity.vo;import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.util.List;@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@ApiModel(value = "MenuPONewVo")
public class MenuPONewVo {private Long id;private String path;private String redirect;private String name;private String component;private MetaVo meta;private List<MenuPONewVo>  children;private Long menuPid;}
package com.ssdl.baize.entity.vo;import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@ApiModel(value = "MetaVo")
public class MetaVo {private String icon;private Integer rank;private String title;private Boolean keepAlive;private String frameSrc;
}

获取树状的菜单结构:

public Response<List<MenuPONewVo>> getMenu(){// //先获取你想要在哪些菜单范围内搜索List<MenuEntity> list = this.list();// 父id (顶层菜单)为 0 List<MenuEntity> collect = list.stream().filter(a -> 0==a.getMenuPid()).collect(Collectors.toList());//  排序collect = collect.stream().sorted(Comparator.comparing(MenuEntity::getRankRank)).collect(Collectors.toList());  List<MenuPONewVo> result = new ArrayList<>();for (MenuEntity a : collect) {MenuPONewVo menuPONewVo = new MenuPONewVo();// 把最上级菜单的子菜单获取到,子菜单的子菜单也会获取到(目前是三层,由于是递归调用多少层都没有关系)List<MenuPONewVo> child = getChild(a.getId(), list);menuPONewVo.setId(a.getId()).setPath(a.getPath()).setRedirect(a.getRedirect()).setComponent(a.getComponent()).setName(a.getName()).setMeta(new MetaVo().setFrameSrc(a.getFrameSrc()).setKeepAlive(a.getKeepAlive()).setTitle(a.getTitle()).setRank(a.getRankRank()).setIcon(a.getIcon())).setMenuPid(a.getMenuPid()).setChildren(child);result.add(menuPONewVo);}return Response.success(ServerCode.SUCCESS.getCode(), "查询成功!!!",result);}

获取子菜单方法:

/***通过传入当前菜单id,获取当前id的子菜单 且子菜单里也有子菜单及其信息,直到子菜单没有子菜单了,递归结束* @param id  当前菜单的id* @param menus  要查询的菜单范围* @return  该id的子菜单*/
private List<MenuPONewVo> getChild(Long id,List<MenuEntity> list){List<MenuPONewVo> childList = new ArrayList<>();for (MenuEntity a : list) {if(a.getMenuPid()!=null && a.getMenuPid().equals(id)){MenuPONewVo menuPONewVo = new MenuPONewVo();menuPONewVo.setId(a.getId()).setPath(a.getPath()).setRedirect(a.getRedirect()).setComponent(a.getComponent()).setName(a.getName()).setMeta(new MetaVo().setFrameSrc(a.getFrameSrc()).setKeepAlive(a.getKeepAlive()).setTitle(a.getTitle()).setRank(a.getRankRank()).setIcon(a.getIcon())).setMenuPid(a.getMenuPid());// 当菜单范围内的父id等于传入的id,获取该id的所有子列表childList.add(menuPONewVo);}}for (MenuPONewVo menu : childList) {// 当上面循环语句查询不到子菜单,长度为0,自然也就不会递归调用了// 将该id的子菜单便利,通过递归调用,给每一个子菜单赋值子菜单List<MenuPONewVo> child = getChild(menu.getId(), list);menu.setChildren(child);}if(childList.size()==0){//子菜单的长度为0,返回nullreturn  null;}return  childList;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/40810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cefsharp在splitContainer.Panel2中显示调试工具DevTools(非弹出式)含源代码

一、弹出式调试工具 (ShowDevTools) ChromiumWebBrowser webbrowser; public void showDevTools(){//定位到某元素webbrowser.ShowDevTools(null, parameters.XCoord, parameters.YCoord);

STM32智能农业监控系统教程

目录 引言环境准备智能农业监控系统基础代码实现&#xff1a;实现智能农业监控系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 控制系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;农业监控与优化问题解决方案与优化收尾与总结 1. 引言 智能农业监控系统利用STM32嵌…

代码随想录day37 动态规划(3)

416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; 解1&#xff1a;二维dp数组&#xff0c;时间O(m*n)&#xff0c;空间O(m*n)&#xff0c;m、n为dp数组的行和列数。 判断原数组总和能否整除2&#xff1b; 将target设为total // 2&#xff08;若是total / 2&#…

遇到的异步问题

事例1&#xff1a; app.post("/predictfunc") async def predictfunc(item: Item):# 使用asyncio.to_thread()在单独的线程中运行predict_in_threadresult await asyncio.to_thread(predictfunc_main, item)return result 事例2&#xff1a; app.post("/remo…

PCL从理解到应用【02】PCL环境安装 | PCL测试| Linux系统

前言 本文介绍在Ubuntu18.04系统中&#xff0c;如何安装PCL。 源码安装方式&#xff1a;pcl版本1.91&#xff0c;vtk版本8.2.0&#xff0c;Ubuntu版本18.04。 安装好后&#xff0c;可以看到pcl的库&#xff0c;在/usr/lib/中&#xff1b; 通过编写C代码&#xff0c;直接调用…

华为路由器静态路由配置(eNSP模拟实验)

实验目标 如图下所示&#xff0c;让PC1ping通PC2 具体操作 配置PC设备ip 先配置PC1的ip、掩码、网关。PC2也做这样的配置 配置路由器ip 配置G0/0/0的ip信息 #进入系统 <Huawei>system-view #进入GigabitEthernet0/0/0接口 [Huawei]int G0/0/0 #设置接口的ip和掩码 […

【UE5.3】笔记7 控制Pawn移动

使用A、D键控制角色左右移动 打开我们的BP_Player蓝图类&#xff0c;选择事件图表&#xff0c;添加我们的控制事件 右键&#xff0c;搜索A keyboard&#xff0c;选择A,如下图&#xff0c;D也是 添加扭矩力 首先我们要把我们的player上的模拟物理选项打开&#xff0c;这样我们…

ChatGPT在Java后端开发中的应用与影响

随着人工智能技术的发展&#xff0c;尤其是OpenAI推出的聊天机器人模型ChatGPT&#xff0c;其强大的自然语言理解和生成能力正在改变着我们的生活和工作方式。在Java后端开发领域&#xff0c;ChatGPT同样有着广泛的应用前景&#xff0c;并且能够为Java后端开发者带来诸多好处。…

Caused by: java.io.IOException: Broken pipe

IO异常&#xff1a;管道破裂。 推荐文章&#xff1a;解决java.io.IOException: Broken pipe的报错

JavaFx基础知识

1.Stage 舞台 如此这样的一个框框&#xff0c;舞台只是这个框框&#xff0c;并不管里面的内容 public void start(Stage primaryStage) throws Exception {primaryStage.setScene(new Scene(new Group()));primaryStage.getIcons().add(new Image("/icon/img.png"))…

【不锈钢酸退作业区退火炉用高温辐射计快速安装】

项目名称 不锈钢酸退作业区退火炉用高温辐射计快速安装 改造实施项目简介项目提出前状况:不锈钢生产过程中,各种型号的不锈钢带钢在退火工艺中对带钢温度的准确性要求很高,带钢温度的检测直接影响带钢的产品质量,不锈钢带钢温度测量依靠的是高温辐射计,其测量的准确性、稳…

【Python机器学习】算法链与管道——通用的管道接口

Pipeline类补单可以用于预处理和分类&#xff0c;实际上还可以将任意数量的估计器连接在一起。例如&#xff0c;我们可以构建一个包含特征提取、特征选择、缩放和分类的管道&#xff0c;总共有4个步骤。同样的&#xff0c;最后一步可以用聚类或回归代替。 对于管道中估计器的唯…

@Validated 根据字段的值不同,动态分组校验

GroupSequenceProvider 配置 作用域只在单个对象的字段里 Data GroupSequenceProvider(value TestProvider.class) public class TestRO {NotNull(message "不能为空",groups ValidatedRemark.A.class)Pattern(regexp "2|3|",message "只能为2,…

vue2使用use注册自定义指令实现权限控制

版本环境 vue的版本是^2.6.12&#xff0c;将会使用到Vue.use()、Vue.directive() 适用环境 页面某些按钮&#xff0c;需要受到当前登录用户的“角色”“权限”的影响&#xff0c;通过store获取角色role和权限permission&#xff0c;通过自定义指令的方式&#xff0c;控制某一…

antd DatePicker日期选择框限制最多选择一年

实现效果 实现逻辑 import React, { useState } from react;const ParentComponent () > {const [dates, setDates] useState(null);const disabledDate (current) > {if (!dates) {return false;}const tooLate dates[0] && current.diff(dates[0], days) &…

Appium自动化测试框架1

电脑的浏览器 手机的浏览器 手机上的app 原生的应用 纯java 手机上的app apk 移动网页应用 纯HTML CSS 手机的浏览器上 电脑的浏览器上 混合应用 java html css python代码 Appium python库 Appium 手机 都是代表本机 0.0.0.0 127.0.0.1 localhost 如何启动app 启动参…

土壤养分化验仪:农业生态与可持续发展

随着现代农业技术的不断进步&#xff0c;土壤养分化验仪在农业生产中扮演着越来越重要的角色。这款高科技设备以其高精度、高效率的特点&#xff0c;为农业生态与可持续发展提供了强有力的支撑。 一、农田土壤监测与管理 农田是土壤养分化验仪最主要的应用场所。通过对农田土壤…

【AI】DeepStream(14):图像分割deepstream-segmentation-test示例演示

【AI】AI学习目录汇总 1、简介 deepstream-segmentation-test示例演示了图像的语义分割。两个配置文件,分别加载U-Net和Res-UNet两种分割模型 unet_output_graph.uffunetres18_v4_pruned0.65_800_data.uffU-Net是一个在生物医学图像分割领域广泛应用的卷积神经网络(CNN),…

集团型企业组织架构复杂,业务线多,如何进行高效费用管控?

企业管理中流行这样一句话&#xff1a;“企业转型&#xff0c;财务先行”。对集团型企业而言&#xff0c;当今的发展形势下&#xff0c;通过财务战略全面转型、最终撬动企业价值提升&#xff0c;是一件难而正确的事情。 集团企业具有经营规模大、产业链多、分支机构多、地域跨度…

地下电子标识器探测仪ED8000选型注意事项

ED8000探测仪是一台集成了多频率、多种ID标识器调制模式、高低灵敏度调节、可读写标识器等全功能、高性能电子标识器探测仪。它有着极高的灵敏度,同时具备良好的噪声抑制能力&#xff0c;不仅适合专业测绘人员&#xff0c;普通操作人员也可以轻松掌握。 ED8000可支持模拟电子标…