Explorar o código

fix: 修复课件假删除后,测试仍可见的bug

ChenSiTong %!s(int64=6) %!d(string=hai) anos
pai
achega
3f155e677b

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

@@ -2,14 +2,12 @@ package nju.seec.helper.controller;
 
 import nju.seec.helper.aspect.auth.Auth;
 import nju.seec.helper.controller.response.PageResponse;
-import nju.seec.helper.dto.question.BaseQuestionDTO;
 import nju.seec.helper.dto.user.LoginUser;
 import nju.seec.helper.service.QuestionService;
 import nju.seec.helper.util.enums.UserType;
 import nju.seec.helper.vo.question.BaseQuestionVO;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.web.PageableDefault;
-import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -49,6 +47,12 @@ public class QuestionController {
         return questionService.getQuestionsByQuiz(user, quizId);
     }
 
+    @Auth(roles = UserType.TEACHER, message = "获取题目信息")
+    @GetMapping("/{questionId}")
+    public BaseQuestionVO getOneQuestion(LoginUser user, @PathVariable("questionId") String questionId) {
+        return questionService.getOneQuestion(user, questionId);
+    }
+
 //    @Auth(roles = UserType.TEACHER, message = "创建题目")
 //    @PostMapping
 //    public BaseQuestionVO createQuestion(LoginUser user, @Validated @RequestBody BaseQuestionDTO baseQuestionDTO) {

+ 0 - 10
src/main/java/nju/seec/helper/dao/BaseQuestionDAO.java

@@ -1,10 +0,0 @@
-//package nju.seec.helper.dao;
-//
-//import nju.seec.helper.entity.question.BaseQuestion;
-//import org.springframework.data.jpa.repository.JpaRepository;
-//
-///**
-// * @author cst
-// */
-//public interface BaseQuestionDAO extends JpaRepository<BaseQuestion, Long> {
-//}

+ 0 - 21
src/main/java/nju/seec/helper/dto/QuestionStudentAnswerDTO.java

@@ -1,21 +0,0 @@
-//package nju.seec.helper.dto;
-//
-//
-//import com.fasterxml.jackson.annotation.JsonProperty;
-//import lombok.Data;
-//
-//import javax.validation.constraints.NotBlank;
-//import javax.validation.constraints.NotNull;
-//
-///**
-// * @author sheen
-// */
-//@Data
-//public class QuestionStudentAnswerDTO {
-//    @JsonProperty(value = "id")
-//    @NotBlank
-//    private String questionId;
-//    @JsonProperty(value = "studentAnswer")
-//    @NotNull
-//    private Object studentAnswer;
-//}

+ 0 - 10
src/main/java/nju/seec/helper/dto/QuizAnswerDTO.java

@@ -1,10 +0,0 @@
-//package nju.seec.helper.dto;
-//
-//import lombok.Data;
-//
-//import java.util.List;
-//
-//@Data
-//public class QuizAnswerDTO {
-//    List<QuestionStudentAnswerDTO> answers;
-//}

+ 0 - 20
src/main/java/nju/seec/helper/dto/QuizUpdateDTO.java

@@ -1,20 +0,0 @@
-//package nju.seec.helper.dto;
-//
-//import lombok.Data;
-//import nju.seec.helper.util.enums.SlideState;
-//
-//import java.util.List;
-//
-///**
-// * @author sheen
-// */
-//
-//@Data
-//public class QuizUpdateDTO {
-//    String id;
-//    String name;
-//    SlideState quizTime;
-//    String slideId;
-//    List<String> questions;
-//
-//}

+ 0 - 34
src/main/java/nju/seec/helper/entity/question/BaseQuestion.java

@@ -1,34 +0,0 @@
-//package nju.seec.helper.entity.question;
-//
-//import lombok.Data;
-//import lombok.experimental.Accessors;
-//import nju.seec.helper.entity.User;
-//import nju.seec.helper.util.enums.QuestionType;
-//
-//import javax.persistence.*;
-//
-///**
-// * @author cst
-// */
-//@Data
-//@Accessors(chain = true)
-//@MappedSuperclass
-//public abstract class BaseQuestion {
-//    @Id
-//    @GeneratedValue(strategy = GenerationType.IDENTITY)
-//    protected Long id;
-//
-//    @Column(nullable = false, columnDefinition = "text not null")
-//    protected String stem;
-//
-//    @Column(nullable = false, columnDefinition = "text not null")
-//    protected String analysis;
-//
-//    @Enumerated(EnumType.STRING)
-//    @Column(nullable = false)
-//    protected QuestionType type;
-//
-//    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.LAZY)
-//    @JoinColumn(name = "teacher_id", nullable = false, foreignKey = @ForeignKey(name = "question_teacher"))
-//    protected User teacher;
-//}

