Sfoglia il codice sorgente

Merge branch 'iterator5'

ChenSiTong 6 anni fa
parent
commit
972f62c0fd
53 ha cambiato i file con 316 aggiunte e 225 eliminazioni
  1. 47 47
      pom.xml
  2. 2 2
      src/main/java/nju/seec/helper/aspect/event/Event.java
  3. 3 3
      src/main/java/nju/seec/helper/aspect/event/EventAspect.java
  4. 2 2
      src/main/java/nju/seec/helper/aspect/record/ExerciseRecordAspect.java
  5. 10 2
      src/main/java/nju/seec/helper/controller/CommentController.java
  6. 2 2
      src/main/java/nju/seec/helper/controller/CourseController.java
  7. 1 1
      src/main/java/nju/seec/helper/controller/EventController.java
  8. 2 2
      src/main/java/nju/seec/helper/controller/KnowledgeController.java
  9. 3 3
      src/main/java/nju/seec/helper/controller/QuestionController.java
  10. 2 2
      src/main/java/nju/seec/helper/controller/QuizController.java
  11. 1 1
      src/main/java/nju/seec/helper/controller/RecordController.java
  12. 21 0
      src/main/java/nju/seec/helper/dao/CommentDAO.java
  13. 7 7
      src/main/java/nju/seec/helper/dao/MessageDAO.java
  14. 32 32
      src/main/java/nju/seec/helper/dao/UserDAO.java
  15. 3 0
      src/main/java/nju/seec/helper/dto/comment/CommentDTO.java
  16. 11 1
      src/main/java/nju/seec/helper/service/CommentService.java
  17. 1 1
      src/main/java/nju/seec/helper/service/EventService.java
  18. 3 3
      src/main/java/nju/seec/helper/service/QuestionService.java
  19. 1 1
      src/main/java/nju/seec/helper/service/RecordService.java
  20. 8 5
      src/main/java/nju/seec/helper/service/impl/CommentServiceImpl.java
  21. 2 2
      src/main/java/nju/seec/helper/service/impl/EventServiceImpl.java
  22. 9 9
      src/main/java/nju/seec/helper/service/impl/QuestionServiceImpl.java
  23. 4 4
      src/main/java/nju/seec/helper/service/impl/RecordServiceImpl.java
  24. 4 9
      src/main/java/nju/seec/helper/sys/bok/api/KnowledgeApi.java
  25. 6 11
      src/main/java/nju/seec/helper/sys/bok/api/QuestionApi.java
  26. 4 9
      src/main/java/nju/seec/helper/sys/bok/api/QuestionQueryApi.java
  27. 3 3
      src/main/java/nju/seec/helper/sys/bok/api/RecordApi.java
  28. 6 13
      src/main/java/nju/seec/helper/sys/bok/api/UserInteractiveApi.java
  29. 1 1
      src/main/java/nju/seec/helper/sys/bok/constant/QuestionType.java
  30. 1 1
      src/main/java/nju/seec/helper/sys/bok/dto/CollectDTO.java
  31. 1 1
      src/main/java/nju/seec/helper/sys/bok/dto/RateDTO.java
  32. 1 1
      src/main/java/nju/seec/helper/sys/bok/dto/RecordDTO.java
  33. 1 1
      src/main/java/nju/seec/helper/sys/bok/vo/InteractiveVO.java
  34. 1 1
      src/main/java/nju/seec/helper/sys/bok/vo/KnowledgeNodeVO.java
  35. 1 1
      src/main/java/nju/seec/helper/sys/bok/vo/PageVO.java
  36. 1 1
      src/main/java/nju/seec/helper/sys/bok/vo/PageableQuestionListVO.java
  37. 2 2
      src/main/java/nju/seec/helper/sys/bok/vo/QuestionVO.java
  38. 1 1
      src/main/java/nju/seec/helper/sys/bok/vo/RecordQuestionVO.java
  39. 1 1
      src/main/java/nju/seec/helper/sys/bok/vo/RecordVO.java
  40. 5 9
      src/main/java/nju/seec/helper/sys/dataanalysis/api/EventApi.java
  41. 2 6
      src/main/java/nju/seec/helper/sys/dataanalysis/api/ExerciseApi.java
  42. 1 1
      src/main/java/nju/seec/helper/sys/dataanalysis/constant/EventAction.java
  43. 1 1
      src/main/java/nju/seec/helper/sys/dataanalysis/constant/EventType.java
  44. 3 3
      src/main/java/nju/seec/helper/sys/dataanalysis/model/Event.java
  45. 1 1
      src/main/java/nju/seec/helper/sys/dataanalysis/model/ExerciseRecord.java
  46. 5 3
      src/main/java/nju/seec/helper/util/OssUtils.java
  47. 52 0
      src/main/java/nju/seec/helper/util/cache/BaseCacheUtils.java
  48. 8 7
      src/main/java/nju/seec/helper/util/cache/CaffeineCacheUtils.java
  49. 1 1
      src/main/java/nju/seec/helper/vo/CommentVO.java
  50. 2 2
      src/main/java/nju/seec/helper/vo/question/BaseQuestionVO.java
  51. 1 1
      src/main/java/nju/seec/helper/vo/question/ChoiceQuestionVO.java
  52. 1 1
      src/main/java/nju/seec/helper/vo/question/TrueOrFalseQuestionVO.java
  53. 21 0
      src/test/java/nju/seec/helper/HelperApplicationTests.java

+ 47 - 47
pom.xml

@@ -33,14 +33,14 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>org.springframework.boot</groupId>-->
-<!--            <artifactId>spring-boot-starter-data-redis</artifactId>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.springframework.boot</groupId>-->
-<!--            <artifactId>spring-boot-starter-mail</artifactId>-->
-<!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>org.springframework.boot</groupId>-->
+        <!--            <artifactId>spring-boot-starter-data-redis</artifactId>-->
+        <!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>org.springframework.boot</groupId>-->
+        <!--            <artifactId>spring-boot-starter-mail</artifactId>-->
+        <!--        </dependency>-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
@@ -86,26 +86,26 @@
             <artifactId>pdfbox</artifactId>
             <version>2.0.18</version>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>org.apache.poi</groupId>-->
