00:00
然后咱们下面呢,写三个方法,第一个方法带着各位来写,这个方法就是获取所的菜单,也就是对应咱们里边的这个control中permission control菜单里边的第一个方法,获取全部菜单。那这个方法要怎么做,给大家我来说一下啊。我这里边已经写好了,待会给各位重新写一遍,让大家加一下印象啊,来写这个,那比如说我给他加上一个这么一个注解啊,就为了咱后面测试方便,这个就是。查询所有菜单,然后这个方法要做什么效果呢?先做一个基本的一个分析啊,给各位小弟位置啊,咱简单分析一下。查询所有菜单,也就是把我们菜单表中的所有数据都给它弹出来,但是查来之后要给它构建成一种树形的这种结构,就做成树形那种结构,而这过程和咱之前写那个分类的列表应该是很相似的,咱当时写分类列表。
01:07
做的就是一个使用结构,而现在跟他一样,也就是说呢,咱做成什么样子给大家啊,我简单画一下,假如我现在有这个菜单,它里边的最外层。肯定是这么一个。对象的形式,然后在里边,比如说我们现在有这个菜单的ID啊,假如说ID是一,然后有一个菜单的名称,比如是name,比如第一个名称,我们叫这个就是比叫一级菜单啊,这是一个,然后在这里边呢,我们还有一个属性叫那个children准。大家写一下,这个叫children。Children准在children里边呢,我们有一个数组,数组里边呢,存储是它那个二级菜单,比如说我这里边画一下啊,二级菜单中我们里边也是有一个对象。比如说咱们这么来写,然后在它里边也是有那个ID。
02:03
比如说ID啊,我们叫幺幺,然后下面有一个名称,比如名称name。Name,我们就叫二级菜单。这是第二个啊,然后咱们在二级菜单里边,它可能还有子菜单,那我们就是再来一个叫秋准。然后就这里边是个数组里边还有,然后有的话可能是它的三级,或者说它有四级,以此类推,往里边写这个值啊,比如说啊,咱再写一个。假如它是这种形式。然后在里边我们有它那个三级菜单,比如说现在他的三级菜单是这个111,然后这个叫三级,当然可能有四级,有更多级,所以咱现在我就要把这个。菜单按照这种形式我们给做显示,也就是说构建成一种树形结构啊,这是我们要做的效果,而就是在里边肯定会有多个一菜单,每个一中可能会有多个二级,然后每个二级中可能又有多个三级,所以咱们最终给他封装成。
03:11
这种形式啊,这是我们要做一个效果,希望各位知道啊,而这种效果呢,咱之前应该是做过类似的,只是咱们当时啊,应该只有两级,没有三级,有没有四级,那咱当时在什么地方做过呢?就是在这个分类列表中,还有那个课程大纲列表中,这咱当时应该都做过,那怎么做,咱快速看一下啊,然后一会儿咱换一种方式把这实验出来。咱们快速找到啊,找到咱那个一丢里边。咱们看啊,当时我们做法找到里面的位置啊,咱就找到这个地方啊,咱就以这个章节小节为例,注意我们当时的写法,第一个三见两十一类,第一个是章节VO,第二个是小节VO,然后章节里边用粒子集合是不是代表它的小节。
04:01
当时这么做到的,然后做完之后咱做封装,先封装章节,在章节里边再封装小结,咱是写那个循环,包括便利,包括做这操作,这代码咱也找到。在开里边,当时咱应该就是。这个写法先查章节,再查小节,然后给他便利,包括封装章节,封装小结,做这个欠刀破循环把这个就是咱做到了,当时咱是这么一种方式实现,就是这种方式呢,我们目前其实也可以这么做,但是这种方式有它的缺点,各位应该能看到哈,你看啊,这种写法中咱的章节小节这些咱是不是写的固定的,就是你有章节有小节,如果你再有的话,那我还要写11类,还要做这个过程,所以这么写,写的就是太固定了。然后你再就是做封装手,大家还要写这个嵌到for循环,先遍利章节,再遍利小节,所以这么做它的效果也并不是很好,另外写法中啊,这也不是很方便,就写的太固定了,所以咱们现在要做的话,咱现在也能这么做,就是这么做的话,你需要创建就是你的一级菜单,二级菜单,三级菜单,如果有的话再建四级等等,这么做不方便,所以咱可以怎么做呢?另一种也是一种比较常见方式,咱就可以写一个叫递归,通过递归方式把这个可以做到。
05:22
那什么叫递归呢?给大家啊,来解释一下啊,就这个词。因为咱们写程序中,不管你用什么语言,你是用,比如我们用Java还是用C加加,或者说其他语言,这个递归这种操作肯定是一个最常见操作。现在咱就可以使用叫。递归来实现查询所有菜单这功能,那递归什么意思呢?说的通俗点就是自己重复调自己,直到取到值为止,那说的更具体点啊,比如我现在我要查菜单,那咱就先查一菜单,然后查他下面的二级菜单,再查二级下面的三级,直到查不到数据为止,如果下面有,那得查四级,再有的查五级,如果没有那就不查了,有的话继续往下来查,就是这种过程叫递归,就是自己重复调自己,直到查不到数据为止啊,所以咱现在用递归把这些做到。
06:19
这各位知道啊,我们这个应用场景递归的写法确实稍微麻烦一点,因为它里边啊,那个过程比较抽象,不太好理解,但是虽然说不好理解,然后各位这些代码必须要会写啊,因为就是这么来说吧。你说捡一个程序员,他是什么级别,不是说检他能做什么自然杆的操作,而需要他做出一些别人不会做的事,或者别人不熟练的事情,这个递归就是一种很好体现,如果说你把递归能够很熟练的用很清晰思写出来,那你写着把层次就能提升一个档次,所以咱把DV会给他好好去练练写写啊,咱下面就开始简这代码,就为了让大家把代码更加熟练,把我们的编程这种。
07:06
层次啊,就是进一步提升,咱就写这个递归。那咱们啊,具体看一下啊,还回到我们这项目中,咱们现在在permission里边,这个方法是查询所有菜单,这个我之前写过了,大家为了区分给大家重新写一遍,这些方法名字我都特别改一下啊,这大家后面都加上一个叫这个,呃,都叫鼓励啊,就为了区分,现在我们都改成这个方法啊,那现在你看啊,在我的CTRL里边,我们建立一个方法。查所有菜单,然后所有菜单呢,返回就是这个叫permission啊,咱通过这个操作,那怎么做呢?给大家说思路啊,首先第一部分咱把permission这个试一类打开,咱打开啊。这里边呢,其实就是根据咱的表生成的这么一个,就是基本一些值,但是值里边呢,有几个值是我后面额外加的值,咱主要看。
08:04
这两个属性,这两个属性在表中是没有的啊,那咱看什么意思啊,前面都是一些基本,比如说你的IDPID名称什么类型等等,但是咱看这两只。这两个什么意思呢?大家看啊,第一个叫level是不是层级啊,还有一个叫children准,就是它下级那数据,那我强调什么意思啊,就是如果说啊,你当前是一级目录或者一级菜单,这个level值就是一,如果说你是二级菜单,它的值就是二,Children表示它下面那个就是结果,比如说按照我刚才说的,当你一下面有二级,那用children里边存储。二级前面有三级求源存储,但是它里边还需要有个值,就咱说那个level。我大概写一下啊,这边是有一个叫level。如果说你是一级菜单,那level值就是一,如果说你是二级菜单,那level值就是二,如果说你是三级菜单,那level值就是三,所以里边我是特别加了这么一个属性level,用它表示你当前是哪级菜单,就是123啊,一会儿这个这个处理,另外秋准存他的下季目录啊,这是我们做的第一部分,这个我提前写好了,当然各位看到也能看懂它是什么意思啊。
09:24
主要这么两个值啊,这是用到就是这个没什么用啊,就是table field做那个相关的一个注解啊,主要是这个啊。给大家。截过来啊,咱是加了这个东西。然后这个看到之后咱再回来啊,就是现在我再返数据,其实返回就这个permission,因为它是递规模在一个里边,它里边有这个children children里边可以再存permission,也就是这个效果,咱看啊整个是一个permission,然后每个children中是不是又是一个permission里边又是一个,就是每个不同对象,因为咱们加了这个层级和他的这个children准啊。
10:03
是不是一个值,这各位知道啊,所以咱们这个方法,然后这个选完之后,下面咱在里边创建一个方法,然后实现这个过程,那我们来给我创建,把这个啊创建一下,这我重新写了一个啊。然后这个方法我们就叫。Query,这个O古力啊,这个值就是查所有菜单的啊,把这个小这位置,然后写完之后,咱们来到S的实现类中,把这方法我们最终做个实践。啊,就是里边的这个方法把它我们做到啊,然后咱们下面把这方法我们就继续来写一下啊,看他该怎么做到啊,下面有些工具类的方法啊,咱们也是一会儿重新来写。找到这位者。呃,为了区分,我给他就拿到我们的。最下边去啊,为了咱们能看到我们这个更好的效果。我给他加一些注释啊。咱为了就是测试一下啊,特别加一下啊。
11:02
这个位置我写到这里啊。然后下面呢,在这里边咱就写一下这个操作,看他该怎么去做啊,那我们来实现啊。首先各位注意啊,它的功能是不是要查所有菜单呀,那我们的第一步操作,咱先把表中的所有菜单先查出来,然后查出来之后再按照咱这结构做封装,就是先有数据才能做封装,所以第一步先给他查出来。然后写一下啊,第一步先查询你这个菜单表里面的。所有数据啊,咱们先做查询,那我来写一下啊,因为它是在service里边,我就调这个base map中查询所有的方法,就是这个select list,然后里边加个条件,条件可以为空啊,那我们也给它加个条件,比如条件我就做一个排序了啊,我觉得它更明显啊,这里边加一个叫。Permission。然后这个名字我们就叫rapper,等于new上一个快rapper rapper里边给它加个条件,就加个排序啊,再来一个叫order by。
12:07
DSC。根据它那个ID,咱就给排序看一下表中那个字段找到啊,就这个ID排序一下啊,就给它加个条件啊。然后这里边传入我们的rapper,最终返回是一个历史集合,这历史集合里边就是我们现在查出表里边的所有菜单的集合,但这集合咱们要按照结构封装,只是把数据都有了啊,这是咱们做的第一步操作,然后这个做到之后,下面咱就通过这个数据把它最终。封装成咱们要的这种结果啊,咱来做这个事情,然后写一下啊第二步。就是把我们查询出来的所有菜单的历史集合,按照咱们的要求进行这么一个封装,那咱来写一下啊,那首先这里边比如说我写一个返回值,因为它返回到就这个例子集合值,这集合中呢,咱要按照要求封装,然后给它起个名字,比如叫这个result list。
13:14
然后下面咱们做封装,这封装为了明显,我在下面咱们单独写个方法来做到,就专门写个方法,比如方法我就起个名字啊,就是这个构建菜单数据,我就叫build permission。G my promi就有它了啊,然后在里边呢,把咱那个例子集合传进去,就是你查出来集合传进去,咱把封装过程都在这里边统一写出来啊,这是我们的第二部分,把这结果做封装,然后这方法往上来写,最后把这值封装之后,你做一个返回。这个啊,咱的一个基本的一个结构啊,然后写完之后呢,下面咱来创建这个方法,在这方法中来完成咱这个递归的操作,就是下面咱就要写这个递归了啊,当然这个方法呢,你可以写一个工具类中,我这里边有填效工具类,那我为了明显我就在当前这个里边写了啊,咱们把方法创建啊。
14:14
这个方法。就他啊。咱来做一个操作啊,因为是当前里边呢,我就来一个。啊,或者写public啊都一样啊。为了明显来一个public,为了后面调方便啊。这是咱写到的啊,然后下面咱们把这个写完之后呢,下面咱要写什么呢,我先read一个空啊,不让他报错。在里边我们实现啊。价格注释。他就是把咱们返回到所有菜单的历史集合,进行那个封装。它的这么一个方法,那咱们下面要怎么做呢?给大家说明啊,各位注意,因为咱们现在要做的过程是不是叫递归,有递归什么意思,是不是就是一个一个往里面去查呀,就自己重复查自己,那咱们要查的话,注意啊,不管你做什么事情,写什么程序,是不是要有一个叫入口啊,就是从哪里开始,比如说咱们写程序,我们执行main方法是叫入口啊,咱查询做递归有一个原则,需要你有一个查询的入口。
15:19
希望各位记住啊,这是一个原则,你做递归查询需要有一个入口,就从哪里开始进行查询,不是说你随便去写的,那什么叫入口,大家看啊,就是现在比如说我想查里边的所有菜单,那菜单咱是不是要从那个一级菜单就查往下查,就一级先查出来,查二级,再查三级,查四级,所以你的一级是你的入口,那大看我的数据中哪个是一级呢?大家看这结构中啊,各位看到。你看这行数据。各位仔细看啊,要全部数据,它的PID是什么,是不是零啊,所以这就是咱们的最顶层的数据,可以理解为就是咱们递归查询这个入口,这是啊,咱要做到的,所以你记住啊,递归的原则,你做查询需要有一个入口,不是说随便查到,那是入口,咱要怎么做,咱先分析啊,大家看,如果说你想得到它一个最明显标志,它的pad是不是等于零啊,所以咱们做法就是根据PI等于零把这得到,然后再做操作啊,包得到之后,按照我刚才说到的,如果你是一级,那它level是不是就是一有,那我们就做个设置。
16:29
啊,那我来写一下啊,这过程可能稍微麻烦一点啊,但是希望各位记住,我再重复一遍啊,就是你做递归查询一个原则,需要有一个查询的入口,就从哪里进入查询,咱现在做菜单,那菜单入口是不是就是你的D最顶层的一级菜单呀,而在表中咱看到PID等于零,是咱们最顶菜单,所以从它进入我们的查询入口,就是从它往下依次做查询啊,这是第一个,而查出来之后他的level可能是一,这是二,下面有三有四等等。
17:04
啊,那咱们写一下啊,看怎么做啊。就这位置大家注意啊,咱们这个集合里边是不是有所有数据啊,所以单做法就是写一下啊,我们现在就是把我这里边就是所有菜单的历次集合。先做一个便利啊,就把它先便利,然后便利之后呢,我们就是得到里面那个就是顶层的那个菜单,也就是这个PID等于零的这个菜单,把这得到,然后得到之后我们设置它那个level值是这个一,就来做这个事情,把它便利,然后做。取到那个PA等于零的值,然后设置LEVEL11,这就是我们的入口,得到入口之后,下面就是依次往里面查就可以了,那当然做一下啊,我现在咱就写这么一个,呃。负循环啊,当然负循环呢,你可以写普通否循环,我这里边咱写一个那个增强负循环吧。
18:03
但是做法都都一样的啊,我就来一个叫呃permission,然后起个名字,这个名字我就叫这个呃,Permission。TR啊,Permission这个node啊,就是咱这个节点啊,为了区分一下啊node,然后加个冒号,再加上咱这个叫permission list,这样的话啊,把它便利,然后这个permission node就是每次遍历出来那个。菜单那个节点,或者说菜单对象啊,这是一个,然后得到之后,下面咱做的就这个事情,得到你的顶层菜单,并且设置它的值是这个角level啊,把这得到,那咱来得到一下啊,怎么得到这里写到了PID等于零就可以了啊,那我们就获取一下啊,咱就加上一个。If条件,然后里边判断,如果说你这个零。点上这个equals,加这个叫permission no。
19:03
点上get PID是不是得到顶菜单,然后得到之后怎么做呢?咱就是啊第二部分设置你顶层菜单的level值是这个一。啊,顶层菜单的level值是一,那我们来设置一下啊,顶层菜单我先得到,就是它permission node,点上里面一个方法叫set level,这个值就是一,这表就得到定菜单啊,因为这个值咱刚才看到过了啊,在pro里边我是直接加了两个属性level表示它是第几层,所以咱把它变成一,就是顶层菜单啊,这个得到了,然后这个得到之后呢,下面咱怎么做呢?根据顶层菜单继续往里边进步查,就查他的第二层,第三层或者说第四层,咱依次给他查询,然后都查完之后,最后把数据再给他放回到我们那个机构中去。啊,那我们写一下啊,这个位置,比如说我先创建一个意思集合,用于咱们那个数据的最终的一个封装。
20:08
啊,咱先来个集合做最终封装到上边啊,就来一个list,然后调。Permission。比如这个名字,我就叫这个。Final no,就是最终那个节点,等于new上一个list啊,这是咱们最终那个值,然后这样的话,这最终值最后肯定要返回,但是返回的过程之前呢,咱肯定在里边要做封装,那怎么做啊,写这位置啊。就是咱们要。根据我们的顶层菜单,然后就是向这个里边继续往下查询它的子菜单。啊子菜单,然后查出来之后都给它封装到我们这个final no的这个里边去啊,放到这里边去,咱主要做这个过程,那final node向里边可能要封装,咱就加上一个A啊,然后里边做咱那个查询过程,当然查询过程呢,这里边如果咱在里边写啊,就不方便了,那我就是再起个方法,专门做下一层的查询,我先写啊,然后解释啊,比如这个方法我给他起个名字,我就叫这个,呃。
21:22
Select这个children。然后在在里边传你那个所有的集合,还有就是你这个一级节点或者一级菜单这个对象我们叫permission node。这个给他传过来,然后最后把它最后返回啊,这个是咱写的,然后咱们里边有个方法,把方法。做个创建。这个啊是一个基本结构,我先写出来啊,下面我来再解释一下啊,这个过程稍微麻烦点啊,如果它简单,那就不叫递归了啊,那咱们再说一遍,什么意思啊,首先第一个各位记住啊,你做递归操作一个原则,需要找到你查询一个入口,它不是随便查的,要找到入口,而咱现在按照我们的实际入口是不是你的顶级菜单,所以咱就得到顶级菜单,那怎么得到把这个便利,因为里边有所有数据得到它的PA等于零,是不是顶级菜单,然后得到之后怎么做,根据顶级菜单是往下查询,所以咱们注意啊,这一方法只得到你的顶级菜单,而往下查询,咱就写到这个方法中,在这方法中做你一级下边菜查,比如你查二级,查三级,查四级,一次查询,所以这里边啊,这个方法只是得到一级菜单,咱真正查询递归是是在这里边要做到的。
22:45
不知道各位是不是能理解啊,这只是找到了你的查询的入口,就是一层菜单,也就是这个菜单,然后下面才有查询,那查询咱小这位这个过程中啊,然后把它都最终放到这里边去,那咱下面啊,最终就写下这个叫light children准里边做递归,就是从一级往下开始查询。
23:08
那咱们看怎么来做啊。咱往下筛一下啊,咱这些我我强调啊,我这么写可能还不是特别难理解,但是现在要求各位啊,把这些值先知道什么意思,因为后面咱还要写类似操作,到后面这值你很容易弄混。首先第一个啊。这个例子是你查出的所有菜单,然后这个permission node是便利出来那个一级菜单那个对象,这个final node是最终那个集合啊,这个各位要明确啊,这是所有那个菜单,这是你的一级菜单,这是你最终封装菜单,这几个参数各位要明确,然后这里边是为了判断,只是为了得到一层菜单啊,然后下面咱把这个最终查二级,三级,包括里边的各种的方法都写到select求是里面去,在这里边咱来做它的最终操作。
24:00
啊,那咱们最终就给他写下啊,来看这个怎么来实现啊。我往下写下啊。那各位注意啊,这个写法要怎么做呢?因为你注意我现在传的这个叫permission node是一层菜单,那咱就是现在像一层菜单里边是不是要放它的二级,或者二级里边再放三级,所以咱们现在啊,先给来个初始值。我写一下这个步骤啊,第一步就是因为我们要向。这个。一层菜单里边要放他的二层菜单,或者二层里边。他还要放他的三层菜单啊,还要放。三层,如果你有四层,那三层里边还要放四层,所以咱们现在先把这个对象先做个初始化,就让里边有那个一个值,如果没有值它为空,那怎么初始化呢?比如我现在这是一层菜单,里边放二层,那怎么放,咱就来一个叫set。
25:08
Children准,然后里边咱先new一个空的这么一个例子,让它先有一个初始值啊,先来一个空,这叫permission啊,所以咱们这么来做。就是目前这么做,只来一个空的集合,里边没有数据,下面咱做的它是向里边做这个数据操作啊。那怎么做呢?各位注意啊,咱们往下来看。其实下面做的过程呢,我觉得各位应该知道,咱之前写过类似的,比如我现在想得到一层下边的二层菜单,那怎么得到,是不是根据ID做判断呀,也就是说啊,你的一层的ID和二层的PID一样,是不是得到了,包括三层也同样,你三层的这个PID和二层ID如果一样,是不是得到,所以咱们下面就做了判断,做一个递归操作,把这实现就可以了啊,那咱来写一下啊,看怎么做啊。
26:02
首先我这里强调啊,咱们做法还是做这个便利。就是便利你所有菜单的历史集合,然后咱们进行判断的一个比较啊,就是比较ID和PID的值是否。相同啊,就做这个事情啊,那咱给他便利一下啊,继续便利咱来一个。For循环,然后for循环里边便利咱这个所有菜单集合就这个啊,那我给他就跟这一样啊,直接我就复制一下啊,就我们叫permission这个名字啊,我就来一个叫。It啊,我给它区分一下,咱便利它这一遍利之后是里边所有菜单,包括里边的it是每个菜单一个对象,然后下面咱就做了这么一个判断,判断什么呢。就比如说我们这个一节点,那就是一级节点的ID和二级节点的PID是否一样,如果一样的话,那我们就做这个封装,不一样就不做封装啊,就做这判断就是判断。
27:06
ID和PID是否相同,那咱们来写一下啊,就是加上这么一个if做个判断就可以了。啊,咱来实现啊,我来个if。各位注意怎么写啊,按照我刚才说的啊,咱俩回来啊,这过程稍微麻烦一点啊,希望大家有一个思路啊,你注意,比如咱就以第一次为例,我第一次这个permission no的这个值是不是你的一级菜单呀,而咱现在要查询一级下边是不是二级菜单呀,假如我这是一级,那怎么做,拿着一级里边的ID和二级中的PID是不是做比较,看这两个是不是不一样,所以咱们这么做,你好比说这是一级,那么拿着一级的ID就写一个叫permission no。点上这个叫get ID啊,这是ID,然后点上ES2级怎么做就跟所有这个比较,因为这是便利嘛,那我们来一个E点。
28:06
这个at TD这表它们相同,如果相同的话,那怎么做呢?按照我们的过程啊,首先第一个。各位注意啊,这步操作如果你是二级,让它是不是就变成二,也就是说在之前基础之上把那值给它加一是可以,因为咱们这是一级,那把一级里边的level值加一就可以了。好写一下啊,就是把你这个。这么写啊,就是它那个。这么写负菜单的level值给它就加一,如果你是一级,那现在变成二级,你是二级那就变成了三级啊。那咱们来写一下啊,比如先来一个变量,我叫level。等于这个叫permission no.get level。啊,Get level,让它指。加一啊就变成下级,然后加一之后再做一个设置,就来一个1.setlevel,等于这个叫level,这样的话完成了这么一个设置。
29:07
所以大家啊,把这个给他知道啊。咱现在做这个过程啊,然后这个做到之后,下面怎么做呢?咱们数据是不是要做这个封装呢?那我来做封装,那怎么封装呢?因为现在啊,咱要把这个查出的二级放到一里面去,一级是谁。是不是就是这个叫permission node嘛,这是一级啊,那我写这步啊,就是把你查询出来的那个二级菜单要放到你的一里面去。但是它是递归嘛,如果你查三级放到二级,查四级放到三级一样的啊。所写的完善点啊,就是把你查出的子菜单放它那个负菜单里面去。那怎么放啊,加一个permission node,点上这个方法叫get children,然后点上之后再来一个A,然后把这个放进去,然后咱放的应该就是这个E就可以了,但是现在你这么做,注意啊,它只能放一次,不能放多次,所以咱要写递归,咱们写递归呢,在it里边咱们怎么做,再去调这个方法,就这个方法咱再调一次。
30:17
然后最终把它实现啊,那这个方法我们叫select。Children准,然后在里边还是传这两个值,一个叫it,还有一个值指咱那个所有那个集合啊,就是上面的这个值permission。List,这样的话,把这个我们就初步做到了啊,然后最终你把这个permission note给它返回,这就是一个递归的写法。这个咱们就基本写完了啊,然后这过程我再说一遍啊,确实复杂一点啊,但要各位能给他理解啊,我再重复一遍啊。它的过程怎么做到的,咱同学来说啊,第一步就是你做递归查询有一个原则,先找到查询的一个入口,而咱的入口是不是就是一层菜单是入口,那咱怎么找,把你的所有这个菜单得到,做个便利,然后判断如果PID是零,是不是就是一层那个菜单,然后得到之后level变成一,咱下面啊,通过一层菜单往下查询。
31:21
就写这个方法。你注意啊,这个方法中啊,只是得到我的一层派单,包括这个封装,然后真正递归置写到这个方法中,这个方法什么意思,根据你的一层,然后调这个方法,查他的二层,三层,四层,以此类推,主要咱们用这方法,然后里边你把一层菜单和它的最后菜单乘进来啊这个方法,然后方法中怎么做到,大家看啊,第一步先写个初始化,那里边有一个初始值,然后写完之后把所有菜单做个便利。便利之后怎么做就是这个判断。比如我现在。一级,那我就判断一级的ID和二级的PID是否一样,因为咱们比如说我现在传这就是我们的一级,那判断一级的ID跟里边所有的这个里边的PID哪个一样,如果一样的话,那就是它下边的子菜单,咱把它的level值加一,因为你是一级,加一之后就变成二啊一给它设这个二的这个值。
32:25
然后设置之后,把这个一的这个值。需要给它封装到咱这个菜单里面去,就这个permission noe中去,因为它是一级嘛,里边要放咱的二级,那怎么封装,就是得到里边的children准加个A的放就可以了,但是如果你这里边,比如说咱刚才写到的,我只放个一的,这么放可以,但你这么放只能放一次,就你有一级二级,如果他有三级四级,那放不了,所以这位置我们要写个递归,什么叫递归呢?就是重复调用在里边,如果有二级放进去,然后再查二级,下面菜单再往里放,如果有的话再查三级,再有的话再查四级,以此类推,这就叫递归,就是重复往下查询,你下面只要有它就依次查询。
33:11
比如咱按这过程啊,假如我现在查成二级,那我把二级放进去和所有菜单,他还是整理过程,再判断查三级,如果有的话,再判断查四级,直到查不到数据位置,最终都做完之后,在这个permission node中应该有咱们所有数据,因为我都加了A的嘛,注意应该都有最终把它返回。这样的话,我们就把这个过程啊,然后这里边也放到我们的final note里边去了。这是关于啊递归的这么一个操作。所以大家把这过程啊,必须好好给他消化消化啊,你这过程确实要稍微麻烦一点啊。当然这过程中呢,有个地方咱可以给他完善一下,就是这个值啊,如果说这个值啊,本身等于空,咱需要给它来一个初始化啊,就跟这个类似啊,给它也判断一下啊,就是不写,现在效果应该可以大,给他写的完善点啊,就是这个意思。
34:05
如果permission.get children准,它本身等于空,那咱给他就来这么一个初始化操作,也就是咱们上面写的。这个代码啊,做个初始化,要不然啊,它里面会报错,等于一个囊值了,再来一个空的一个集合。这个啊,加个注释啊,如果说这个秋准。它为空啊,咱也进行一个初始化的这个操作,所以这样的话啊,按照这个过程,咱们把这个递归代码我们就完成了,就是可以查出你当前这个里边的所有菜单,并且把菜单按照咱们这种树形结构,可以给他做个封装啊,这个咱就完成了,里边递归主要在这个位置。先查一层,查二层,二层查出来之后再去查三层四层,以此类推,就重复调这个select丘诊方法,把这过程我们最终做到啊,所以这个啊是咱们最终写的这么一个操作啊,关于递归。
35:08
咱们就完成了啊。
我来说两句