权限管理-查询所有菜单(递归) | 学习笔记

简介: 快速学习 权限管理-查询所有菜单(递归)

开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot)权限管理-查询所有菜单(递归)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/667/detail/11527


权限管理-查询所有菜单(递归)


目录:

一、简介

二、编写代码

三、总结


一、简介

查询所有菜单,把菜单表所有数据查询出来,需要构建树形结构,而这过程和之前的分类列表相似。

当时的分类列表现在跟它一样,要做成以下的样子

结构如下所示:

//菜单的 id

id:'1',

//菜单的名称

name:一级菜单'

//属性

children:  

// children 里的数组,存储的是二级菜单

id:' 11' ,

name:'二级菜单’,

//二级菜单里也有 id

children:  

id:' 111' ,

name:'三级菜单’

这是需要做的效果。当时在分类列表中做过,在课程列表都做过,它的具体操作如下:

找到章节 Vo,第二个是小节 Vo,做完后再封装,先封装章节,在封装小节。

@Data

//表示章节

public class ChapterVo

private String id;

private String title;

//表示小节

private List<VideoVo> chiJdrer = new ArrayList<>);

先查章节,再查小节先封装章节,再封装小节。这种方式目前也可以做,但是这种方式的缺点是,太固定了,先遍历章节,再遍历小节,此时再封装时效果并不是很好。

写的太固定了,就需要创建一级菜单、二级菜单、三级菜单、四级菜单等。这样做也不太方便

解决方式可以使用递归方式。

递归的解释如下:

在写程序时,不管用什么语言,无论是在 java、C++中,还是在其他语言中,递归操作是一个最常见的操作,可以使用递归查询所有菜单的功能,通俗来说,就是自己调自己,直到取到重复值为止。

更具体点,如果现在要查菜单,那就先查一级菜单,然后再查它下面的二级菜单,再查二级下面的三级,直到查不到数据为止。如果下面有再查四级以此类推,如果没有就不查了、

递归就是自己查自己,直到查不到数据为止。


二、编写代码:

回到项目中,改变方法名字,增加一条 guli:

//获取全部菜单

