00:00
各位同学大家好,刚才呢,我们分析了菜单管理模块的需求,下面呢,我们开始开发菜单管理模块的接口,首先我们实现,也就是增删查接口,这个接口中我们重点写的是菜单列表接口,那咱们下面开始进行编写,首先我们找到controller,我们刚才用代码生成器生成出来了system menu controller。然后在CTRL里边,首先我们先加上一个S的注解。我们给它加上。名字。菜单。管理接口,然后加上之后把路径按照课件的名字给他改一下。改成我们。这个名字。然后改完之后,在CTRL里边我们注入service,在里边我们进行注入,加上。奥特曼。Private system menu。
01:00
Service,现在咱们完成注入,然后完成注入之后,下面呢来开始编写里边的具体接口,这个接口中我强调啊,我这里边呢,给大家重点编写列表接口,它里边的其他接口我们就直接复制了,因为其他接口比较简单,那咱们啊先把其他接口先复制过来,然后最终重点写它的列表接口,因为列表接口中要构建成一种数形结构,就是层级关系,第一层,第二层,第三层等等,那咱们先写其他接口,我现在做个复制,然后大家看一下啊,第一个接口叫新增菜单。咱们用post提交,起个名字叫,然后在里边得到我们过来的对象,这个对象呢,我们通过的进行传递,就是Jason格式进行传递,然后最终在里边有我们这个B项。System menu。最后呢,我们调用service中等方法进行实现,这是咱们写到第一个新增菜单,然后第二个叫修改菜单,同样我们用body传过来这个数据,最后调方法进行修改,第三个叫删除,删除里边我们根据ID进行实现。
02:18
当然删除中还有一个细节,咱们一会儿把这个再进一步完善,下面呢,我们重点写第一个接口,也就是菜单的。列表接口,那咱这个该怎么去做,我这里来编写一下,加上A片,然后加上这个菜单列表下面呢,加上这个方法。这个方法我就让路径跟课件中保持一致了,叫find nos,就是这个查询节点,因为它里边有第一层,第二层,第三层,多层的这个结构,咱们写一下啊,加上。Get find no?
03:02
加上这个名字,这个菜单呢,它不需要条件是查询全部,所以我们直接调用里边的方法进行实现。Find no最终返回的是一个list集合。加上这个判刑。然后最后我们给他做一个。Result。点传入list,所以现在啊,CTRL部分我们就完成了,完成之后呢,下面呢,我们重点写下service,在service里边把这个功能我们具体做个实现,那咱们service里边方法先创建出来,包括实验类中这个方法我们也进行创建。然后最后我们来写一下这个方法。那这个怎么来写,首先我们先做一个分析,然后咱们进行实践,因为这个写法要稍微麻烦一点。
04:03
那咱们说一下为什么它比较麻烦啊,大家注意啊,因为咱们现在来到这个菜单表里边,我们菜单的结构是不是有层级关系,就是有第一层,第二层,包括可能有第三层,第四层,比如咱们看到的这种形式,你看我这里边啊,这是第一层。这是第二层,当然可能还有第三层,所以要把数据构建成这种层级的结构,那层级结构的数据长什么样子呢?其实就是我们这个前端这个由这个样子咱们看一下啊,咱们。看这个例子,比如你看这是不是第一层,这里边有一个叫children准,Children准中这是不是第二层,这里边如果再加children准,是不是它的第三层,所以咱把数据要构建成这个样子,有第一层,有第二层,包括可能有第三层,那数据我在这里给大家简单画一下啊,这个结构。我们加上一个数据。在里边,比如说啊,写到这个位置啊。
05:03
这里边,比如现在我的。往下写一下啊,诶稍等我这还卡住了啊,我重新写一下。咱们写到这个位置啊,我把字体调的稍微大一点。这么一个结构,然后在里边呢,比如现在我这里边有我们的第一层数据。这是第一层。啊,当然它的名字什么,咱就省略了啊,然后在第一层里边,比如咱一个属性叫children,或者叫child。我就叫children准,然后children里边呢,我们加上一个中括号,里边是它的第二层的数据,当然第二层里边我们也可以再加个大括号,我加到这里啊,这个表示它的第二层。写到这里啊。这是第二层。在第二层里边呢,它里边比如说咱们还有一个秋准。
06:01
然后children里边加个中括号,这里边会有它的,比如说第三层数据,以此类推,所以咱们数据最终变成这个样子,有第一层丘准,丘疹里边有第二层,第二层中有丘准,还有第三层,包括有第四层,第五层等等,这是我们要最终构建出来这个数据一个基本结构,也就是咱们路由里面看到的这个结构。那这个该怎么去做呢?大家看数据里边啊,就是我现在这数据有几层,是不是不是确定的,可能只有一层,也可能有两层,也可能有三层四层,所以它是不确定的,那咱该怎么去写,如果你确定简单,我就约定第一层,第二层,第三层就可以了,现在不确定,那大家想一下这个怎么做。怎么实现?各位应该能想到啊,有一种方式是不是叫递归影,就是我现在从第一层开始查,如果就是作为我的入口,如果第一层下边有第二层,咱们查询,再看有没有第三层,再看有没有第四层,直到查不到数据为止,我再说一遍啊,通过递归找到入口,就找到你的第一层,也就是part等于零,作为我们的入口,然后查它下面有没有下一层,如果有的话,取到再查下一层有没有,直到查不到为止。这是我们的方式,通过递归进行视线。
07:25
而这过程中大家看啊,在我们的实体类中呢,我这边做了一个处理,咱往下看。大家看这个位置。之前提到过啊,但是没有具体说,因为当时没有用到。这是我们说那个MY中的注解表示属性对应的字段,而这个什么意思呢?Ex等于false,表示表里边没有对应的这个字段,它的目的就是表示它的下一层数据,比如说第一层系统管理,用这个集合表示第二层,如果里边再有,那再表示第三层,第四层,这句话表示表里边可以没有这个对动字段,因为暂时只为了数据的这个封装。
08:07
这是咱们看到的啊,那下面呢,我们就开始写这个具体的递归代码,把它做实现。我这里边来写一下啊,咱们来到service里边,其他的先关掉,然后在service里边怎么做呢?我写一下步骤啊,首先第一部分咱们先查询所有的菜单的数据,把所有都查出来。那我们来查一下啊,调用service里边的方法。例子的这个。里边传个,那这样的话,得到就是所有的菜单的数据,我们给它起个名字system menu。List这个得到得到之后呢,注意啊,这个你不能直接返回,虽然它是数据,但是数据呢,并不满足咱这个层级关系,这个结构就是没有丘疹,没有这个结构它是所有数据,所以需要把这数据给它转成这个样子,用递归进行实现,所以咱们下面进入到第二步操作。
09:10
这里写一下啊,我们的第二步操作,咱就来构建成。我们这种树形的结构,就是刚才我画的这个结构,我再简单写一下啊,比如现在我们有一个大括号,里边有第一层。啊,第一层的这个数据,然后在里边呢,我们可以有一个秋准。Children,准里边有个中括号,在中括号中我们还有大括号,里边有第二层的数据,好,这里写一下啊,比如有个大括号,这里边是第二层的数据,然后它里边还有准,还会有第三层,以此类推,咱最终数据应该就是涨,类似于这个样子,这个未明确啊,这下面我们开始进行构建,这个构建呢,咱们一会儿写个工具类事件,那我这里写一下啊。
10:04
比如现在我在这里边呢,我就建一个。咱们就叫这个。然后在里边呢,我来建个工具,咱们在这里进行,这工具就me help。就是它了啊me help,咱们一会儿在里面进行实现,那咱写一下啊,在这个位置我们就调用工具类中的一个方法,这方法我起个名字就叫这个build。啊,数形结构,然后传入刚才咱们这个例次集合,最终让它返回的肯定是一个构建好的数据的例子集合。咱们叫这个呃,Result list啊。就是它这里边加上判刑menu,最后把它做个屡退。
11:00
所以现在啊,这个部分我们就完成这么一个基本的结构,然后最后呢,我们就是在这方法中做咱们的具体实现。就现在我们写了一构基本的结构啊,我再重复一遍啊,我们目前的做法就是要把这个菜单构建成咱们的这个结构,因为咱们要数形显示,里边通过children表示它的下层数据,Children咱们刚才看到的实体类,它就是一个历集合,也就是这个。那咱怎么做?在CTRL里边我们直接就查询返回service里边,先得到S3数据,然后把数据构建成这个样子,咱们通过一个工具类中的方法最终进行实现,那下面呢,我在工具类中把这方法咱们给它创建出来,也是这个方法叫build。我尽量保持跟课件中一致啊,但是有时候名字可能不一样,过程都是一样的,咱们就构建它,然后这里边用递归方式来构建这个菜单。
12:03
在这里边我们进行实现,那下面呢,咱们就开始写这个递归这个相关代码。那那代码怎么写呢?给大家说一下这种思想啊,其实递归这个东西呢,确实它不太好写,但是它有一个原则,什么原则呢?我们做递归要找到你递归的入口,还有你结束的条件,就是你不能无限递归,肯定有一个结束的地方。另外找到入口你要从哪里进入开始递归,而咱现在怎么做,我们要通过根节点进行递归,也就是说你这里边的part等于零,所以你的入口最终你查不到数据之后,表示它结束了。那什么意思呢?说的具体点啊,比如现在我从系统管理进入找他的下层数据怎么找?谁的PD和它的ID相同,是不是相同数据,然后再找谁跟它相同,如果找不到就结束,如果能找到,那继续往下找,比如说我现在啊,咱看我这个结构中,我找二下一层是不是这几个。
13:05
然后我再找,再往下,以此类推,最终能找到所有这个数据,就是第一层,第二层,第三层,直到找不到为止,这是咱们一个基本思想,那我在里边给大家写这个代码。首先第一部分咱们先创建一个例子集合,用于就是我们最终的那个数据啊,咱要给它放进去,那我来创建啊,加上一个list。System menu,然后这个起个名字,比如叫这个,呃,就叫tree啊,因为咱是一个树形结构嘛,上一个a release,这是第一部分,然后第二部分呢,咱怎么做,大家看这里啊,我这个传过来的是不是我们的所有的菜单数据,第二部操作咱们就是把所有的菜单数据进行遍历,然后在里边做这个操作,那咱就遍利一下啊,我加上一个负循环。
14:04
啊,咱就用一个增强for方式进行便利啊,当然用别的方式也都一样啊,我用这个直接增强for。便利项,便利之后呢,得到每个这个才算对象,然后得到之后,注意下面怎么做呢?按照刚才说到的,你递归是不是有你的递归的入口,所以咱就进行这个。递归的这个入口的这么一个进入。那什么是入口,刚才提到啊,咱们里边这个ID值等于零,是不是就是我们的入口通过它进行递归,所以这里边我做一个判断。我写下啊,就是如果说这个system.get这个如果它等于这个零,那就表示我们当前这个入口啊,当才写的更规范点啊,加一个这个浪Y等于零表示入口,如果它是入口的话,那咱们就开始递归,递归之后把数据最终肯定都放到我们这个tree里边去。
15:10
这里边写上一个方法,咱们写一下啊,比如这个get。Children。然后在里边传入当前你这个入口,还有你的所有这个。菜单的数据啊,通过这个我们写递归,因为它要一层一层往下来找,这表示设置我们的入口,这就完成,完成之后这里边我们做一个把trace对存出来,然后下面呢,写这个get children方法,在里边我们就是一层一层往下找它的下一层数据,比如第一层是系统管理,下面看它有什么管理,再下面还有什么管理,以此类推。这个创建出来啊。这个方法。创建这个方法,呃,点错了啊,不是这个,咱就直接写到下面啊。
16:02
算这个方法,我想这位置啊。我们加上一个public。考返回这个menu,然后方法叫get children。在get children中传入参数,第一个就是我们这个B项,就是咱说那个入口。啊,写到这里。System menu。Menu,第二个是这个的集合。啊system list,现在这方法我们就创建出来,创建之后在里边呢,我们写它的具体的实现。咱们来写一下啊,那这个实现怎么来做呢?首先因为这是我们的入口,咱们是不是要查它的下一层的数据,然后在以此类推,一层一层往下去查,而查的过程怎么做?就判断当前节点的ID和下一层的per ID是否一样,如果两个一样就封装,如果不一样就表示没有啊,咱就以此类推,按照这个原则进行操作,ID和D的对应关系,最终进行实现。
17:12
那咱们来写一下啊,首先我们先做一个基础的设置,用这个menu点上set children啊,咱上一个。椎list先扭一下啊。然后这里边给它加上一个泛行吧,STEM卖掉,然后加上之后,这表示要做它的相同数据,下面呢,我们进行这么一个便利,就是把这个数据变利,还是根据它来做个判断。这位置啊,便利所有菜单的数据,然后咱们判断判断什么ID和。Parent ID对应的关系就是来做这个事情,那咱们来写一下啊,加上循环。
18:01
然后里边的这个值。写上啊,System menu啊,为了区分我就改个名字叫啊,就为了区叫别的名字也可以啊,为了看的,要不然很容易弄乱啊,然后这个之后下面呢,咱就开始做这个判断。那怎么判断呢?我们写一下啊,就是当前的这个ID和下一层的ID如果相同封装,比如我这里看到的第一层系统管理ID是二,谁的PID跟它相同,是二,那咱们就做这个封装,表示它有相同数据就来做这个。那我们来看啊,当前是不是这个menu。咱们写上点get ID。然给它规范点啊,上这个Y6,如果它等于下一层的D,这是跟它进行判断,Get判D点浪,那表示它们相同,相同的话,咱们就进行这么一个封装啊,我们来做这个事情。
19:05
但这里边啊,如果说可能没有啊,咱先给写一个结啊,我们把这个system menu.get然后点上eight在里面进行封装,这封装就把数据给它放进去,但是你可能还有下一层也可能还有,所以咱们继续写这个递归get children准就是再便利下一层我们加上it,加上这个粒子集合。现在就完成了递归过程,最终把这个做一个旅退。咱们吞一下啊,System menu这是我们写到的啊,当然在过程中可能这个值没有初始化,它里边为空啊,所以咱们给它如果为空的话做一个初始化,给它留一个空的集合。给他也加上啊。我就加到这个位置。所以以上啊,我们把这个递归的代码就完成了,给各位啊,我这里再重复一遍啊,确实稍微麻烦一点,首先你记住原则,第一步递归要找到入口,就进入口什么地方进入D等于零,就是你的入口,然后入口之后我们找它的下数据,怎么找当前的ID和下层派D如果一样,是不是它表示有下层数据,有的话把数据封装过来,就是放到他的丘里边,因为它的丘准是一个历次集合,然后以此类推,如果再有,再往里面放,咱们做一个递归的这个过程。
20:36
最终把每层数据给他返回。然后数据都放到我们这个里边。所以现在这个列表功能我们就最终完成,这是我们写的这个接口,然后完成之后呢,咱们下面啊,把这个接口先做个简单的测试,就看一下刚才写这个递归的过程是否正确。我现在啊,把这个服务我们给它重新启动一下,然后通过S进行接口的测试,就一下菜单列表是否正确。
21:11
等它启动啊,咱们测试。现在已经启动了,然后到里边我们试一下啊,用这个8800。加上doc到菜单管理接口就接列就可以了,然后大家注意啊,我现在调试中点发送。咱们看最后结果啊,各位仔细看,你看啊,这是系统管理,是不是有丘疹,丘疹下面有什么,有用户管理,在用户管理下面确诊中有什么查看添加等等,包括这里边有多个菜单,这是角色管理,下面有这个查看就是等等内容,所以证明咱的数据就完成了,封装也说以上啊,咱就把这个菜单的列表接口就完成了。
我来说两句