ソースを参照

refactor: 删除Page数据结构

ChenSiTong 6 年 前
コミット
a03960c462

+ 1 - 1
src/main/java/nju/seec/helper/aspect/auth/AuthAspect.java

@@ -1,7 +1,7 @@
 package nju.seec.helper.aspect.auth;
 
-import nju.seec.helper.util.Consts;
 import nju.seec.helper.dto.LoginUser;
+import nju.seec.helper.util.Consts;
 import nju.seec.helper.util.exception.HelperException;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.annotation.Aspect;

+ 4 - 3
src/main/java/nju/seec/helper/controller/CommentController.java

@@ -78,10 +78,11 @@ public class CommentController {
     /**
      * 取得某一页的评论信息
      */
-    @GetMapping("/page/{pageId}")
-    public PageResourceResponse<CommentVO> getComments(@PathVariable Integer pageId,
+    @GetMapping("/slide/{slideId}")
+    public PageResourceResponse<CommentVO> getComments(@PathVariable Integer slideId,
+                                                       @RequestParam(required = false, defaultValue = "1") Integer pageNumber,
                                                        @PageableDefault(Integer.MAX_VALUE) Pageable pageable) {
-        List<CommentVO> commentVOList = commentService.getCommentsByType(pageId, pageable);
+        List<CommentVO> commentVOList = commentService.getCommentsBySlideIdAndPageNumber(slideId, pageNumber, pageable);
         return PageResourceResponse.of(commentVOList, pageable.getPageNumber(), pageable.getPageSize());
     }
 }

+ 10 - 20
src/main/java/nju/seec/helper/dao/CommentDAO.java

@@ -5,10 +5,8 @@ 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.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
-import org.springframework.transaction.annotation.Transactional;
 
 /**
  * @author cst
@@ -29,35 +27,27 @@ public interface CommentDAO extends JpaRepository<Comment, Integer> {
     /**
      * 查询置顶评论数量
      *
-     * @param pageId
+     * @param slideId
+     * @param pageNumber
      * @return
      */
     @Query("select max(c.topNumber) from Comment c " +
-            "where c.pageId=?1 " +
+            "where c.slideId=?1 " +
+            "and c.pageNumber=?2" +
             "and c.topNumber is not null")
-    Integer countTopComments(Integer pageId);
+    Integer countTopComments(Integer slideId, Integer pageNumber);
 
     /**
      * 获取评论
      *
-     * @param pageId
+     * @param slideId
+     * @param pageNumber
      * @param pageable
      * @return
      */
     @Query("select c from Comment c " +
-            "where c.pageId=?1 " +
+            "where c.slideId=?1 " +
+            "and c.pageNumber=?2" +
             "order by nullif(c.topNumber, 0) desc")
-    Page<Comment> findComments(Integer pageId, Pageable pageable);
-
-    /**
-     * 调整置顶评论顺序
-     *
-     * @param pageId
-     */
-    @Modifying
-    @Transactional(rollbackFor = Exception.class)
-    @Query("update Comment c " +
-            "set c.topNumber=null " +
-            "where c.pageId=?1")
-    void cleanTopComments(Integer pageId);
+    Page<Comment> findComments(Integer slideId, Integer pageNumber, Pageable pageable);
 }

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

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

+ 3 - 1
src/main/java/nju/seec/helper/dto/CommentDTO.java

@@ -11,7 +11,9 @@ import javax.validation.constraints.NotNull;
 @Data
 public class CommentDTO {
     @NotNull
-    private Integer pageId;
+    private Integer slideId;
+    @NotNull
+    private Integer pageNumber;
     @NotBlank
     private String content;
 }

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

