wanghongkai %!s(int64=5) %!d(string=hai) anos
pai
achega
1ebc848902

+ 34 - 0
Iteration2.md

@@ -0,0 +1,34 @@
+## 迭代二说明
+### 课程点赞
+现需要增加点赞功能,用户可以给课程点赞,也可以取消点赞,每个用户对每个课程只能点赞一次。  
+你需要从上到下实现点赞和取消点赞的逻辑,从Controller层到底层的数据层。  
+1. CourseController中的setCourseLike和cancelCourseLike分别为用户点赞课程和用户取消点赞课程。
+2. Service层的接口需要你自己去定义,相关的实现也需要自己去实现,可以参考Controller用户传入的数据是什么来思考该怎样定义这两个接口。
+3. 数据层新增了course_likes表,具体的结构可以参考sql文件中的定义,其中为了实现用户点赞和取消点赞的效果,数据层的相关方法需要你去实现,其中,接口的定义写在了CourseLikesMapper,而相关的sql实现在CourseLikesMapper.xml中是错误的,需要你更改并替换为正确的sql语句。
+
+### 优惠券策略
+现需要你实现优惠券的按用户点赞某课程来分发优惠券的策略,你可以考虑如下场景:
+1. 用户点赞了A课程,且A课程和B课程有一定关系,如(同个老师,同个学校),且B课程用户没买过,那么是不是有一定理由相信用户可能去购买并学习B课程呢?那么我们就可以将优惠券发放给该用户。
+
+你需要实现的方法在CourseLikeDeliverStrategy,它实现了CouponDeliverStrategy接口,用来判断是否能把优惠券发放给该用户,其中extra为发放的依据。
+如:需要实现用户只要点赞了某个课程A,那就发放优惠券给课程B,那么实现中显然需要课程A的id和课程B的id,那么这里就由extra传入相关的数据。
+
+Tips:
+- 数据的格式可以由你自定义,如key为likeCourseId和deliverCourseId分别表示用户点赞的课程和分发的课程。
+- 你甚至可以不需要deliverCourseId,比如考虑另一种场景,只要用户点赞了A课程,那么只要优惠券适用的课程范围中包含和A课程同学校或同老师的其他课程,则发放。而具体需要什么,由你的业务需求去定义。
+- 优惠券相关的代码说明:
+    - Coupon为优惠券实体类,相关字段的解释见代码注释。
+    - CouponType为优惠券类型,包括满减、折扣,你可以在这里定义你的优惠券类型,并给出该类型的优惠券的使用策略CouponStrategy,并与你的优惠券类型绑定。
+    - CouponScope为优惠券的使用范围,你也可以在这里定义优惠券的适用范围,并给出怎么判断某个课程能否使用优惠券的判断。
+    - 如果你感兴趣优惠券的相关API的实现,参考CouponController,CouponService,同时,在CourseOrderService中也涉及到了Coupon的相关操作,如订单支付后需要消耗掉用户的优惠券、优惠券的使用顺序决定了订单的价格,那么系统应该给出最优价格,那么如何搜索该最优的价格,也在该类下实现了。
+
+### 循环依赖
+在实现代码的过程中,某学生发现代码中存在循环依赖的情况,即CourseOrderService依赖了CourseService和CouponService,且
+CourseService和CouponService也依赖了CourseOrderService,该学生为了消除依赖,将CourseService和CouponService用到的方法抽离到了QueryOrderService接口,
+使得CourseService和CouponService并不直接依赖CourseOrderService,而是依赖QueryOrderService来消除循环依赖,但是相关的实现代码他没有完成,请你帮他完成这些代码。
+
+### 项目结构
+代码中的某些类对应的包似乎有些不正确,请你将这些类归类到对应的包。
+
+Tips
+- 你可以参考service中是如何归类这些类的,显然,一个包下只有相关功能的类不是吗?

+ 1 - 1
src/main/java/cn/seecoder/courselearning/controller/coupon/CouponController.java → src/main/java/cn/seecoder/courselearning/controller/CouponController.java

@@ -1,4 +1,4 @@
-package cn.seecoder.courselearning.controller.coupon;
+package cn.seecoder.courselearning.controller;
 
 import cn.seecoder.courselearning.dto.coupon.CouponDTO;
 import cn.seecoder.courselearning.dto.coupon.DeliverCouponDTO;

+ 1 - 1
src/main/java/cn/seecoder/courselearning/controller/order/CourseOrderController.java → src/main/java/cn/seecoder/courselearning/controller/CourseOrderController.java

@@ -1,4 +1,4 @@
-package cn.seecoder.courselearning.controller.order;
+package cn.seecoder.courselearning.controller;
 
 import cn.seecoder.courselearning.service.order.CourseOrderService;
 import cn.seecoder.courselearning.vo.order.CourseOrderVO;

