Explorar o código

feat: 增加删除回复功能

ChenSiTong %!s(int64=6) %!d(string=hai) anos
pai
achega
52313e1d72

+ 0 - 12
src/main/java/nju/seec/helper/controller/CommentController.java

@@ -6,7 +6,6 @@ import nju.seec.helper.controller.response.PageResourceResponse;
 import nju.seec.helper.controller.response.ResourceResponse;
 import nju.seec.helper.dto.CommentDTO;
 import nju.seec.helper.dto.LoginUser;
-import nju.seec.helper.dto.ReplyDTO;
 import nju.seec.helper.service.CommentService;
 import nju.seec.helper.util.enums.UserType;
 import nju.seec.helper.vo.CommentVO;
@@ -42,17 +41,6 @@ public class CommentController {
         return ResourceResponse.of(commentVO);
     }
 
-    /**
-     * 教师回复评论
-     */
-    @Auth(roles = UserType.TEACHER, message = "回复评论")
-    @PostMapping("/reply")
-    public EmptyResponse replyComment(LoginUser user,
-                                      @Valid @RequestBody ReplyDTO replyDTO) {
-        commentService.replyComment(user, replyDTO);
-        return EmptyResponse.getInstance();
-    }
-
     /**
      * 删除评论
      */

+ 45 - 0
src/main/java/nju/seec/helper/controller/ReplyController.java

@@ -0,0 +1,45 @@
+package nju.seec.helper.controller;
+
+import nju.seec.helper.aspect.auth.Auth;
+import nju.seec.helper.controller.response.EmptyResponse;
+import nju.seec.helper.dto.LoginUser;
+import nju.seec.helper.dto.ReplyDTO;
+import nju.seec.helper.service.ReplyService;
+import nju.seec.helper.util.enums.UserType;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * @author cst
+ */
+@RestController("/api/reply")
+public class ReplyController {
+    private final ReplyService replyService;
+
+    public ReplyController(ReplyService replyService) {
+        this.replyService = replyService;
+    }
+
+    /**
+     * 教师回复
+     */
+    @Auth(roles = UserType.TEACHER, message = "回复")
+    @PostMapping
+    public EmptyResponse createReply(LoginUser user,
+                                     @Valid @RequestBody ReplyDTO replyDTO) {
+        replyService.createReply(user, replyDTO);
+        return EmptyResponse.getInstance();
+    }
+
+    /**
+     * 教师删除回复
+     */
+    @Auth(roles = UserType.TEACHER, message = "删除回复")
+    @DeleteMapping("/{replyId}")
+    public EmptyResponse removeReply(LoginUser user,
+                                     @PathVariable Integer replyId) {
+        replyService.removeReply(user, replyId);
+        return EmptyResponse.getInstance();
+    }
+}

+ 9 - 8
src/main/java/nju/seec/helper/controller/UserController.java

@@ -46,10 +46,11 @@ public class UserController {
     public ResourceResponse<UserVO> emailLogin(@Valid @RequestBody LoginDTO loginDTO,
                                                HttpSession session) {
         UserVO userVO = userService.getUserByEmailAndPassword(loginDTO.getUsername(), loginDTO.getPassword());
-        LoginUser user = new LoginUser();
-        user.setId(userVO.getId());
-        user.setName(userVO.getName());
-        user.setType(userVO.getType());
+
+        LoginUser user = new LoginUser()
+                .setId(userVO.getId())
+                .setName(userVO.getName())
+                .setType(userVO.getType());
 
         session.setAttribute(Consts.SESSION_USER_NAME, user);
         // 20分钟有效期
@@ -76,10 +77,10 @@ public class UserController {
                                                @Valid @RequestBody ModifyUserDTO modifyUserDTO,
                                                HttpSession session) {
         UserVO userVO = userService.modifyUser(user, modifyUserDTO);
-        user = (LoginUser) session.getAttribute(Consts.SESSION_USER_NAME);
-        user.setId(userVO.getId());
-        user.setName(userVO.getName());
-        user.setType(userVO.getType());
+        user = ((LoginUser) session.getAttribute(Consts.SESSION_USER_NAME))
+                .setId(userVO.getId())
+                .setName(userVO.getName())
+                .setType(userVO.getType());
         session.setAttribute(Consts.SESSION_USER_NAME, user);
         return ResourceResponse.of(userVO);
     }

+ 23 - 0
src/main/java/nju/seec/helper/dao/ReplyDAO.java

@@ -0,0 +1,23 @@
+package nju.seec.helper.dao;
+
+import nju.seec.helper.entity.Reply;
+import nju.seec.helper.util.exception.HelperException;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author cst
+ */
+@Repository
+public interface ReplyDAO extends JpaRepository<Reply, Integer> {
+    /**
+     * 封装findById
+     *
+     * @param id
+     * @return
+     */
+    default Reply findReplyById(Integer id) {
+        return this.findById(id)
+                .orElseThrow(() -> HelperException.of(HelperException.ExceptionType.NOT_FOUND, "找不到回复"));
+    }
+}

+ 2 - 0
src/main/java/nju/seec/helper/dto/LoginUser.java

@@ -1,12 +1,14 @@
 package nju.seec.helper.dto;
 
 import lombok.Data;
+import lombok.experimental.Accessors;
 import nju.seec.helper.util.enums.UserType;
 
 /**
  * @author cst
  */
 @Data
+@Accessors(chain = true)
 public class LoginUser {
     private Integer id;
     private String name;

+ 11 - 2
src/main/java/nju/seec/helper/entity/Comment.java

@@ -3,8 +3,12 @@ package nju.seec.helper.entity;
 import lombok.Data;
 import lombok.experimental.Accessors;
 import nju.seec.helper.util.enums.UserType;
+import org.hibernate.annotations.CreationTimestamp;
 
 import javax.persistence.*;
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
 
 /**
  * @author cst
@@ -40,6 +44,11 @@ public class Comment {
     @Column(name = "user_type", nullable = false)
     private UserType userType;
 
-    @OneToOne(mappedBy = "comment", cascade = CascadeType.ALL)
-    private Reply reply;
+    @Column(name = "create_at", updatable = false)
+    @CreationTimestamp
+    private LocalDateTime createAt;
+
+    @OneToMany(mappedBy = "comment", cascade = CascadeType.ALL)
+    @OrderBy("createAt asc")
+    private List<Reply> replies = Collections.emptyList();
 }

+ 2 - 2
src/main/java/nju/seec/helper/entity/Reply.java

@@ -19,8 +19,8 @@ public class Reply {
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Integer id;
 
-    @OneToOne
-    @JoinColumn(name = "comment_id")
+    @ManyToOne
+    @JoinColumn(name = "comment_id", nullable = false)
     private Comment comment;
 
     @Column(name = "teacher_id", nullable = false)

+ 6 - 0
src/main/java/nju/seec/helper/entity/User.java

@@ -3,8 +3,10 @@ package nju.seec.helper.entity;
 import lombok.Data;
 import lombok.experimental.Accessors;
 import nju.seec.helper.util.enums.UserType;
+import org.hibernate.annotations.CreationTimestamp;
 
 import javax.persistence.*;
+import java.time.LocalDateTime;
 
 /**
  * @author cst
@@ -33,4 +35,8 @@ public class User {
 
     @Column(nullable = false)
     private String password;
+
+    @Column(name = "create_at", updatable = false)
+    @CreationTimestamp
+    private LocalDateTime createAt;
 }

+ 0 - 8
src/main/java/nju/seec/helper/service/CommentService.java

@@ -46,12 +46,4 @@ public interface CommentService {
      * @return
      */
     List<CommentVO> getCommentsBySlideIdAndPageNumber(Integer slideId, Integer pageNumber, Pageable pageable);
-
-    /**
-     * 回复评论
-     *
-     * @param user
-     * @param replyDTO
-     */
-    void replyComment(LoginUser user, ReplyDTO replyDTO);
 }

+ 25 - 0
src/main/java/nju/seec/helper/service/ReplyService.java

@@ -0,0 +1,25 @@
+package nju.seec.helper.service;
+
+import nju.seec.helper.dto.LoginUser;
+import nju.seec.helper.dto.ReplyDTO;
+
+/**
+ * @author cst
+ */
+public interface ReplyService {
+    /**
+     * 创建回复
+     *
+     * @param user
+     * @param replyDTO
+     */
+    void createReply(LoginUser user, ReplyDTO replyDTO);
+
+    /**
+     * 删除回复
+     *
+     * @param user
+     * @param replyId
+     */
+    void removeReply(LoginUser user, Integer replyId);
+}

+ 2 - 20
src/main/java/nju/seec/helper/service/impl/CommentServiceImpl.java

@@ -4,9 +4,7 @@ import nju.seec.helper.dao.CommentDAO;
 import nju.seec.helper.dao.SlideDAO;
 import nju.seec.helper.dto.CommentDTO;
 import nju.seec.helper.dto.LoginUser;
-import nju.seec.helper.dto.ReplyDTO;
 import nju.seec.helper.entity.Comment;
-import nju.seec.helper.entity.Reply;
 import nju.seec.helper.service.CommentService;
 import nju.seec.helper.util.exception.HelperException;
 import nju.seec.helper.vo.CommentVO;
@@ -33,8 +31,8 @@ public class CommentServiceImpl implements CommentService {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public CommentVO createComment(LoginUser user, CommentDTO commentDTO) {
-        Comment comment = new Comment();
-        comment.setSlideId(commentDTO.getSlideId())
+        Comment comment = new Comment()
+                .setSlideId(commentDTO.getSlideId())
                 .setPageNumber(commentDTO.getPageNumber())
                 .setUserId(user.getId())
                 .setUserName(user.getName())
@@ -79,20 +77,4 @@ public class CommentServiceImpl implements CommentService {
                 .map(CommentVO::new)
                 .collect(Collectors.toList());
     }
-
-    @Transactional(rollbackFor = Exception.class)
-    @Override
-    public void replyComment(LoginUser user, ReplyDTO replyDTO) {
-        Comment comment = commentDAO.findCommentById(replyDTO.getCommentId());
-        if (!slideDAO.findSlideById(comment.getSlideId()).getTeacherId().equals(user.getId())) {
-            throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "您无权回复该评论");
-        }
-
-        Reply reply = new Reply();
-        reply.setComment(comment)
-                .setTeacherId(user.getId())
-                .setContent(replyDTO.getContent());
-        comment.setReply(reply);
-        commentDAO.save(comment);
-    }
 }

+ 4 - 4
src/main/java/nju/seec/helper/service/impl/CourseServiceImpl.java

@@ -39,8 +39,8 @@ public class CourseServiceImpl implements CourseService {
         if (courseDAO.existsByNameAndTeacherId(courseDTO.getName(), teacherId)) {
             throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "该课程名已使用");
         }
-        Course course = new Course();
-        course.setTeacherId(teacherId)
+        Course course = new Course()
+                .setTeacherId(teacherId)
                 .setTeacherName(teacher.getName())
                 .setName(courseDTO.getName())
                 .setBio(courseDTO.getBio())
@@ -77,8 +77,8 @@ public class CourseServiceImpl implements CourseService {
             throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "选课码错误");
         }
 
-        Choose choose = new Choose();
-        choose.setCourseId(chooseDTO.getCourseId())
+        Choose choose = new Choose()
+                .setCourseId(chooseDTO.getCourseId())
                 .setStudentId(studentId);
         chooseDAO.save(choose);
     }

+ 56 - 0
src/main/java/nju/seec/helper/service/impl/ReplyServiceImpl.java

@@ -0,0 +1,56 @@
+package nju.seec.helper.service.impl;
+
+import nju.seec.helper.dao.CommentDAO;
+import nju.seec.helper.dao.ReplyDAO;
+import nju.seec.helper.dao.SlideDAO;
+import nju.seec.helper.dto.LoginUser;
+import nju.seec.helper.dto.ReplyDTO;
+import nju.seec.helper.entity.Comment;
+import nju.seec.helper.entity.Reply;
+import nju.seec.helper.service.ReplyService;
+import nju.seec.helper.util.exception.HelperException;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author cst
+ */
+@Service
+public class ReplyServiceImpl implements ReplyService {
+    private final SlideDAO slideDAO;
+    private final CommentDAO commentDAO;
+    private final ReplyDAO replyDAO;
+
+    public ReplyServiceImpl(SlideDAO slideDAO, CommentDAO commentDAO, ReplyDAO replyDAO) {
+        this.slideDAO = slideDAO;
+        this.commentDAO = commentDAO;
+        this.replyDAO = replyDAO;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void createReply(LoginUser user, ReplyDTO replyDTO) {
+        Comment comment = commentDAO.findCommentById(replyDTO.getCommentId());
+        if (!slideDAO.findSlideById(comment.getSlideId()).getTeacherId().equals(user.getId())) {
+            throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "您无权回复该评论");
+        }
+
+        Reply reply = new Reply()
+                .setComment(comment)
+                .setTeacherId(user.getId())
+                .setContent(replyDTO.getContent());
+        comment.getReplies().add(reply);
+        commentDAO.save(comment);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void removeReply(LoginUser user, Integer replyId) {
+        Reply reply = replyDAO.findReplyById(replyId);
+        if (!reply.getTeacherId().equals(user.getId())) {
+            throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "您无权删除该回复");
+        }
+
+        replyDAO.deleteById(replyId);
+    }
+}

+ 3 - 3
src/main/java/nju/seec/helper/service/impl/SlideServiceImpl.java

@@ -6,8 +6,8 @@ import nju.seec.helper.dao.ChooseDAO;
 import nju.seec.helper.dao.CourseDAO;
 import nju.seec.helper.dao.SlideDAO;
 import nju.seec.helper.dto.LoginUser;
