00:00
各位同学大家好,在前面内容中呢,咱们完成了员工端审批的流程,包括发起请求,处理任务,以及最终各种查询,这个我们已经做到了,那这个做到之后呢,大家看啊,我们现在这个页面呢,其实最终我们肯定不是这么显示,不是在网页中显示,是在微信公众号进行实现,员工通过绑定公众号实现这个审批过程,所以咱们下面呢,开始在我们的项目中整合微信公众号,最终实现我们的功能。那各位看一下我的课件里面啊,咱们员工端使用微信公众号完成审批操作,这里边涉及到功能主要有三个,第一个是自定义菜单,比如我们在公众号中会看到这么三个菜单,一个是审批列表,一个审批中心,一个叫我的,这是第一个,然后第二个叫微信授权登录,员工关注公众号之后,第一次登录需要进行授权,并且绑定手机号,第三个就是微信消息,这个消息什么意思呢?比如我们现在啊,我们审批之后。
01:09
或者说提交之后,那这个时候呢,会推送给那个审批人一个消息,告诉他现在有新的申请需要你进行审批,咱们通过公众号来完成消息推送,所以以上啊是咱们公众号中主要要完成的三个功能,自定义菜单,授权登录以及消息,这各位给他明确啊,那下面呢,咱先做第一个内容,就是微信公众号的相关操作,那公众号呢,我们怎么做呢?首先第一个咱们在管理员系统中先进行公众号菜单的管理,然后在推送到公众号中去,那现在呢,我们先做一下菜单管理,这个管理大家看啊,就是实现一个菜单的增删改查操作,在咱们管理员系统中进行实现。然后大家看我的界面中啊,这个界面中是它的功能介绍,各位看到首先第一个功能是不是它的列表功能,这个列表呢,咱就给它显示成一个树形结构,包括里边有这个修改,删除添加等等,除此之外还有这个菜单的同步,咱们同步会推送到微信公众号上去,那下面呢,我们先做一个准备工作,首先啊把这个菜单的表做个介绍,然后把菜单相关的代码我们用代码生成器先生出来,那下面我们来写一下啊。
02:31
第一部分呢,大家看啊,我们之前的建表语句里边的最后一个表me,这就是微信公众号的菜单表,咱把这个表在里边进行创建,我这里边已经创建过了,然后创建之后大家看啊,这里边有一个层级关系的表示,跟咱之前说那个菜单是一样的,大家看这个位置啊。第一个值ID,第二个叫parent ID,通过它表示们的关系,然后各位看里边啊,这个ID是不是零啊,它就是级菜单,咱们看审批列表是二,在二的下边有待处理,已处理已发起,这是二级菜单,在我的下边有两个基本信息和关于我们,所以这就是菜单一个结构,通过ID和ID表示他们的层级关系,跟咱们项目中那个菜单表的结构基本一致,都是有这两个字段,这各位明确啊,然后这个之后呢,下面呢,咱把这个相关的代码给它生成出来,然后最终编写我们的管理员系统中的增删给他接口,我这里边的重点写一个列表接口,各位自己把其他的增加修改接口给他自行完善一下。
03:49
那下面呢,咱们来生成一下这个代码,首先我把这些先关掉,咱们打开代码生成器这个类,我把这个找到。
04:00
也就是咱们的这个类啊,然后在里边改一下,第一个地方不需要改,就是这个路径,然后下面有数据库,这位有包包的这个位置,我改成叫web chart,就咱们是这个微信相关的,然后下面加上这个表的名字,注意啊,这表名字不要写错,叫web chart啊。然后最终这就完成了,完成之后咱们把这个执行下,把这个菜单相关的类给它生成出来,包括里边的controller service内容。现在啊,已经完成了,然后到里边我们看一下啊,就是在我们的这位置多了一个叫web chart里边是不是有相关的代码。所以现在啊,咱就完成了啊,但是完成之后呢,咱这么写肯定没有什么问题,比如现在啊,我们看个细节问题,大家注意啊,我的表是不是叫web chart下线menu,它生成的类叫we chart menu control,包括包括这个等等,比如现在啊,我想做件事情。
05:05
我想让生成类里边呢,没有这个就叫me service,这个是可以做到的,之前其实咱们写的过程中也遇到过这个问题,只当时没有说你看这个是不是叫OA process,这do OA总觉得这个看起来比较难受一点啊,咱就要这么写,可能看着更方便,那我现在在这里边处理一下啊,把它的这个前面的web差的这部分给它去掉,那怎么去掉写下啊。我位置就是去掉它的前缀。这个前缀个table,这个fix。前缀啊,咱找到啊这个table前缀,然后在里边呢,把那个前缀给这个前缀就是T下划这么一会有什么果,就把这个前缀去表,这个最生里就没有这个前缀,咱们这么来做啊,把这加上,不加也没有问题,只是这个名字看起来有点啊,总觉得这个名字看起来有点难受,所以咱把它前面去掉啊。
06:20
我现在把这删掉,咱们重新生成一下啊,生成这个菜单相关类。现在我在执行。然后大家啊,看一下这个效果。咱们现在来看啊,大家仔细看里面特点,它的前缀是不是都去掉了啊,都变成我们这个menu部分,同样啊,这个实体类咱们还是用那个model中统一的实体类,这个给它去掉了,然后把里面这个包给它改一下啊,改成model中的统一的十几类。在这里边叫这个menu啊,就是这个啊,Model中的。包括service,包括它的实现类。
07:04
以及啊里边这个map我们都给它改一下。所以大家看啊,现在这个相关的代码我们就生出来了,这就完成了啊,完成之后呢,我们来到CTRL里边,在CTRL中来实现它的最基本这个增删改查操作,这个操作中呢,我们这里边重点给大家写这个列表的这个接口,就是完成一个树形结构的显示啊,咱就写这个列表这接口,那下面咱们开始写下这个接口啊。然后这个接口怎么做呢?给大家做一个分析啊,咱们看一个类,我们找这个叫menu view,大家看这个类啊,Menu view然括ID这个位置,它这里边是不是有一个叫丘疹的属性,然后它是一个例集合,那这是什么意思呢?给大家强调啊,因为咱目前是不是一个层级关系,或者说是一个数形结构,比如现在啊,我们这个对象你可以理解为就是它的一级菜单,在一级菜单下边是不是有很多的二级菜单,所以咱们通过一个list集合,Children准代表它的二级菜单,以咱们一会儿通过menu VO来封装咱们的层级数据,里面有一层、二层等等,咱目前因为只有两层,所以用它我们一会儿都有封装。
08:32
那大家看一下表里边啊,如果说它是第一层的菜单,那它的派D是不是等于零,就是一层,然后在这下边谁的ID跟它一样,是不是它的这个二级菜单啊,咱目前就是两层,所以咱们用menu VO最终进行封装,有一层丘疹里边是它的第二层。这个我明确啊,那下面呢,我们在里边写一下这个具体接口,首先啊,我们看一下课件里边,为了前端方便啊,咱这个路径跟它保持一致,我把这部分给大家就复制过来啊,咱们拿过来。
09:08
这里边啊,我写一下,它就是获取全部的菜单,或者说所有菜单这个列表,咱们把这个给它注入进来。Menu。Service完成一个注入,然后注入之后我们调用里边的方法,咱们最终进行实现,就是查询所有菜单列表,这个过程中,然后给它变成一种树形结构,通过那刚才看到的menu view封装,比如说现在我这里边啊,Menu view理解为代表一层菜,它下的集代表二层菜单,我这里有很的一菜单,每个级的二级菜单咱们封装成一种树形结构。啊,这是我们写到的啊,然后这里边我的方法写到外边啊,咱们调一个方法,最终让它返回的肯定是一个例子的集合。
10:04
我写一下啊,粒子集合,比如咱们叫这个。Menu。List,然后在里面加上泛型,就是刚才咱们看到那个menu view啊,通过他做到就表示有很多的一级菜单,一级下边有很多的二级菜单,最后把list传到里面去给它返回,这是写到CTRL部分,然后CTRL写完之后,下面呢,咱们在里边把这方法创建出来。创建之后来到实现类中,最终实现下这个方法。那咱们啊,最终快速实现下啊,实现过程同样啊,按照我的习惯啊,还是把步骤给各位先写一下,然后咱们最终进行实现,那咱们看怎么来做啊,这个实现的过程我写一下步骤啊。首先第一步操作,咱在里边呢,就是我可以查询出所有菜单的这个。
11:05
List集合就把所有菜单查出来,但是这个查出这个菜单的类型并不是menu view,它就是menu,就是咱把表中这数据先都查出来,这个查出数据它目前没有这个关系的这种表示,只是把数据先得到,这是第一步啊,然后这个得到之后我们的第二步操作,第二步咱做什么呢?咱们做这么一个查询,就是查询里边的这么写啊。查询这个所有菜单中的所有这个就是一级菜单。把这个插出来,那怎么插一级菜单呢?咱们刚才说到了啊,我再说一遍,大家看啊,每条数据中的判断ID等于零,是不是就是一级菜单,所以咱们根据它做个判断,就是谁的判断ID它的值等于零,那就是一级菜单,一级菜单肯定也是有很多,它最终。
12:01
就是得到的或者说返回的啊,肯定是一个粒子激活,就是所有一级菜单的历子激活。这个啊是咱们的第二步操作,然后这个之后咱们进入到第三步。那大家想一下啊,第三步咱们做什么这干什么,这里边有一级菜单的历次集合,那咱就把这个一级菜单历次集合进行遍历,得到里边的每个一级菜单啊,把这得到,然后得到之后做什么呢?是不是把一级里边的二级菜单给它取到,最终做封装啊,第四步就是获取每个一级菜单里边的所有的二级菜单,那怎么获取呢?这个咱们看一下表里边啊。一级菜单的ID和谁的判ID是一样,是不是就把它得到啊,这是我们获取方式啊,用ID和ID。
13:04
他们这个关系进行比较,如果两个一样,那就是它的二级菜单,我们得到二级菜单之后第五步啊,把这个。一级菜单里边的所有的二级菜单获取到之后,给他封装到一级菜单那个,就是刚才咱们看到menu中的这个children这个机构中去啊,放到这里去。这个children的集合里面去。然后最终啊,待会他返回,当然这个过程中会涉及到一个menu和menu view的转换啊,这单一会在细节中会写到,写一下啊,它会涉及到一个这个menu。和这个menu view这个类型的这么一个。转换。最终啊,给它返回,所以以上啊就是咱们写的一个基本步骤,获取全部菜单,但是按照我们这个层级结构型封装,咱通过menu view有很多一级菜单,每个一级中用children代表它下面的二级菜单,咱目前只有两个层级,所以咱们直接这么来做就可以了。
14:17
这个啊是一个基本步骤的说明。这个步骤呢,完成之后,下面呢,我们开始写下这个具体代码,咱们做个实现啊,首先第一步先把所有菜单先查出来,咱们直接调用base map中的方法select list里边咱传个now,因为是查全部,最终返回的是所有菜单,这个list集合,咱起个名字就叫menu list,这就是第一步。然后第一步之后咱做第二步,从所有菜单中把它的一级菜单给他取出来,就是谁的party等于零,就是一级菜单,那咱把它遍历做判断取就可以了,这个过程中呢,咱们通过流给它做个实验,因为这个更加方便啊,你直接遍历也是一样的,我们加上manual,点上,再点上一个叫filter,然后在filter里边我加上一个叫menu啊,就是表式的结构,然后咱们做个判断啊,Menu。
15:18
点上get ID,我们点上一个叫long y6,如果它的值等于这个零,那表示它就是咱们说那个一级菜单啊,用这个filter进行实现,然后继续我们把它最终,因为这里面有很多一菜单,咱把它最终啊转成一个list集合,我点上一个方法叫这个collect,然后里边有一个工具类方法叫collect.to list,最终得到这个list集合,这个list集合就是咱说那个所有一级菜单的list集合,我们起个名字啊叫这个y menu。的。
16:00
所以现在啊,咱们把第二步得到了,得到里边的所有一级菜单,各位记住这个写法啊,咱通过这个SIM流中的filter这个方法,然后最终经实现,然后这个之后我们看第三步啊,现在把所有一一菜单得到了,咱把这一一菜单进行遍历,得到里边的每个一菜单。那现在啊,我来遍历一下。咱们加上这个。Menu。加上这个y menu list啊,为了区分起个名字啊,就叫y menu这个得到啊,然后得到之后怎么做呢?给各位说明啊,因为咱们后面要做的话呢,是把这个menu是不是都变成这个叫menu view,所以咱们现在做个处理,这里边做个转换,把现在这个一级菜单。啊,一级菜单这个menu这个类型给它,就是转换成这个menu这个view类型,为了咱们最终进行封装,因为咱最后返回的是list menu这个集合我在外边啊,创建一个集合,为了最终封装啊,咱就叫list。
17:13
上一个呃,用于最终的封装,那这里边啊,我们来转换一下啊,怎么转换呢,加上menu这个view。Menu VO等于上一个menu VO,为了区分啊,还是加个Y,因为这是一级菜单,那个VO只是给它变了一种类型而已啊,在里边封装通过这个B。U里边的。Copy,把menu中的复制到这个VO中去,现在啊这个就完成了,就是现在这个中就是一级菜单里面的数据,这是我们做到的啊,然后做到之后呢,我们继续往下来做,下面做什么呢?就是里边咱要完成的这个过程,我把这个步骤啊,大家拿到上面来啊。
18:03
来,继续来看。然后看啊,下面的做法是什么啊,我们下面做法就是呢,你可以理解为这个是咱们的一级菜单,然后在每个一级里边是不是有很多的二级菜单,所以下面再来做这个每个一级的二级菜单,那这个怎么得到呢?就是按照我们刚才说到的啊,这里写的具体点。一级菜单的ID和其他菜单的那个parent ID如果说一样,那是不是就是这下的二级菜单,就是用他的ID和别的party做比较,看谁跟他一样,那就把它做封装啊,那咱们来给他比较一下啊,咱看怎么做,做法跟刚才这个写法类似啊。咱们用这个就是刚才我们那个所有数据啊,Menu,就是所有菜单里边点上,点上一个叫filter,在filter里边我们来做这个判断。
19:03
那咱判断一下啊,加上啊加上这个menu.get这个ID,点上这个,然后等于我们当前菜单的ID就是get ID。看它们是否一致啊,比如ID。这个。然后大家看这个写法啊,我再说一遍,咱怎么判断我当前一级菜单的ID,和其他菜单的判断ID如果一样,那就是下面的二级菜单,你看啊,这是一级的ID。这是其他的用们做过比较,如果他们一样,那就表示它下面的二级菜单给他最终装一下,还是加这个collect里边这个方法collect.to list。最终返回这个集合,这个集合中就是一级里边那个二级菜单,我们叫to menu。
20:06
所以现在啊,把这个就完成了,当然这个过程中呢,咱可以加上一个排序等等啊,我就写一个基本结构,因为咱就那几个值啊,就那个两三个,咱就直接把这个调到,然后得到之后我们看第五步,第五步做什么呢?我们现在啊,需要把这个二级菜单是不是要放到每个意义菜单那个children里面去啊,给它放进可以了,那咱给他就放下啊,那咱看怎么做。因为现在啊,在我们这个过程中,我们看到啊,这个类型是不是叫list menu,然后把这个list menu转换成那个menu VO是不放进去才可以啊,所以咱们要做一个简单的类型转换,把这个二级菜单的类型。转成这个样子叫menu。VO啊,那咱们来转一下啊,这个转没有更好的方式啊,咱就直接给它遍历一下啊,给它转成这样就可以了,那我先扭一个啊,咱们叫这个就叫children啊。
21:08
等于new上一个list。然后在里边啊,把这个to menu list,我们做一个便利。咱给他便利一下啊。在里边写一下,呃,这个叫menu。我们叫这个兔。卖。加上to list,然后在里边还是在里边做这个操作,这个我就复制了啊,刚才这个代码很类似啊。是,名字也稍微改一下。To me view。这里边啊,都改成这个to。现在啊,都变成这个view,然后把它放到我们这个children里边去,点上就是这个to menu view,现在啊,这个秋疹里边,就是咱们想要这个类型,这就可以了,然后之后呢,咱们把它放到一级菜单那个秋疹里边去,那我来放一下啊,One menu will.set children。
22:14
里边值就这个children准,所以现在就完成了啊,这就是咱们目前做到这个每个意义菜单,而在这过程中呢,咱因为你看啊,我是在这个不循环里边,这里边涉及到有多个菜单,所以咱最后做的就是把我们每个封装好的这个。一级菜单放到咱们最终的那个例子集合中去就可以了,我来放一下啊,点A的叫y menu view,所以现在这个咱们就完成,完成之后最后忘记啊,把你最终的集合需要做个。所以咱们到这里把这个菜单列表接口,我们就最终完成了,按照我们刚才的思路啊。
23:02
查询所有菜单。D等于零,一级彩台便利一级得到里面的二级,把二级放到它的丘正中去,最终完成封装。所以现在啊,列表的接口咱们就完成了,完成之后呢,里面还有其他的,比如大家看我这课件中有它的获取,新增,修改,删除等等,这些各位自行去完善一下,跟之前的代码都差不多,我这里边就重点写一个列表接口,这个咱们就讲到这里啊。
我来说两句