-<!--            <artifactId>poi-ooxml</artifactId>-->
-<!--            <version>4.1.2</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.apache.poi</groupId>-->
-<!--            <artifactId>poi-scratchpad</artifactId>-->
-<!--            <version>4.1.2</version>-->
-<!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>org.apache.poi</groupId>-->
+        <!--            <artifactId>poi-ooxml</artifactId>-->
+        <!--            <version>4.1.2</version>-->
+        <!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>org.apache.poi</groupId>-->
+        <!--            <artifactId>poi-scratchpad</artifactId>-->
+        <!--            <version>4.1.2</version>-->
+        <!--        </dependency>-->
         <dependency>
             <groupId>com.aliyun.oss</groupId>
             <artifactId>aliyun-sdk-oss</artifactId>
             <version>3.8.1</version>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>com.aliyun</groupId>-->
-<!--            <artifactId>aliyun-java-sdk-core</artifactId>-->
-<!--            <version>4.0.3</version>-->
-<!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>com.aliyun</groupId>-->
+        <!--            <artifactId>aliyun-java-sdk-core</artifactId>-->
+        <!--            <version>4.0.3</version>-->
+        <!--        </dependency>-->
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
@@ -122,14 +122,14 @@
             <artifactId>hibernate-types-52</artifactId>
             <version>2.9.5</version>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>org.hibernate</groupId>-->
-<!--            <artifactId>hibernate-jcache</artifactId>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.ehcache</groupId>-->
-<!--            <artifactId>ehcache</artifactId>-->
-<!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>org.hibernate</groupId>-->
+        <!--            <artifactId>hibernate-jcache</artifactId>-->
+        <!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>org.ehcache</groupId>-->
+        <!--            <artifactId>ehcache</artifactId>-->
+        <!--        </dependency>-->
         <!--一个工具类库,不用自己造轮子了!!!-->
         <dependency>
             <groupId>cn.hutool</groupId>
@@ -154,22 +154,22 @@
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
-            <plugin>
-                <groupId>com.github.apiggs</groupId>
-                <artifactId>apiggs-maven-plugin</artifactId>
-                <version>1.6</version>
-                <executions>
-                    <execution>
-                        <phase>compile</phase>
-                        <goals>
-                            <goal>apiggs</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <!-- options in there -->
-                </configuration>
-            </plugin>
+            <!--            <plugin>-->
+            <!--                <groupId>com.github.apiggs</groupId>-->
+            <!--                <artifactId>apiggs-maven-plugin</artifactId>-->
+            <!--                <version>1.6</version>-->
+            <!--                <executions>-->
+            <!--                    <execution>-->
+            <!--                        <phase>compile</phase>-->
+            <!--                        <goals>-->
+            <!--                            <goal>apiggs</goal>-->
+            <!--                        </goals>-->
+            <!--                    </execution>-->
+            <!--                </executions>-->
+            <!--                <configuration>-->
+            <!--                    &lt;!&ndash; options in there &ndash;&gt;-->
+            <!--                </configuration>-->
+            <!--            </plugin>-->
         </plugins>
     </build>
     <distributionManagement>

+ 2 - 2
src/main/java/nju/seec/helper/aspect/event/Event.java

@@ -1,7 +1,7 @@
 package nju.seec.helper.aspect.event;
 
-import nju.seec.helper.api.dataanalysis.constant.EventAction;
-import nju.seec.helper.api.dataanalysis.constant.EventType;
+import nju.seec.helper.sys.dataanalysis.constant.EventAction;
+import nju.seec.helper.sys.dataanalysis.constant.EventType;
 
 import java.lang.annotation.*;
 

+ 3 - 3
src/main/java/nju/seec/helper/aspect/event/EventAspect.java

@@ -2,9 +2,9 @@ package nju.seec.helper.aspect.event;
 
 import com.google.common.collect.ImmutableMap;
 import lombok.SneakyThrows;
-import nju.seec.helper.api.dataanalysis.EventApi;
-import nju.seec.helper.api.dataanalysis.constant.EventAction;
-import nju.seec.helper.api.dataanalysis.constant.EventType;
+import nju.seec.helper.sys.dataanalysis.api.EventApi;
+import nju.seec.helper.sys.dataanalysis.constant.EventAction;
+import nju.seec.helper.sys.dataanalysis.constant.EventType;
 import nju.seec.helper.aspect.auth.LoginUser;
 import nju.seec.helper.dao.CourseDAO;
 import nju.seec.helper.dao.QuizDAO;

+ 2 - 2
src/main/java/nju/seec/helper/aspect/record/ExerciseRecordAspect.java

@@ -1,7 +1,7 @@
 package nju.seec.helper.aspect.record;
 
-import nju.seec.helper.api.bok.RecordApi;
-import nju.seec.helper.api.dataanalysis.ExerciseApi;
+import nju.seec.helper.sys.bok.api.RecordApi;
+import nju.seec.helper.sys.dataanalysis.api.ExerciseApi;
 import nju.seec.helper.aspect.auth.LoginUser;
 import nju.seec.helper.dto.quiz.QuizStudentAnswerDTO;
 import nju.seec.helper.vo.quiz.QuizStudentAnswerVO;

+ 10 - 2
src/main/java/nju/seec/helper/controller/CommentController.java

@@ -1,7 +1,7 @@
 package nju.seec.helper.controller;
 
-import nju.seec.helper.api.dataanalysis.constant.EventAction;
-import nju.seec.helper.api.dataanalysis.constant.EventType;
+import nju.seec.helper.sys.dataanalysis.constant.EventAction;
+import nju.seec.helper.sys.dataanalysis.constant.EventType;
 import nju.seec.helper.aspect.auth.Auth;
 import nju.seec.helper.aspect.auth.LoginUser;
 import nju.seec.helper.aspect.event.Event;
@@ -119,4 +119,12 @@ public class CommentController {
                                   @NotNull(message = "缺少展示状态") Boolean show) {
         commentService.modifyCommentShow(user, commentId, show);
     }
+
+    @Auth(roles = {UserRole.TEACHER, UserRole.STUDENT}, message = "获取自己的评论")
+    @GetMapping("/self")
+    public PageResponse<CommentVO> getSelfComments(LoginUser user,
+                                                   @RequestParam(required = false, defaultValue = "") String key,
+                                                   @PageableDefault(Integer.MAX_VALUE) Pageable pageable) {
+        return PageResponse.of(commentService.getSelfComments(user, key, pageable));
+    }
 }

+ 2 - 2
src/main/java/nju/seec/helper/controller/CourseController.java

@@ -1,7 +1,7 @@
 package nju.seec.helper.controller;
 
-import nju.seec.helper.api.dataanalysis.constant.EventAction;
-import nju.seec.helper.api.dataanalysis.constant.EventType;
+import nju.seec.helper.sys.dataanalysis.constant.EventAction;
+import nju.seec.helper.sys.dataanalysis.constant.EventType;
 import nju.seec.helper.aspect.auth.Auth;
 import nju.seec.helper.aspect.auth.LoginUser;
 import nju.seec.helper.aspect.event.Event;

+ 1 - 1
src/main/java/nju/seec/helper/controller/EventController.java

@@ -1,6 +1,6 @@
 package nju.seec.helper.controller;
 
-import nju.seec.helper.api.dataanalysis.model.Event;
+import nju.seec.helper.sys.dataanalysis.model.Event;
 import nju.seec.helper.service.EventService;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;

+ 2 - 2
src/main/java/nju/seec/helper/controller/KnowledgeController.java

@@ -1,7 +1,7 @@
 package nju.seec.helper.controller;
 
-import nju.seec.helper.api.bok.KnowledgeApi;
-import nju.seec.helper.api.bok.vo.KnowledgeNodeVO;
+import nju.seec.helper.sys.bok.api.KnowledgeApi;
+import nju.seec.helper.sys.bok.vo.KnowledgeNodeVO;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;

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

@@ -1,8 +1,8 @@
 package nju.seec.helper.controller;
 
-import nju.seec.helper.api.bok.dto.CollectDTO;
-import nju.seec.helper.api.bok.dto.RateDTO;
-import nju.seec.helper.api.bok.vo.InteractiveVO;
+import nju.seec.helper.sys.bok.dto.CollectDTO;
+import nju.seec.helper.sys.bok.dto.RateDTO;
+import nju.seec.helper.sys.bok.vo.InteractiveVO;
 import nju.seec.helper.aspect.auth.Auth;
 import nju.seec.helper.aspect.auth.LoginUser;
 import nju.seec.helper.controller.response.PageResponse;

+ 2 - 2
src/main/java/nju/seec/helper/controller/QuizController.java

@@ -1,7 +1,7 @@
 package nju.seec.helper.controller;
 
-import nju.seec.helper.api.dataanalysis.constant.EventAction;
-import nju.seec.helper.api.dataanalysis.constant.EventType;
+import nju.seec.helper.sys.dataanalysis.constant.EventAction;
+import nju.seec.helper.sys.dataanalysis.constant.EventType;
 import nju.seec.helper.aspect.auth.Auth;
 import nju.seec.helper.aspect.auth.LoginUser;
 import nju.seec.helper.aspect.event.Event;

+ 1 - 1
src/main/java/nju/seec/helper/controller/RecordController.java

@@ -1,6 +1,6 @@
 package nju.seec.helper.controller;
 
-import nju.seec.helper.api.dataanalysis.model.ExerciseRecord;
+import nju.seec.helper.sys.dataanalysis.model.ExerciseRecord;
 import nju.seec.helper.service.RecordService;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;

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

@@ -4,8 +4,10 @@ import nju.seec.helper.entity.Comment;
 import nju.seec.helper.entity.User;
 import nju.seec.helper.enums.ExceptionType;
 import nju.seec.helper.exception.HelperException;
+import nju.seec.helper.util.StringUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.stereotype.Repository;
@@ -70,4 +72,23 @@ public interface CommentDAO extends JpaRepository<Comment, Long>, JpaSpecificati
      * @return
      */
     Page<Comment> findBySlideIdAndPageNumberAndUserAndShow(Long slideId, Integer pageNumber, User user, Boolean show, Pageable pageable);
+
+    /**
+     * 根据用户ID、关键字检索
+     *
+     * @param userId
+     * @param key
+     * @param pageable
+     * @return
+     */
+    default Page<Comment> findByUserIdAndKey(Long userId, String key, Pageable pageable) {
+        String keyPattern = StringUtils.keyPattern(key);
+
+        return this.findAll(
+                (Specification<Comment>) (root, query, cb) -> cb.and(
+                        cb.equal(root.get("user").get("id"), userId),
+                        cb.or(cb.like(root.get("title"), keyPattern), cb.like(root.get("content"), keyPattern))
+                )
+                , pageable);
+    }
 }

+ 7 - 7
src/main/java/nju/seec/helper/dao/MessageDAO.java

@@ -50,11 +50,11 @@ public interface MessageDAO extends JpaRepository<Message, Long> {
      */
     Page<Message> findByToUserIdAndReadAndContentContains(Long toUserId, Boolean read, String key, Pageable pageable);
 
-    /**
-     * 基于关联数据删除
-     *
-     * @param refId
-     * @param messageType
-     */
-    void deleteByRefIdAndType(Long refId, MessageType messageType);
+//    /**
+//     * 基于关联数据删除
+//     *
+//     * @param refId
+//     * @param messageType
+//     */
+//    void deleteByRefIdAndType(Long refId, MessageType messageType);
 }

+ 32 - 32
src/main/java/nju/seec/helper/dao/UserDAO.java

@@ -30,38 +30,38 @@ public interface UserDAO extends JpaRepository<User, Long>, JpaSpecificationExec
     }
 
 //    /**
-////     * 检查邮箱是否已存在
-////     *
-////     * @param email
-////     * @return
-////     */
-////    boolean existsByEmail(String email);
-////
-////
-////    /**
-////     * 检查手机号是否已存在
-////     *
-////     * @param phone
-////     * @return
-////     */
-////    boolean existsByPhone(String phone);
-////
-////    /**
-////     * 邮箱密码匹配
-////     *
-////     * @param email
-////     * @param password
-////     * @return
-////     */
-////    Optional<User> findByEmailAndPassword(String email, String password);
-////
-////    /**
-////     * 根据邮箱查询
-////     *
-////     * @param email
-////     * @return
-////     */
-////    Optional<User> findByEmail(String email);
+//     * 检查邮箱是否已存在
+//     *
+//     * @param email
+//     * @return
+//     */
+//    boolean existsByEmail(String email);
+//
+//
+//    /**
+//     * 检查手机号是否已存在
+//     *
+//     * @param phone
+//     * @return
+//     */
+//    boolean existsByPhone(String phone);
+//
+//    /**
+//     * 邮箱密码匹配
+//     *
+//     * @param email
+//     * @param password
+//     * @return
+//     */
+//    Optional<User> findByEmailAndPassword(String email, String password);
+//
+//    /**
+//     * 根据邮箱查询
+//     *
+//     * @param email
+//     * @return
+//     */
+//    Optional<User> findByEmail(String email);
 
     /**
      * 根据手机号查询

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

@@ -23,4 +23,7 @@ public class CommentDTO implements Serializable {
     @NotBlank(message = "内容不能为空")
     @Length(max = 1000, message = "内容长度不能超过1000")
     private String content;
+
+    @NotNull(message = "缺少展示状态")
+    private Boolean show = true;
 }

+ 11 - 1
src/main/java/nju/seec/helper/service/CommentService.java

@@ -64,7 +64,7 @@ public interface CommentService extends AuthService<Comment> {
     CommentVO getOneComment(LoginUser user, Long commentId);
 
     /**
-     * 取得自己的评论
+     * 取得自己的评论(基于slide和pageNumber)
      *
      * @param user
      * @param slideId
@@ -83,4 +83,14 @@ public interface CommentService extends AuthService<Comment> {
      * @param show
      */
     void modifyCommentShow(LoginUser user, Long commentId, Boolean show);
+
+    /**
+     * 取得自己的评论
+     *
+     * @param user
+     * @param key
+     * @param pageable
+     * @return
+     */
+    Page<CommentVO> getSelfComments(LoginUser user, String key, Pageable pageable);
 }

+ 1 - 1
src/main/java/nju/seec/helper/service/EventService.java

@@ -1,6 +1,6 @@
 package nju.seec.helper.service;
 
-import nju.seec.helper.api.dataanalysis.model.Event;
+import nju.seec.helper.sys.dataanalysis.model.Event;
 
 import java.util.List;
 

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

@@ -1,8 +1,8 @@
 package nju.seec.helper.service;
 
-import nju.seec.helper.api.bok.dto.CollectDTO;
-import nju.seec.helper.api.bok.dto.RateDTO;
-import nju.seec.helper.api.bok.vo.InteractiveVO;
+import nju.seec.helper.sys.bok.dto.CollectDTO;
+import nju.seec.helper.sys.bok.dto.RateDTO;
+import nju.seec.helper.sys.bok.vo.InteractiveVO;
 import nju.seec.helper.aspect.auth.LoginUser;
 import nju.seec.helper.dto.question.BaseQuestionDTO;
 import nju.seec.helper.entity.Quiz;

+ 1 - 1
src/main/java/nju/seec/helper/service/RecordService.java

@@ -1,6 +1,6 @@
 package nju.seec.helper.service;
 
-import nju.seec.helper.api.dataanalysis.model.ExerciseRecord;
+import nju.seec.helper.sys.dataanalysis.model.ExerciseRecord;
 
 import java.util.List;
 

+ 8 - 5
src/main/java/nju/seec/helper/service/impl/CommentServiceImpl.java

@@ -12,7 +12,6 @@ import nju.seec.helper.enums.ExceptionType;
 import nju.seec.helper.enums.MessageType;
 import nju.seec.helper.exception.HelperException;
 import nju.seec.helper.service.CommentService;
