目录

删除课程计划

课程计划排序:

师资管理,也就是课程教师的信息查询,添加,修改,删除操作

删除课程

总结


删除课程计划

首先观察文档:

我们发现,此时的报错信息中是有个errCode参数的,为了方便使用,我们就可以直接在base工程那个目录下面的XueChengPlusException文件中添加一些参数:

public class XueChengPlusException extends RuntimeException {private String errMessage;private int errCode = 0;public XueChengPlusException() {}public XueChengPlusException(String errMessage) {this.errMessage = errMessage;}public XueChengPlusException(String errMessage,int errCode) {this.errMessage = errMessage;this.errCode = errCode;}public String getErrMessage() {return errMessage;}public int getErrCode(){return errCode;}public void setErrCode(int errCode){this.errCode = errCode;}public static void cast(String errMessage) {throw new XueChengPlusException(errMessage);}public static void cast(String errMessage,int errCode) {throw new XueChengPlusException(errMessage,errCode);}public static void cast(CommonError commonError) {throw new XueChengPlusException(commonError.getErrMessage());}
}

当然,肯定是少不了修改返回给前端的那个参数包装类RestErrorResponse:

public class RestErrorResponse implements Serializable {private String errMessage;private int errCode;public RestErrorResponse(String errMessage){this.errMessage= errMessage;}public RestErrorResponse(String errMessage,int errCode){this.errMessage= errMessage;this.errCode = errCode;}public int getErrCode(){return errCode;}public void setErrCode(int errCode){this.errCode = errCode;}public String getErrMessage() {return errMessage;}public void setErrMessage(String errMessage) {this.errMessage = errMessage;}
}

这两步搞定就可以开始我们的操作了

第一步当然是先在api的TeachplanController中定义接口:

@Api(value = "课程计划编辑接口",tags = "课程计划编辑接口")
@RestController
public class TeachplanController {@AutowiredTeachplanService teachplanService;@ApiOperation("课程计划删除")@DeleteMapping("/teachplan/{courseId}")public void deleteTeachplan(@PathVariable Long courseId){System.out.println("课程计划删除")}}

然后经过考虑发现,其实Mapper中的自定义方法是不满足,一些要求的,就这个删除而言,如果是大章节,那么就要进行大章节下面是否有小章节的判断,所以我们可以在手写一个SQL,所以这边要给TeachplanMapper加入一个,我们自定义判断大章节下面是否有小章节的接口:

public interface TeachplanMapper extends BaseMapper<Teachplan> {//课程计划查询public List<TeachplanDto> selectTreeNodes(Long courseId);//查询大章节下面是否有小章节public Long selectBigFest(Long id);
}

然后去TeachplanMapper.xml中实现我们的SQL,在这里完整的文件我就不写出来了,只写个自定义SQL和方法:

  <select id="selectBigFest"  parameterType="long" resultType="java.lang.Long">SELECTCOUNT(*)FROMteachplan oneINNER JOIN teachplan two ON two.parentid = one.idWHEREone.id = #{id}</select>

在这个接口中,如果大章节下面有数据,就会返回数据的总条数,如果没有数据就会返回0,我们在之后的代码中就可以直接进行判断,

现在在service工程下面找到课程计划的TeachplanService接口,在接口中定义删除课程的方法:

public interface TeachplanService {/***因为删除的时候,是要考虑删除的是大章节还是小章节* 删除课程小节和大章节* @param courseId 课程id*/void deleteTeachplan(Long courseId);
}

然后开始去Service接口的实现类TeachplanServiceImpl中,写逻辑思维:

