00:00
就是咱们下面的先来做这个功能,课程大纲的列表显示,然后做完之后再来做这个修改功能,也就是说我们在第二步的时候。这一步咱们先把课程大纲的列表做个显示,这个功能做到,而做这个功能咱是为了把昨天这个课程分类这个列表功能做个巩固,做完之后咱再做这个上一步做修改过程,那咱们来实现一下啊这个流程。我来写一下啊,来到我这个位置啊。写到这个位置,咱做一个课程大纲列表功能。而这个功能咱就完全可以参考,咱们昨天做那个课程分类列表,跟这功能基本上是一样的,所以咱们用它把昨天这功能做个完善,就做个巩固,还是写一个这个后端的接口部分。但是我前调这个流程啊,其实咱们就是第一次进入第二步操作里边应该是没有东西的,咱们点添加之后应该才有章节和小节,但是我就先做列表,后面再来做添加这个包括小结这部分。
01:11
各位要明确啊,我这个意思啊。他最开始肯定是没有数据的,但是我们先做列表,后面再做添加,正常应该是先有一个添加操作,然后才有列表啊,但是为了巩固昨天知识,所以我写个列表功能,那咱就来具体写下这个部分啊,那这部分怎么做,咱先做第一个就是一个分析。这个分析呢,把昨天咱们画一张图,咱再打开。就这张图。大家看到啊,有这么一张表的结构,在这个表里边,主要咱用到目前是这两张表,一个叫章节,一个叫小节,因为章节小节加一起又叫课程大纲,那咱做的就是章节和小节的力保功能,或者说章节和课时的六保功能,这是我们做到的,而章节小节咱昨天分析到了,这两表之间是一个一对多的关系。
02:06
一个章节中有多个小节,一个小节属于某一个章节,跟咱昨天说那个一级二级分类是差不多的,所以咱用它把这功能我们做个实现,首先我们先写一下里面这个接口部分。那咱看怎么做啊。我想步骤啊。首先第一步按照咱们昨天的一级和二级分类的方式,咱把昨天那个也打开,看昨天怎么做的啊,参考它咱就写一下。找到这个啊,昨天的做法就是一级二级分类,咱是不是建了两个实体类啊,然后在一级里边用集合表示是不是二级分类,现在同样,那我们做法就是建一个就是章节的是一类,在建个小节是一类,在章节里边表示它的小节,做法一模一样,只是换成不同的表而已。我写一下第一步啊,创建两个实体类。
03:08
然后两十一类,一个是章节,还有一个是小结,咱们创建之后,在这个章节的是一类中使用,还是一个历史集合。表示它里边那个。小结,这时候我们要做的第一步操作,那咱们啊把这步骤我们就来写一下。按照昨天这个做法啊,那这过程中首先我先垫个包。这个位置啊,这个包,然后这个包我给它起个名字,比如就叫这个就叫capital。就叫开啊,然后在开里边咱们创建两个实体类,一个章节一个小节。那我写一下啊,第一个我们就叫这个capital。啊character,比如也叫为了区分啊,叫character VO了啊character这是第一个代表章节,然后创建之后再创建一个叫小节,小节咱就叫video VO。
04:06
是为了做这个封装。V顶无忧这是两个是一类,然后创建之后,在它们里边也是写上属性章节和小节部分,而它的属性咱也是写它的ID和名称,ID是它名称,我们叫title。那我写一下啊,谢谢这个张姐。写个private private。这是ID表示章节ID,再来一个private string。开头。它的名称写完之后,上面加上这么一个date,一个注解,就是它的get set方法,这个完成完成之后我们再写这个小节,在里边也是两个,一个ID,一个名称,包括在它上面加上这么一个date,一个注解,这个完成完成之后呢,章节里边要表示它的小结。
05:01
那我们做法就是呢,因为啊章节和小节是一对多的关系,也就是说一个章节中有很多小节,所以咱们在里边呢,还是写个历史集合。加上这个叫video video。比如这个名字,我还叫这个children吧。当然,你可以随便起名字啊,我还是叫children,等于new上这么一个list。创建这么一个集合,这样的话把这个我们就完成了,然后把它的依赖给它引入啊,这是list,这是。Release。这个啊,我们就做到了啊,所以大家把这个给他知道啊。这些没用的,我先关掉啊,然后这个做到之后,咱的第一步就完成了,创建了两个实体类,然后实体类之间表示了他们这个关系。这个完成啊,然后完成之后,下面我们写第二步就来开始写它那个具体的代码,跟昨天的一样,咱们一会儿也是写个controller,然后controller调service service里边写它最终过程,也就是咱昨天的这个过程。
06:11
先得到一分类,再得到二级分类,然后最终这个封装啊跟它一模一样。那我就直接写下了啊。咱们来做一下啊,就是因为呢,现在要做的是章节和小节部分,也就说我们是另外一个部分,课程大纲所章节和小节部分咱就不要写到这个E丢中了,然给它写到这个CTRL中,这个edu角C中里边写我们的章节和小节部分,在这里边我们来实现,然后换一个另外一个CTRL,因为它是一个新的部分。然后在里边我把这个写下,这个方法啊,咱先做个注入,加上一个叫凹凸曼。加个private,这个叫edu capital。Service,我们叫capital service,下面加上这个方法。
07:04
就是返回那个。课程大纲等。列表。然后咱写一下啊,我就加一个。Get,提交。里边起个名字就叫get这个。Capital video啊,就这个名字,然后写完之后,下面写的方法public r,咱的方法还是叫这个名字。然后在里边我们写它那个内容啊,我先让他个值,让他先不报错,然后咱再完善。这是一个最基本的方法,但是这个方法跟咱昨天写的虽然说差不多,但是还是有一点点区别的,我说一下什么区别啊,希望各位能想到啊。也就是说啊,我这个课程大纲,课程大纲呢,肯定不是单独存在的,课程大纲是不是要存在于某个课程里边,也就是说大纲里边的章节小节,在课程中是不是才有章节小节,所以咱得查的话,就并不是查所有章节,而是查什么,是不是要查你课程里边的章节和小节啊,这个我要明确啊。
08:12
昨天咱们写分类是查所有没有什么条件,但是章节小节不是只有课程中才有章节小节你不能查所有,你查所有不知道是哪个课程的,这单做法就是要去查课程里边的章记和小结,那怎么查,大家看表中有个字段。很清楚告诉我们这个字段叫什么cosd cosd是不是课程ID啊,这单写的话就要根据课程ID把课程中的章节小节查出来,然后在里面做个显示,这是跟昨天不一样的地方。然后写下啊。我们要根据课程ID。进行查询,那咱们写一下啊,课程ID呢,我在这里边,咱就直接用路径给他传下了,我就叫。
09:02
Co ID,课程ID,然后咱们这么传的话,之前写过,在这里边呢,咱需要加上一个注解。然后加上一个紫缀。Cos ID啊,这个是得到我们的课程ID,根据课程ID把里边的章节和小节给它就是查出来。然后这个写完之后,咱下面就调这个service,把这过程最终都写到我们的service中。我写一下啊,得到你的这个章节就是开和这个小节,然后根据我们的那个。课程ID里边就传入一个课程ID,这是一个方法,然后这个方法按照咱昨天写的1.d分类返回的肯定也是一个。例子集合,而在例子结合中,咱加的应该是这个章节的是无忧,因为章节里边是包含小节,我们加的泛型应该写这个。章节就是开。不由。
10:00
所以这个方法我们就创建出来了,然后这个一会儿咱写,最后把这值我们肯定最终要做一个返回。比如说起个名字啊,就叫O这个。Video。这里边它的值是这个例子。这样的话CTR了咱就完成了,然后ctrler完成之后,最后再来写这个service,在service里边做它那个最终的封装过程。那咱们来创建啊,先创建这个方法。就是这个,根据CTRID查询章节小结,这是service的接口,再写service的实现类。找到实验内应该是在。这里边啊,实现类。把这个方法创建在实现类中,咱把这过程我们就最终实现一下,就是这个封装,咱还是参考昨天这个写法。那怎么封装,咱们还是先分析一下,然后写代码。
11:02
希望各位要能知道啊,就是昨天那代码如果能写出来,那今天跟昨天没有什么区别,是一样的,那我们来分析啊。首先咱要封装是章节和小节,那第一步操作咱是不是要查询出这个章节的数据,那你章节不是查有,咱还是根据这个条件,根据课程ID先查询出课程里边那个所有的章节,这是第一步啊,有单查询,然后第二步肯定要查询里边那个小结。但小节怎么查,咱看一下表里边啊。找到小节表一丢,Video。大家看到啊,小节表里边呢,有一个当地ID,但是为了方便,这里边还有一个字段。是什么?是不是课程ID啊,也就说我们现在根据课程ID小节是不是也能查出来啊,这就是他的第二操作,所以咱们就是先把数据查出来,根据课程ID先查出课程里的所有章节,再根据课程ID查询里边的所有的小节,这是它的第一步和第二步,然后查完之后第三步啊,咱就按照昨天写的便利你查询出来那个。
12:17
章节的历次集合,然后进行这么一个封装,然后做完之后第四步再来便利查询出来那个小节的历次集合,然后进行判断,最终进行一个封装,要这么一个流程,先把课程中的章节小节都查出来,然后咱们便利再做封装,主要这么一个流程。跟昨天应该一样的啊,那咱们下面就来写一下一个过程啊。先来查里面的章节部分。那咱就写一个query rapper,因为有条件嘛,这必须要有query rapper里边加上章节叫edu。Capital。这里边起个名字,我就叫rapper capital。
13:01
等于咱就是new上一个快d rap啊,就是new这么一个对象,然后扭完之后呢,在里边我们设置它的条件,因为要根据课程ID查询,我们写一个EQ。然后加上那个字段,到里边复制一下啊,找到章节表他的课程ID。是不是这个cosd,把这个咱给它复制过来,然后写上课程ID那个。参数值,或者说那个具体值就是cos,把这个写出来,写完之后咱就调方法,这怎么调,昨天提到过了,因为在开里边第一种方式,你可以调这个base map,或者说写个this都可以,那我们就写一个base map,在里边我们调方法,方法叫select list。咱把rapper开传进来,最终还结果,这个结果就是所有的那个章节的那个。集合这个我们就查出来了啊,是里边的第一部分,然后这个查完之后咱再查这个小节跟它写法差不多,那我们用它咱就快速改一下啊。
14:10
第一部分也是牛这个对象。咱为了区分,给他换个值。我叫这个video。这是video,然后小结跟他一样,也是根据课程ID查询,那我们现在啊,条件做完了,然后做完之后进行查询,但是现在有一个跟昨天同样的问题啊,我现在呢,是在。Character里边去,但是你要查video肯定查不了,现在要查video怎么做呢?咱就需要把这个video的接口是不是要注进来,或者把video的TH注进来才能查询,因为你直接character里边查不了这个video,那我们给它就。注入一下啊。写一下就是outwa private叫edu video service,这叫video service,咱这过程就是注入。
15:02
小节的service,为了后面查询,你不注重开里边没法查小结,然后注入之后咱们调里边的方法给方法在中应该就叫list。咱传一个叫rapper video,最后传一个结果,这结果就是所有小节的,就是课程中小节那个历次集合,我就叫edu video list。这样的话我们就完成了,这就是第一步,第二步查出里边的章节和小节数据,啊,这名字写错了啊,应该叫video。小结,这个完成了啊,第一步,第二步就是现在数据都有了,然后数据都有之后,咱下面要做的就是最终做这个封装啊,那我们来封装一下啊。封装之前的,咱先创建一个历次集合,用于我们最终的那个封装的那个数据啊,先有一个集合,为了最终的一个结果,那我写个例,这例子中就叫这个character view。
16:05
然后起个名字叫这个final,这个。List就是最终那个集合。等于上一个叫a list。这个创建了啊,然后创建之后咱往下写啊,又来封装它的章节和小节部分。那怎么做,看一下昨天我们写那个一级二级分类那个。咱用它再看一遍啊。大家看写法啊,它的做法就是呢,首先咱们一二级分类的时候,先遍历一级分类,然后把里面数据。放到这个one subject中,最终放到例子结构中去。咱用到了b us,然后再遍历里边这个二级分类,包括做判断,就是做封装,所以现在做的就这过程是咱们要便利的是章节,包括便利是小节,小节里边做个判断,最终这个结果。
17:00
那咱就写下啊,这个过程啊。首先咱先遍历查询出来那个章节的。历次集合,也就是把这个遍历edu capital list。那咱来写一下啊。点上一个遍历,然后遍历之后得到里边的每个章节,我们写一个叫edu character list的上get I,这得到里边的每个章节,啊,它就叫edu capital,但是呢,现在我们要放到集合中,那个对象叫capital VO,不是edo capital,所以咱做法怎么做,把edo capital中的值是不是要放到VO中去,然后最终再放到历史集合里面去,咱要做这个过程。然后写一下啊,咱们把edu。对象里边的值给它就复制到这个叫capital VO里边去。要做这个过程。那怎么做我就直接写下了啊,咱们昨天都写过了,开VO等于new上一个开VO,然后咱们用到一个工具类,就这个叫B。
18:11
Us点上这个叫copy pro,咱们就是把edu中的值复制到这个capital。VO里面去啊,就来做这个最终VO中有里面的值,然后都做完之后,咱就把这个叫开V,给它放到咱们那个最终那个历史集合里面去,比如放到。这位中来。那我们给它放下啊,点上A的。要这个character view。这样的话,咱就完成了章节数据封装主要这个过程,所以各位给他知道啊,我再说一遍,然后再写小节,做法就是把你查出来的章节这个集合做个便利,便利之后呢,因为它要放到view中,而不是放我们的e capital,所以咱把e capital中的数据复制到capital view中,最终复制完之后这VO加到final例中去,现在这么做之后,在这个list结构中应该有咱们这里边的课程中的所有的章节部分里面应该都存在了。
19:18
这个啊做到了,然后做到之后,下面咱再变里边这个小节的部分。把这个红轴遍历,但是大家注意,因为就是一个章节中有很多的小节,所以说咱们遍历小节的时候,要写这个分循环里边我们写一个欠条负循环做便历,因为章节里边是一个章节中有多个小节,那咱们便历啊变这个小节叫edu video list的。加一个便利。按照我昨天说的啊,这个变量咱改个我改成M,然后变了之后,咱就是得到每个小节叫edu。
20:00
Video list.get注意啊,加的是一个M啊,咱是一个新的变量,这得到是每个小节,然后得到每个小节之后,咱就这里边下面要做一个判断了。判断什么呢?给大家说明啊,就是咱们的这个表里边我们看到啊,你注意小节里边是不是有个叫开ID,而我章节中对应的是不是这ID,也就是说小节里边那个开ID如果和章节的ID一样,那是不是就是章节选小节咱做封装,如果不是的话,那咱就不做封装,就是用这个。Cat ID和章节中的ID做比较,类似于昨天判ID和ID做比较啊,是一个意思,那咱们来判断一下啊。我喜欢的位置。咱就是判断小结里边那个。ID。和章节里边的ID是否一样,如果一样的话,我们就做封装啊,但是封装为了方便,外面咱也创建一个集合,用于封装你那个。
21:12
章节中的小结。这个啊,咱也先建个集合。然后里边写一下啊,加一个list,这叫做video video。这个比如我叫video。List等于new上这么一个a list啊,用于我们一份封装,然后写完之后,下面再来做这个判断。我就来一个if。按照我这个过程啊,小结里边的开ID,因为这是小节,咱们把它拿过来,得到里边那个叫开ID,这个ID。点上equals就是章节中的ID,章节要么是他,要么是这个,两个都一样,我用第一个原始这个E丢capital,把这个拿过来,得到里边这个ID,如果说它们相同的话,那我们就做封装,那怎么封装呢?咱就把这个eduv的值放到这个view中去就可以了。
22:10
啊,就是进行封装。然后写一下啊,Video VO,咱先谬这个对象。然后完之后用这个叫b.copy pro,咱就把我们就是edu video中的值。放到这个video video里面去。啊,放到这里边去,然后这样的话,里边有咱最终数据都做完之后,把它放到我们那个就是集合中去啊,放到咱那个。小结的。封装的集合里面去,比如咱刚才写这个。Video例子给它放进去点A的,这叫。VV。这样的话,咱把这个就完成了,就在这个小节循环中,我们做了判断,如果小节的开ID和章节ID一样,那我们做这封装最终都放到video例子中去,然后这个都完成之后,咱再循环外边做最后一件事情。
23:11
把咱们就是封装之后的小节的历次集合放到我们的是那个章节的对象里面去。放到这里边最终就可以了,然后章节对象就是咱们刚才看那个叫character VO,咱最终就放到里面去。就是点上set这个children,咱放的叫video。List这个啊,是咱们写的这么一个封装代码,我们就给它快速完成了。然后过程我再说一遍啊,最后咱再测试。这个过程就是呢,跟咱昨天就有一个区别,里边就需要传个参数,别的过程都一样,然后因为我们的章节小节它在某个课程中,这单是根据课程ID去查里面内容,然后这个位置是咱们查完之后最终返回,那再看具体地方,首先第一步根据课程ID把里边的章节查出来,第二步根据CRID查里的小节部分。
24:12
然后都查完之后,先便利章节封装到结构中去,还是用到咱昨天说那个b us给他做个封装,然后这个做到之后再便利小节,当然遍历小节,因为里边有很多小节,咱做个判断,看小节是不是章节里边的小节,就用这个。开ID和他的ID做个比较,如果是的话,那我们也是用BU做这个复制,最终放到集合中去,这集合就是章节中的所有小节集合,然后咱放到每个章节对象里面去,最终返回就可以了,这就是章节和小节的这么一个封装。跟我们昨天说那个一级二级分类应该基本上是一样的,昨天咱们写到的也是这么一个过程。
25:00
所以大家啊,通过就是这两个功能,你把这个封装这过程一定要特别熟练,咱是写了两遍了,第一遍就是在这课程分类中,第二遍在课程大纲里表中,所以各位这个都能写到啊,就是你换一种写法,这个叫举一反一的方式啊,就是那个会写,这跟他应该是一样,只是多了一个条件而已。这个啊,我们就写出来了啊,关于这个过程啊。然后洗完之后,最后我把这服务咱们启动一下,然后这里边我们可以看一下最终的效果。
我来说两句