Explorar o código

Merge branch 'iterator3'

ChenSiTong %!s(int64=6) %!d(string=hai) anos
pai
achega
23aa8ad30c
Modificáronse 23 ficheiros con 165 adicións e 238 borrados
  1. 13 1
      src/main/java/nju/seec/helper/controller/QuestionController.java
  2. 0 21
      src/main/java/nju/seec/helper/dto/QuestionStudentAnswerDTO.java
  3. 0 10
      src/main/java/nju/seec/helper/dto/QuizAnswerDTO.java
  4. 0 20
      src/main/java/nju/seec/helper/dto/QuizUpdateDTO.java
  5. 21 9
      src/main/java/nju/seec/helper/dto/question/BaseQuestionDTO.java
  6. 4 4
      src/main/java/nju/seec/helper/dto/question/ChoiceQuestionDTO.java
  7. 21 21
      src/main/java/nju/seec/helper/dto/question/SubjectiveQuestionDTO.java
  8. 4 4
      src/main/java/nju/seec/helper/dto/question/TrueOrFalseQuestionDTO.java
  9. 8 17
      src/main/java/nju/seec/helper/service/QuestionService.java
  10. 2 2
      src/main/java/nju/seec/helper/service/impl/CourseServiceImpl.java
  11. 12 29
      src/main/java/nju/seec/helper/service/impl/QuestionServiceImpl.java
  12. 9 2
      src/main/java/nju/seec/helper/service/impl/QuizServiceImpl.java
  13. 4 3
      src/main/java/nju/seec/helper/service/impl/QuizStudentAnswerServiceImpl.java
  14. 3 0
      src/main/java/nju/seec/helper/service/impl/SlideServiceImpl.java
  15. 2 2
      src/main/java/nju/seec/helper/util/GuavaCacheUtil.java
  16. 11 48
      src/main/java/nju/seec/helper/vo/question/BaseQuestionVO.java
  17. 12 0
      src/main/java/nju/seec/helper/vo/question/ChoiceQuestionVO.java
  18. 11 0
      src/main/java/nju/seec/helper/vo/question/TrueOrFalseQuestionVO.java
  19. 0 27
      src/main/java/nju/seec/helper/vo/quiz/QuizResultVO.java
  20. 24 3
      src/main/java/nju/seec/helper/vo/quiz/QuizStudentAnswerVO.java
  21. 0 11
      src/main/java/nju/seec/helper/vo/quiz/QuizVO.java
  22. 2 2
      src/main/resources/application-deploy.yml
  23. 2 2
      src/main/resources/application-dev.yml

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