@@ -18,8 +18,11 @@ public class Comment {
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Integer id;
 
-    @Column(name = "page_id", nullable = false)
-    private Integer pageId;
+    @Column(name = "slide_id", nullable = false)
+    private Integer slideId;
+
+    @Column(name = "page_number", nullable = false)
+    private Integer pageNumber;
 
     @Column(name = "top_number")
     private Integer topNumber;

+ 0 - 23
src/main/java/nju/seec/helper/entity/Page.java

@@ -1,23 +0,0 @@
-package nju.seec.helper.entity;
-
-import lombok.Data;
-
-import javax.persistence.*;
-
-/**
- * @author cst
- */
-@Data
-@Entity
-@Table(name = "page")
-public class Page {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Integer id;
-
-    @Column(nullable = false)
-    private Integer number;
-
-    @Column(name = "teacher_id", nullable = false)
-    private Integer teacherId;
-}

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

@@ -8,7 +8,6 @@ import org.hibernate.annotations.UpdateTimestamp;
 
 import javax.persistence.*;
 import java.time.LocalDateTime;
-import java.util.List;
 
 /**
  * @author cst
@@ -46,8 +45,6 @@ public class Slide {
     @UpdateTimestamp
     private LocalDateTime updateAt;
 
-    @OneToMany(cascade = CascadeType.ALL)
-    @JoinColumn(name = "slide_id")
-    @OrderBy("number asc")
-    private List<Page> pages;
+    @Column(nullable = false)
+    private Integer pages;
 }

+ 4 - 3
src/main/java/nju/seec/helper/service/CommentService.java

@@ -38,13 +38,14 @@ public interface CommentService {
     void topComment(LoginUser user, Integer commentId);
 
     /**
-     * 根据类型获取评论
+     * 基于幻灯片和页码数获取评论
      *
-     * @param pageId
+     * @param slideId
+     * @param pageNumber
      * @param pageable
      * @return
      */
-    List<CommentVO> getCommentsByType(Integer pageId, Pageable pageable);
+    List<CommentVO> getCommentsBySlideIdAndPageNumber(Integer slideId, Integer pageNumber, Pageable pageable);
 
     /**
      * 回复评论

+ 17 - 18
src/main/java/nju/seec/helper/service/impl/CommentServiceImpl.java

@@ -1,7 +1,7 @@
 package nju.seec.helper.service.impl;
 
 import nju.seec.helper.dao.CommentDAO;
-import nju.seec.helper.dao.PageDAO;
+import nju.seec.helper.dao.SlideDAO;
 import nju.seec.helper.dto.CommentDTO;
 import nju.seec.helper.dto.LoginUser;
 import nju.seec.helper.dto.ReplyDTO;
@@ -23,18 +23,19 @@ import java.util.stream.Collectors;
 @Service
 public class CommentServiceImpl implements CommentService {
     private final CommentDAO commentDAO;
-    private final PageDAO pageDAO;
+    private final SlideDAO slideDAO;
 
-    public CommentServiceImpl(CommentDAO commentDAO, PageDAO pageDAO) {
+    public CommentServiceImpl(CommentDAO commentDAO, SlideDAO slideDAO) {
         this.commentDAO = commentDAO;
-        this.pageDAO = pageDAO;
+        this.slideDAO = slideDAO;
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
     public CommentVO createComment(LoginUser user, CommentDTO commentDTO) {
         Comment comment = new Comment();
-        comment.setPageId(commentDTO.getPageId())
+        comment.setSlideId(commentDTO.getSlideId())
+                .setPageNumber(commentDTO.getPageNumber())
                 .setUserId(user.getId())
                 .setUserName(user.getName())
                 .setUserType(user.getType())
@@ -57,24 +58,22 @@ public class CommentServiceImpl implements CommentService {
     @Override
     public void topComment(LoginUser user, Integer commentId) {
         Comment comment = commentDAO.findCommentById(commentId);
-        if (comment.getTopNumber() == null) {
-            if (!pageDAO.findPageById(comment.getPageId()).getTeacherId().equals(user.getId())) {
-                throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "您无权进行置顶操作");
-            }
-            Integer topCommentNum = commentDAO.countTopComments(comment.getPageId());
-            if (topCommentNum == null) {
-                topCommentNum = 0;
-            }
-            comment.setTopNumber(topCommentNum + 1);
-            commentDAO.save(comment);
+        if (!slideDAO.findSlideById(comment.getSlideId()).getTeacherId().equals(user.getId())) {
+            throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "您无权进行置顶操作");
         }
+        Integer topCommentNum = commentDAO.countTopComments(comment.getSlideId(), comment.getPageNumber());
+        if (topCommentNum == null) {
+            topCommentNum = 0;
+        }
+        comment.setTopNumber(topCommentNum + 1);
+        commentDAO.save(comment);
     }
 
     @Transactional(readOnly = true)
     @Override
-    public List<CommentVO> getCommentsByType(Integer pageId, Pageable pageable) {
+    public List<CommentVO> getCommentsBySlideIdAndPageNumber(Integer slideId, Integer pageNumber, Pageable pageable) {
         return commentDAO
-                .findComments(pageId, pageable)
+                .findComments(slideId, pageNumber, pageable)
                 .getContent()
                 .stream()
                 .map(CommentVO::new)
@@ -85,7 +84,7 @@ public class CommentServiceImpl implements CommentService {
     @Override
     public void replyComment(LoginUser user, ReplyDTO replyDTO) {
         Comment comment = commentDAO.findCommentById(replyDTO.getCommentId());
-        if (!pageDAO.findPageById(comment.getPageId()).getTeacherId().equals(user.getId())) {
+        if (!slideDAO.findSlideById(comment.getSlideId()).getTeacherId().equals(user.getId())) {
             throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "您无权回复该评论");
         }
 

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

@@ -9,7 +9,6 @@ import nju.seec.helper.dto.LoginUser;
 import nju.seec.helper.dto.ModifySlideDTO;
 import nju.seec.helper.dto.SlideDTO;
 import nju.seec.helper.entity.Course;
-import nju.seec.helper.entity.Page;
 import nju.seec.helper.entity.Slide;
 import nju.seec.helper.service.SlideService;
 import nju.seec.helper.util.CacheUtils;
@@ -29,7 +28,6 @@ import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
-import java.util.stream.IntStream;
 
 /**
  * @author cst
@@ -70,26 +68,18 @@ public class SlideServiceImpl implements SlideService {
 
         // 解析文件页数
         MultipartFile file = slideDTO.getFile();
-        int pageNum;
+        int pages;
         switch (Objects.requireNonNull(file.getContentType())) {
             // pdf
             case "application/pdf":
                 PDDocument doc = PDDocument.load(file.getInputStream());
-                pageNum = doc.getNumberOfPages();
+                pages = doc.getNumberOfPages();
                 break;
             default:
                 throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "不支持的文件类型");
         }
 
-        slide.setPages(IntStream.rangeClosed(1, pageNum)
-                .mapToObj(number -> {
-                    Page page = new Page();
-                    page.setTeacherId(teacher.getId());
-                    page.setNumber(number);
-                    return page;
-                })
-                .collect(Collectors.toList())
-        );
+        slide.setPages(pages);
 
         // 上传文件
         String objectName = fileUtils.upload(LocalDateTime.now().toString() + "-" + file.getOriginalFilename(), file.getInputStream());

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

@@ -11,6 +11,17 @@ import nju.seec.helper.util.enums.UserType;
 @Data
 public class CommentVO {
     private Integer id;
+    /**
+     * 幻灯片ID
+     */
+    private Integer slideId;
+    /**
+     * 所属页码
+     */
+    private Integer number;
+    /**
+     * 置顶优先级(越大说明越高,为null说明不是置顶评论)
+     */
     private Integer topNumber;
     private String content;
     private Integer userId;

+ 2 - 20
src/main/java/nju/seec/helper/vo/SlideVO.java

@@ -2,13 +2,10 @@ package nju.seec.helper.vo;
 
 import lombok.Data;
 import lombok.NonNull;
-import nju.seec.helper.entity.Page;
 import nju.seec.helper.entity.Slide;
 import nju.seec.helper.util.enums.SlideState;
 
 import java.time.LocalDateTime;
-import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * @author cst
@@ -21,7 +18,7 @@ public class SlideVO {
     private String name;
     private LocalDateTime createAt;
     private LocalDateTime updateAt;
-    private List<PageVO> pages;
+    private Integer pages;
 
     public SlideVO(@NonNull Slide slide) {
         this.id = slide.getId();
@@ -30,21 +27,6 @@ public class SlideVO {
         this.name = slide.getName();
         this.createAt = slide.getCreateAt();
         this.updateAt = slide.getUpdateAt();
-        this.pages = slide
-                .getPages()
-                .stream()
-                .map(PageVO::new)
-                .collect(Collectors.toList());
-    }
-
-    @Data
-    static class PageVO {
-        private Integer id;
-        private Integer number;
-
-        public PageVO(@NonNull Page page) {
-            this.id = page.getId();
-            this.number = page.getNumber();
-        }
+        this.pages = slide.getPages();
     }
 }

+ 1 - 15
src/test/java/nju/seec/helper/HelperApplicationTests.java

@@ -1,28 +1,14 @@
 package nju.seec.helper;
 
-import nju.seec.helper.dao.SlideDAO;
-import nju.seec.helper.entity.Slide;
-import nju.seec.helper.util.enums.SlideState;
 import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
-import java.util.Collections;
-
 @SpringBootTest
 class HelperApplicationTests {
-    @Autowired
-    private SlideDAO slideDAO;
 
     @Test
     void contextLoads() {
-        Slide slide = new Slide();
-        slide.setTeacherId(1);
-        slide.setCourseId(1);
-        slide.setName("第一章");
-        slide.setState(SlideState.DRAFT);
-        slide.setObjectName("SEEC Helper 需求.pdf");
-        slide.setPages(Collections.emptyList());
+
     }
 
 }