@Service
public class TeachplanServiceImpl implements TeachplanService {@AutowiredTeachplanMapper teachplanMapper;@AutowiredTeachplanMediaMapper teachplanMediaMapper;public void deleteTeachplan(Long courseId) {//根据courseId查询课程计划,然后通过parentId判断是小章节还是大章节Teachplan teachplan = teachplanMapper.selectById(courseId);if (teachplan.getParentid() != 0) {//证明是小章节//根据mediaType属性判断小章节是否关联视频String mediaType = teachplan.getMediaType();if (mediaType == null) {//证明没有关联视频或者文档//删除小章节teachplanMapper.deleteById(teachplan);} else {//证明关联了视频或者文档//删除视频,暂不考虑文档的情况teachplanMediaMapper.deleteById(courseId);//删除小章节teachplanMapper.deleteById(teachplan);}//} else {//证明是大章节//判断大章节下面是否有小节Long aLong = teachplanMapper.selectBigFest(courseId);if (aLong == 0) {//证明没有小节,可以进行删除teachplanMapper.deleteById(teachplan);} else {//有小节,不能删除XueChengPlusException.cast("课程计划信息还有子级信息,无法操作", 120409);}}}}

然后就可以在Controller接口中,直接调用方法,进行测试,这里我就不写测试过程了,这个已经测试是没问题的:

@Api(value = "课程计划编辑接口",tags = "课程计划编辑接口")
@RestController
public class TeachplanController {@AutowiredTeachplanService teachplanService; @ApiOperation("课程计划删除")@DeleteMapping("/teachplan/{courseId}")public void deleteTeachplan(@PathVariable Long courseId){teachplanService.deleteTeachplan(courseId);}
}

课程计划排序

老规矩先看文档:

看完之后,我们就可以先定义Controller层中的方法了:

@Api(value = "课程计划编辑接口",tags = "课程计划编辑接口")
@RestController
public class TeachplanController {@AutowiredTeachplanService teachplanService;@ApiOperation(("课程计划向下移动"))@PostMapping("/teachplan/movedown/{id}")public void moveDown(@PathVariable Long id){System.out.println("课程计划向下移动")}@ApiOperation(("课程计划向上移动"))@PostMapping("/teachplan/moveup/{id}")public void moveUp(@PathVariable Long id){System.out.println("课程计划向上移动")}}

然后开始定义Service层的接口方法:

public interface TeachplanService {/*** 课程计划向下移动* @param id 课程id*/void moveDown(Long id);/*** 课程计划向上移动* @param id 课程id*/void moveUp(Long id);}

然后开始去实现逻辑:

@Service
public class TeachplanServiceImpl implements TeachplanService {@AutowiredTeachplanMapper teachplanMapper;@AutowiredTeachplanMediaMapper teachplanMediaMapper;public void moveDown(Long id) {//课程计划向下移动//根据courseId查询课程计划,然后通过parentId判断是小章节还是大章节Teachplan teachplan = teachplanMapper.selectById(id);if (teachplan.getParentid() != 0) {Integer orderby = teachplan.getOrderby();//证明是小章节//根据父章节的id,找出大章节下面所有小节点LambdaQueryWrapper<Teachplan> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(Teachplan::getParentid,teachplan.getParentid()).eq(Teachplan::getGrade,2);List<Teachplan> teachplans = teachplanMapper.selectList(queryWrapper);int i = 0;for (Teachplan t:teachplans) {//找到当前章节的排序字段加一,以此获得下一个章节if(t.getOrderby()==orderby+1){i++;}if(i==1){//进行交换teachplan.setOrderby(t.getOrderby());t.setOrderby(orderby);teachplanMapper.updateById(t);teachplanMapper.updateById(teachplan);break;}}if(i==0){XueChengPlusException.cast("当前计划已经在末尾,无法交换");}} else {Integer orderby = teachplan.getOrderby();//证明是大章节//根据课程的id,找到下一个大章节LambdaQueryWrapper<Teachplan> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(Teachplan::getCourseId,teachplan.getCourseId()).eq(Teachplan::getGrade,1);List<Teachplan> teachplans = teachplanMapper.selectList(queryWrapper);int i = 0;for (Teachplan t:teachplans) {//找到当前章节的排序字段加一,以此获得下一个章节if(t.getOrderby()==orderby+1){i++;}if(i==1){//进行交换teachplan.setOrderby(t.getOrderby());t.setOrderby(orderby);teachplanMapper.updateById(t);teachplanMapper.updateById(teachplan);break;}}if(i==0){XueChengPlusException.cast("当前计划已经在末尾,无法交换");}}}@Overridepublic void moveUp(Long id) {//课程计划向上移动//根据courseId查询课程计划,然后通过parentId判断是小章节还是大章节Teachplan teachplan = teachplanMapper.selectById(id);if (teachplan.getParentid() != 0) {Integer orderby = teachplan.getOrderby();//证明是小章节//根据父章节的id,找出大章节下面所有小节点LambdaQueryWrapper<Teachplan> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(Teachplan::getParentid,teachplan.getParentid()).eq(Teachplan::getGrade,2);List<Teachplan> teachplans = teachplanMapper.selectList(queryWrapper);int i = 0;for (Teachplan t:teachplans) {//找到当前章节的排序字段减一,以此获得上一个章节if(t.getOrderby()==orderby-1&&(orderby-1)!=0){i++;}if(i==1){//进行交换teachplan.setOrderby(t.getOrderby());t.setOrderby(orderby);teachplanMapper.updateById(t);teachplanMapper.updateById(teachplan);break;}}if(i==0){XueChengPlusException.cast("当前计划已经在顶部,无法交换");}} else {Integer orderby = teachplan.getOrderby();//证明是大章节//根据课程的id,找到上一个大章节LambdaQueryWrapper<Teachplan> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(Teachplan::getCourseId,teachplan.getCourseId()).eq(Teachplan::getGrade,1);List<Teachplan> teachplans = teachplanMapper.selectList(queryWrapper);int i = 0;for (Teachplan t:teachplans) {//找到当前章节的排序字段减一,以此获得上一个章节if(t.getOrderby()==orderby-1&&(orderby-1)!=0){i++;}if(i==1){//进行交换teachplan.setOrderby(t.getOrderby());t.setOrderby(orderby);teachplanMapper.updateById(t);teachplanMapper.updateById(teachplan);break;}}if(i==0){XueChengPlusException.cast("当前计划已经在顶部,无法交换");}}}
}

然后在Controller的api中,进行方法调用:

@Api(value = "课程计划编辑接口",tags = "课程计划编辑接口")
@RestController
public class TeachplanController {@AutowiredTeachplanService teachplanService; @ApiOperation(("课程计划向下移动"))@PostMapping("/teachplan/movedown/{id}")public void moveDown(@PathVariable Long id){teachplanService.moveDown(id);}@ApiOperation(("课程计划向上移动"))@PostMapping("/teachplan/moveup/{id}")public void moveUp(@PathVariable Long id){teachplanService.moveUp(id);}
}

师资管理,也就是课程教师的信息查询,添加,修改,删除操作

先看接口文档:

然后去Controller层,仔细看,此时我是又定义了一个新的Controller,这些接口中的方法,还没实现可以先写上,然后根据这个定义方法,并且添加和删除我是定义了一个接口,咳咳,偷个懒,定义接口:

@Api(value = "师资信息管理接口",tags = "师资信息管理接口")
@RestController
public class CourseTeacherController {@AutowiredCourseTeacherService courseTeacherService;@ApiOperation("讲师信息查询")@GetMapping("/courseTeacher/list/{courseId}")public List<CourseTeacher> getCourseTeacher(@PathVariable Long courseId){return courseTeacherService.getCourseTeacher(courseId);}@ApiOperation("添加/修改讲师")@PostMapping("/courseTeacher")public CourseTeacher setCourseTeacher(@RequestBody CourseTeacher courseTeacher){return courseTeacherService.setCourseTeacher(courseTeacher);}@ApiOperation("删除讲师")@DeleteMapping("/courseTeacher/course/{courseId}/{id}")public void deleteCourseTeacher(@PathVariable Long courseId,@PathVariable Long id){courseTeacherService.deleteCourseTeacher(courseId,id);}
}

然后去CourseTeacherService,要是没有就创建一个,定义接口方法:

import java.util.List;public interface CourseTeacherService {/*** 查询教师信息* @param courseId 课程id* @return 教师信息*/List<CourseTeacher> getCourseTeacher(Long courseId);/*** 添加教师信息* @param courseTeacher 要添加的信息* @return 返回添加的信息*/CourseTeacher setCourseTeacher(CourseTeacher courseTeacher);//删除教师信息void deleteCourseTeacher(Long courseId, Long id);
}

然后去实现层CourseTeacherServiceImpl:

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.xuecheng.base.exception.XueChengPlusException;
import com.xuecheng.content.mapper.CourseTeacherMapper;
import com.xuecheng.content.model.po.CourseTeacher;
import com.xuecheng.content.service.CourseTeacherService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;@Service
public class CourseTeacherServiceImpl implements CourseTeacherService {@AutowiredCourseTeacherMapper courseTeacherMapper;//查询讲师信息@Overridepublic List<CourseTeacher> getCourseTeacher(Long courseId) {//根据课程id查询讲师信息LambdaQueryWrapper<CourseTeacher> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(CourseTeacher::getCourseId,courseId);return courseTeacherMapper.selectList(queryWrapper);}//添加,修改讲师信息@Overridepublic CourseTeacher setCourseTeacher(CourseTeacher courseTeacher) {//根据id判断是修改还是删除if(courseTeacher.getId()==null){//证明是添加courseTeacher.setCreateDate(LocalDateTime.now());courseTeacherMapper.insert(courseTeacher);return courseTeacherMapper.selectById(courseTeacher);}else{//证明是修改courseTeacherMapper.updateById(courseTeacher);return courseTeacherMapper.selectById(courseTeacher);}}//删除讲师信息@Overridepublic void deleteCourseTeacher(Long courseId, Long id) {LambdaQueryWrapper<CourseTeacher> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(CourseTeacher::getCourseId,courseId).eq(CourseTeacher::getId,id);CourseTeacher courseTeacher = courseTeacherMapper.selectOne(queryWrapper);if(courseTeacher==null){XueChengPlusException.cast("未知错误,请稍后重试");}courseTeacherMapper.deleteById(courseTeacher);}
}

然后这些接口就搞定了

删除课程

先看接口文档:

首先还是在Controller层的CourseBaseInfoController中定义接口:

@Api(value = "课程信息管理接口",tags = "课程信息管理接口")
@RestController
public class CourseBaseInfoController {@AutowiredCourseBaseInfoService courseBaseInfoService;@ApiOperation("删除课程")@DeleteMapping("/course/{courseId}")public void deleteCourseBase(@PathVariable Long courseId){//获取到用户所属机构id,这里就先模拟一个,可以自行更改Long companyId = 22L;courseBaseInfoService.deleteCourseBase(companyId,courseId);}
}

然后开始在CourseBaseInfoService中,定义接口,需要注意的是这里的方法,还要有个机构id参数来进行判断是否是本机构:

public interface CourseBaseInfoService {/*** 删除课程* @param companyId 机构id* @param courseId 课程id*/void deleteCourseBase(Long companyId,Long courseId);}

然后去CourseBaseInfoServiceImpl开始实现逻辑:

@Service
public class CourseBaseInfoServiceImpl implements CourseBaseInfoService {@AutowiredCourseBaseMapper courseBaseMapper;@AutowiredCourseMarketMapper courseMarketMapper;@AutowiredCourseCategoryMapper courseCategoryMapper;@AutowiredTeachplanMapper teachplanMapper;@AutowiredTeachplanMediaMapper teachplanMediaMapper;@AutowiredCourseTeacherMapper courseteacherMapper;public void deleteCourseBase(Long companyId, Long courseId) {//根据id查询课程CourseBase courseBase = courseBaseMapper.selectById(courseId);//判断课程是否是该机构的if (!courseBase.getCompanyId().equals(companyId)) {XueChengPlusException.cast("本机构只能删除本机构课程");}LambdaQueryWrapper<CourseTeacher> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(CourseTeacher::getCourseId, courseId);CourseTeacher courseTeacher = courseteacherMapper.selectOne(queryWrapper);if (courseTeacher != null) {//删除讲师信息courseteacherMapper.deleteById(courseTeacher);}LambdaQueryWrapper<CourseMarket> Wrapper = new LambdaQueryWrapper<>();Wrapper.eq(CourseMarket::getId, courseId);CourseMarket courseMarket = courseMarketMapper.selectOne(Wrapper);if (courseMarket != null) {//删除收费信息courseMarketMapper.deleteById(courseMarket);}LambdaQueryWrapper<TeachplanMedia> wrapper = new LambdaQueryWrapper<>();wrapper.eq(TeachplanMedia::getCourseId, courseId);TeachplanMedia teachplanMedia = teachplanMediaMapper.selectOne(wrapper);if (teachplanMedia != null) {//删除媒资信息courseMarketMapper.deleteById(courseTeacher);}LambdaQueryWrapper<Teachplan> qwrapper = new LambdaQueryWrapper<>();qwrapper.eq(Teachplan::getCourseId, courseId);List<Teachplan> teachplan = teachplanMapper.selectList(qwrapper);if (teachplan != null) {for (Teachplan t:teachplan ) {//删除课程计划teachplanMapper.deleteById(t);}}//删除课程信息courseBaseMapper.deleteById(courseBase);}
}

然后所有内容就搞定了,如果以上所有功能,有任何问题,或者你有任何疑惑,欢迎评论交流

总结

删除课程计划,这个接口小难点,我感觉在于那个判断大章节下面是否有小章节的SQL语句。

课程计划排序,这个接口,难点就在于,比如下移,如果是大章节你要如何拿到下一个大章节的数据,这个搞定就没啥了

师资管理,没啥好说的,就crud就完了

删除课程,没啥难点,就要删仔细,一个一个删除就好了,当然我感觉还有更快的方法,但是我咳咳,懒得想了,要是有大神看到,欢迎指点

最后祝大家,早日上岸,天天无bug

黑马学成在线项目之Day4实战相关推荐

