00:00
那我们再来完善一个功能,当我们鼠标划到我们的一级菜单,那就要给我们显示这个菜单对应的二级菜单,以及他们对应的三级菜单,那这个功能呢,参照我们项目里边,咱们项目的静态资源文件里边有一个GS,这个GS呢叫catalog loader GS,这个GS呢会给我们指定的位置发送请求,诶,这是一个get杰森,这是使用杰克瑞发送的HJS请求,然后呢,拿到我们所有的数据在这进行解析,最终就生成了我们这一块的功能,那么鼠标放在这呢,这就能进行展示,当然这个数据呢,它是放在index杰森,Catalog杰森里边来看一下,它是在这放的,那这有一个这样的数据,那这样的数据呢,在这是写死的,我们应该是从我们的服务器要过来的,我们整个三级分类的数据,那把这个数据呢,Ctrl a ctrl c,我们复制一份,这个数据呢,我们准备让服务器给它返回,那们先来看这个数据长什么样子,我在这来搜索一个Jason格式化。
01:00
那按照他的这个要求,如果我们能封装成这样的数据来CTRLV,那么就来到页面就能自动显示了,好,这个数据呢,展示成这个样子,我们把它呢都先合并,合并以后呢,我们把这里边的都来一合并,那这个数据呢,是这样子的,我们来看一下好。把它呢都来合并。那现在呢,我们这里边有21个元素,诶这还不是元素,我们看这是一个大对象,那说明呢,这是我们一个接省对象,接对象里边的属性名是12345678,一直到21,这个属性名呢,是我们一级分类的ID。他拿ID的值作为属性名,是为了它方便查找,我们看到这一块的GS里边在找的时候呢,按照ID相当于直接拿到对象里边这个ID叫11的这个属性的值,我们就能拿到它的这些子节点,那所以呢,这一块比较特殊,它的这个ID是作为我们map里边的K,然后呢,Map里边每一个K的值,它是一个数组,而这个数组长什么样呢?来合并上一个看一下。
02:14
那每数组里边呢,每一个东西又是一个对象,看一下这个对象,好,那这个对象里边我们来展开,这个对象里边呢,有这么几个属性,第一个是CATALOG1ID catalog3list,还有ID name,这个一呢,就代表一号的我们的一级分类,这个分类呢,它里边中括号,那就是它里边的子节点,子节点呢有这么多,其中一号节点呢叫电子书刊,那相当于我们找到了它的这么多的子节点,然后呢,这个叫CATALLO1ID,这就是我们当前这个节点的一级分类ID,这个节点呢,能在中括号里边子节点说明它是一个二级分类,把二级分类放在这儿了,然后呢,它的父分类的ID是一,相当于这是我们一号,然后呢,接下来还有它的子分类,子分类呢,在CATALLO3LIST里边,它呢又是一个数组,我们就合并上一个,那看它有哪些对象,对象里边呢有CATALLO2ID,还有当前这个ID和。
03:14
Name是当前节点的数据,然后呢,还有它的负节点c log2的ID,因为这是三级节点,所以它的负节点是c log2,然而我们这个节点呢,是二级节点,所以它的负节点是CATLO1ID,然后呢,这叫CATLO3LIST,那么就按照这样类型的数据,我们来给它做一个封装,那封装之前呢,我们先来写上这个VO,那首先得有这么一种类型的对象,我们要放在一号的ID里边,放成它的子节点,那这个对象呢,我们先来封装一个,就有这么四个属性啊,那给这呢来写一个VO,那我们这个VO呢,我来写一个,我们来看这个VO的特点,它其实是二级分类的VO,它有一级分类的ID,还有它的三级子分类,我们就来把它叫一个,看它LOG2 log2,我们的VO好把这个VO呢放到这来,还是enter贝将long bank的注解。然后呢,我们要这几。
04:14
个属性,首先catalog e ID,而且这还是一个string,我们就按照要求封装就行了,那private string类型的catalog ID,然后呢,还有一个我们的CATALOG3LIST,这是一个数组,那就private,那数组呢,我们先写成list类型,这个list里边呢,我们先来装上object,我们一会再改,它是我们这个数组,这是我们这个三级分类,三级子分类子分类,而这个呢,是我们一级负分类的ID,这是一级负分类,负分类ID,然后呢,再来封装上它的其他两个属性,这两个呢,分别是我们的ID和name,那就是当前节点的ID值以及name值,就来写上private,发现这个ID呢,也是string,那么就来写上ID,还有我们的private name string name。
05:11
好,我们封装了这个一级二级分类的这个VO节点了,这个VO节点呢,那为了方便我们给它生成一个全参构造器,有一个叫all a constructor,那既然有全餐就必须有无餐,那加上no a constructor,这都是room bank的注器,帮我们快速的生成get set方法,有参无参构造器啊,加在这儿,那这是二级分类的VO,二级分类VO里边呢,我们来看它里边的CATALLO3LIST,它其实还是一个三级分类的这个VO的样子。那么把这个view呢,可以写成它的一个内部类,哎,我们写成一个这个静态内部类,我们来放在这,好,我们在内部里边呢,我们就来为了可访问public static class,我们就叫呢,三级分类的这个VO就叫CATALOG3VO。
06:03
这个VO里边呢,还是这么几个属性,当然我们还是加上这三个注解,这三个注解生成有参无参全三构造器,第一个是private string类型的,它的负分类也就是二级分类的ID,那么负分类也就是我们的二级分类ID。而当前这个呢,它是三级分类,哎,我们这个我们来写上三级分类,三级分类为,而我们上面这个呢,是二级分类为,我们就叫二级分类维度,好,我们三级分类VO里边呢,除了它,我们继续来写上我们的private死string类型的ID,好,String类型,String类型的我们这个ID这是这个放在这,还有private那string类型的name好。我们把这些都写上以后呢,那我们的VO就准备好了,然后我们按照要求封装成这个类型的数据,相当于呢,外边的这个大对象里边有超多的属性,那这个属性呢,是一级分类的ID,然后它里边的值又是这些,好,我们就来逐层封装,那写在这这个loader GS,那假设呢,Loader GS会给我们当前项目来发送请求,会发送index下的catalog,杰森把这个原数据我就不要了,他原来的这个数据我们就不要了。
07:25
好,这个数据呢,我来删掉,来按照他的要求,我们来封装,他给这来发请求,那我们的ctrler就应该有人来处理这个请求,CTRLC,因为这是一个AJ请求返回杰森数据,所以我们的写法呢,我先写一个public,我们也不知道返回什么类型,我先写一个object,我们呢就叫get,我们的catlo解释。哎,这是我们按照要求返回的这个catallo解S,好,我们拿到这个方法,我们来编写,我们先来return一个,那我们来先写上,我们先来处理这个请求,那要处理呢,我们先来写一个get map处理get请求,我们把这个路径我们放到这,好,这就是我们指定的路径,页面呢会给我们这个路径发请求,由于我们要返回接son数据,而不是跳转页面,所以我们一定要加一个注解,加response body,将我们返回的值以JA省的方式写出去。好接下来呢,我们就希望有一个service,就是category service,它呢能有一个方法就叫get我们这个cat log节省这个方法,而且呢,这个节省的这个最大的特点,然我们最大的返回的这个对象,这是一个接省对象,那说明它是一个map map呢,就是一个接省对象,所以呢,我们就把往回返的这个我们来写成一个map,我们也不能写VO了。
08:49
因为它这个属性的K这都不确定这个VO的这个K咋写呀,所以我们就来写一个map自己来封装,那值呢,我先写成object,那其实返回的这个值我们会发现K是这个值呢,这是一个list类型的这个数组,数组里边呢,是我们三级分类的这个VO对象,那这一块呢,我们一会儿再封装再说,我们在这先写成map object,好我们希望呢,我们有一个这个方法,能直接帮我们来返回这个map,那最终来以return就行了,好,我们来创建出这个方法。
09:24
这个方法最大的特点就是要查出所有的分类,然后按照要求给我们来组织,所以我们来写我们的逻辑,第一个查出所有分类,诶,这个查所有分类,我们以前写过有一个get,诶,这直接有一个get level1categories,我先查出所有一级分类,一级分类。因为我们要把一级分类的ID作为我们这个对象里边的这么十二十一个属性,好,那么就来查出所有一级分类,这是一级分类,我们就来查一下,来先写过来,好,它来返回我们的所有一级分类,然后呢,我们来封装数据,封装咱们这个数据,那么这个要封装呢,我们就来写上一级分类,点一个我们调用它的stream方法,点一个来逐个封装,我们来写map map的,我们最终来返回我们指定的对象,但是呢,为了简单起见,我可以直接来写一个collect。
10:24
我们想要来收集这些数据,但是我们把它呢收集成一个map,我们collector有一个方法叫to map,我们先to list放在这,它呢有一个方法叫to map,我们可以把这些数据呢,最终收集映射成一个map,而map的K是什么,V是什么,我们都要自己来写,首先整个这个一级分类最终全部返回的这个map k呢是我们当前一级分类的ID,那V呢,就是我们当前这个分类的所有子分类,二级子分类,所以呢,我们这个KV都要自定义封装,那么就来写K的封装逻辑,我们来写一个拉姆达表达式,好,K的封装逻辑呢,我们直接来return return呢那就是K,那当前元素直接把它的ID拿来,我们还要变成string,我们就来写一个to string。
11:14
MY,它的这个string呢,直接一返回,那这就是我们要封装的K,而V是什么呢?我们也来写一个,而且既然这个返回就一句话,所以我们就把这一块删掉,只有一句话的返回,我们就直接这么来简写,那V是什么呢?我们来也写成V,好V的值呢,我们自己来封装上这一块提示我们k get count ID没有,我们来看一下我们这一块的K呢,这是我们catorary enity的东西,Categorary enity里边有一个get count ID确实有这个方法,然后呢,再调用它的to string,把这个结果返回成一个map,我们说这一块to string也没有,好,我们先不看了,那我们先来写一个return,好,我们写一个我们的这个V,但是我们这一块V真正要有的值,我不能直接来返回,那们相当于在这是来遍利每一个一级分类,我们现在是拿到每一个的一级分类,而我们最终要返回的这个值,其实是我们来看一下。
12:15
这是一个数组,相当于它里边的所有二级分类,所以呢,我们应该把它的cat log2的这个数组我们来给它返回,所以我们来给它封装一下,我们要查询它的所有二级分类,查到这个分类,查到这的一级分类类的所有二级分类,一级分类的咱们这个二级分类好,那这个二级分类怎么查呢?我们就调用被member,好,我们这个member呢,比如我们直接调用select list方法,我们来写一个new,一个corrywaer,我们要进行查询,返回的是category entity,但是条件呢,我们想要查二级分类,不管查几级分类,我们都要按照负分类的ID,每一个分类呢,都有指定的负分类ID,好我们拿到负分类。
13:03
负分类的ID,然后呢,接下来我们相当于要查当前分类的这个所有子分类,那当前分类就是这个。我们这个K当然不能用,我们现在传入过来的是这个V,好V呢就是当前便利的这个一级分类,它里边呢有一个当前分类的ID,我们根据它来查到它所有的子分类,把这个子分类呢,我们其实最终来进行返回,但这个返回呢,又不是我们合适的数据。我们合适的数据要封装成页面的CATALLO2VO,这二级分类的VO里边呢,还包含三级分类的这个集合,那相当于要封装成这个样子。所以呢,我们在这应该将这个查出来的list,我们要封装成我们指定的那个list,好,我们来封装还是来便利点一个stream,我们现在拿到我们的这个catalog entities,拿到我们的这个实体,点一个stream来进行遍历。
14:03
当然便利之前呢,我们最好做一个非空判断,好这样呢比较保险,如果它不等于空,我们呢才有必要来做我们这件事情,好把这个呢来进行stream,把这个数据拿来,每一个数据呢,要组装成我们指定的格式,所以我写一个map,那当前数据我就拿过来item,那当前数据呢,这就是我们正在便利的当前二级分类的信息,有分类的ID,分类的名字,当然我们要封装成二级分类的这个VO,所以我来new一个我们叫CATEGORY2的VO,就叫CATEGORY2,我来找一下,二来我们叫can log2vo,好,那就创建一个这个VO,而且创建的时候呢,因为我们有全参构造器,所以我们来写上一个全参构造器,那这个全参构造器呢,我们来传入指定的值,首先看到LOG1的ID,那一级分类的ID就是我。
15:03
对外边的这个VV的这个get这个ID,因为我们是获取它的这个子ID的,好,我们把这个一级分类的ID,我们给它封装上点一个图丝,然后呢,还有三级分类的这个。集合,这个集合呢,我们一会还要查,我们先放在这,当然还有它二级分类的信息,二级分类的ID,那就是当前item,点一个get,我们有一个can ID,当然我们还要string,我们就写一个to string,还有我们这个二级分类的名字,那我们就来写上item。点一个get我们的name,那么这个对象呢就创建出来了,我们把这个对象呢最终返回,这叫CATALLO2V。那这个返回以后呢,我们的这个stream.collect图一个list,那这个list呢,就是相当于当前分类的二级分类的这个集合。
16:01
而我们这个二级分类的集合就是我们要返回的值,而不是这个NDT,这个NTT呢,还没封装,我们来给它在这儿封装一下,好,我们来放在这儿,比如呢,它等于一个钠。好,我们在这来封装指定的来,我们第二步来封装上边的,封装上面的结果,把这个上面的结果呢,封装成我们指定的格式,我们要把这个来进行一个返回,那最终的返回的这个数据,Collect的数据,那就长成这个样子,所以呢,我们最终相当于方法返回的就是这个样子的数据,那么把这个东西呢,也给它一返回。我们把方法的签名呢,就可以来重新改一下,好来改一下,包括呢,他的这个接口的这一块的签名,我们也给他改一下,来到他的这个接口,把这个接口签名呢,也来重新改一下,这是我们指定的这个返回结果,Ctrl out来进入它的实现,在这一块呢,我们来有异常,我们来看一下,那么三级分类的这个list,它不是一个string,我们在这儿呢,还要构造。
17:06
把这个构造呢,我来先写上一个呢。好,这是我们二级分类的这个VO封装好了,然后呢,给这个二级分类,再来找他的三级分类,找我们这个当前二级分类的。三级分类封装成VO,那找呢,还是我们这个方法,Base member,我们要按照它的负ID进行查找,好,那我就继续来调用我们这个base member。点一个select list,我们来写一个new,一个corrywaer,我们来进行查询,那查询呢,还是category entity实体类,点eo,我们来要指定,指定我们的这个列是什么,以及值是什么,我们这一块的列呢,还是按照我们这个parent cid必须等于我们当前二级分类的ID,我们拿过来。
18:01
那二级分类的ID呢,就是item get count ID,那就能查出这个二级分类对应的所有子分类,当然呢,把这个子分类我们要封装成我们指定的这个集合才行,所以我把这一块的数据好,我们拿过来,来直接进行stream调用,好我们来点一个,由于这是一个list,所以我来直接来点一个string,当然要点之前呢,还是要判断非空,所以我们在这儿呢,最好别直接点了,万一是空了,那就有问题了,好,我们来给它先来返回,返回我们的整个的相当于LEVEL3的所有分类。我们就叫cat log,然后呢,我们在这来判断一下,如果说如果我们这个LEVEL3有东西,它不等于空。那么就给它封装成指定的数据,接下来第二步我们来封装成我们指定格式,那这个指定格式呢。
19:05
相当于要把每一个这个封装成一个我们这个叫can log3的VO cat log,那们三里边呢,有一个这个三的VO,我们要封装成它,那封装成它呢,它里边我们也给它传了,有参构造器啊,我们来写上我们这三个参数,那看一下这三个参数分别是什么,我们就传什么,首先是我们这个。二级分类的ID,那二级分类的ID,我们当前这是查到的三级分类的集合,拿到它的二级分类ID。那二级分类ID相当于我们就得遍历,因为是要遍历封装这里边的数据,好我们来遍历点stream,最终返回什么样的数据,我们来做一个映射,我们就叫L3,我们三级分类的这个数据我们要返回,那这个返回呢,我们先来给它把这个封装成指定格式,这个对象拿过来,好我们准备要返回成这样,那return直接把它1RETURN,然后呢,把它的这个集合一收集,这就是我们要返回的数据点collect to list。
20:11
那这个数据呢,就是我们三级的这个list,那这个list我们要最终放在我们的这个二级的VO里边,因为我们这个二级VO里边有一个属性是专门来放它的。所以在这收集完了以后,我们直接给cat log2vo里边set一个它的cat log3list,那这个list呢,我们就把数据给它,就是这个集合,看到LOG3的集合啊,看到LOG3的封装好,首先二级分类的ID和当前节点的ID和名字,那当前就是我们遍历的,我们拿过来L3当前的ID,我们拿来它是一个string,那我们就用图string,然后当前的名字L3的名字来写上L3DR。Get name,这是它的名字,还有我们二级分类的ID。
21:03
那这个二级分类的ID就是我们之前查的,我是按照它来查询数据的,CTRLC我来复制过来走。但是大家注意,我们这一块的二级分类呢,稍微有点不对,我们来看一下当前遍历的这个item,这是二级分类,那么就来写一个LEVEL2,这是LEVEL2节点,那LEVEL2节点的ID level2节点的名字包括呢,我们要查LEVEL3,也要拿到LEVEL2节点的ID。那么在这封装三级节点的时候,我们也要获取到LEVEL2的这个ID,这个ID呢,也必须是一个string。那这样呢,我们就比较层次清楚了。那么这一块呢,就把三级分类也封装成功了,那最终呢,整个这个集合的返回好返回了整个我们封装的这个数据,我来点过来,那这个数据呢,我们也给它来重新返回给controller好来让它返回我们这个类型的数据,那controller呢,也就是要这个类型的数据。
22:08
我们把这个类型的数据直接给它进行返回。那么这个接口呢,就写好了,我来重启一下我们的product application服务,来测试一下这个接口,当这个接口呢,我们前端还要发请求调用,那就是这个index,我们的页面看log JS会发送这个数据来调用,那调用以后的最终结果我们看是不是符合期望,那下来访问我们的整个这个项目,好,我们这是1万项目,先来访问我们的杰森数据,这1万项目里边呢,我们新写了一个接口叫index catallo杰森。把它复制过来,好来准备让它返回所有的数据回车。我们看一下它这一块的返回,好这个数据呢,返回出来了,我ctrl a ctrl c,我复制一份,我呢给这粘一份,看跟我们原来想要的数据是不是一样的,好,我们来打开一个新页面,万一错了,我们还能跟以前对比来粘在这。
23:06
我们发现呢,我们这一块的一二好,这跟我们以前的这个返回都是一样的,我们按照指定的格式,那一号里边呢,每一个对象我们先给他一合并,这个一号里边对象太多了,我们就来合并一个少的,看二号,二号里边呢,我们这个对象长这个样子,看到LOG1的ID是什么,看到LOG3的list,那相当于它的子节点,子节点呢,我们这一块也都有相应的数据,诶手机通讯那这一块呢,都没问题了。那么这一块的杰森数据没问题了,我们来看我们的这一块,我来刷新,来刷新的时候呢,鼠标放在这这块呢,就应该是我们从数据库拿来了的数据,那比如我们来改一个,我们就把这个电子书改为我们数据库来电一下来找到我们的这个电子书,我们看一下我们的这个电子书。它的这个ID是多少,来看一下,我们主要看它的这个LEVEL3,来找一个这个LEVEL3LEVEL2,这都是LEVEL2,我们来从LEVEL3里边我们来找一个电子书,好LEVEL3里边的这个电子书,我们来给它改一个电子书一一好我们来保存一下。
24:13
刷新,把这个数据呢,保存一下,完了重新刷新页面,我们看一下效果对不对,放到这儿,诶电子书111,这确实是从我们数据库里边拿到的数据,然后把这个电子书一一我们重新改回来,好来刷新一下。保存,那么再来刷新页面,页面当然得刷新,因为我们是文档一加载发送的这个请求。我们看到这一块的load GS,这是Dollar小括号,Function,这是文档,一加载,相当于我们这个页面只要一渲染完成,他去发请求,要到这个数据,然后在这儿解析。那如果变了的话,那我们页面就必须得刷新了,那我们现在这一块呢,数据都是我们实时的数据,好没问题了,那么首页的基本数据我们就要来了。
我来说两句