7-8


添加课程分类的前端实现

一、添加课程分类路由

// 在router/index.js下添加代码

二、创建课程分类页面和添加课程页面(list.vue和save.vue),修改路由对应的页面路径

三、在save页面添加上传组件

课程分类的列表显示功能(树形)

需要做的事情:创建接口,把分类按照要求的格式返回数据即可

一、针对返回数据创建对应的实体类,创建两个实体类:一级分类和二级分类

// 一级分类
@Data
public class OneSubject {
    private String id;
    private String title;
}

// 二级分类
@Data
public class TwoSubject {
    private String id;
    private String title;
}

二、在两个实体类之间表示关系(一个一级分类中有多个二级分类)

// 一个一级分类中有多个二级分类
private List<TwoSubject> children = new ArrayList<>();

三、编写具体封装的代码

1、service层

// 接口
// 课程分类列表显示
List<OneSubject> getAllOneTwoSubject();

// 实现类
// 课程分类列表显示
@Override
public List<OneSubject> getAllOneTwoSubject() {
    // 有数据才能封装
    // 1.查询处所有的一级分类  parent_id = 0
    QueryWrapper<EduSubject> wrapper1 = new QueryWrapper<>();
    wrapper1.eq("parent_id","0");
    // 注:mybatis-plus已经帮我们在service层中注入了mapper
    List<EduSubject> oneSubjectList = baseMapper.selectList(wrapper1);
    // 2.查询处所有的二级分类  parent_id != 0
    QueryWrapper<EduSubject> wrapper2 = new QueryWrapper<>();
    wrapper2.ne("parent_id","0");
    List<EduSubject> twoSubjectList = baseMapper.selectList(wrapper2);

    // 创建list结合,用于存储最终封装的数据
    List<OneSubject> finalSubjectList = new ArrayList<>();
    // 3.封装一级分类
    // 遍历查询出的一级分类,封装到finalSubjectList中(因为前端页面要的是finalSubjectList格式)
    for (int i = 0; i < oneSubjectList.size(); i++) {
        // 得到oneSubjectList中的元素
        EduSubject eduSubject = oneSubjectList.get(i);
        // 把eduSubject放入OneSubject
        OneSubject oneSubject = new OneSubject();
        BeanUtils.copyProperties(eduSubject,oneSubject);
        // 把OneSubject放入finalSubjectList
        finalSubjectList.add(oneSubject);

        // 在一级分类的for循环中封装二级分类
        // 4.封装二级分类
        // 创建list集合用于封装二级分类
        List<TwoSubject> finalSubjectList2 = new ArrayList<>();
        for (int j = 0; j < twoSubjectList.size(); j++) {
            EduSubject eduSubject2 = twoSubjectList.get(j);
            // 判断二级分类属于哪个一级分类(二级分类的parent_id == 一级分类的id)
            if (eduSubject2.getParentId().equals(eduSubject.getId())){
                TwoSubject twoSubject = new TwoSubject();
                BeanUtils.copyProperties(eduSubject2,twoSubject);
                finalSubjectList2.add(twoSubject);
            }
        }
        // 把一级下面的所有二级分类放回到一级分类中
        oneSubject.setChildren(finalSubjectList2);
    }
    return finalSubjectList;
}

2、controller层

@GetMapping("/getAllSubject")
public R getAllSubject(){
    // 获取所有一级和二级分类
    // 泛型写一级分类是因为:一级分类中包含二级分类
    List<OneSubject>list = subjectService.getAllOneTwoSubject();
    return R.ok().data("list",list);
}

四、前端

课程管理模块

## 建立四张数据库表
edu_course 				## 课程表:存储课程的基本信息
edu_course_description	 ## 课程简介表:存储课程的简介信息
edu_chapter				## 课程章节表:存储课程的章节信息
edu_video				## 课程小节表:存储章节里面的小节信息

具体的sql语句见:谷粒学院sql

1、使用代码生成器生成相关代码

strategy.setInclude("edu_course","edu_course_description","edu_chapter","edu_video");

删除EduCourseDescriptionController

2、相关细节

  1. 创建vo实体类用于表单数据封装(因为数据不全:EduCourse中没有简介)

    @Data
    public class CourseInfoVo {
        @ApiModelProperty(value = "课程ID")
        @TableId(value = "id",type = IdType.ID_WORKER_STR)
        private String id;
    
        @ApiModelProperty(value = "课程讲师ID")
        private String teacherId;
    
        @ApiModelProperty(value = "课程专业ID")
        private String subjectId;
    
        @ApiModelProperty(value = "课程标题")
        private String title;
    
        @ApiModelProperty(value = "课程销售价格,设置为0则可免费观看")
        // 0.01
        private BigDecimal price;
    
        @ApiModelProperty(value = "总课时")
        private Integer lessonNum;
    
        @ApiModelProperty(value = "课程封面图片路径")
        private String cover;
    
        @ApiModelProperty(value = "课程简介")
        private String description;
    }
  2. 把表单提交过来的数据提交到数据库中

    • 向两张表中添加数据:课程表和课程描述表

      // controller层
      @RestController
      @RequestMapping("/eduservice/course")
      @CrossOrigin
      public class EduCourseController {
          @Autowired
          private EduCourseService eduCourseService;
      
          /**
           * 添加课程基本信息的方法
           * @param courseInfoVo 课程的基本信息
           * @return
           */
          @PostMapping("/addCourseInfo")
          public R addCourseInfo(@RequestBody CourseInfoVo courseInfoVo){
              eduCourseService.saveCourseInfo(courseInfoVo);
              return R.ok();
          }
      }
      
      // service接口
      public interface EduCourseService extends IService<EduCourse> {
          void saveCourseInfo(CourseInfoVo courseInfoVo);
      }
      
      // service实现类
      @Service
      public class EduCourseServiceImpl extends ServiceImpl<EduCourseMapper, EduCourse> implements EduCourseService {
          // 课程描述的注入
          @Autowired
          private EduCourseDescriptionService eduCourseDescriptionService;
      
          // 添加课程基本信息的方法
          @Override
          public void saveCourseInfo(CourseInfoVo courseInfoVo) {
              // 1.向课程表中添加课程的基本信息
              // 把CourseInfoVo转换为EduCourse
              EduCourse eduCourse = new EduCourse();
              BeanUtils.copyProperties(courseInfoVo,eduCourse);
              int result = baseMapper.insert(eduCourse);
              if (result == 0)
                  throw new GuliException(20001,"添加课程信息失败");
      
              // 2.向课程简介表中添加课程的简介
              EduCourseDescription courseDescription = new EduCourseDescription();
              BeanUtils.copyProperties(courseInfoVo,courseDescription);
              eduCourseDescriptionService.save(courseDescription);
          }
      }
    • 问题:课程和描述是一对一关系,添加之后,id值应该相同,但现在不同

      // 获取添加之后的课程id
      String cid = eduCourse.getId();
      // 设置描述id就是课程id
      courseDescription.setId(cid);
          
      @ApiModelProperty(value = "课程ID")
      // 改自动生成策略:手动设置(EduCourseDescription中)
      @TableId(value = "id", type = IdType.INPUT)
      rivate String id;

3、课程管理模块前端

添加课程管理路由(router/index.js → info.vue → chapter.vue → api/edu/course.js)

4、完善controller、service(加返回值)

5、把讲师和分类使用下拉列表显示(课程分类做成二级联动效果)

添加课程基本信息功能


文章作者: Prannt
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Prannt !
评论
  目录