  1. 黑马学成在线--项目环境搭建

    完整版请移步至我的个人博客查看:https://cyborg2077.github.io/ 学成在线–项目环境搭建 学成在线–内容管理模块 学成在线–媒资管理模块 学成在线–课程发布模块 学成在线–认 ...

  2. 黑马学成在线-项目搭建

    一.开发环境搭建 1.开发工具版本 开发工具 版本号 IntelliJ-IDEA 2021.x以上版本 Java JDK-1.8.x Maven 3.6.x以上版本 Mysql 8.x VMware- ...

  3. 学成在线项目开发技巧整理---第一部分

    学成在线项目开发技巧整理---第一部分 1.数据字典 2.http-client远程测试插件,可以保存测试数据 3.三种跨域解决 4.具有多层级数据查询思路 5.Mybaits分页插件原理 6.根据文 ...

  4. 学成在线项目-轮播图banner

    学成在线项目-轮播图banner 1.效果图如下 2.html代码如下: <!DOCTYPE html> <html lang="en"> <head ...

  5. HTML+CSS实战——学成在线项目(含源码、素材、psd文件)

    文章目录 准备工作 版心和清除默认样式 header布局 logo和nav布局 搜索--布局和文本框 用户区域 banner布局 精品推荐 版权区域 项目源码--点击下载 准备工作 版心和清除默认样式 ...