@@ -43,10 +43,22 @@ public class QuestionController {
      */
     @Auth(roles = {UserType.TEACHER, UserType.STUDENT}, message = "获得测试题目")
     @GetMapping("/quiz/{quizId}")
-    public List<BaseQuestionVO> getQuestionsOfQuiz(LoginUser user, @PathVariable Long quizId) {
+    public List<BaseQuestionVO> getQuestionsByQuiz(LoginUser user, @PathVariable Long quizId) {
         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) {
+//        return questionService.createQuestion(user, baseQuestionDTO);
+//    }
+
 //    /**
 //     * 获得题目列表
 //     */

+ 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;
-//
-//}

+ 21 - 9
src/main/java/nju/seec/helper/dto/question/BaseQuestionDTO.java

@@ -1,26 +1,38 @@
 package nju.seec.helper.dto.question;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import lombok.Data;
-import nju.seec.helper.util.enums.QuestionType;
+import nju.seec.helper.dto.groups.Create;
 import org.hibernate.validator.constraints.Length;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 
 /**
  * @author cst
  */
 @Data
+@JsonTypeInfo(
+        use = JsonTypeInfo.Id.NAME,
+        include = JsonTypeInfo.As.EXISTING_PROPERTY,
+        property = "type",
+        visible = true
+)
+@JsonSubTypes({
+        @JsonSubTypes.Type(value = ChoiceQuestionDTO.class, name = BaseQuestionDTO.CHOICE),
+        @JsonSubTypes.Type(value = TrueOrFalseQuestionDTO.class, name = BaseQuestionDTO.TRUE_FALSE)
+})
 public abstract class BaseQuestionDTO {
+    protected static final String CHOICE = "CHOICE";
+    protected static final String TRUE_FALSE = "TRUE_FALSE";
+
     @NotBlank(message = "题干不能为空")
     @Length(max = 1000, message = "题干长度不能超过1000")
-    private String stem;
+    protected String stem;
     @Length(max = 1000, message = "解析长度不能超过1000")
-    private String analysis;
+    protected String analysis;
+    @NotNull(message = "缺少题目类型", groups = Create.class)
+    protected String type;
 
-    /**
-     * 获取题目类型
-     *
-     * @return
-     */
-    public abstract QuestionType getQuestionType();
 }

+ 4 - 4
src/main/java/nju/seec/helper/dto/question/ChoiceQuestionDTO.java

@@ -2,7 +2,7 @@ package nju.seec.helper.dto.question;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import nju.seec.helper.util.enums.QuestionType;
+import lombok.ToString;
 import org.hibernate.validator.constraints.Length;
 
 import javax.validation.constraints.NotBlank;
@@ -15,6 +15,7 @@ import java.util.Map;
  * @author cst
  */
 @EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
 @Data
 public class ChoiceQuestionDTO extends BaseQuestionDTO implements Serializable {
     private static final long serialVersionUID = -2991414748803093291L;
@@ -26,8 +27,7 @@ public class ChoiceQuestionDTO extends BaseQuestionDTO implements Serializable {
     @Length(max = 10, message = "答案长度不能超过10")
     private String answer;
 
-    @Override
-    public QuestionType getQuestionType() {
-        return QuestionType.CHOICE;
+    public ChoiceQuestionDTO() {
+        this.type = BaseQuestionDTO.CHOICE;
     }
 }

+ 21 - 21
src/main/java/nju/seec/helper/dto/question/SubjectiveQuestionDTO.java

@@ -1,21 +1,21 @@
-package nju.seec.helper.dto.question;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import nju.seec.helper.util.enums.QuestionType;
-
-import java.io.Serializable;
-
-/**
- * @author cst
- */
-@EqualsAndHashCode(callSuper = true)
-@Data
-public class SubjectiveQuestionDTO extends BaseQuestionDTO implements Serializable {
-    private static final long serialVersionUID = -4391297345486351815L;
-
-    @Override
-    public QuestionType getQuestionType() {
-        return QuestionType.SUBJECTIVE;
-    }
-}
+//package nju.seec.helper.dto.question;
+//
+//import lombok.Data;
+//import lombok.EqualsAndHashCode;
+//import nju.seec.helper.util.enums.QuestionType;
+//
+//import java.io.Serializable;
+//
+///**
+// * @author cst
+// */
+//@EqualsAndHashCode(callSuper = true)
+//@Data
+//public class SubjectiveQuestionDTO extends BaseQuestionDTO implements Serializable {
+//    private static final long serialVersionUID = -4391297345486351815L;
+//
+//    @Override
+//    public QuestionType getQuestionType() {
+//        return QuestionType.SUBJECTIVE;
+//    }
+//}

+ 4 - 4
src/main/java/nju/seec/helper/dto/question/TrueOrFalseQuestionDTO.java

@@ -2,7 +2,7 @@ package nju.seec.helper.dto.question;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import nju.seec.helper.util.enums.QuestionType;
+import lombok.ToString;
 
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
@@ -11,14 +11,14 @@ import java.io.Serializable;
  * @author cst
  */
 @EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
 @Data
 public class TrueOrFalseQuestionDTO extends BaseQuestionDTO implements Serializable {
     private static final long serialVersionUID = -2256887591745338790L;
     @NotNull(message = "缺少答案")
     private Boolean answer;
 
-    @Override
-    public QuestionType getQuestionType() {
-        return QuestionType.TRUE_FALSE;
+    public TrueOrFalseQuestionDTO() {
+        this.type = BaseQuestionDTO.TRUE_FALSE;
     }
 }

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

@@ -24,14 +24,6 @@ public interface QuestionService {
      */
     Page<BaseQuestionVO> getQuestions(LoginUser user, String stem, Pageable pageable);
 
-    /**
-     * 取得题目详情
-     *
-     * @param questionId
-     * @return
-     */
-    BaseQuestionVO getQuestion(String questionId);
-
     /**
      * 根据测试获取题目
      *
@@ -49,13 +41,12 @@ public interface QuestionService {
      */
     List<BaseQuestionVO> getQuestionsByQuiz(Quiz quiz);
 
-//    /**
-//     * @param newQuestion
-//     * @return
-//     */
-//    BaseQuestionVO createQuestion(BaseQuestionVO newQuestion);
-//
-//    BaseQuestionVO updateQuestion(BaseQuestionVO newQuestion);
-//
-//    void deleteQuestion(String questionId);
+    /**
+     * 获取某一题目
+     *
+     * @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);
     }
 

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

@@ -1,6 +1,7 @@
 package nju.seec.helper.service.impl;
 
 import nju.seec.helper.dao.QuizDAO;
+import nju.seec.helper.dao.UserDAO;
 import nju.seec.helper.dto.user.LoginUser;
 import nju.seec.helper.entity.Quiz;
 import nju.seec.helper.service.QuestionService;
@@ -24,11 +25,16 @@ import java.util.List;
 @Service
 public class QuestionServiceImpl implements QuestionService {
     private final QuizDAO quizDAO;
+    private final UserDAO userDAO;
+
     private final BokUtil bokUtil;
 
     @Autowired
-    public QuestionServiceImpl(QuizDAO quizDAO, BokUtil bokUtil) {
+    public QuestionServiceImpl(QuizDAO quizDAO
+            , UserDAO userDAO
+            , BokUtil bokUtil) {
         this.quizDAO = quizDAO;
+        this.userDAO = userDAO;
         this.bokUtil = bokUtil;
     }
 
@@ -37,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) {
@@ -57,27 +58,9 @@ public class QuestionServiceImpl implements QuestionService {
         return bokUtil.bokFindByIdIn(questionIds, true);
     }
 
-    //    @Override
-//    public BaseQuestionVO newQuestion(BaseQuestionVO newQuestion) {
-//        try {
-//            return bokUtil.postNewQuestion(newQuestion);
-//        } catch (JsonProcessingException e) {
-//            throw HelperException.of(ExceptionType.ERROR, "请求BOK题库数据错误:" + e.getMessage());
-//        }
-//    }
-//
-//    @Override
-//    public BaseQuestionVO updateQuestion(BaseQuestionVO newQuestion) {
-//        try {
-//            return bokUtil.putQuestion(newQuestion);
-//        } catch (JsonProcessingException e) {
-//            throw HelperException.of(ExceptionType.ERROR, "请求BOK题库数据错误:" + e.getMessage());
-//        }
-//    }
-//
-//    @Override
-//    public void deleteQuestion(String questionId) {
-//        bokUtil.deleteQuestion(questionId);
-//    }
-
+    @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);
     }
 }

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

@@ -88,13 +88,14 @@ public class QuizStudentAnswerServiceImpl implements QuizStudentAnswerService {
                 .setAnswers(answers)
                 .setScore(score);
 
-        return new QuizStudentAnswerVO(quizStudentAnswerDAO.save(quizStudentAnswer));
+        return new QuizStudentAnswerVO(quizStudentAnswerDAO.save(quizStudentAnswer), questionVOList);
     }
 
     @Transactional(readOnly = true)
     @Override
     public Page<QuizStudentAnswerVO> teacherGetQuizStudentAnswers(LoginUser user, Long quizId, Pageable pageable) {
-        return quizStudentAnswerDAO.findByQuiz(quizDAO.findQuizById(quizId), pageable).map(QuizStudentAnswerVO::new);
+        return quizStudentAnswerDAO.findByQuiz(quizDAO.findQuizById(quizId), pageable)
+                .map(quizStudentAnswer -> new QuizStudentAnswerVO(quizStudentAnswer, questionService.getQuestionsByQuiz(quizDAO.findQuizById(quizId))));
     }
 
     @Transactional(readOnly = true)
@@ -102,7 +103,7 @@ public class QuizStudentAnswerServiceImpl implements QuizStudentAnswerService {
     public QuizStudentAnswerVO studentGetSelfQuizStudentAnswer(LoginUser user, Long quizId) {
         return quizStudentAnswerDAO
                 .findByQuizAndStudent(quizDAO.findQuizById(quizId), userDAO.findUserById(user.getId()))
-                .map(QuizStudentAnswerVO::new)
+                .map(quizStudentAnswer -> new QuizStudentAnswerVO(quizStudentAnswer, questionService.getQuestionsByQuiz(quizDAO.findQuizById(quizId))))
                 .orElse(null);
     }
 }

+ 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();

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

@@ -31,6 +31,17 @@ public abstract class BaseQuestionVO {
         }
     }
 
+//    public static BaseQuestionVO convertBaseQuestionToVO(@NonNull BaseQuestion baseQuestion, boolean withAnswer) {
+//        switch (baseQuestion.getType()) {
+//            case CHOICE:
+//                return new ChoiceQuestionVO((ChoiceQuestion) baseQuestion, withAnswer);
+//            case TRUE_FALSE:
+//                return new TrueOrFalseQuestionVO((TrueOrFalseQuestion) baseQuestion, withAnswer);
+//            default:
+//                throw HelperException.of(ExceptionType.ERROR,"暂不支持该类型的题目");
+//        }
+//    }
+
     /**
      * 检查答案是否正确
      *
@@ -39,51 +50,3 @@ public abstract class BaseQuestionVO {
      */
     public abstract boolean pass(Object answer);
 }
-//QuestionSerializer
-//问题的详细定义
-//
-//Attribute
-//type QuestionSerializer =
-//  | ChoiceQuestionSerializer
-//  | TrueOrFalseQuestionSerializer;
-//
-//type QuestionWithoutAnswerSerializer = Omit<
-//  QuestionSerializer,
-//  "answer" | "analysis"
-//>;
-//
-//type QuestionWithStudentAnswerSerializer =
-//  | ChoiceQuestionWithStudentAnswer
-//  | TrueOrFalseQuestionWithStudentAnswer;
-//
-//interface Question {
-//  id: number; // 题目id
-//  kind: "CHOICE" | "TRUE_FALSE";
-//  stem: string; // 题干
-//}
-//
-//interface ChoiceQuestionSerializer extends Question {
-//  kind: "CHOICE";
-//  options: {
-//    [key: string]: string;
-//  };
-//  answer: string; // 答案 [与 options 的 key 一致]
-//  analysis?: string; // 解析
-//}
-//
-//interface ChoiceQuestionWithStudentAnswer extends ChoiceQuestionSerializer {
-//  studentAnswer: string;
-//  pass: boolean; // 是否正确
-//}
-//
-//interface TrueOrFalseQuestionSerializer extends Question {
-//  kind: "TRUE_FALSE";
-//  answer: boolean; // 答案
-//  analysis?: string; // 解析
-//}
-//
-//interface TrueOrFalseQuestionWithStudentAnswer
-//  extends TrueOrFalseQuestionSerializer {
-//  studentAnswer: boolean;
-//  pass: boolean; // 是否正确
-//}

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

@@ -30,6 +30,18 @@ public class ChoiceQuestionVO extends BaseQuestionVO {
         }
     }
 
+//    public ChoiceQuestionVO(ChoiceQuestion baseQuestion, boolean withAnswer) {
+//        this.id = String.valueOf(baseQuestion.getId());
+//        this.type = QuestionType.CHOICE;
+//        this.stem = baseQuestion.getStem();
+//        this.options = baseQuestion.getOptions();
+//
+//        if (withAnswer) {
+//            this.answer = baseQuestion.getAnswer();
+//            this.analysis = baseQuestion.getAnalysis();
+//        }
+//    }
+
     @Override
     public boolean pass(Object answer) {
         return this.answer.equals(String.valueOf(answer));

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

@@ -16,6 +16,17 @@ import nju.seec.helper.util.enums.QuestionType;
 public class TrueOrFalseQuestionVO extends BaseQuestionVO {
     private Boolean answer;
 
+//    public TrueOrFalseQuestionVO(TrueOrFalseQuestion baseQuestion, boolean withAnswer) {
+//        this.id = String.valueOf(baseQuestion.getId());
+//        this.type = QuestionType.TRUE_FALSE;
+//        this.stem = baseQuestion.getStem();
+//
+//        if (withAnswer) {
+//            this.answer = baseQuestion.getAnswer();
+//            this.analysis = baseQuestion.getAnalysis();
+//        }
+//    }
+
     @Override
     public boolean pass(Object answer) {
         return this.answer.equals(Boolean.valueOf(String.valueOf(answer)));

+ 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));
-//    }
-//}

+ 24 - 3
src/main/java/nju/seec/helper/vo/quiz/QuizStudentAnswerVO.java

@@ -1,12 +1,16 @@
 package nju.seec.helper.vo.quiz;
 
+import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NonNull;
 import nju.seec.helper.entity.QuizStudentAnswer;
+import nju.seec.helper.vo.question.BaseQuestionVO;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @author cst
@@ -21,7 +25,7 @@ public class QuizStudentAnswerVO {
     /**
      * 回答情况
      */
-    private Map<String, Object> answers;
+    private Map<String, QuestionStudentAnswerInfo> answers;
 
     /**
      * 提交时间
@@ -36,14 +40,31 @@ public class QuizStudentAnswerVO {
      */
     private BigDecimal score;
 
-    public QuizStudentAnswerVO(@NonNull QuizStudentAnswer quizStudentAnswer) {
+    public QuizStudentAnswerVO(@NonNull QuizStudentAnswer quizStudentAnswer, List<BaseQuestionVO> baseQuestionVOList) {
         this.quizId = quizStudentAnswer.getQuiz().getId();
         this.quizName = quizStudentAnswer.getQuiz().getName();
         this.studentId = quizStudentAnswer.getStudent().getId();
         this.studentName = quizStudentAnswer.getStudent().getName();
-        this.answers = quizStudentAnswer.getAnswers();
+
+        Map<String, Object> answers = quizStudentAnswer.getAnswers();
+        this.answers = baseQuestionVOList.parallelStream()
+                .map(baseQuestionVO -> {
+                    String questionId = baseQuestionVO.getId();
+                    Object questionStudentAnswer = answers.get(questionId);
+                    return QuestionStudentAnswerInfo.of(questionId, questionStudentAnswer, baseQuestionVO.pass(questionStudentAnswer));
+                })
+                .collect(Collectors.toMap(QuestionStudentAnswerInfo::getQuestionId, questionStudentAnswerInfo -> questionStudentAnswerInfo));
+
         this.submitAt = quizStudentAnswer.getSubmitAt();
         this.submitNumber = quizStudentAnswer.getSubmitNumber();
         this.score = quizStudentAnswer.getScore();
     }
+
+    @Data
+    @AllArgsConstructor(staticName = "of")
+    private static class QuestionStudentAnswerInfo {
+        private String questionId;
+        private Object answer;
+        private Boolean correct;
+    }
 }

+ 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: