讲师完善
分页查询讲师
新建front包
来到controller层
package com.atguigu.eduservice.controller.front;
import com.atguigu.commonutils.R;
import com.atguigu.eduservice.entity.EduTeacher;
import com.atguigu.eduservice.service.EduTeacherService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@Api(description="qianduan讲师管理") //swagger提示注解定义在类上:@Api
@RestController
@RequestMapping("/eduservice/teacherfront")
@CrossOrigin
public class TeacherFrontController {
@Autowired
private EduTeacherService eduTeacherService;
@ApiOperation(value = "分页查询讲师")
@PostMapping("pagequeryteacher/{page}/{limit}")
public R pagequeryteacher(@PathVariable long page,@PathVariable long limit){
//Page对象需要的是long类型的参数
Page<EduTeacher> pagePram = new Page<>(page,limit);
//需要key来去value,所以key是string类型,而value又不一定放哪种类型,所以直接上object,父类型引用自动转换子类型对象
Map<String,Object> map = eduTeacherService.pageSelectTeacher(pagePram);
return R.ok().data(map);
}
service层
//分页查询前端讲师
@Override
public Map<String, Object> pageSelectTeacher(Page<EduTeacher> pagePram) {
QueryWrapper wrapper = new QueryWrapper();
wrapper.orderByDesc("gmt_modified");
//现在pagePram有所有讲师的数据
baseMapper.selectPage(pagePram,wrapper);
//获取当前页所有讲师
List<EduTeacher> records = pagePram.getRecords();
//获取总记录数
long total = pagePram.getTotal();
//获取总共多少页
long pages = pagePram.getPages();
//获取当前页有多少条数据
long size = pagePram.getSize();
//获取当前页码
long current = pagePram.getCurrent();
//获取下一页
boolean hasNext = pagePram.hasNext();
//获取上一页
boolean hasPrevious = pagePram.hasPrevious();
//将上面的数据全部封装到map集合并返回
HashMap<String,Object> hashMap = new HashMap<>();
hashMap.put("items",records);
hashMap.put("total",total);
hashMap.put("pages",pages);
hashMap.put("size",size);
hashMap.put("current",current);
hashMap.put("hasNext",hasNext);
hashMap.put("hasPrevious",hasPrevious);
return hashMap;
}
查询讲师详情
controller层
@ApiOperation(value = "根据讲师ID查询讲师信息和相关课程")
@GetMapping("queryTeacherById/{teacherId}")
public R queryTeacherById(@PathVariable String teacherId){
//根据id查询讲师信息和相关课程
EduTeacher eduTeacher = eduTeacherService.getById(teacherId);
QueryWrapper<EduCourse> wrapper = new QueryWrapper<>();
wrapper.eq("teacher_id",teacherId);
List<EduCourse> courseList = eduCourseService.list(wrapper);
return R.ok().data("teacher",eduTeacher).data("courseList",courseList);
}
查询课程分类和信息带分页
controller层
package com.atguigu.eduservice.controller.front;
import com.atguigu.commonutils.R;
import com.atguigu.eduservice.entity.EduCourse;
import com.atguigu.eduservice.entity.frontvo.CourseQueryVO;
import com.atguigu.eduservice.entity.subject.OneSubject;
import com.atguigu.eduservice.service.EduCourseService;
import com.atguigu.eduservice.service.EduSubjectService;
import com.atguigu.eduservice.service.EduTeacherService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@Api(description="前台讲师管理") //swagger提示注解定义在类上:@Api
@RestController
@RequestMapping("/eduservice/coursefront")
@CrossOrigin
public class CourseFrontController {
@Autowired
private EduTeacherService eduTeacherService;
@Autowired
private EduCourseService eduCourseService;
@Autowired
private EduSubjectService eduSubjectService;
//查询课程信息,课程分类,课程价格,热度,最新时间
@ApiOperation(value = "分页查询课程信息")
@PostMapping("pageCourseBySubject/{page}/{limit}")
public R pageCourseBySubject(@PathVariable long page,@PathVariable long limit,
@RequestBody(required = false) CourseQueryVO courseQueryVO
//@RequestBody(required = false)表示前端传递数据时可以没有json对象
){
//查询所有一级分类和二级分类
List<OneSubject> oneSubjectList = eduSubjectService.selectSubject();
Page<EduCourse> pagePram = new Page<>(page,limit);
//List<EduCourse> pageCourseBySubject = eduCourseService.selectCoursePageByOneSubjectIdOrTwoSubjectId(courseQueryVO,pagePram);
Map<String,Object> pageCourseBySubject = eduCourseService.selectCoursePageByOneSubjectIdOrTwoSubjectId(courseQueryVO,pagePram);
return R.ok().data("oneSubjectList",oneSubjectList).data("pageCourseBySubject",pageCourseBySubject);
}
service层
//查询前台课程的数据
@Override
public Map<String,Object> selectCoursePageByOneSubjectIdOrTwoSubjectId(CourseQueryVO courseQueryVO, Page pagePram) {
QueryWrapper<EduCourse> wrapper = new QueryWrapper();
//如果二级分类的id被选中就不再根据一级分类查询
if(!StringUtils.isEmpty(courseQueryVO.getSubjectId())) {
wrapper.eq("subject_id",courseQueryVO.getSubjectId());
}else if(!StringUtils.isEmpty(courseQueryVO.getSubjectParentId())){
wrapper.eq("subject_parent_id", courseQueryVO.getSubjectParentId());
}
//按照热度、价格、最新时间查询课程信息,先查询再分页
FrontCourseSortUtils.frontCourseSort(wrapper, courseQueryVO);
baseMapper.selectPage(pagePram, wrapper);
//获取当前页所有讲师
List<EduTeacher> records = pagePram.getRecords();
//获取总记录数
long total = pagePram.getTotal();
//获取总共多少页
long pages = pagePram.getPages();
//获取当前页有多少条数据
long size = pagePram.getSize();
//获取当前页码
long current = pagePram.getCurrent();
//获取下一页
boolean hasNext = pagePram.hasNext();
//获取上一页
boolean hasPrevious = pagePram.hasPrevious();
//将上面的数据全部封装到map集合并返回
HashMap<String,Object> hashMap = new HashMap<>();
hashMap.put("items",records);
hashMap.put("total",total);
hashMap.put("pages",pages);
hashMap.put("size",size);
hashMap.put("current",current);
hashMap.put("hasNext",hasNext);
hashMap.put("hasPrevious",hasPrevious);
// //如果前端传过来page和limit的数据表示需要进行分页
// if(courseQueryVO.getPage() != 0 && courseQueryVO.getLimit() != 0){
// Page<EduCourse> eduCoursePage = new Page<>(courseQueryVO.getPage(),courseQueryVO.getLimit());
// baseMapper.selectPage(eduCoursePage, wrapper);
// //获取数据list集合
// List<EduCourse> records = eduCoursePage.getRecords();
// //获取总记录数
// //long total = eduCoursePage.getTotal();
// return records;
// }
//
// List<EduCourse> list = baseMapper.selectList(wrapper);
// hashMap.put("allCourseList",list);
return hashMap;
}
多表联查:根据课程ID查询课程详情
返回前端数据的vo类
package com.atguigu.eduservice.entity.frontvo;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 根据id查询课程详细信息的实体类对象
* 用于封装查询到的数据到这个实体类返回给前端
*/
public class CourseWebVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "课程id")
private String id;
@ApiModelProperty(value = "课程标题")
private String title;
@ApiModelProperty(value = "课程销售价格,设置为0则可免费观看")
private BigDecimal price;
@ApiModelProperty(value = "总课时")
private Integer lessonNum;
@ApiModelProperty(value = "课程封面图片路径")
private String cover;
@ApiModelProperty(value = "销售数量")
private Long buyCount;
@ApiModelProperty(value = "浏览数量")
private Long viewCount;
@ApiModelProperty(value = "课程简介")
private String description;
@ApiModelProperty(value = "讲师ID")
private String teacherId;
@ApiModelProperty(value = "讲师姓名")
private String teacherName;
@ApiModelProperty(value = "讲师资历,一句话说明讲师")
private String intro;
@ApiModelProperty(value = "讲师头像")
private String avatar;
@ApiModelProperty(value = "课程类别一级分类ID")
private String subjectLevelOneId;
@ApiModelProperty(value = "类别一级分类名称")
private String subjectLevelOne;
@ApiModelProperty(value = "课程类别二级分类ID")
private String subjectLevelTwoId;
@ApiModelProperty(value = "类别二级分类名称")
private String subjectLevelTwo;
}
controller层
//根据课程id查询课程详情信息
@GetMapping("queryCourseById/{id}")
public R queryCourseById(@PathVariable String id){
//根据id查询课程详细信息
CourseWebVo courseWebVo = eduCourseService.selectCourseById(id);
//根据id查询课程章节信息
List<ChapterVo> courseChapter = eduChapterService.getCourseChapter(id);
return R.ok().data("courseWebVo",courseWebVo).data("courseChapter",courseChapter);
}
service层
@Override
public CourseWebVo selectCourseById(String id) {
return baseMapper.selectCourseById(id);
}
mapper层
@Mapper
public interface EduCourseMapper extends BaseMapper<EduCourse> {
//根据课程id查询课程发布信息
CoursePublishVo getPublishCourseInfo(String courseId);
//根据课程id查询课程详情信息
CourseWebVo selectCourseById(String id);
}
xml多表联查
<!-- CourseWebVo selectCourseById(String id);根据课程id查询课程详情信息-->
<select id="selectCourseById" parameterType="string" resultType="com.atguigu.eduservice.entity.frontvo.CourseWebVo">
SELECT ec.id,ec.`title`,ec.`price`,ec.`lesson_num` AS lessonNum,ec.cover,ec.`buy_count` AS buyCount,ec.`view_count` AS viewCount,
ecd.`description`,
et.id AS teacherId, et.name AS teacherName,et.intro,et.avatar,
es1.id AS subjectLevelOneId,es1.`title` AS subjectLevelOne,
es2.id AS subjectLevelTwoId,es2.`title` AS subjectLevelTwo
FROM `edu_course` ec LEFT OUTER JOIN `edu_course_description` ecd ON ec.id = ecd.id
LEFT OUTER JOIN `edu_teacher` et ON ec.`teacher_id` = et.id
LEFT OUTER JOIN `edu_subject` es1 ON ec.`subject_parent_id` = es1.id
LEFT OUTER JOIN `edu_subject` es2 ON ec.`subject_id` = es2.id
WHERE ec.id = #{id}
</select>
序列化异常,返回前端的实体类封装数据如果不做可序列化处理,就会报这个异常,当然90%是我忘了加@Date注解,然后找不到属性进行数据的注入。
配置项目到本地运行,可以通过本地ip访问。
获取阿里云视频凭证
//获取阿里云视频凭证
@ApiOperation(value = "根据视频id获取阿里云视频凭证")
@GetMapping("getAlyVideoVoucher/{id}")
public R getAlyVideoVoucher(@PathVariable String id){
//获取阿里云客户端连接
DefaultAcsClient client = InitObject.initVodClient(VideoUtil.KEY_ID, VideoUtil.KEY_SECRET);
//创建获取视频凭证的请求对象
GetVideoPlayAuthRequest getVideoPlayAuthRequest = new GetVideoPlayAuthRequest();
//注入请求的视频id
getVideoPlayAuthRequest.setVideoId(id);
//通过客户端连接获取响应对象 获取视频地址
try {
GetVideoPlayAuthResponse acsResponse = client.getAcsResponse(getVideoPlayAuthRequest);
String playAuth = acsResponse.getPlayAuth();
//把视频地址扔给前端
return R.ok().data("playAuth",playAuth);
} catch (ClientException e) {
e.printStackTrace();
throw new GuliException(20001,"获取视频地址失败");
}
}