-import nju.seec.helper.service.MessageService;
 import nju.seec.helper.vo.CommentVO;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -30,13 +29,10 @@ public class CommentServiceImpl implements CommentService {
     private final SlideDAO slideDAO;
     private final UserDAO userDAO;
 
-    private final MessageService messageService;
-
-    public CommentServiceImpl(CommentDAO commentDAO, SlideDAO slideDAO, UserDAO userDAO, MessageService messageService) {
+    public CommentServiceImpl(CommentDAO commentDAO, SlideDAO slideDAO, UserDAO userDAO) {
         this.commentDAO = commentDAO;
         this.slideDAO = slideDAO;
         this.userDAO = userDAO;
-        this.messageService = messageService;
     }
 
     @Message(MessageType.COMMENT_NEW)
@@ -52,6 +48,7 @@ public class CommentServiceImpl implements CommentService {
                         .setUser(userDAO.findUserById(user.getId()))
                         .setTitle(commentDTO.getTitle())
                         .setContent(commentDTO.getContent())
+                        .setShow(commentDTO.getShow())
         );
 
         return new CommentVO(comment);
@@ -146,6 +143,12 @@ public class CommentServiceImpl implements CommentService {
         commentDAO.save(comment.setShow(show));
     }
 
+    @Transactional(readOnly = true)
+    @Override
+    public Page<CommentVO> getSelfComments(LoginUser user, String key, Pageable pageable) {
+        return commentDAO.findByUserIdAndKey(user.getId(), key, pageable).map(CommentVO::new);
+    }
+
     private void unTopComment(Comment comment) {
         Integer topNumber = comment.getTopNumber();
         comment.setTopNumber(0);

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

@@ -1,8 +1,8 @@
 package nju.seec.helper.service.impl;
 
 import com.google.common.collect.Lists;
-import nju.seec.helper.api.dataanalysis.EventApi;
-import nju.seec.helper.api.dataanalysis.model.Event;
+import nju.seec.helper.sys.dataanalysis.api.EventApi;
+import nju.seec.helper.sys.dataanalysis.model.Event;
 import nju.seec.helper.dao.*;
 import nju.seec.helper.entity.*;
 import nju.seec.helper.enums.UserRole;

+ 9 - 9
src/main/java/nju/seec/helper/service/impl/QuestionServiceImpl.java

@@ -1,15 +1,15 @@
 package nju.seec.helper.service.impl;
 
 import cn.hutool.core.util.IdUtil;
-import nju.seec.helper.api.bok.QuestionApi;
-import nju.seec.helper.api.bok.QuestionQueryApi;
-import nju.seec.helper.api.bok.RecordApi;
-import nju.seec.helper.api.bok.UserInteractiveApi;
-import nju.seec.helper.api.bok.dto.CollectDTO;
-import nju.seec.helper.api.bok.dto.RateDTO;
-import nju.seec.helper.api.bok.vo.InteractiveVO;
-import nju.seec.helper.api.bok.vo.QuestionVO;
-import nju.seec.helper.api.bok.vo.RecordQuestionVO;
+import nju.seec.helper.sys.bok.api.QuestionApi;
+import nju.seec.helper.sys.bok.api.QuestionQueryApi;
+import nju.seec.helper.sys.bok.api.RecordApi;
+import nju.seec.helper.sys.bok.api.UserInteractiveApi;
+import nju.seec.helper.sys.bok.dto.CollectDTO;
+import nju.seec.helper.sys.bok.dto.RateDTO;
+import nju.seec.helper.sys.bok.vo.InteractiveVO;
+import nju.seec.helper.sys.bok.vo.QuestionVO;
+import nju.seec.helper.sys.bok.vo.RecordQuestionVO;
 import nju.seec.helper.aspect.auth.LoginUser;
 import nju.seec.helper.dao.ChooseDAO;
 import nju.seec.helper.dao.QuestionRecordDAO;

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

@@ -1,9 +1,9 @@
 package nju.seec.helper.service.impl;
 
-import nju.seec.helper.api.bok.RecordApi;
-import nju.seec.helper.api.bok.vo.RecordQuestionVO;
-import nju.seec.helper.api.dataanalysis.ExerciseApi;
-import nju.seec.helper.api.dataanalysis.model.ExerciseRecord;
+import nju.seec.helper.sys.bok.api.RecordApi;
+import nju.seec.helper.sys.bok.vo.RecordQuestionVO;
+import nju.seec.helper.sys.dataanalysis.api.ExerciseApi;
+import nju.seec.helper.sys.dataanalysis.model.ExerciseRecord;
 import nju.seec.helper.dao.UserDAO;
 import nju.seec.helper.service.RecordService;
 import org.springframework.data.domain.PageRequest;

+ 4 - 9
src/main/java/nju/seec/helper/api/bok/KnowledgeApi.java → src/main/java/nju/seec/helper/sys/bok/api/KnowledgeApi.java

@@ -1,10 +1,10 @@
-package nju.seec.helper.api.bok;
+package nju.seec.helper.sys.bok.api;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
-import nju.seec.helper.api.bok.vo.KnowledgeNodeVO;
+import nju.seec.helper.sys.bok.vo.KnowledgeNodeVO;
 import nju.seec.helper.util.RestRequestUtil;
-import nju.seec.helper.util.cache.CaffeineCacheUtils;
+import nju.seec.helper.util.cache.BaseCacheUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
@@ -22,15 +22,10 @@ public class KnowledgeApi {
     private String bokKnowledgeCacheName;
 
     private final RestRequestUtil restRequestUtil;
-    private final CaffeineCacheUtils cacheUtils;
+    private final BaseCacheUtils cacheUtils;
 
     private String url;
 
-    public KnowledgeApi(RestRequestUtil restRequestUtil, CaffeineCacheUtils cacheUtils) {
-        this.restRequestUtil = restRequestUtil;
-        this.cacheUtils = cacheUtils;
-    }
-
     @SuppressWarnings("unchecked")
     public List<KnowledgeNodeVO> getAllKnowledgeNodes() {
         Object cache = cacheUtils.get(bokKnowledgeCacheName, "all");

+ 6 - 11
src/main/java/nju/seec/helper/api/bok/QuestionApi.java → src/main/java/nju/seec/helper/sys/bok/api/QuestionApi.java

@@ -1,18 +1,18 @@
-package nju.seec.helper.api.bok;
+package nju.seec.helper.sys.bok.api;
 
 import com.google.common.collect.ImmutableMap;
 import lombok.Data;
-import nju.seec.helper.api.bok.constant.QuestionType;
-import nju.seec.helper.api.bok.vo.PageableQuestionListVO;
-import nju.seec.helper.api.bok.vo.QuestionVO;
 import nju.seec.helper.dto.question.BaseQuestionDTO;
 import nju.seec.helper.dto.question.ChoiceQuestionDTO;
 import nju.seec.helper.dto.question.TrueOrFalseQuestionDTO;
 import nju.seec.helper.enums.ExceptionType;
 import nju.seec.helper.exception.HelperException;
+import nju.seec.helper.sys.bok.constant.QuestionType;
+import nju.seec.helper.sys.bok.vo.PageableQuestionListVO;
+import nju.seec.helper.sys.bok.vo.QuestionVO;
 import nju.seec.helper.util.RestRequestUtil;
 import nju.seec.helper.util.StringUtils;
-import nju.seec.helper.util.cache.CaffeineCacheUtils;
+import nju.seec.helper.util.cache.BaseCacheUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.data.domain.Page;
@@ -37,15 +37,10 @@ public class QuestionApi {
     private String bokQuestionCacheName;
 
     private final RestRequestUtil restRequestUtil;
-    private final CaffeineCacheUtils cacheUtils;
+    private final BaseCacheUtils cacheUtils;
     private String url;
     private String searchUrl;
 
-    public QuestionApi(RestRequestUtil restRequestUtil, CaffeineCacheUtils cacheUtils) {
-        this.restRequestUtil = restRequestUtil;
-        this.cacheUtils = cacheUtils;
-    }
-
     public Page<QuestionVO> getQuestionList(String stem, String tag, String knowledgeId, Pageable pageable) {
         Map<String, ?> urlParams = ImmutableMap.<String, Object>builder()
                 .put("stem", stem)

+ 4 - 9
src/main/java/nju/seec/helper/api/bok/QuestionQueryApi.java → src/main/java/nju/seec/helper/sys/bok/api/QuestionQueryApi.java

@@ -1,14 +1,14 @@
-package nju.seec.helper.api.bok;
+package nju.seec.helper.sys.bok.api;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
-import nju.seec.helper.api.bok.vo.QuestionVO;
+import nju.seec.helper.sys.bok.vo.QuestionVO;
 import nju.seec.helper.util.JsonUtils;
 import nju.seec.helper.util.RestRequestUtil;
-import nju.seec.helper.util.cache.CaffeineCacheUtils;
+import nju.seec.helper.util.cache.BaseCacheUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
@@ -28,15 +28,10 @@ public class QuestionQueryApi {
     private String bokQuestionCacheName;
 
     private final RestRequestUtil restRequestUtil;
-    private final CaffeineCacheUtils cacheUtils;
+    private final BaseCacheUtils cacheUtils;
 
     private String byIdUrl;
 
-    public QuestionQueryApi(RestRequestUtil restRequestUtil, CaffeineCacheUtils cacheUtils) {
-        this.restRequestUtil = restRequestUtil;
-        this.cacheUtils = cacheUtils;
-    }
-
     @SuppressWarnings({"unchecked", "rawtypes"})
     public List<QuestionVO> getQuestionListById(final List<String> ids) {
         Map<String, QuestionVO> bokQuestionsMap = Maps.newHashMapWithExpectedSize(ids.size());

+ 3 - 3
src/main/java/nju/seec/helper/api/bok/RecordApi.java → src/main/java/nju/seec/helper/sys/bok/api/RecordApi.java

@@ -1,9 +1,9 @@
-package nju.seec.helper.api.bok;
+package nju.seec.helper.sys.bok.api;
 
 import com.google.common.collect.ImmutableMap;
 import lombok.Data;
-import nju.seec.helper.api.bok.dto.RecordDTO;
-import nju.seec.helper.api.bok.vo.RecordQuestionVO;
+import nju.seec.helper.sys.bok.dto.RecordDTO;
+import nju.seec.helper.sys.bok.vo.RecordQuestionVO;
 import nju.seec.helper.util.RestRequestUtil;
 import nju.seec.helper.util.StringUtils;
 import org.springframework.boot.context.properties.ConfigurationProperties;

+ 6 - 13
src/main/java/nju/seec/helper/api/bok/UserInteractiveApi.java → src/main/java/nju/seec/helper/sys/bok/api/UserInteractiveApi.java

@@ -1,17 +1,16 @@
-package nju.seec.helper.api.bok;
+package nju.seec.helper.sys.bok.api;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
-import nju.seec.helper.api.bok.dto.CollectDTO;
-import nju.seec.helper.api.bok.dto.RateDTO;
-import nju.seec.helper.api.bok.vo.InteractiveVO;
-import nju.seec.helper.api.bok.vo.PageableQuestionListVO;
-import nju.seec.helper.api.bok.vo.QuestionVO;
+import nju.seec.helper.sys.bok.dto.CollectDTO;
+import nju.seec.helper.sys.bok.dto.RateDTO;
+import nju.seec.helper.sys.bok.vo.InteractiveVO;
+import nju.seec.helper.sys.bok.vo.PageableQuestionListVO;
+import nju.seec.helper.sys.bok.vo.QuestionVO;
 import nju.seec.helper.util.JsonUtils;
 import nju.seec.helper.util.RestRequestUtil;
 import nju.seec.helper.util.StringUtils;
-import nju.seec.helper.util.cache.CaffeineCacheUtils;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
@@ -29,18 +28,12 @@ import java.util.Map;
 @Data
 public class UserInteractiveApi {
     private final RestRequestUtil restRequestUtil;
-    private final CaffeineCacheUtils cacheUtils;
 
     private String rateUrl;
     private String collectionUrl;
     private String questionUrl;
     private String interactiveUrl;
 
-    public UserInteractiveApi(RestRequestUtil restRequestUtil, CaffeineCacheUtils cacheUtils) {
-        this.restRequestUtil = restRequestUtil;
-        this.cacheUtils = cacheUtils;
-    }
-
     public void collectQuestion(String userId, String questionId, CollectDTO collectDTO) {
         restRequestUtil.sendPostRequest(collectionUrl, collectDTO, Object.class, ImmutableMap.of("userId", userId, "questionId", questionId));
     }

+ 1 - 1
src/main/java/nju/seec/helper/api/bok/constant/QuestionType.java → src/main/java/nju/seec/helper/sys/bok/constant/QuestionType.java

@@ -1,4 +1,4 @@
-package nju.seec.helper.api.bok.constant;
+package nju.seec.helper.sys.bok.constant;
 
 
 /**

+ 1 - 1
src/main/java/nju/seec/helper/api/bok/dto/CollectDTO.java → src/main/java/nju/seec/helper/sys/bok/dto/CollectDTO.java

@@ -1,4 +1,4 @@
-package nju.seec.helper.api.bok.dto;
+package nju.seec.helper.sys.bok.dto;
 
 import lombok.Data;
 

+ 1 - 1
src/main/java/nju/seec/helper/api/bok/dto/RateDTO.java → src/main/java/nju/seec/helper/sys/bok/dto/RateDTO.java

@@ -1,4 +1,4 @@
-package nju.seec.helper.api.bok.dto;
+package nju.seec.helper.sys.bok.dto;
 
 import lombok.Data;
 

+ 1 - 1
src/main/java/nju/seec/helper/api/bok/dto/RecordDTO.java → src/main/java/nju/seec/helper/sys/bok/dto/RecordDTO.java

@@ -1,4 +1,4 @@
-package nju.seec.helper.api.bok.dto;
+package nju.seec.helper.sys.bok.dto;
 
 import lombok.Builder;
 import lombok.Data;

+ 1 - 1
src/main/java/nju/seec/helper/api/bok/vo/InteractiveVO.java → src/main/java/nju/seec/helper/sys/bok/vo/InteractiveVO.java

@@ -1,4 +1,4 @@
-package nju.seec.helper.api.bok.vo;
+package nju.seec.helper.sys.bok.vo;
 
 import lombok.Data;
 

+ 1 - 1
src/main/java/nju/seec/helper/api/bok/vo/KnowledgeNodeVO.java → src/main/java/nju/seec/helper/sys/bok/vo/KnowledgeNodeVO.java

@@ -1,4 +1,4 @@
-package nju.seec.helper.api.bok.vo;
+package nju.seec.helper.sys.bok.vo;
 
 import lombok.Data;
 

+ 1 - 1
src/main/java/nju/seec/helper/api/bok/vo/PageVO.java → src/main/java/nju/seec/helper/sys/bok/vo/PageVO.java

@@ -1,4 +1,4 @@
-package nju.seec.helper.api.bok.vo;
+package nju.seec.helper.sys.bok.vo;
 
 import lombok.Data;
 

+ 1 - 1
src/main/java/nju/seec/helper/api/bok/vo/PageableQuestionListVO.java → src/main/java/nju/seec/helper/sys/bok/vo/PageableQuestionListVO.java

@@ -1,4 +1,4 @@
-package nju.seec.helper.api.bok.vo;
+package nju.seec.helper.sys.bok.vo;
 
 import lombok.Data;
 

+ 2 - 2
src/main/java/nju/seec/helper/api/bok/vo/QuestionVO.java → src/main/java/nju/seec/helper/sys/bok/vo/QuestionVO.java

@@ -1,7 +1,7 @@
-package nju.seec.helper.api.bok.vo;
+package nju.seec.helper.sys.bok.vo;
 
 import lombok.Data;
-import nju.seec.helper.api.bok.constant.QuestionType;
+import nju.seec.helper.sys.bok.constant.QuestionType;
 
 import java.util.Date;
 import java.util.List;

+ 1 - 1
src/main/java/nju/seec/helper/api/bok/vo/RecordQuestionVO.java → src/main/java/nju/seec/helper/sys/bok/vo/RecordQuestionVO.java

@@ -1,4 +1,4 @@
-package nju.seec.helper.api.bok.vo;
+package nju.seec.helper.sys.bok.vo;
 
 import lombok.AllArgsConstructor;
 import lombok.Builder;

+ 1 - 1
src/main/java/nju/seec/helper/api/bok/vo/RecordVO.java → src/main/java/nju/seec/helper/sys/bok/vo/RecordVO.java

@@ -1,4 +1,4 @@
-package nju.seec.helper.api.bok.vo;
+package nju.seec.helper.sys.bok.vo;
 
 import lombok.AllArgsConstructor;
 import lombok.Builder;

+ 5 - 9
src/main/java/nju/seec/helper/api/dataanalysis/EventApi.java → src/main/java/nju/seec/helper/sys/dataanalysis/api/EventApi.java

@@ -1,12 +1,12 @@
-package nju.seec.helper.api.dataanalysis;
+package nju.seec.helper.sys.dataanalysis.api;
 
 import cn.hutool.core.util.StrUtil;
 import lombok.Data;
-import nju.seec.helper.api.dataanalysis.constant.EventAction;
-import nju.seec.helper.api.dataanalysis.constant.EventType;
-import nju.seec.helper.api.dataanalysis.model.Event;
 import nju.seec.helper.entity.Course;
 import nju.seec.helper.entity.Quiz;
+import nju.seec.helper.sys.dataanalysis.constant.EventAction;
+import nju.seec.helper.sys.dataanalysis.constant.EventType;
+import nju.seec.helper.sys.dataanalysis.model.Event;
 import nju.seec.helper.util.RestRequestUtil;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.scheduling.annotation.Async;
@@ -24,14 +24,10 @@ public class EventApi {
     private String reportUrl;
     private final RestRequestUtil restRequestUtil;
 
-    public EventApi(RestRequestUtil restRequestUtil) {
-        this.restRequestUtil = restRequestUtil;
-    }
-
     @Async
     public void reportEvent(Event event) {
 //        System.out.println(event);
-//            restRequestUtil.sendPostRequest(eventReportUrl, event, Boolean.class);
+//        restRequestUtil.sendPostRequest(eventReportUrl, event, Boolean.class);
     }
 
     /**

+ 2 - 6
src/main/java/nju/seec/helper/api/dataanalysis/ExerciseApi.java → src/main/java/nju/seec/helper/sys/dataanalysis/api/ExerciseApi.java

@@ -1,7 +1,7 @@
-package nju.seec.helper.api.dataanalysis;
+package nju.seec.helper.sys.dataanalysis.api;
 
 import lombok.Data;
-import nju.seec.helper.api.dataanalysis.model.ExerciseRecord;
+import nju.seec.helper.sys.dataanalysis.model.ExerciseRecord;
 import nju.seec.helper.util.RestRequestUtil;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.scheduling.annotation.Async;
@@ -21,10 +21,6 @@ public class ExerciseApi {
     private String reportUrl;
     private final RestRequestUtil restRequestUtil;
 
-    public ExerciseApi(RestRequestUtil restRequestUtil) {
-        this.restRequestUtil = restRequestUtil;
-    }
-
     @Async
     public void reportExercise(List<ExerciseRecord> exerciseRecords) {
 //        System.out.println(exerciseRecords);

+ 1 - 1
src/main/java/nju/seec/helper/api/dataanalysis/constant/EventAction.java → src/main/java/nju/seec/helper/sys/dataanalysis/constant/EventAction.java

@@ -1,4 +1,4 @@
-package nju.seec.helper.api.dataanalysis.constant;
+package nju.seec.helper.sys.dataanalysis.constant;
 
 import lombok.Getter;
 

+ 1 - 1
src/main/java/nju/seec/helper/api/dataanalysis/constant/EventType.java → src/main/java/nju/seec/helper/sys/dataanalysis/constant/EventType.java

@@ -1,4 +1,4 @@
-package nju.seec.helper.api.dataanalysis.constant;
+package nju.seec.helper.sys.dataanalysis.constant;
 
 import lombok.Getter;
 

+ 3 - 3
src/main/java/nju/seec/helper/api/dataanalysis/model/Event.java → src/main/java/nju/seec/helper/sys/dataanalysis/model/Event.java

@@ -1,9 +1,9 @@
-package nju.seec.helper.api.dataanalysis.model;
+package nju.seec.helper.sys.dataanalysis.model;
 
 import lombok.Builder;
 import lombok.Data;
-import nju.seec.helper.api.dataanalysis.constant.EventAction;
-import nju.seec.helper.api.dataanalysis.constant.EventType;
+import nju.seec.helper.sys.dataanalysis.constant.EventAction;
+import nju.seec.helper.sys.dataanalysis.constant.EventType;
 
 import java.time.LocalDateTime;
 

+ 1 - 1
src/main/java/nju/seec/helper/api/dataanalysis/model/ExerciseRecord.java → src/main/java/nju/seec/helper/sys/dataanalysis/model/ExerciseRecord.java

@@ -1,4 +1,4 @@
-package nju.seec.helper.api.dataanalysis.model;
+package nju.seec.helper.sys.dataanalysis.model;
 
 import lombok.Builder;
 import lombok.Data;

+ 5 - 3
src/main/java/nju/seec/helper/util/OssUtils.java

@@ -9,7 +9,7 @@ import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import nju.seec.helper.enums.ExceptionType;
 import nju.seec.helper.exception.HelperException;
-import nju.seec.helper.util.cache.CaffeineCacheUtils;
+import nju.seec.helper.util.cache.BaseCacheUtils;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
@@ -34,7 +34,7 @@ public class OssUtils {
     private String bucketName;
     private long objectUrlLivingSeconds;
     private String objectUrlCacheName;
-    private final CaffeineCacheUtils cacheUtils;
+    private final BaseCacheUtils cacheUtils;
 
     public void upload(String objectName, InputStream inputStream) {
         OSS ossClient = getOss();
@@ -60,7 +60,9 @@ public class OssUtils {
         Date expiration = new Date(System.currentTimeMillis() + objectUrlLivingSeconds * 1000);
         try {
             URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
-            return url.toString();
+            String objectUrl = url.toString();
+            cacheUtils.set(objectUrlCacheName, objectName, objectUrl);
+            return objectUrl;
         } catch (OSSException | ClientException e) {
             log.error(e.getMessage());
             throw HelperException.of(ExceptionType.ERROR, "获取文件链接失败");

+ 52 - 0
src/main/java/nju/seec/helper/util/cache/BaseCacheUtils.java

@@ -0,0 +1,52 @@
+package nju.seec.helper.util.cache;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * @author cst
+ */
+public interface BaseCacheUtils {
+    /**
+     * 设置缓存
+     *
+     * @param cacheName
+     * @param key
+     * @param value
+     */
+    void set(String cacheName, String key, Object value);
+
+    /**
+     * 批量设置缓存
+     *
+     * @param cacheName
+     * @param valueMap
+     */
+    void setAll(String cacheName, Map<String, Object> valueMap);
+
+    /**
+     * 获取缓存
+     *
+     * @param cacheName
+     * @param key
+     * @return
+     */
+    Object get(String cacheName, String key);
+
+    /**
+     * 批量获取缓存
+     *
+     * @param cacheName
+     * @param keys
+     * @return
+     */
+    Map<String, Object> multiGet(String cacheName, Collection<String> keys);
+
+    /**
+     * 删除缓存
+     *
+     * @param cacheName
+     * @param key
+     */
+    void delete(String cacheName, String key);
+}

+ 8 - 7
src/main/java/nju/seec/helper/util/cache/CaffeineCacheUtils.java

@@ -16,7 +16,7 @@ import java.util.stream.Collectors;
  * updated by cst
  */
 @Component
-public class CaffeineCacheUtils {
+public class CaffeineCacheUtils implements BaseCacheUtils {
     private final Cache<String, Object> cache;
 
     public CaffeineCacheUtils(@Value("${helper.cache.maximumSize}") Long maximumSize,
@@ -25,37 +25,38 @@ public class CaffeineCacheUtils {
         cache = Caffeine
                 .newBuilder()
                 .maximumSize(maximumSize)
-                .expireAfterAccess(expireAfterAccessInSeconds, TimeUnit.SECONDS)
+//                .expireAfterAccess(expireAfterAccessInSeconds, TimeUnit.SECONDS)
                 .expireAfterWrite(expireAfterWriteInSeconds, TimeUnit.SECONDS)
                 .build();
     }
 
+    @Override
     public void set(String cacheName, String key, Object value) {
         cache.put(combineKey(cacheName, key), value);
     }
 
+    @Override
     public void setAll(String cacheName, Map<String, Object> putAll) {
         final Map<String, Object> all = putAll.entrySet().stream().collect(Collectors.toMap(entry -> combineKey(cacheName, entry.getKey()), Map.Entry::getValue));
         cache.putAll(all);
     }
 
+    @Override
     public Object get(String cacheName, String key) {
         return cache.getIfPresent(combineKey(cacheName, key));
     }
 
+    @Override
     public Map<String, Object> multiGet(String cacheName, Collection<String> keys) {
         Collection<String> body = keys.stream().map(s -> combineKey(cacheName, s)).collect(Collectors.toList());
         return cache.getAllPresent(body);
     }
 
-    public void invalidate(String cacheName, String key) {
+    @Override
+    public void delete(String cacheName, String key) {
         cache.invalidate(combineKey(cacheName, key));
     }
 
-    public void invalidateAll() {
-        cache.invalidateAll();
-    }
-
     private String combineKey(String cacheName, String key) {
         return cacheName + ":" + key;
     }

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

@@ -22,7 +22,7 @@ public class CommentVO {
      */
     private Integer pageNumber;
     /**
-     * 置顶优先级(越大说明越高,为null说明不是置顶评论)
+     * 置顶优先级
      */
     private Integer topNumber;
     private String title;

+ 2 - 2
src/main/java/nju/seec/helper/vo/question/BaseQuestionVO.java

@@ -2,8 +2,8 @@ package nju.seec.helper.vo.question;
 
 import lombok.Data;
 import lombok.NonNull;
-import nju.seec.helper.api.bok.constant.QuestionType;
-import nju.seec.helper.api.bok.vo.QuestionVO;
+import nju.seec.helper.sys.bok.constant.QuestionType;
+import nju.seec.helper.sys.bok.vo.QuestionVO;
 
 import java.util.Date;
 import java.util.List;

+ 1 - 1
src/main/java/nju/seec/helper/vo/question/ChoiceQuestionVO.java

@@ -3,7 +3,7 @@ package nju.seec.helper.vo.question;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NonNull;
-import nju.seec.helper.api.bok.vo.QuestionVO;
+import nju.seec.helper.sys.bok.vo.QuestionVO;
 
 /**
  * @author xst

+ 1 - 1
src/main/java/nju/seec/helper/vo/question/TrueOrFalseQuestionVO.java

@@ -4,7 +4,7 @@ import cn.hutool.core.convert.Convert;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NonNull;
-import nju.seec.helper.api.bok.vo.QuestionVO;
+import nju.seec.helper.sys.bok.vo.QuestionVO;
 
 /**
  * @author xst

+ 21 - 0
src/test/java/nju/seec/helper/HelperApplicationTests.java

@@ -1,14 +1,35 @@
 package nju.seec.helper;
 
+import lombok.SneakyThrows;
+import nju.seec.helper.util.cache.BaseCacheUtils;
 import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
 class HelperApplicationTests {
+    @Autowired
+    private BaseCacheUtils cacheUtils;
 
+    @SneakyThrows
     @Test
     void contextLoads() {
 
     }
 
+//    @Test
+//    void testOne() {
+//        System.out.println(cacheUtils.get("n", "123"));
+//        cacheUtils.set("n", "123", "123456");
+//        for (int i = 0; i < 10; i++)
+//            System.out.println(cacheUtils.get("n", "123"));
+//    }
+
+//    @Test
+//    void testAll() {
+//        Map<String, Object> ids = Stream.of(1, 2, 3, 4, 5, 6).map(num -> num + "").collect(Collectors.toMap(key -> key, key -> key));
+//        cacheUtils.setAll("test", ids);
+//        System.out.println(cacheUtils.multiGet("test", ImmutableList.of("1", "2", "3")));
+//    }
+
 }