+ 1 - 1
src/main/java/cn/seecoder/courselearning/controller/course/CourseWareController.java → src/main/java/cn/seecoder/courselearning/controller/CourseWareController.java

@@ -1,4 +1,4 @@
-package cn.seecoder.courselearning.controller.course;
+package cn.seecoder.courselearning.controller;
 
 import cn.seecoder.courselearning.service.course.CourseWareService;
 import cn.seecoder.courselearning.vo.course.CourseWareVO;

+ 1 - 1
src/main/java/cn/seecoder/courselearning/controller/file/FileController.java → src/main/java/cn/seecoder/courselearning/controller/FileController.java

@@ -1,4 +1,4 @@
-package cn.seecoder.courselearning.controller.file;
+package cn.seecoder.courselearning.controller;
 
 import cn.seecoder.courselearning.service.file.FileService;
 import cn.seecoder.courselearning.vo.file.FileInfoVO;

+ 1 - 1
src/main/java/cn/seecoder/courselearning/controller/order/RechargeController.java → src/main/java/cn/seecoder/courselearning/controller/RechargeController.java

@@ -1,4 +1,4 @@
-package cn.seecoder.courselearning.controller.order;
+package cn.seecoder.courselearning.controller;
 
 import cn.seecoder.courselearning.service.order.RechargeService;
 import cn.seecoder.courselearning.vo.order.RechargeOrderVO;

+ 3 - 3
src/main/java/cn/seecoder/courselearning/controller/course/CourseController.java → src/main/java/cn/seecoder/courselearning/controller/coupon/CourseController.java

@@ -1,4 +1,4 @@
-package cn.seecoder.courselearning.controller.course;
+package cn.seecoder.courselearning.controller.coupon;
 
 import cn.seecoder.courselearning.service.course.CourseService;
 import cn.seecoder.courselearning.util.Constant;
@@ -96,7 +96,7 @@ public class CourseController {
      */
     @PostMapping("/like/{courseId}")
     public ResultVO<CourseVO> setCourseLike(@RequestParam Integer uid, @PathVariable Integer courseId) {
-        return courseService.setCourseLike(courseId, uid);
+        return null;
     }
 
     /**
@@ -106,6 +106,6 @@ public class CourseController {
      */
     @PostMapping("/cancel_like/{courseId}")
     public ResultVO<CourseVO> cancelCourseLike(@RequestParam Integer uid, @PathVariable Integer courseId) {
-        return courseService.cancelCourseLike(courseId, uid);
+        return null;
     }
 }

+ 1 - 1
src/main/java/cn/seecoder/courselearning/controller/user/UserController.java → src/main/java/cn/seecoder/courselearning/controller/course/UserController.java

@@ -1,4 +1,4 @@
-package cn.seecoder.courselearning.controller.user;
+package cn.seecoder.courselearning.controller.course;
 
 import cn.seecoder.courselearning.service.user.UserService;
 import cn.seecoder.courselearning.vo.ResultVO;

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

@@ -23,10 +23,6 @@ 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);
 
     Course getByPrimaryKey(Integer courseId);
 }

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

@@ -106,23 +106,6 @@ 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));
-    }
 
     @Override
     public Course getByPrimaryKey(Integer courseId) {

+ 2 - 6
src/main/java/cn/seecoder/courselearning/serviceimpl/order/QueryOrderServiceImpl.java

@@ -1,24 +1,20 @@
 package cn.seecoder.courselearning.serviceimpl.order;
 
-import cn.seecoder.courselearning.mapperservice.order.CourseOrderMapper;
 import cn.seecoder.courselearning.po.order.CourseOrder;
 import cn.seecoder.courselearning.service.order.QueryOrderService;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.Resource;
 
 @Service
 public class QueryOrderServiceImpl implements QueryOrderService {
-    @Resource
-    CourseOrderMapper orderMapper;
 
     @Override
     public CourseOrder queryMostRecentOrder(Integer uid, Integer courseId) {
-        return orderMapper.queryMostRecentOrder(uid, courseId);
+        return null;
     }
 
     @Override
     public CourseOrder getByPrimaryKey(Integer orderId) {
-        return orderMapper.selectByPrimaryKey(orderId);
+        return null;
     }
 }

+ 4 - 5
src/main/resources/mapper/CourseLikesMapper.xml

@@ -2,13 +2,12 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.seecoder.courselearning.mapperservice.course.CourseLikesMapper">
   <delete id="deleteByPrimaryKey" parameterType="map">
-    delete from course_likes
-    where course_id = #{courseId,jdbcType=INTEGER}
-      and user_id = #{userId,jdbcType=INTEGER}
+    select count(*) as num 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})
+    select count(*) as num from course_likes
+    where course_id=#{courseId,jdbcType=INTEGER} and user_id=#{userId,jdbcType=INTEGER};
   </insert>
   <select id="count" resultType="java.lang.Integer">
     select count(*) as num from course_likes