+ 0 - 32
src/main/java/nju/seec/helper/entity/question/ChoiceQuestion.java

@@ -1,32 +0,0 @@
-//package nju.seec.helper.entity.question;
-//
-//import lombok.Data;
-//import lombok.EqualsAndHashCode;
-//import lombok.experimental.Accessors;
-//import nju.seec.helper.entity.converter.MapConverter;
-//import nju.seec.helper.util.enums.QuestionType;
-//
-//import javax.persistence.Convert;
-//import javax.persistence.Entity;
-//import javax.persistence.Table;
-//import java.util.Map;
-//
-///**
-// * @author cst
-// */
-//@EqualsAndHashCode(callSuper = true)
-//@Data
-//@Accessors(chain = true)
-//@Entity
-//@Table(name = "question_choice")
-//public class ChoiceQuestion extends BaseQuestion {
-//    @SuppressWarnings("all")
-//    @Convert(converter = MapConverter.class)
-//    private Map<String, String> options;
-//
-//    private String answer;
-//
-//    public ChoiceQuestion() {
-//        this.type = QuestionType.CHOICE;
-//    }
-//}

+ 0 - 25
src/main/java/nju/seec/helper/entity/question/TrueOrFalseQuestion.java

@@ -1,25 +0,0 @@
-//package nju.seec.helper.entity.question;
-//
-//import lombok.Data;
-//import lombok.EqualsAndHashCode;
-//import lombok.experimental.Accessors;
-//import nju.seec.helper.util.enums.QuestionType;
-//
-//import javax.persistence.Entity;
-//import javax.persistence.Table;
-//
-///**
-// * @author cst
-// */
-//@EqualsAndHashCode(callSuper = true)
-//@Data
-//@Accessors(chain = true)
-//@Entity
-//@Table(name = "question_true_or_false")
-//public class TrueOrFalseQuestion extends BaseQuestion {
-//    private Boolean answer;
-//
-//    public TrueOrFalseQuestion() {
-//        this.type = QuestionType.TRUE_FALSE;
-//    }
-//}

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

@@ -1,6 +1,5 @@
 package nju.seec.helper.service;
 
-import nju.seec.helper.dto.question.BaseQuestionDTO;
 import nju.seec.helper.dto.user.LoginUser;
 import nju.seec.helper.entity.Quiz;
 import nju.seec.helper.vo.question.BaseQuestionVO;
@@ -25,14 +24,6 @@ public interface QuestionService {
      */
     Page<BaseQuestionVO> getQuestions(LoginUser user, String stem, Pageable pageable);
 
-    /**
-     * 取得题目详情
-     *
-     * @param questionId
-     * @return
-     */
-    BaseQuestionVO getQuestion(String questionId);
-
     /**
      * 根据测试获取题目
      *
@@ -50,11 +41,12 @@ public interface QuestionService {
      */
     List<BaseQuestionVO> getQuestionsByQuiz(Quiz quiz);
 
-//    /**
-//     * 创建题目
-//     * @param user
-//     * @param baseQuestionDTO
-//     * @return
-//     */
-//    BaseQuestionVO createQuestion(LoginUser user, BaseQuestionDTO baseQuestionDTO);
+    /**
+     * 获取某一题目
+     *
+     * @param user
+     * @param questionId
+     * @return
+     */
+    BaseQuestionVO getOneQuestion(LoginUser user, String questionId);
 }

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

@@ -185,8 +185,8 @@ public class CourseServiceImpl implements CourseService {
                 (Specification<Course>) (root, query, cb) -> cb.and(
                         cb.equal(root.get("teacher").get("id"), teacherId)
                         , cb.equal(root.get("deleteAt"), 0L)
-//                        , cb.like(root.get("name"), StringUtils.keyPattern(key))
-                        ),
+                        , cb.like(root.get("name"), StringUtils.keyPattern(key))
+                ),
                 pageable);
     }
 

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

@@ -26,18 +26,15 @@ import java.util.List;
 public class QuestionServiceImpl implements QuestionService {
     private final QuizDAO quizDAO;
     private final UserDAO userDAO;
-//    private final BaseQuestionDAO baseQuestionDAO;
 
     private final BokUtil bokUtil;
 
     @Autowired
     public QuestionServiceImpl(QuizDAO quizDAO
             , UserDAO userDAO
-//            , BaseQuestionDAO baseQuestionDAO
             , BokUtil bokUtil) {
         this.quizDAO = quizDAO;
         this.userDAO = userDAO;
-//        this.baseQuestionDAO = baseQuestionDAO;
         this.bokUtil = bokUtil;
     }
 
@@ -46,11 +43,6 @@ public class QuestionServiceImpl implements QuestionService {
         return bokUtil.bokFindByStemLike(stem, pageable, true);
     }
 
-    @Override
-    public BaseQuestionVO getQuestion(String questionId) {
-        return bokUtil.bokFindById(questionId, true);
-    }
-
     @Transactional(readOnly = true)
     @Override
     public List<BaseQuestionVO> getQuestionsByQuiz(LoginUser user, Long quizId) {
@@ -66,32 +58,9 @@ public class QuestionServiceImpl implements QuestionService {
         return bokUtil.bokFindByIdIn(questionIds, true);
     }
 
-//    @Transactional(rollbackFor = Exception.class)
-//    @Override
-//    public BaseQuestionVO createQuestion(LoginUser user, BaseQuestionDTO baseQuestionDTO) {
-//        BaseQuestion baseQuestion = getQuestion(baseQuestionDTO);
-//        baseQuestion.setTeacher(userDAO.findUserById(user.getId()));
-//        baseQuestion = baseQuestionDAO.save(baseQuestion);
-//        return BaseQuestionVO.convertBaseQuestionToVO(baseQuestion, true);
-//    }
-//
-//    private BaseQuestion getQuestion(BaseQuestionDTO baseQuestionDTO) {
-//        switch (QuestionType.valueOf(baseQuestionDTO.getType())) {
-//            case CHOICE:
-//                ChoiceQuestion choiceQuestion = new ChoiceQuestion();
-//                choiceQuestion.setStem(baseQuestionDTO.getStem());
-//                choiceQuestion.setAnalysis(baseQuestionDTO.getAnalysis());
-//                choiceQuestion.setOptions(((ChoiceQuestionDTO) baseQuestionDTO).getOptions());
-//                choiceQuestion.setAnswer(((ChoiceQuestionDTO) baseQuestionDTO).getAnswer());
-//                return choiceQuestion;
-//            case TRUE_FALSE:
-//                TrueOrFalseQuestion trueOrFalseQuestion = new TrueOrFalseQuestion();
-//                trueOrFalseQuestion.setStem(baseQuestionDTO.getStem());
-//                trueOrFalseQuestion.setAnalysis(baseQuestionDTO.getAnalysis());
-//                trueOrFalseQuestion.setAnswer(((TrueOrFalseQuestionDTO) baseQuestionDTO).getAnswer());
-//                return trueOrFalseQuestion;
-//            default:
-//                throw HelperException.of(ExceptionType.FORBIDDEN, "暂时无法创建该类型的题目");
-//        }
-//    }
+    @Transactional(readOnly = true)
+    @Override
+    public BaseQuestionVO getOneQuestion(LoginUser user, String questionId) {
+        return bokUtil.bokFindById(questionId, true);
+    }
 }

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

@@ -198,6 +198,8 @@ public class QuizServiceImpl implements QuizService {
                         , cb.equal(root.get("deleteAt"), 0L)
                         , cb.equal(root.get("state"), state)
                         , cb.like(root.get("name"), StringUtils.keyPattern(key))
+                        , cb.equal(root.get("slide").get("deleteAt"), 0L)
+                        , cb.equal(root.get("course").get("deleteAt"), 0L)
                 ),
                 pageable);
     }
@@ -208,6 +210,8 @@ public class QuizServiceImpl implements QuizService {
                         cb.equal(root.get("slide").get("id"), slideId)
                         , cb.equal(root.get("deleteAt"), 0L)
                         , cb.like(root.get("name"), StringUtils.keyPattern(key))
+                        , cb.equal(root.get("slide").get("deleteAt"), 0L)
+                        , cb.equal(root.get("course").get("deleteAt"), 0L)
                 ),
                 pageable);
     }
@@ -218,8 +222,11 @@ public class QuizServiceImpl implements QuizService {
                 (Specification<Quiz>) (root, query, cb) -> cb.and(
                         cb.equal(root.get("slide").get("id"), slideId)
                         , cb.equal(root.get("deleteAt"), 0L)
-//                        , cb.like(root.get("name"), StringUtils.keyPattern(key))
-                        , cb.not(root.get("state").in(exclusiveStates))),
+                        , cb.like(root.get("name"), StringUtils.keyPattern(key))
+                        , cb.not(root.get("state").in(exclusiveStates))
+                        , cb.equal(root.get("slide").get("deleteAt"), 0L)
+                        , cb.equal(root.get("course").get("deleteAt"), 0L)
+                ),
                 pageable);
     }
 }

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

@@ -275,6 +275,7 @@ public class SlideServiceImpl implements SlideService {
                         cb.equal(root.get("teacher").get("id"), teacherId)
                         , cb.equal(root.get("deleteAt"), 0L)
                         , cb.like(root.get("name"), StringUtils.keyPattern(key))
+                        , cb.equal(root.get("course").get("deleteAt"), 0L)
                 ),
                 pageable);
     }
@@ -285,6 +286,7 @@ public class SlideServiceImpl implements SlideService {
                         cb.equal(root.get("course").get("id"), courseId)
                         , cb.equal(root.get("deleteAt"), 0L)
                         , cb.like(root.get("name"), StringUtils.keyPattern(key))
+                        , cb.equal(root.get("course").get("deleteAt"), 0L)
                 ),
                 pageable);
     }
@@ -296,6 +298,7 @@ public class SlideServiceImpl implements SlideService {
                         , cb.equal(root.get("deleteAt"), 0L)
                         , cb.like(root.get("name"), StringUtils.keyPattern(key))
                         , cb.not(root.get("state").in(exclusiveStates))
+                        , cb.equal(root.get("course").get("deleteAt"), 0L)
                 ),
                 pageable);
     }

+ 2 - 2
src/main/java/nju/seec/helper/util/GuavaCacheUtil.java

@@ -24,10 +24,10 @@ public class GuavaCacheUtil {
     private Long maximumSize = 1000L;
 
     @Value("${guavaCache.expireAfterAccessInSeconds}")
-    private Long expireAfterAccessInSeconds = 1800L;
+    private Long expireAfterAccessInSeconds = 0L;
 
     @Value("${guavaCache.expireAfterWriteInSeconds}")
-    private Long expireAfterWriteInSeconds = 3600L;
+    private Long expireAfterWriteInSeconds = 600L;
 
     public GuavaCacheUtil() {
         CacheBuilder<Object, Object> builder = CacheBuilder.newBuilder();

+ 0 - 27
src/main/java/nju/seec/helper/vo/quiz/QuizResultVO.java

@@ -1,27 +0,0 @@
-//package nju.seec.helper.vo.quiz;
-//
-//import com.fasterxml.jackson.annotation.JsonUnwrapped;
-//import lombok.Data;
-//import nju.seec.helper.entity.QuizStudentAnswer;
-//import nju.seec.helper.entity.StudentScore;
-//import nju.seec.helper.entity.User;
-//import nju.seec.helper.vo.UserVO;
-//
-//import java.util.List;
-//import java.util.Map;
-//import java.util.stream.Collectors;
-//
-//@Data
-//public class QuizResultVO {
-//    @JsonUnwrapped
-//    UserVO student;
-//    Integer score;
-//    Map<String, Boolean> detail;
-//
-//    public QuizResultVO(StudentScore studentScore, User student, List<QuizStudentAnswer> list) {
-//        this.student = new UserVO(student);
-//        this.score = studentScore.getScore();
-//        this.detail = list.stream().collect(
-//                Collectors.toMap(QuizStudentAnswer::getQuestionId, QuizStudentAnswer::getPass));
-//    }
-//}

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

@@ -30,17 +30,6 @@ public class QuizVO {
     private LocalDateTime createAt;
     private LocalDateTime updateAt;
 
-//    public QuizVO(Quiz quiz, List<BaseQuestionVO> questions) {
-//        this.quizId = quiz.getId().toString();
-//        this.name = quiz.getName();
-//        this.state = quiz.getState();
-//        this.courseVO = new CourseVO(quiz.getCourse());
-//        this.quizTime = quiz.getQuizTime();
-//        this.slide = new SlideVO(quiz.getSlide());
-//        this.questionNumber = questions.size();
-//        this.questions = questions;
-//    }
-
     public QuizVO(@NonNull Quiz quiz) {
         this.id = quiz.getId();
         this.name = quiz.getName();

+ 2 - 2
src/main/resources/application-deploy.yml

@@ -54,8 +54,8 @@ bok:
   url: http://bok.seecoder.cn
 guavaCache:
   maximumSize: 1000
-  expireAfterAccessInSeconds: 1800
-  expireAfterWriteInSeconds: 1800
+  expireAfterAccessInSeconds: 0
+  expireAfterWriteInSeconds: 600
 # 自定义数据
 helper:
   mail:

+ 2 - 2
src/main/resources/application-dev.yml

@@ -54,8 +54,8 @@ bok:
   url: http://bok.seecoder.cn
 guavaCache:
   maximumSize: 1000
-  expireAfterAccessInSeconds: 1800
-  expireAfterWriteInSeconds: 1800
+  expireAfterAccessInSeconds: 0
+  expireAfterWriteInSeconds: 600
 # 自定义数据
 helper:
   mail: