瀏覽代碼

feat: 增加评论功能(未测试)

ChenSiTong 6 年之前
父節點
當前提交
ce5974d0c7

+ 33 - 0
src/main/java/nju/seec/helper/data/dao/CommentDAO.java

@@ -0,0 +1,33 @@
+package nju.seec.helper.data.dao;
+
+import nju.seec.helper.data.entity.Comment;
+import nju.seec.helper.util.exception.HelperException;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author cst
+ */
+@Repository
+public interface CommentDAO extends JpaRepository<Comment, Integer> {
+    /**
+     * 封装findById
+     *
+     * @param commentId
+     * @return
+     */
+    default Comment findCommentById(Integer commentId) {
+        return findById(commentId).orElseThrow(() -> HelperException.of(HelperException.ExceptionType.NOT_FOUND, "找不到评论"));
+    }
+
+    /**
+     * 根据Item ID查询
+     *
+     * @param itemId
+     * @param pageable
+     * @return
+     */
+    Page<Comment> findByItemId(Integer itemId, Pageable pageable);
+}

+ 48 - 0
src/main/java/nju/seec/helper/data/entity/Comment.java

@@ -0,0 +1,48 @@
+package nju.seec.helper.data.entity;
+
+import lombok.Data;
+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.Set;
+
+/**
+ * @author cst
+ */
+@Data
+@Entity
+@Table(name = "comment")
+public class Comment {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    @Column(name = "item_id")
+    private Integer itemId;
+
+    @Column(name = "user_id")
+    private Integer userId;
+
+    @Column(name = "user_name")
+    private String username;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "user_type")
+    private UserType userType;
+
+    private String content;
+
+    @Column(name = "publish_time", updatable = false)
+    @CreationTimestamp
+    private LocalDateTime publishTime;
+
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fatherComment")
+    private Set<Comment> followComments = Collections.emptySet();
+
+    @ManyToOne
+    @JoinColumn(name = "father_comment_id")
+    private Comment fatherComment;
+}

+ 1 - 1
src/main/java/nju/seec/helper/data/entity/Item.java

@@ -32,7 +32,7 @@ public class Item {
 
     private String content;
 
-    @ManyToOne(cascade = CascadeType.ALL)
+    @ManyToOne
     @JoinColumn(name = "slide_id")
     private Slide slide;
 }

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

@@ -0,0 +1,40 @@
+package nju.seec.helper.logic.service;
+
+import nju.seec.helper.logic.vo.CommentVO;
+import nju.seec.helper.util.enums.UserType;
+import nju.seec.helper.web.dto.CommentDTO;
+import org.springframework.data.domain.Pageable;
+
+import java.util.List;
+
+/**
+ * @author cst
+ */
+public interface CommentService {
+    /**
+     * 发布评论
+     *
+     * @param userId
+     * @param username
+     * @param userType
+     * @param commentDTO
+     * @return
+     */
+    CommentVO create(Integer userId, String username, UserType userType, CommentDTO commentDTO);
+
+    /**
+     * 获取评论
+     *
+     * @param itemId
+     * @param pageable
+     * @return
+     */
+    List<CommentVO> getComments(Integer itemId, Pageable pageable);
+
+    /**
+     * 删除评论
+     *
+     * @param commentId
+     */
+    void deleteComment(Integer commentId);
+}

+ 61 - 0
src/main/java/nju/seec/helper/logic/service/impl/CommentServiceImpl.java

@@ -0,0 +1,61 @@
+package nju.seec.helper.logic.service.impl;
+
+import nju.seec.helper.data.dao.CommentDAO;
+import nju.seec.helper.data.entity.Comment;
+import nju.seec.helper.logic.service.CommentService;
+import nju.seec.helper.logic.vo.CommentVO;
+import nju.seec.helper.util.enums.UserType;
+import nju.seec.helper.web.dto.CommentDTO;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author cst
+ */
+@Service
+public class CommentServiceImpl implements CommentService {
+    private final CommentDAO commentDAO;
+
+    public CommentServiceImpl(CommentDAO commentDAO) {
+        this.commentDAO = commentDAO;
+    }
+
+    @Override
+    public CommentVO create(Integer userId, String username, UserType userType, CommentDTO commentDTO) {
+        Comment comment = new Comment();
+        comment.setUserId(userId);
+        comment.setUsername(username);
+        comment.setUserType(userType);
+        comment.setItemId(commentDTO.getItemId());
+        comment.setContent(commentDTO.getContent());
+        comment.setFollowComments(Collections.emptySet());
+
+        Integer fatherCommentId = commentDTO.getFatherCommentId();
+        if (fatherCommentId != null && fatherCommentId > 0) {
+            Comment fatherComment = commentDAO.findCommentById(fatherCommentId);
+            comment.setFatherComment(fatherComment);
+        }
+        comment = commentDAO.save(comment);
+        return new CommentVO(comment);
+    }
+
+    @Override
+    public List<CommentVO> getComments(Integer itemId, Pageable pageable) {
+        Page<Comment> commentPage = commentDAO.findByItemId(itemId, pageable);
+        return commentPage
+                .getContent()
+                .stream()
+                .map(CommentVO::new)
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public void deleteComment(Integer commentId) {
+        commentDAO.deleteById(commentId);
+    }
+}

+ 41 - 0
src/main/java/nju/seec/helper/logic/vo/CommentVO.java

@@ -0,0 +1,41 @@
+package nju.seec.helper.logic.vo;
+
+import lombok.Data;
+import nju.seec.helper.data.entity.Comment;
+import nju.seec.helper.util.enums.UserType;
+
+import java.time.LocalDateTime;
+import java.util.Set;
+
+/**
+ * @author cst
+ */
+@Data
+public class CommentVO {
+    private Integer id;
+
+    private Integer itemId;
+
+    private Integer userId;
+
+    private String username;
+
+    private UserType userType;
+
+    private String content;
+
+    private LocalDateTime publishTime;
+
+    private Set<Comment> followComments;
+
+    public CommentVO(Comment comment) {
+        this.id = comment.getId();
+        this.itemId = comment.getItemId();
+        this.userId = comment.getUserId();
+        this.username = comment.getUsername();
+        this.userType = comment.getUserType();
+        this.content = comment.getContent();
+        this.publishTime = comment.getPublishTime();
+        this.followComments = comment.getFollowComments();
+    }
+}

+ 1 - 1
src/main/java/nju/seec/helper/util/enums/UserRole.java → src/main/java/nju/seec/helper/util/enums/UserType.java

@@ -3,6 +3,6 @@ package nju.seec.helper.util.enums;
 /**
  * @author cst
  */
-public enum UserRole {
+public enum UserType {
     TEACHER, STUDENT
 }

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

@@ -0,0 +1,54 @@
+package nju.seec.helper.web.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiParam;
+import nju.seec.helper.logic.service.CommentService;
+import nju.seec.helper.logic.vo.CommentVO;
+import nju.seec.helper.util.enums.UserType;
+import nju.seec.helper.web.dto.CommentDTO;
+import nju.seec.helper.web.response.EmptyResponse;
+import nju.seec.helper.web.response.PageResourceResponse;
+import nju.seec.helper.web.response.ResourceResponse;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author cst
+ */
+@Api(tags = "评论")
+@RestController
+@RequestMapping("/api/comment")
+public class CommentController {
+    private final CommentService commentService;
+
+    public CommentController(CommentService commentService) {
+        this.commentService = commentService;
+    }
+
+    @PostMapping("/teacher")
+    public ResourceResponse<CommentVO> teacherComment(@RequestBody CommentDTO commentDTO) {
+        return ResourceResponse.of(commentService.create(1, "teacher", UserType.TEACHER, commentDTO));
+    }
+
+    @PostMapping("/student")
+    public ResourceResponse<CommentVO> studentComment(@RequestBody CommentDTO commentDTO) {
+        return ResourceResponse.of(commentService.create(1, "student", UserType.STUDENT, commentDTO));
+    }
+
+    @GetMapping("/item/{itemId}")
+    public PageResourceResponse<CommentVO> getComments(@PathVariable("itemId") Integer itemId,
+                                                       @ApiParam(hidden = true) @PageableDefault(size = Integer.MAX_VALUE, sort = "publishTime", direction = Sort.Direction.DESC) Pageable pageable) {
+        List<CommentVO> comments = commentService.getComments(itemId, pageable);
+        return PageResourceResponse.of(comments, PageResourceResponse.PageInfo.of(pageable.getPageNumber(), comments.size()));
+    }
+
+    @DeleteMapping("/{commentId}")
+    public EmptyResponse deleteComment(@PathVariable("commentId") Integer commentId) {
+        commentService.deleteComment(commentId);
+        return EmptyResponse.getInstance();
+    }
+}

+ 4 - 4
src/main/java/nju/seec/helper/web/controller/SlideController.java

@@ -37,8 +37,8 @@ public class SlideController {
     public PageResourceResponse<SlideVO> teacherGetSlides(@PathVariable Integer courseId,
                                                           @RequestParam(required = false, defaultValue = "") String key,
                                                           @ApiParam(hidden = true) @PageableDefault(size = Integer.MAX_VALUE, sort = "updateTime", direction = Sort.Direction.DESC) Pageable pageable) {
-        List<SlideVO> slideVOs = slideService.teacherGetSlides(1, courseId, key, pageable);
-        return PageResourceResponse.of(slideVOs, PageResourceResponse.PageInfo.of(pageable.getPageNumber(), slideVOs.size()));
+        List<SlideVO> slides = slideService.teacherGetSlides(1, courseId, key, pageable);
+        return PageResourceResponse.of(slides, PageResourceResponse.PageInfo.of(pageable.getPageNumber(), slides.size()));
     }
 
 
@@ -46,8 +46,8 @@ public class SlideController {
     @GetMapping("/teacher")
     public PageResourceResponse<SlideVO> teacherGetSlides(@RequestParam(required = false, defaultValue = "") String key,
                                                           @ApiParam(hidden = true) @PageableDefault(size = Integer.MAX_VALUE, sort = "updateTime", direction = Sort.Direction.DESC) Pageable pageable) {
-        List<SlideVO> slideVOs = slideService.teacherGetSlides(1, key, pageable);
-        return PageResourceResponse.of(slideVOs, PageResourceResponse.PageInfo.of(pageable.getPageNumber(), slideVOs.size()));
+        List<SlideVO> slides = slideService.teacherGetSlides(1, key, pageable);
+        return PageResourceResponse.of(slides, PageResourceResponse.PageInfo.of(pageable.getPageNumber(), slides.size()));
     }
 
     @ApiOperation(value = "教师根据ID获取幻灯片")

+ 18 - 0
src/main/java/nju/seec/helper/web/dto/CommentDTO.java

@@ -0,0 +1,18 @@
+package nju.seec.helper.web.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author cst
+ */
+@Data
+public class CommentDTO {
+    @NotNull
+    private Integer itemId;
+    private Integer fatherCommentId;
+    @NotBlank
+    private String content;
+}