  6. 黑马程序员HTML+CSS学成在线项目

    /*美化首页*/ *{margin: 0;padding: 0;box-sizing: border-box; }li{list-style: none; } a{text-decoration: n ...

  7. CSS学习笔记之学成在线项目(下) 3.3

    1.1 机器学习工程师模块 本人思路:定义一个content大盒子,里面包含top和ugui上下两个小盒子,小盒子里的布局以及样式与前面的模块是一致的,这里不再赘述,可直接套用style样式. 结构代 ...

  8. 学成在线项目note

    目录 一.index.html 1.头部header 2.轮播图banner 3.精品推荐 4.精品推荐课程 5.footer 二.index.css 1.重要的代码 一.index.html < ...

  9. 学成在线项目(HTML+CSS)

    去年在B站上跟着Pink老师学习的前端成果,衷心的感谢Pink老师! 效果图: HTML代码 <!DOCTYPE html> <html lang="en"> ...

最新文章

  1. 美国《消费者报告》实测特斯拉Model 3,“完全自动驾驶”名不符实
  2. html目录怎么搞出来,webpack怎么把html搬到输出目录里?
  3. jsp员工管理系统mysql_简单的员工管理系统(Mysql+jdbc+Servlet+JSP)
  4. hdu1799 循环多少次?(组合递推公式的使用)
  5. 文献管理工具Zotero
  6. JAVA中常用的逻辑运算符_Java中的常见运算符以及使用
  7. [python-thirdLib] Python中第三方的用于解析HTML的库:BeautifulSoup
  8. C语言课后习题(25)
  9. iOS 不通过改变url 与web JS 交互
  10. 苹果mac可视化数学分析软件:matlabr2021b
  11. 深大计算机专业进腾讯,国内中游985和深圳大学计算机专业怎么选?640报考深圳大学吃亏吗...
  12. java系统源代码_JAVA学生管理系统源代码
  13. 2022-2027年中国沙漠旅游行业市场全景评估及发展战略规划报告
  14. 4个很 丝滑 的 Veu 路由过渡动效
  15. Mysql 复制表结构
  16. 我的世界服务器反作弊不起作用,[优化][反作弊]NeverLag——优化性能、防作弊、修复MC漏洞、限制刷物品[1.6.4-1.8.7]...
  17. 【LeetCode】 374. 猜数字大小 骚气的猴子算法 打死都找不着系列 JAVA
  18. 用函数求出平均分、最高分和最低分
  19. mapping文件的编写
  20. Echat 地图样式格式

热门文章

  1. 怎么在html中加入文字,如何在指定的地方插入html内容和文本内容
  2. 禁用宏则关闭excel文件
  3. Unicode 标准新增5个行星符号
  4. 大数据存储引擎——Kudu
  5. ChatGPT或要推出APP,OpenAI官宣为ChatGPT招募移动端开发工程师
  6. 波士顿房价预测-code
  7. spawn sh ENOENT
  8. opencv 基础(6):基于OpenCV的轮廓检测
  9. 你知道农村的年轻人为什么穷吗
  10. 微信小程序自定义tabbar中间凸起