00:00
各位同学大家好,下面呢,我们开始编写这个方法,构建成框架要求的路由结构,下面咱们开始写下这个代码,在方法中传入的是树形结构的例子集合,咱们把这个集合构建成要求的结构,那咱来看一下啊,首先第一步我们创建一个历史集合,用于存储我们最终的这个数据。那我在里边写一下,我们加上list VO,然后起个名字,等于上一个list,这是我们的第一步,然后第一步之后我们的第二步操作,把这个us的集合,咱们进行便利,得到每个单对象,再进行封装,我这里边变利一下。加上system menu。然后加上这个完后我行封装,我们首先VO这个对象。
01:06
上一个。下啊,这是route,然后里边来相关的这个过程,我就从里边复制要里边的这几个。咱们把它拿过来啊,大家看第一个它就是hidden等于就是这里边不是隐藏路由,然后always等于always受啊,包括路径,包括包括它的头信息等等,这里边有一个叫。Get route pass得到路由的这个路径,这个方法呢,我在下面提前写好了,所以各位把这个直接复制可以了,就是得到这个路径,就是咱们看到的这种路径啊,包括你看带个斜杠,加上你这个名字,这各位明确啊,所以咱们现在把这直接下可以了,然后捏完之后,因为咱们现在这个菜单是一个多层结构,所以咱下面来封装它的下一层的这个数据的部分,当然下一层可能还有第三层,可能还有第四层,所以咱这里边还是采用递归的方式实现,那我来写一下啊,首先menu里边点get children,得到它的下一层的数据,我们叫children,然后得到children之后,这里边呢,下面呢,我们进行这个封装。
02:23
然后怎么封装,我强调啊,比如说大家注意啊,如果说啊,我当前是这个,就是比如说当前是用户管理,那咱是不是要把用户管理下一层的菜单给它都加载出来,如果当前是系统管理,咱要把它下面的内容都加载出来,但是加载过程中啊,有一个细节问题,各位注意啊,就刚才提到了一部分,大家看这个type里边你发现啊,零是不是最顶层数据,一是不是下一层,然后这个二是不是它的按钮部分呀,这么看好像没看什么区别来,然后咱们看的更仔细一点啊,大家看这个。
03:04
你注意啊,这个叫分配权限,它的类型也是二,也属于这个按钮级别的,但是你发现它后面有什么,是不是有路由的路径,还有这个页面,那这是什么呢?咱们找一下这个分配权限是什么,大家仔细来看啊,找到分配权限。往下面找一下,或者说里边这个角色授权一样的啊,然后大家看这什么意思啊,Hidden事处它是不是一个隐藏路由啊,所以咱们现在要把这部分是不是要构建出来,因为隐藏路由跟按钮不太一样,它里边也有这个页面,也有这个路径啊,当然这个路由它不进行显示,所以咱们要把这部分做个处理,那下面我这里来写一下啊,首先我这位置先做个判断,如果它的menu的typeb是一,那咱把里边下一层那个隐藏由部分给它下载出来,也是咱们刚才看到的类似于这种形式,那怎么加载,各位注意啊,很简单。
04:05
Type这个二,如果说它里面这个count的值不为空,那表示是不是隐藏路由,那我们就加载隐藏路由,隐藏路由设置的方式很简单,就是你把这个只等于处是不是就是隐藏路由,所以咱们现在就来做这个事情,我在里边写一下啊,首先我加上一个if做判断,如果菜单下面有隐藏路由,那把它就下载出来,menu.get type.int value等于一,这表示菜单,如果它是菜单,那我们就加载它下面那个隐藏路由,把这个给它加载出来。这里我写一下啊,然后大家看怎么做啊,首先我们刚才提到了,咱们只要判断里边那个的值不为空是不是就可以了,那我写一下啊,这个写法有多种实验方式,我这里边呢,还是用这个死这流的方式给大家写一下,或者你直接遍历判断也是一样的,那咱写上啊。
05:11
就刚才那个下一层个集合点上,然后咱们点个大家这个方法啊叫做。Filter什么意思?是不是有过滤器的意思啊,通过这个filter进行,然后加上就是加上拉姆表式,在拉表里边我们做过判断,加上这个点,然后里边em点上get,如果说它不等于空,我们加上一个感叹号,这样的话就表示用做了一个判断,然后判断之后得到里面的所有的隐藏路由,我们点上一个collect。然后里边那个collectors。
06:03
To list构建成一个list集合,就是咱说那个隐藏路由部分,然后我现在给它起个名字啊,这个名字,呃,我看一下我课件中叫什么啊,跟他就尽量保持一致了,我找一下这个名字啊,这个。Hi menu list,现在把这个拿过来,这样的话得到就是隐藏路由部分,隐藏路由呢,可能没有,可能一个也可能多个,所以咱把它还是继续变历,然后给它封装成那个root VO这种形式啊,指这个改成了。那咱们便利一下啊。System,我们叫这个。Me?加上,然后下面做这个封装,还是这个对象过程跟上面基本上是类似的啊,这个我也就复制一下,就是你看往里边数据。
07:00
只是放的时候呢,特别注意这个地方,我加个注释啊。Hidden值是处表示它是一个隐藏路由,这样的话我们就放进去了,然后最终都放到咱那个routeors里,也就最终那个集合中啊加上,所以现在啊,这个if判断过程就完成了,就是把隐藏路由部分我们就加载出来了,然后之后我们再加上else。啊,L里边呢,首先我们判断啊,比如说里边这个children准啊,它的值不等于空,那咱们让里边的就是这个值啊,大家看这个值。叫做always处always数啊,它的值变成就是总会被显示,然后之后我们写上一个递归的这么一个过程啊,那我开头写一下啊。或加上一个if,首先我们判断一下这个集合,集合判断的多种方式啊,这里有个工具类叫做collectionus,点上意思empty加上children。如果说集合不等于空。
08:12
那这里边啊,我们做这个就是递归的这个过程,我们加上这个。点上,然后再来,我们当前这个方法叫build。下叉啊,然后在里边传入我们这个求这参数,就查它的下一层,如果有再继续查,这里边完成一个递归的一个过程啊,通过它进行实现,当然过程中里边还有一个属性叫O,那把它设置成啊,如果有值,这值等于它表示你的这个菜单总会被显示。所现在完成完成之后,我们的最后一部分,那咱们啊把这个都给它,就是最终放到咱那个routeutors这个里边去,那最后啊给就放下。
09:03
找到这个位置。加上这个。Routes。点上A的加上这个。所以现在啊,这个结构就完成了,然后最终把它做一个退。所以大家看啊,现在咱们就把这个方法完成了,把菜单的这种结构构建成框架要求的路由结构,这过程我们再看一遍啊,首先就是利给它root VO,因为root是咱们要求这个结构,然后在里边把里边那个隐藏路由给它加载出来。包括啊进行递归的这么一个就是封装,包括便利,最终都放到roots里边,然后把它做一个退就可以了,以上啊这个过程我们就完成了,所以咱们写完了这个方法,然后这个方法写完之后我们继续来看啊,然后最终我们来测试,咱来看下一个方法,就是这个方法,这个就比较简单了,我们根据用户ID获取用户可以操作那个按钮的列表,那咱们下面啊,把这个我们来快速写下。
10:14
当然过程中呢,最终还少了一个最后语句,但最终再进行实现啊,目前我们先写这个部分。那这位置我来写一下啊,首先这里边我们做一个判断,跟之前应该是一样的啊,咱们就判断一下。呃,我还是加上一个加上system system。然后下面呢进行判断,在判断过程中,如果说你这个user ID,嗯,加上这个long y6等于一表示它是管理员,然后else不是管理员查询,如果是管理员,那我们就进行这个查询,得到我们所有这个操作这个相关的部分啊,那咱给他就查一下啊,这个查的过程和刚才那个方法应该是一样的啊。
11:10
就是这个方法跟他应该是一致的,咱们把它就直接拿过来就可以了。直接查询啊,但是这个查呢,因为它得到是一个按钮啊,应该不需要这个排序,这个我就去掉了啊,查询状态是一的所有的菜单这个数据,然后之后else不是管理员,那我们就根据ID进行查询,这个查询就调用我们刚才写的那个方法就可以了,那我来调一下啊。Base map中加上咱们刚才的这个方法,比如咱们写语句进行实现,入UID返回的是一个list集合。这个位置啊,我来写一下,就咱们刚才这个。System menu list。这个我们就完成,然后完成之后,最后呢,从这个子集合中,咱们把这个所有的这个菜单操作这个值给它取出来,也就是我们看到的就是找一下啊,就是这个这个给它取出来,最终变成集合进行返回可以了,那咱们把这个写下啊。
12:18
那家看怎么做啊,也是多种方式,你可以,然后咱们还是用的方式进行,现加上system menu list点上,我点上一个叫filter,为什么叫filter呢,这位置啊,我要做一个判断。大家看啊,我当前这个按钮值取的时候,你发现啊,Typeb等于零是没有,等于一也没有,等于什么才有,是不是等于二才有,所以咱们判断值等于二,取这个值,如果不是二,那这值就没有啊这位置,所以我加上一个the,那我写一下啊,加上item。然后通过item.get t,它的值等于二这样的取到,然后取到之后把里面那个具体值给它取出来,咱们加上一个方法。
13:11
下面啊,点上一个map,然后item上em里方法把这个,然后取到之后最终呢,把它构建成一个list集合。就是collectors to list,然后把这个最进行回这我们这个我们起个名字。Her Miss。然后最终做个就可以了,所以上这过程就完成了啊,我强调啊,这次流的过程呢,我这里写了很多次了啊,以后各位把这代码一定要特别熟练,如果这个代码你不熟悉,那你可以用原生方式把集合便利得到每个对象,再判断,再取值也是一样的,我这里边习惯用四流进行操作。
14:03
所以现在啊,把这一部分方法就完成了,我们再看一遍啊。刚才我们写的方法中,第一个就是根据用户ID得到可以操作的用户菜单列表,咱最终封装成框架要求的结构,然后第二部分根据用户ID得到可以操作的按钮的这个值,咱们也是最终完成操作,所以咱们现在啊,把这部分就都完成了,然后都完成之后,最后写的是什么呢?我们现在你看啊,麦里边方法已经创建过了,那在下面呢,就找到对应的文件,然后在文件中编写语句,把这个最终这个查询过程我们进行实现。那下面呢,我们就开始写这个语句了,咱们把其他部分先关掉啊,就保留一个map,然后map里边我们有一个方法,方法中有个参数叫ID,咱们在配置文件中取这个参数值,最终根据它进行条件查询这个过程,当这个值我们可以加一个注解叫P,我给它加上啊。
15:12
P母,然后给它起个名字叫UID啊,但是你不加的话,如果一个参数这名字可以随便起,如果多个参数,这必须要加,我强调啊,这个注解如果你不清楚,那你先学一下my be,然后再来看我们这个课程,所以现在啊,这方法完成,完成之后找到它对应的叉M文件,就这个文件。Map点叉,那把它打开,打开之后大家看一下啊,第一个这个map的路径不要写错,跟它应该是一致的,然后在里边呢,咱们就开始编写circle语句了,那语句怎么做,我们先做一个简单的复习,就是买杯子中的知识,首先各位明确啊,在中有很多的标签,如果说你做查询是不是用标签。
16:05
这应该明确啊,另外有增加,修改,删除不同的标签,除此之外里边还有一个标签。大家看这个。Result map。这是什么意思?是不是叫自定义返回结果,所以里边有很多内容啊,那咱根据它我们来做个操作,首先第一部分我们先定一个自定义返回结果ID里边我给它起个名字就叫system menu。Map里边呢,加上这个me,这个径就是它的路径啊,把这个拿过来。然后再加上里边一个属性叫凹凸ping,就是自动麦ping映射啊,加上一个触,所以现在把这个自定义结果就完成了,我们起个名字system me map,这是一部分,然后第二部分呢,我们加上一个标在里边来编写它的circle语句,那咱写一下啊,首先这个怎么做?
17:08
各位跟着我一起也是在回顾一下啊,做查询ID中大家说加什么?是不是加上你map中这个方法名字,就咱把它复制过来,注意啊,不要复制错,另外复制时候呢,里边不要加括号,然后里面有第二部分加上一个叫type或者map参数类型,但这个可以省略,第三个叫result type或者result map,咱目前用的是自定义返回结果,再加上result map,把这个ID的值给它拿过来,这部分完成,完成之后在里边我们来写下这个circle语句部分,根据用户ID得到它的相关的这个菜单的信息,包括按钮的值,包括菜单的其他值。
18:01
那这个语句呢,我这么来做啊,我在这里边把语句咱们先写完,然后咱们到里边再复制过去,因为直接写可能会写错啊,所以咱在这里边把语句给它先写出来。那这位置我来写下这个语句啊。那语句怎么做?咱们分析过了,这个过程中涉及到的是三张表的关联,包括你的用户角色关系表,角色菜单关系表,以及菜单的这个表,那咱们写个语句啊,首先我加上,后面加上菜单里边的各种字段,这个字段呢,我先来个星号,后面咱再把字段加上啊,实际中肯定不建议写星号,要写上你的具体字段,我为了测试先来个星号,然后咱怎么做加上。From加上我们的表,第一张表就是menu啊,咱起个别名叫这个M。这是第一个啊,然后加的时候呢,它里边可能会产生一些重复的数据,比如说我们一个用户有多个角色,角色中可能他们都操作同一个这个菜单,所以加上一个去虫的这么一个。
19:13
关键字啊叫。我说各位是否能听明白啊,我再说一遍,比如现在啊,我的用户有管理员,比如用户有销售人员的角色,有这个测试员的角色,而两个角色,比如他都可以操作同一个这个菜单,那如果咱们查的话,可能会产生多条重复的记录,加上一个表示,这是我们的第一部分查菜单,然后这个写完之后,我们要做一个关联查询,怎么做,加上一个关键字叫inner。这各位应该记得啊,什么意思,就是内连接操作,咱先关联第一个就是我们这个。角色菜单关系表关联一下啊,角色菜单关系表,我给它起个名字就叫这个。
20:03
呃,就叫RM了啊这个表,然后完之后上条加个RM,上这个me I。等于M里边这个ID啊,就是这个菜单里边的ID,咱们做一个关联,这样的话把角色菜单关系表跟这个菜单做了一个关联啊,这是写的第一部分啊,但是你没有写完,咱继续往下来看啊,然后下面我们写什么,继续来写,下面呢,我们继续关联inner作业,关联咱们的另一个表。这个表是什么呢?就是用户和角色关系表,因为有用户ID,我起个名字叫U上关联条件,U里的角色ID等于RM里边的角色ID,应该叫肉ID。这个指啊,也就是说现在你看这个关系啊。
21:00
咱看我这张图里边,如果你没有弄清楚,这一定要弄明白啊,要不然这语句你写不出来,咱目前是这么一个观点。这三个表我刚才写的过程中第一个啊,用菜单表中的ID和菜单角色表中这个叫menu。我就简写了啊ID1,然后呢,用这个ID。和用户角色表中的肉外地进行关联,我们目前是这么一个关联关系,我这里画一下啊,就首先第一个。质量管理。然后第二个这个关联最终能根据用户ID得到你这个菜单中的数据,你看我写的这个结构啊,这个关联完成,完成之后我们加上条件,加上一个啊,就是条件。然后条件里边呢,加上这个叫呃U呃下边啊,加上这个UR,点上这个ID。
22:03
等于你的user ID,比如说一或者二或者什么其他,我随便写一个啊,一会咱完善,然后这样的话,我们现在把这就完成了。但是完成之后呢,里面有一些小细节问题,就是刚才提到的这个菜单要查这个状态是一等,包括我们现在做的应该是逻辑删除,所以咱那个意思delete应该都是这个等于零的,这个数据也是我课件中写到的这个结构啊,咱找一下就是它。我把这个啊复制过来。你看啊。菜单状态是一表示可用的,然后你的意思delete都等于零,表示你这个没有被删除的数据,所以现在啊,咱就把这个最基本的circle语句就完成了,最终得到你相应这个数据啊,就这些数据咱们。查一个啊这个数据。让他把这个能得到啊,咱们找一个有数据的啊看一下。
23:01
比如说我现在啊,你看啊,我就手动加一个数据了,我们现在先找这个用户。啊,找了一个用户啊。用户里边呢,比如用户有一个值是ID是二的这个用户。这是用户啊,然后用户跟角色,咱们找个角色,角色里边呢,有这个一的这个角色,那我在用户角色关系表中,我就手动加一条数据了啊,咱手动加一个用ID是二,然后角色是一,这个值我改成。零啊,给它加上啊。然后这些我给他先都删掉啊。给它删掉。那就为了测试啊,我这就手动把这数据给他整理一下。让大家看啊,就是目前ID用坏D是二,它的角色ID是一啊,这个值改成零。这里边的这个数据,然后之后我们再来看啊,在角色菜单关系表中,把这个打开,角色ID是一,然后菜单它有相应的这么多菜单,那咱们菜单里边你看啊,有这个十十一等等,包括最终菜单中有它的数据,那咱们可以再查一下啊,用外地是二的这个数据。
24:21
我们把这个语句执行,大家看得到的是不平衡结果啊,记住我们语句证明是正确的,然后语句写完之后,咱们下面呢,把这语句就复制到我们的插入文件中,然后最终我们把这个功能完成出来,那我现在啊把它就复制过来。咱们到这里。拿过来啊,然后复制之后把这个给它改一下啊,我先把格式先稍微调整一下。啊,这个格式啊,然后下面加上where条件。这是select,在这个写法过程中,我们注意啊,要改几个地方,第一个地方user ID肯定不是写固定来,要取到传过来的参数值,那怎么取呢?在买里边我们加上一个井号大括号,加上user ID,根据这个取到你的用户ID址,然后之后呢,在里面有个号位置呢,加上我们具体这些字段,这个字段我从课件中直接复制过来了啊,就是里边的这些字段。
25:28
当然大家看啊,我课件中这么做的,我写了一个circlecol标签,把这个抽取出来,然后在里面进行音录的使用啊,都是可以的,我这里就直接把这个相关的字段的名字,咱就直接复制过来。给它加到我们的这个位置。就这里。所以现在啊,咱们就完成这个基本的circle语句的编写,这个就做到了,如果咱们不放心啊,把这语句我再重新复制过来,咱们再重新做一次测试啊,你刚才改了一些地方啊,比如说这个值是二。
26:05
我们再重新试一下,现在执行数据是不能查到,也证明语句是正确了,也就说咱们到这里把这个最基本的这个功能我们就完成了,咱们目前完成的接口我们再看一下啊,这接口虽然是一个接口,但是我们现在应该写了很多的事情,咱们从最开始再看一下。获取这个用户的这个信息,然后在获取信息过程中,从请求头里边得到token,得到里边的用户ID,然后得到用户对象,根据用户ID得到你的菜单的列表,得到你的这个按钮的操作权限的列表。这个过程中我们在service里边写了两个方法,就刚才写的一个是菜单,一个是按钮,在过程中咱们都要去调用SQL语句进行查询,所以刚才我们写了map map中呢写了它对应的S语句。
27:02
通过多表的关联查询,最终把这结果我们给他得到。所以现在啊,这个过程我们就最终完成了。
我来说两句