-import nju.seec.helper.dto.modify.ModifySlideDTO;
 import nju.seec.helper.dto.SlideDTO;
+import nju.seec.helper.dto.modify.ModifySlideDTO;
 import nju.seec.helper.entity.Course;
 import nju.seec.helper.entity.Slide;
 import nju.seec.helper.service.SlideService;
@@ -60,8 +60,8 @@ public class SlideServiceImpl implements SlideService {
             throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "您无权创建该课程的幻灯片");
         }
 
-        Slide slide = new Slide();
-        slide.setCourseId(slideDTO.getCourseId())
+        Slide slide = new Slide()
+                .setCourseId(slideDTO.getCourseId())
                 .setTeacherId(teacher.getId())
                 .setName(slideDTO.getName())
                 .setState(SlideState.DRAFT);

+ 5 - 4
src/main/java/nju/seec/helper/service/impl/UserServiceImpl.java

@@ -50,8 +50,8 @@ public class UserServiceImpl implements UserService {
             throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "邮箱验证码错误");
         }
 
-        User user = new User();
-        user.setName(registerDTO.getName())
+        User user = new User()
+                .setName(registerDTO.getName())
                 .setEmail(registerDTO.getEmail())
                 .setPhone(registerDTO.getPhone())
                 .setPassword(EncryptUtils.encode(registerDTO.getPassword()))
@@ -83,8 +83,9 @@ public class UserServiceImpl implements UserService {
 
     @Override
     public UserVO modifyUser(LoginUser loginUser, ModifyUserDTO modifyUserDTO) {
-        User user = userDAO.findUserById(loginUser.getId());
-        user.setName(modifyUserDTO.getName())
+        User user = userDAO
+                .findUserById(loginUser.getId())
+                .setName(modifyUserDTO.getName())
                 .setPassword(EncryptUtils.encode(modifyUserDTO.getPassword()));
         user = userDAO.save(user);
         return new UserVO(user);

+ 12 - 2
src/main/java/nju/seec/helper/vo/CommentVO.java

@@ -5,6 +5,10 @@ import lombok.NonNull;
 import nju.seec.helper.entity.Comment;
 import nju.seec.helper.util.enums.UserType;
 
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * @author cst
  */
@@ -27,7 +31,9 @@ public class CommentVO {
     private Integer userId;
     private String userName;
     private UserType userType;
-    private ReplyVO reply;
+    private LocalDateTime createAt;
+
+    private List<ReplyVO> replies;
 
     public CommentVO(@NonNull Comment comment) {
         this.id = comment.getId();
@@ -36,6 +42,10 @@ public class CommentVO {
         this.userId = comment.getUserId();
         this.userName = comment.getUserName();
         this.userType = comment.getUserType();
-        this.reply = comment.getReply() != null ? new ReplyVO(comment.getReply()) : null;
+        this.createAt = comment.getCreateAt();
+        this.replies = comment.getReplies()
+                .stream()
+                .map(ReplyVO::new)
+                .collect(Collectors.toList());
     }
 }

+ 4 - 0
src/main/java/nju/seec/helper/vo/CourseVO.java

@@ -4,6 +4,8 @@ import lombok.Data;
 import lombok.NonNull;
 import nju.seec.helper.entity.Course;
 
+import java.time.LocalDateTime;
+
 /**
  * @author cst
  */
@@ -13,6 +15,7 @@ public class CourseVO {
     private String name;
     private String bio;
     private String cover;
+    private LocalDateTime createAt;
 
     private Integer teacherId;
     private String teacherName;
@@ -22,6 +25,7 @@ public class CourseVO {
         this.name = course.getName();
         this.bio = course.getBio();
         this.cover = course.getCover();
+        this.createAt = course.getCreateAt();
 
         this.teacherId = course.getTeacherId();
         this.teacherName = course.getTeacherName();

+ 4 - 0
src/main/java/nju/seec/helper/vo/UserVO.java

@@ -5,6 +5,8 @@ import lombok.NonNull;
 import nju.seec.helper.entity.User;
 import nju.seec.helper.util.enums.UserType;
 
+import java.time.LocalDateTime;
+
 /**
  * @author cst
  */
@@ -15,6 +17,7 @@ public class UserVO {
     private String email;
     private String phone;
     private UserType type;
+    private LocalDateTime createAt;
 
     public UserVO(@NonNull User user) {
         this.id = user.getId();
@@ -22,5 +25,6 @@ public class UserVO {
         this.email = user.getEmail();
         this.phone = user.getPhone();
         this.type = user.getType();
+        this.createAt = user.getCreateAt();
     }
 }