@ApiOperation(value="查询所有菜单”)

@GetMapping

public R indexAllPermission()

List<Permission> list = permissionService.queryAllMenuGuli()

return R.okO.data(“children",list);

建立一个方法,查询菜单,打开一类,根据表生成的值,有几个值是后来加入的,主要看以下两个属性:

@ApiModelProperty(value=“层级”)

@TableField(exist=false)//相关注解

private Integer level;

//如果说是一级菜单,level 值为1,

如果说是二级菜单,level 值为2,

如果说是三级菜单,level 值为3,

依次类推,用它表示当前是哪一菜单。

再返回数据:

@ApiModelProperty(value=“下级”)

@TableField(exist = false)

private List<Permission) children;

//存储下级目录

//获取全部菜单 D

@ApiOperation(value="查询所有菜单”)

@GetMapping

public R indexAllPermission()f

List<Permission> list = permissionService.query lMenuGuli()

//改变名称以区分

//获取全部菜单

@Override

public List<Permission>queryAllMenuGuliO [

//1 查询菜单表所有数据

QueryWrapper<Permission> wrapper = new QueryWrapper<>();

wrapper.orderByDesc(..columns:"id");

List<Permission> permissionList= baseMapper. selectList(wrapper);

//2 把查询所有菜单 list 集合按照要求进行封装

List<Permission> resultList = bulidPermission(permissionList);

return resultList;

写递归的方法:

//把返回所有菜单 list 集合进行封装的方法

public static List<Permission> bulidPermission(List<Permission> permissionList)

// public static 是为了后面调取方便

做递归的查询,需要有一个入口,需要从一级开始查起,最顶层的数据是递归查询的入口。这就是递归查询的原则。

根据 pid 等于0

依次进行查询:

//创建 list 集合,用于数据最终封装

List<Permission> finalNode = new ArrayList<>();

//把所有菜单list集合遍历,得到顶层菜单 pid=0菜单,设置 level 值是1。

for(Permission permissionNode : permissionList)(

//得到顶层菜单 pid=0菜单

if("o [equals(permissionNode.getPid()))(

//设置顶层菜单的 level 是1

permissionNode.setLevel(1);

//创建 list 集合,用于数据最终封装,将它移到上方。

List<Permission> finalNode = new ArrayList<>();

finalNode.add(selectChildren(permissionNode,permissionList));

//根据顶层菜单,向里面进行查询子菜单,都查完后,再封装到 finalNode 里面。

finalNode.add(selectChildren(permissionNode, permissionList)) ;

这只是查询了一级菜单,如果想要继续向下查询,还需要做到以下的步骤:privatestaticPermissionselectChildren(PermissionpermissionNode,List<Permission>permissionList)

//1.因为向一层菜单里面放二层菜单,或者二层里面还要放三层,如果有四层,还要放三层,依次类推,把对象初始化。

permissionNode.setChildren(new ArrayList<Permission>());

//2.遍历所有菜单 list 集合,进行判断比较,比较 id 和 pid 值是否相同

for(Permission it : permissionList)(

//判断 id 和 pid 值是否相同

if(permissionNode.getId().equals(it.getPid()))(

用一级的 id 和二级的 pid 进行比较,判断是否相同。

如果相同,继续进行以下的操作:

//把父菜单的 level 值+1

int level = permissionNode.getLevel()+1;

it.setLevel(level);

数据需要做封装:

//把查询出来的子菜单放到父菜单里面

permissionNode.getChildren () .add(it);

它只能放一次,不能放多次,所以需要写递归。

在 it 里再去调用 selectchildren,在里面上传两个值,一个是 it,一个是所有的值,即 permissionlist

最终返回:

//将 retun nill 删除,改成 retun permissionode

此时递归操作就写完了。


三、总结

他的过程有很多步,非常复杂。

第一步是,做递归查询有一个原则,就是先找到递归查询的入口,入口是一层菜单输入口,把所有的菜单得到,做个遍历,然后进行判断,如果 pid 是0,就是一层菜单,得到之后,level 变成1,通过一层菜单往下查询,这个方法只是得到一层菜单。

根据一层调用方法,查它的一层二层三层等,写完后把菜单做个判断,判断一级的 id 和二级的 pid 是否一样。如果一样,就是下面的子菜单,把 level 值加一。把it值封装起来。加add就可以了。

递归就是重复教程,

//把查询出来的子菜单放到父菜单里面

permissionNode.getChildren () .add(it,permissionlist);

就是一个重复的过程,直到查不完数据为止。

最终返回。

if(permissionNode.getChildren() == null)

如果 permission 的值为空,还要继续操作。

需要注释以下:

//如果 children 为空,进行初始化操作

if(permissionNode.getChildren()== null)

permissionNode.setChildren(new ArrayList<Permission>());

可以查出当前里面的所有菜单,并且根据菜单进行封装,重复掉 select 方法,这是递归就完成了。

相关文章
|
5月前
|
存储 JavaScript 前端开发
《跨越边界:探索跨端框架中通用状态管理方案设计》
跨端应用开发中,状态管理是关键枢纽,直接影响性能与体验。面对Web、移动端、桌面端的差异,设计通用状态管理方案尤为重要。通过分层架构(存储层、逻辑层、交互层)、抽象状态模型及事件驱动设计,结合工具优化与测试机制,可实现多端一致、高效的状态管理,提升开发效率与用户体验。
157 29
|
存储 编解码 安全
阿里云服务器计算型c7与c8y、通用型g7与g8y、内存型r7与r8y区别及选择参考
在阿里云目前的活动中,除了轻量应用服务器和经济型e、通用算力型u1实例的云服务器之外,性能更高的云服务器实例规格有计算型c7与c8y、通用型g7与g8y、内存型r7与r8y,这些实例规格更适合企业级用户的上云需求,有的用户并不是很清楚他们之间的区别,从而不知道应该如何选择,本文就为大家介绍一下他们之间的区别,以供选择参考。
阿里云服务器计算型c7与c8y、通用型g7与g8y、内存型r7与r8y区别及选择参考
|
存储 缓存 Java
三级缓存实操系列(四)
三级缓存实操系列(四)
|
JSON 测试技术 API
pyhttptest 与 RESTful API 测试的完全指南
现在,无论是开发还是使用服务,我们每个人都面临着 REST API 的挑战。同时,我们正处于微服务的流行时代,我们将业务逻辑拆分为多个独立的小服务。这些服务大多遵循 RESTful 原则,并使用 JSON 格式进行通信,因为其简单性使其成为最广泛使用的格式。
|
Devops 开发者
从DevOps到BizDevOps,后疫情时代的技术破局之路
6位大咖带你走进《数字化转型浪潮下的技术破局之路》,共同探讨数字化转型浪潮下的技术变局以及应对之道。
649 0
从DevOps到BizDevOps,后疫情时代的技术破局之路
|
弹性计算 关系型数据库 MySQL
动手实操快速搭建LAMP环境
本实验介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
267 0
|
Web App开发 JavaScript 前端开发
Chrome 控制台console的用法(转)
一、查看命令 下面我们来看看console里面具体提供了哪些方法可以供我们平时调试时使用。 目前控制台方法和属性有: ["$$", "$x", "dir", "dirxml", "keys", "values", "profile", "profileEnd", "monitorEvent...
1562 0
|
C语言 C++
贺利坚的课程教学链接
汇编语言程序设计 汇编语言程序设计课程主页 程序设计基础(C语言) 程序设计基础(C语言)课程主页-2016级 数据结构 数据结构课程主页-2015级(2016-2017-1) 数据结构课程主页-2014级(2015-2016-1) (CSDN学院)数据结构基础系列网络课程主页  C++程序设计(新版) C++程序设计-2015级主页(含学生链接) CSDN学院在线课程
1941 0