开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot):课程管理-删除课程删除视频(远程调用)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/667/detail/11419
课程管理-删除课程删除视频(远程调用)
第一步我们先来加入注解,加入依赖和相关配置,加完之后我们新建一个interface,里面调用指定服务的名称,在 interface 中,将方法注入,
//定义调用删除多个视频的方法
将 vod,control 中的方法直接复制到这里,就可以了,
//参数多个视频 id List videoIdlist
@DeleteMapping("delete-batch")
public R deleteBatch(@RequestParam("videoIdList") List videoIdList)
完成之后,完善一下路径,改成完全路径,加上 eduvod/video,后面加一个delete-batch,
//定义调用删除多个视频的方法
//删除多个阿里云视频的方法
//参数多个视频 id List videoIdlist
@DeleteMapping("/eduvod/video/delete-batch")
public R deleteBatch(@RequestParam("videoIdList") List videoIdList):
在 vodclient 中把发布方法进行自我定义,之后来到我们的调的过程中进行调用方式,我们找到删除课程的方法,
//删除课程
@DeleteMapping("{courseId}")
public R deleteCourse(@PathVariable String courseId){
courseService. removeCourse(courseId);
return R. ok();
进入到 removeCourse 中,进入实现类中,在实现类中有如下内容:
//删除课程@Override
public void removeCourse(String courseId) {
//1 根据课程 id 删除小节
eduVideoService.removeVideoByCourseId(courseId)
找到 removeVideoByCourseId,进入最终到方法中,根据视频 id 删除小节,而我们现在就是根据课程 id 删除视频,那就要先查出来视频 id,把课程中所有的视频 id都查出来,在小节表中查到视频 id,写下方法:
//1 根据课程 id 删除小节
// TODO 删除小节,删除对应视频文件
@Override
public void removeVideoByCourseId(String courseId) {
在此注入
//注入vodclient
@Autowired
private VodClient vodClient
调用里面的方法,给他进行删除
//1 根据课程 id 查询课程所有的视频 id
QueryWrapperwrapperVideo = new QueryWrapper<>():
wrapperVideo.eq( column:"course_id",courseId);
在这里设置条件,因为我们要根据课程 id 查视频,所以要写课程 id,
wrapperVideo select(“video- source- i”)
ListeduVideoList=baseMapper.selectList(wrapperVideo)
因为这里可能有一个或者多个视频,所以我们使用 selectList,上传一个wrapperVideo,最后返回一个 list 集合,这里会有我们课程所有的小节对象,但是我们要得到所有的视频 id,然后我们直接取就可以,这是我们第一部分。
我们直接便利取值就可以,但是我们可以把方法优化一点,说明如下:
因为我们现在删除视频需要查询视频id,我们可以写
SELECT video- source- id FRoM edu video WHERE c...
直接查询视频 id 就可以, 就没有必要再查询别的字段,所以我们现在代码也可以这样做,只需要查询视频 id 就可以,
如下:
现在查询的话,就是查询所有默认字段,但我现在只想查询 video source 这个字段,这就叫查询指定的列,
而这个在我们的 wrapperVideo 里有个方法,这个需要牢记,因为我们后面也需要用到,就是 wrapperVideo select(“”),插入指定字段的名字,比如 video- source- id,这样的话,我们就可以查出指定字段的值,使用的是 select 方法,因为我们只需要指定的值,其他的就不需要了。
我们要从 eduVideoList 取里面的值,调用方法就可以做到,如果要调用 vodclient,要先注入。
Vodclient
这里虽然传入的是一个 list 集合,但不是 List,我们要写的是下面的这种效果,而不是里面传入对象,继续完善一下,
public static void main(String[] args)
List list = new ArrayList<>()
list.add("11");
list.add("22");
list.add("33");
// 11,22,33
取出值,传的是 list,这种没有其他的方法,只能取值 list 放入,得到每个值,取出视频 id,
/
/L
ist变成List
ListvideoIds =new ArrayList<>(:
for (int i =0; i
EduVideo eduVideo = eduVideoList.get(i):
String videoSourceId =eduVideo. getVideoSourceId()
if(!StringUtils.isEmpty(videoSourceId))
//放到 videoIds 集合里面
videoIds.add(videoSourceId);
我们小节可能是空的,没有值,如果没有值得话,我们需要把空给放进去,所以我们需要判断,如果 videoSourceId 不等于空,那我们就可以放入值,放入 list 中,这就是完成了。
这就是一个主要的过程,把 videoSourceId 直接放入 videoIds,将 videoIds 直接传进来,
下面我们也需要做一个判断,因为上面的原因,小节里面可能一个视频都没有,那这个集合如果为空,如果为空,那我们就没必要远程调用去删除,所以需要做一个判断,
//就会根据多个视频 id 删除视频,
If(videoids,size()>0){
因为它是一个 list 集合,所以我们使用 size 判断,如果它大于0,说明它有值,有值再调用方法,进行删除,所以我们可以做出完善,如果没有值,就不需要删除,这样我们就完成了调用,过程可能会有点麻烦,但里边也不复杂,就是把多个视频id 查出来,然后进行删除,
vodClient.deleteBatch(videoIds):
我们代码就算完成了,删除视频之后我们再删除小节,但是我们不能先删小节,这样的话就查不到视频id了,所以我们要先删视频,再删小节,这样我们调用就完成了
QueryWrapper wrapper =new QueryWrapper<>() wrapper.eq(column:"course_id",courseId);
baseMapper. delete(wrapper);
//2根据课程id删除章节
chapterService.removeChapterByCourseId(courseId)
//3根据课程id删除描述
courseDescriptionService.removeById(courseId)
//4根据课程id删除课程本身
int result =baseMapper.deleteById(courseId) if(result == 0) { //失败返回
throw new GuliException(20001,"删除失败”)