Prechádzať zdrojové kódy

feature: add getHotCourses, setCourseLike, cancelCourseLike service implement.

tubinyan 5 rokov pred
rodič
commit
374c762624

+ 12 - 0
sql/courselearning.sql

@@ -335,4 +335,16 @@ CREATE TABLE `coupon` (
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
 
+
+-- ----------------------------
+-- Table structure for `course_likes`
+-- ----------------------------
+
+DROP TABLE IF EXISTS `course_likes`;
+CREATE TABLE `course_likes` (
+  `course_id` int NOT NULL,
+  `user_id` int NOT NULL,
+  PRIMARY KEY (`course_id`, `user_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
 SET FOREIGN_KEY_CHECKS=1;

+ 29 - 0
src/main/java/cn/seecoder/courselearning/controller/CourseController.java

@@ -53,6 +53,15 @@ public class CourseController {
         return courseService.getCoursesByType(page, Constant.COURSE_PAGE_SIZE, uid, type);
     }
 
+    /**
+     * 分页获取热门课程列表
+     * @param page 页码数
+     */
+    @GetMapping("/hot/{page}")
+    public PageInfo<CourseVO> getHotCourses(@PathVariable Integer page) {
+        return courseService.getHotCourses(page, Constant.COURSE_PAGE_SIZE);
+    }
+
     /**
      * 获取用户已购买的课程列表
      * @param sid 学生id
@@ -79,4 +88,24 @@ public class CourseController {
     public ResultVO<CourseVO> createCourse(@RequestBody CourseVO course) {
         return courseService.createCourse(course);
     }
+
+    /**
+     * 用户点赞课程
+     * @param uid 用户id
+     * @param courseId 课程id
+     */
+    @PostMapping("/like/{courseId}")
+    public ResultVO<CourseVO> setCourseLike(@RequestParam Integer uid, @PathVariable Integer courseId) {
+        return courseService.setCourseLike(courseId, uid);
+    }
+
+    /**
+     * 用户取消点赞课程
+     * @param uid 用户id
+     * @param courseId 课程id
+     */
+    @PostMapping("/cancel_like/{courseId}")
+    public ResultVO<CourseVO> cancelCourseLike(@RequestParam Integer uid, @PathVariable Integer courseId) {
+        return courseService.cancelCourseLike(courseId, uid);
+    }
 }

+ 11 - 0
src/main/java/cn/seecoder/courselearning/mapperservice/CourseLikesMapper.java

@@ -0,0 +1,11 @@
+package cn.seecoder.courselearning.mapperservice;
+
+import org.apache.ibatis.annotations.Param;
+
+public interface CourseLikesMapper {
+    int deleteByPrimaryKey(@Param("courseId") Integer courseId, @Param("userId") Integer userId);
+
+    int insert(@Param("courseId") Integer courseId, @Param("userId") Integer userId);
+
+    int count(@Param("courseId") Integer courseId, @Param("userId") Integer userId);
+}

+ 3 - 0
src/main/java/cn/seecoder/courselearning/mapperservice/CourseMapper.java

@@ -21,4 +21,7 @@ public interface CourseMapper {
     List<Course> selectByTeacherId(Integer userId);
 
     List<Course> selectByStudentId(Integer userId);
+
+    // 根据点赞数 返回热门课程列表
+    List<Course> selectHotCourses();
 }

+ 7 - 0
src/main/java/cn/seecoder/courselearning/po/Course.java

@@ -28,6 +28,9 @@ public class Course {
 
     private String teacherName;
 
+    // 课程点赞数
+    private Integer likes;
+
     public Integer getId() {
         return id;
     }
@@ -112,6 +115,10 @@ public class Course {
         return teacherName;
     }
 
+    public Integer getLikes() {
+        return likes;
+    }
+
     public void setTeacherName(String teacherName) {
         this.teacherName = teacherName == null ? null : teacherName.trim();
     }

+ 6 - 0
src/main/java/cn/seecoder/courselearning/service/CourseService.java

@@ -12,6 +12,8 @@ public interface CourseService {
     PageInfo<CourseVO> getCourses(Integer currPage, Integer pageSize, Integer uid, String key);
     // 根据分类,分页查询课程
     PageInfo<CourseVO> getCoursesByType(Integer currPage, Integer pageSize, Integer uid, String type);
+    // 分页获取热门课程列表
+    PageInfo<CourseVO> getHotCourses(Integer currPage, Integer pageSize);
     // 查询用户所有已购买的课程
     List<CourseVO> getBoughtCourses(Integer uid);
     // 查询教师所有可管理的课程
@@ -20,4 +22,8 @@ public interface CourseService {
     CourseVO getCourse(Integer courseId, Integer uid);
     // 创建课程
     ResultVO<CourseVO> createCourse(CourseVO courseVO);
+    // 用户点赞课程
+    ResultVO<CourseVO> setCourseLike(Integer courseId, Integer userId);
+    // 用户取消课程点赞
+    ResultVO<CourseVO> cancelCourseLike(Integer courseId, Integer userId);
 }

+ 29 - 0
src/main/java/cn/seecoder/courselearning/serviceimpl/CourseServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.seecoder.courselearning.serviceimpl;
 
+import cn.seecoder.courselearning.mapperservice.CourseLikesMapper;
 import cn.seecoder.courselearning.mapperservice.CourseMapper;
 import cn.seecoder.courselearning.mapperservice.CourseOrderMapper;
 import cn.seecoder.courselearning.po.Course;
@@ -23,6 +24,8 @@ public class CourseServiceImpl implements CourseService {
     @Resource
     private CourseMapper courseMapper;
     @Resource
+    private CourseLikesMapper courseLikesMapper;
+    @Resource
     private CourseOrderMapper orderMapper;
 
     @Override
@@ -41,6 +44,14 @@ public class CourseServiceImpl implements CourseService {
         return getCourseVOPageInfo(uid, po);
     }
 
+    @Override
+    public PageInfo<CourseVO> getHotCourses(Integer currPage, Integer pageSize) {
+        if(currPage==null || currPage<1) currPage=1;
+        PageHelper.startPage(currPage, pageSize);
+        PageInfo<Course> po = new PageInfo<>(courseMapper.selectHotCourses());
+        return getCourseVOPageInfo(null, po);
+    }
+
     @Override
     public List<CourseVO> getBoughtCourses(Integer uid) {
         List<CourseVO> ret = new ArrayList<>();
@@ -89,6 +100,24 @@ public class CourseServiceImpl implements CourseService {
         return new ResultVO<>(Constant.REQUEST_FAIL, "服务器错误");
     }
 
+    @Override
+    public ResultVO<CourseVO> setCourseLike(Integer courseId, Integer userId) {
+        if (courseLikesMapper.count(courseId, userId) > 0) {
+            return new ResultVO<>(Constant.REQUEST_FAIL, "您已经为当前课程点赞过,请勿重复操作!");
+        }
+        courseLikesMapper.insert(courseId, userId);
+        return new ResultVO<>(Constant.REQUEST_SUCCESS, "操作成功", getCourse(courseId, userId));
+    }
+
+    @Override
+    public ResultVO<CourseVO> cancelCourseLike(Integer courseId, Integer userId) {
+        if (courseLikesMapper.count(courseId, userId) == 0) {
+            return new ResultVO<>(Constant.REQUEST_FAIL, "您已经为当前课程取消点赞了,请勿重复操作!");
+        }
+        courseLikesMapper.deleteByPrimaryKey(courseId, userId);
+        return new ResultVO<>(Constant.REQUEST_SUCCESS, "操作成功", getCourse(courseId, userId));
+    }
+
     private PageInfo<CourseVO> getCourseVOPageInfo(Integer uid, PageInfo<Course> po) {
         PageInfo<CourseVO> result = PageInfoUtil.convert(po, CourseVO.class);
         if(uid != null && uid > 0){

+ 5 - 0
src/main/java/cn/seecoder/courselearning/vo/CourseVO.java

@@ -30,6 +30,9 @@ public class CourseVO {
 
     private String teacherName;
 
+    // 课程点赞数
+    private Integer likes;
+
     // 标记当前用户(学生)是否已购买解锁
     private boolean bought;
 
@@ -51,6 +54,7 @@ public class CourseVO {
         cost = course.getCost();
         teacherId = course.getTeacherId();
         teacherName = course.getTeacherName();
+        likes = course.getLikes();
         bought = false;
         manageable = false;
     }
@@ -66,6 +70,7 @@ public class CourseVO {
         cost = course.getCost();
         teacherId = course.getTeacherId();
         teacherName = course.getTeacherName();
+        likes = course.getLikes();
         this.bought = bought;
         this.manageable = manageable;
     }

+ 21 - 0
src/main/resources/mapper/CourseLikesMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.seecoder.courselearning.mapperservice.CourseLikesMapper">
+  <delete id="deleteByPrimaryKey" parameterType="map">
+    delete from course_likes
+    where course_id = #{courseId,jdbcType=INTEGER}
+      and user_id = #{userId,jdbcType=INTEGER}
+  </delete>
+  <insert id="insert">
+    insert into course_likes (course_id, user_id)
+    values (#{courseId,jdbcType=INTEGER}, #{userId,jdbcType=INTEGER})
+  </insert>
+  <select id="count" resultType="java.lang.Integer">
+    select count(*) as num from course_likes
+    where course_id=#{courseId,jdbcType=INTEGER} and user_id=#{userId,jdbcType=INTEGER};
+  </select>
+  <select id="countLikesOfCourse" resultType="java.lang.Integer">
+    select count(*) as count from course_likes
+    where course_id=#{courseId,jdbcType=INTEGER};
+  </select>
+</mapper>

+ 22 - 12
src/main/resources/mapper/CourseMapper.xml

@@ -19,13 +19,13 @@
     where id = #{id,jdbcType=INTEGER}
   </delete>
   <insert id="insert" parameterType="cn.seecoder.courselearning.po.Course" useGeneratedKeys="true" keyProperty="id">
-    insert into course (id, name, type, 
-      intro, picture, school, 
-      create_time, delete_time, cost, 
+    insert into course (id, name, type,
+      intro, picture, school,
+      create_time, delete_time, cost,
       teacher_id, teacher_name)
-    values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR}, 
-      #{intro,jdbcType=VARCHAR}, #{picture,jdbcType=VARCHAR}, #{school,jdbcType=VARCHAR}, 
-      #{createTime,jdbcType=TIMESTAMP}, #{deleteTime,jdbcType=TIMESTAMP}, #{cost,jdbcType=INTEGER}, 
+    values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR},
+      #{intro,jdbcType=VARCHAR}, #{picture,jdbcType=VARCHAR}, #{school,jdbcType=VARCHAR},
+      #{createTime,jdbcType=TIMESTAMP}, #{deleteTime,jdbcType=TIMESTAMP}, #{cost,jdbcType=INTEGER},
       #{teacherId,jdbcType=INTEGER}, #{teacherName,jdbcType=VARCHAR})
   </insert>
   <update id="updateByPrimaryKey" parameterType="cn.seecoder.courselearning.po.Course">
@@ -43,14 +43,17 @@
     where id = #{id,jdbcType=INTEGER}
   </update>
   <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
-    select id, name, type, intro, picture, school, create_time, delete_time, cost, teacher_id, 
-    teacher_name
-    from course
-    where id = #{id,jdbcType=INTEGER}
+    select c.id, c.name, c.type, c.intro, c.picture, c.school, c.create_time, c.delete_time, c.cost, c.teacher_id, c.teacher_name, t.count as likes
+    from course c
+    inner join (select count(*) as count, course_id as id from course_likes group by course_id) as t
+    on c.id = t.id
+    where c.id = #{id,jdbcType=INTEGER}
   </select>
   <select id="selectAll" resultMap="BaseResultMap">
-    select id, name, type, intro, picture, school, create_time, delete_time, cost, teacher_id, teacher_name
-    from course
+    select c.id, c.name, c.type, c.intro, c.picture, c.school, c.create_time, c.delete_time, c.cost, c.teacher_id, c.teacher_name, t.count as likes
+    from course c
+    inner join (select count(*) as count, course_id as id from course_likes group by course_id) as t
+    on c.id = t.id
   </select>
   <select id="selectByType" parameterType="java.lang.String" resultMap="BaseResultMap">
     select id, name, type, intro, picture, school, create_time, delete_time, cost, teacher_id, teacher_name
@@ -85,4 +88,11 @@
         select o.id from course_order o where o.course_id = c.id and o.user_id = #{userId}
     )
   </select>
+  <select id="selectHotCourses" resultType="cn.seecoder.courselearning.po.Course">
+    select c.id, c.name, c.type, c.intro, c.picture, c.school, c.create_time, c.delete_time, c.cost, c.teacher_id, c.teacher_name, t.count as likes
+    from course c
+    inner join (select count(*) as count, course_id as id from course_likes group by course_id) as t
+    on c.id = t.id
+    order by likes desc
+  </select>
 </mapper>