Browse Source

feat: add quiz answer entity

XuShengTao 6 years ago
parent
commit
744e8ffb31

+ 1 - 1
config/application-dev.yml

@@ -10,7 +10,7 @@ spring:
       ddl-auto: update
     database: mysql
     database-platform: org.hibernate.dialect.MySQL8Dialect
-#    show-sql: true
+    show-sql: true
   http:
     encoding:
       force: true

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

@@ -45,7 +45,7 @@ public class QuestionController {
     /**
      * 获得题目列表
      */
-//    @Auth(roles = {UserType.TEACHER}, message = "获得题目列表")
+    @Auth(roles = {UserType.TEACHER}, message = "获得题目列表")
     @GetMapping("")
     public Map getQuestionList(LoginUser user, String stem,@PageableDefault(Integer.MAX_VALUE) Pageable pageable) throws JsonProcessingException {
 
@@ -57,7 +57,7 @@ public class QuestionController {
     }
 
     /**
-     * 创建题目
+     * 创建题目 Stub
      */
     @Auth(roles = {UserType.TEACHER}, message = "创建题目")
     @PostMapping("")
@@ -75,7 +75,7 @@ public class QuestionController {
     }
 
     /**
-     * 更新题目
+     * 更新题目 Stub
      */
     @Auth(roles = {UserType.TEACHER}, message = "更新题目")
     @PutMapping("/{questionId}")
@@ -94,7 +94,7 @@ public class QuestionController {
 
 
     /**
-     * 更新题目
+     * 更新题目 Stub
      */
     @Auth(roles = {UserType.TEACHER}, message = "更新题目")
     @DeleteMapping("/{questionId}")

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

@@ -9,6 +9,7 @@ import nju.seec.helper.dto.LoginUser;
 import nju.seec.helper.dto.QuizAnswerDTO;
 import nju.seec.helper.dto.QuizDTO;
 import nju.seec.helper.dto.QuizUpdateDTO;
+import nju.seec.helper.util.BOKUtil;
 import nju.seec.helper.util.enums.QuestionKindState;
 import nju.seec.helper.util.enums.QuizState;
 import nju.seec.helper.util.enums.SlideState;
@@ -38,8 +39,20 @@ public class QuizController {
     private CourseDAO courseDAO;
     @Autowired
     private SlideDAO slideDAO;
+    @Autowired
+    private BOKUtil bokUtil;
+
+    @GetMapping("/test")
+    public Object test() {
+        List list=new ArrayList();
+        list.add("1001");
+        list.add("1002");
+        list.add("1003");
+        return bokUtil.BokFindByIdIn(list);
+    }
+
     /**
-     * 获得测试列表
+     * 获得测试列表 Stub
      */
     @Auth(roles = {UserType.STUDENT}, message = "获得测试列表")
     @GetMapping("")
@@ -57,7 +70,7 @@ public class QuizController {
     }
 
     /**
-     * 获得某一测试的详细内容
+     * 获得某一测试的详细内容 Stub
      */
     @Auth(roles = {UserType.STUDENT}, message = "获得某一测试的详细内容")
     @GetMapping("/{quizId}")
@@ -87,7 +100,7 @@ public class QuizController {
     }
 
     /**
-     * 修改测试 (仅限未开始时可以修改)
+     * 修改测试 (仅限未开始时可以修改) Stub
      */
     @Auth(roles = {UserType.TEACHER}, message = "修改测试")
     @PutMapping("/{quizId}")
@@ -102,7 +115,7 @@ public class QuizController {
     }
 
     /**
-     * 删除测试 (仅限未开始时可以删除)
+     * 删除测试 (仅限未开始时可以删除) Stub
      */
     @Auth(roles = {UserType.TEACHER}, message = "删除测试")
     @DeleteMapping("/{quizId}")
@@ -113,7 +126,7 @@ public class QuizController {
     }
 
     /**
-     * 获得测试结果统计
+     * 获得测试结果统计 Stub
      */
     @Auth(roles = {UserType.TEACHER}, message = "获得测试结果统计")
     @GetMapping("/{quizId}/result")
@@ -124,7 +137,7 @@ public class QuizController {
         return map;
     }
     /**
-     * 提交答案
+     * 提交答案 Stub
      */
     static ObjectMapper objectMapper = new ObjectMapper();
 

+ 20 - 0
src/main/java/nju/seec/helper/dao/QuizDAO.java

@@ -0,0 +1,20 @@
+package nju.seec.helper.dao;
+
+import nju.seec.helper.entity.Course;
+import nju.seec.helper.entity.Quiz;
+import nju.seec.helper.entity.Slide;
+import nju.seec.helper.util.enums.ExceptionType;
+import nju.seec.helper.util.exception.HelperException;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.Collection;
+import java.util.Set;
+
+public interface QuizDAO extends JpaRepository<Quiz,Long> {
+    default Quiz findQuizById(Long id) {
+        return this.findById(id)
+                .orElseThrow(() -> HelperException.of(ExceptionType.NOT_FOUND, "找不到测试"));
+    }
+    Set<Quiz> findAllBySlide(Slide slide);
+    Set<Quiz> findAllByCourseIn(Collection<Course> course);
+}

+ 16 - 0
src/main/java/nju/seec/helper/dao/QuizStudentAnswerDAO.java

@@ -0,0 +1,16 @@
+package nju.seec.helper.dao;
+
+import nju.seec.helper.entity.Quiz;
+import nju.seec.helper.entity.QuizStudentAnswer;
+import nju.seec.helper.entity.User;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.Optional;
+import java.util.Set;
+
+public interface QuizStudentAnswerDAO extends JpaRepository<QuizStudentAnswer,Long> {
+    Set<QuizStudentAnswer> findAllByQuiz(Quiz quiz);
+    Set<QuizStudentAnswer> findAllByStudent(User student);
+    Set<QuizStudentAnswer> findByQuizAndStudent(Quiz quiz, User student);
+    Set<QuizStudentAnswer> findByQuestionIdAndStudent(String questionId, User student);
+}

+ 61 - 0
src/main/java/nju/seec/helper/entity/Quiz.java

@@ -0,0 +1,61 @@
+package nju.seec.helper.entity;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import nju.seec.helper.util.enums.QuizState;
+import nju.seec.helper.util.enums.SlideState;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Set;
+
+@Data
+@Entity
+@Table(name = "quiz",indexes = {@Index(columnList = "course"),@Index(columnList = "slide")}
+        , uniqueConstraints = @UniqueConstraint(name = "测试名约束", columnNames = {"teacher", "name"}))
+@EntityListeners(AuditingEntityListener.class)
+public class Quiz {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Long id;
+
+    @Basic
+    @Column(name = "name", nullable = false)
+    private String name;
+
+    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name="slide",referencedColumnName="id")
+    private Slide slide;
+
+    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name="course",referencedColumnName="id")
+    private Course course;
+
+    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name="teacher",referencedColumnName="id")
+    private User teacher;
+
+    @ElementCollection
+    private List<String> questions;
+
+    @Enumerated(value = EnumType.STRING)
+    @Column(name = "quizTime")
+    private SlideState quizTime = SlideState.BEFORE_CLASS;
+    @Enumerated(value = EnumType.STRING)
+    @Column(name = "state")
+    private QuizState state;
+
+    @Basic
+    @Column(name = "create_at",nullable = false)
+    @CreatedDate
+    private LocalDateTime createAt;
+
+    @Basic
+    @Column(name = "modified_at",nullable = false)
+    @CreatedDate
+    private LocalDateTime modifiedAt;
+}

+ 50 - 0
src/main/java/nju/seec/helper/entity/QuizStudentAnswer.java

@@ -0,0 +1,50 @@
+package nju.seec.helper.entity;
+
+
+import lombok.Data;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+
+@Data
+@Entity
+@Table(name = "quiz_student_answer",indexes = {@Index(columnList = "quiz"),@Index(columnList = "student")})
+@EntityListeners(AuditingEntityListener.class)
+public class QuizStudentAnswer {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Long id;
+
+    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name="quiz",referencedColumnName="id")
+    private Quiz quiz;
+
+    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JoinColumn(name="student",referencedColumnName="id")
+    private User student;
+
+    @Basic
+    @Column(name = "questionId")
+    private String questionId;
+
+    @Basic
+    @Column(name = "create_at",nullable = false)
+    @CreatedDate
+    private LocalDateTime createAt;
+
+    @Basic
+    @Column(name = "modified_at",nullable = false)
+    @CreatedDate
+    private LocalDateTime modifiedAt;
+
+    @Basic
+    @Column(name = "studentAnswer",nullable = false)
+    private String studentAnswer;
+
+    @Basic
+    @Column(name = "name", nullable = false)
+    private Boolean pass;
+}

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

@@ -3,6 +3,7 @@ package nju.seec.helper.service.impl;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import nju.seec.helper.dto.LoginUser;
 import nju.seec.helper.service.QuestionService;
+import nju.seec.helper.util.BOKUtil;
 import nju.seec.helper.util.JsonUtils;
 import nju.seec.helper.util.RestRequestUtil;
 import nju.seec.helper.util.enums.QuestionKindState;
@@ -25,54 +26,17 @@ import java.util.stream.Collectors;
 @Service
 public class QuestionServiceImpl implements QuestionService {
     @Autowired
-    private RestRequestUtil restRequestUtil;
+    private BOKUtil bokUtil;
 
     @Override
     public Page<QuestionVO> getQuestionList(LoginUser user, String stem, Pageable pageable) throws JsonProcessingException {
         List<QuestionVO> Questions = new ArrayList<QuestionVO>();
         Map page = new HashMap();
-        BokFindByStemLike(stem, Questions,page,pageable);
+        bokUtil.BokFindByStemLike(stem, Questions,page,pageable);
         Page<QuestionVO> ret =new PageImpl<QuestionVO>(Questions,pageable,Long.valueOf((Integer)page.get("totalElements")));
         return ret;
     }
-    // 应该做成bok的库
-    private void BokFindByStemLike(String stem,List<QuestionVO> Questions, Map page,Pageable pageable) {
 
-        Map<String,String> urlParams=new HashMap<>();
-        urlParams.put("content",stem);
-        urlParams.put("sort",pageable.getSort().toString().replaceAll(" ","").replaceAll(":",","));
-        urlParams.put("size",String.valueOf(pageable.getPageSize()));
-        urlParams.put("page",String.valueOf(1+pageable.getPageNumber()));
-        try {
-            Map ret = (Map)restRequestUtil.sendPostGet(
-                    "http://bok.seecoder.cn/api/tq/search/findByStemLike?content={content}&sort={sort}&size={size}&page={page}", urlParams);
 
-            List<Map> tqs= ((List)((Map)ret.get("_embedded")).get("choiceQuestions"));
 
-            final List collect = tqs.stream().map(q -> {
-                switch ((String) q.get("type")) {
-                    case "choice":
-                        return ChoiceQuestionVO.builder().stem((String) q.get("stem")).kind(QuestionKindState.CHOICE)
-                                .options((Map<String, String>) q.get("options")).answer(((String) q.get("answer")).replaceAll("【答案】", ""))
-                                .analysis((String) q.get("analysis")).QuestionId(String.valueOf((Integer) q.get("tq_id"))).build();
-
-                    case "true_false":
-                        return TrueOrFalseQuestionVO.builder().stem((String) q.get("stem")).kind(QuestionKindState.CHOICE)
-                                .answer((Boolean) (q.get("answer")))
-                                .analysis((String) q.get("analysis")).QuestionId(String.valueOf((Integer) q.get("tq_id"))).build();
-
-                }
-                return new Exception("unknown type:" + (String) q.get("type"));
-            }).collect(Collectors.toList());
-            try {
-                page.putAll((Map)ret.get("page"));
-                Questions.addAll(collect);
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-
-        }catch (Exception e){
-            e.printStackTrace();
-        }
-    }
 }

+ 71 - 0
src/main/java/nju/seec/helper/service/impl/QuizServiceImpl.java

@@ -1,8 +1,79 @@
 package nju.seec.helper.service.impl;
 
+import nju.seec.helper.dao.QuizDAO;
+import nju.seec.helper.dao.QuizStudentAnswerDAO;
+import nju.seec.helper.dao.SlideDAO;
+import nju.seec.helper.dto.LoginUser;
+import nju.seec.helper.entity.*;
 import nju.seec.helper.service.QuizService;
+import nju.seec.helper.util.BOKUtil;
+import nju.seec.helper.util.enums.QuizState;
+import nju.seec.helper.util.enums.SlideState;
+import nju.seec.helper.vo.quiz.QuestionVO;
+import nju.seec.helper.vo.quiz.QuizVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+
+import java.util.*;
 
 @Service
 public class QuizServiceImpl implements QuizService {
+    @Autowired
+    private SlideDAO slideDAO;
+    @Autowired
+    private QuizDAO quizDAO;
+    @Autowired
+    private QuizStudentAnswerDAO quizStudentAnswerDAO;
+    @Autowired
+    private BOKUtil bokUtil;
+    @Transactional
+    public QuizVO CreateQuiz(String name, Integer uid, SlideState quizTime,
+                             Integer slideId, List<String> questions){
+        User teacher =new User();
+        teacher.setId(uid);
+        Slide slide = slideDAO.findSlideById(slideId);
+        Course course = new Course();
+        course.setId(slide.getCourseId());
+        Quiz quiz = new Quiz();
+
+        quiz.setCourse(course);
+        quiz.setName(name);
+        quiz.setQuestions(questions);
+        quiz.setQuizTime(quizTime);
+        quiz.setSlide(slide);
+        quiz.setTeacher(teacher);
+        quiz.setState(quizTime.getNum()<slide.getState().getNum()?QuizState.CLOSED:QuizState.ONGOING);
+        quiz=quizDAO.saveAndFlush(quiz);
+        return combineQuiz(quiz.getId());
+    }
+
+    public QuizVO combineQuiz(Long quizId){
+        Assert.notNull(quizId,"QUIZ ID can't be null!");
+        final Quiz quizById = quizDAO.findQuizById(quizId);
+        final List<QuestionVO> questionVOS = bokUtil.BokFindByIdIn(quizById.getQuestions());
+        QuizVO ret= new QuizVO(quizById,questionVOS);
+        return ret;
+    }
+    public QuizVO combineQuizWithAnswer(Long quizId, Integer uid){
+        Assert.notNull(quizId,"QUIZ ID can't be null!");
+        final Quiz quizById = quizDAO.findQuizById(quizId);
+        User student =new User();
+        student.setId(uid);
+        final Set<QuizStudentAnswer> QuizAnswers = quizStudentAnswerDAO.findByQuizAndStudent(quizById, student);
+        List<QuestionVO> questionVOS = bokUtil.BokFindByIdIn(quizById.getQuestions());
+        Map<String,QuizStudentAnswer> qsaMap=new HashMap<>(QuizAnswers.size());
+        for(QuizStudentAnswer qsa: QuizAnswers){
+            qsaMap.put(qsa.getQuestionId(),qsa);
+        }
+        for(QuestionVO vo:questionVOS){
+            if(qsaMap.get(vo.getQuestionId())!=null){
+                vo.exAddAnswer(qsaMap.get(vo.getQuestionId()));
+            }
+
+        }
+        QuizVO ret= new QuizVO(quizById,questionVOS);
+        return ret;
+    }
 }

+ 88 - 0
src/main/java/nju/seec/helper/util/BOKUtil.java

@@ -0,0 +1,88 @@
+package nju.seec.helper.util;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import nju.seec.helper.util.enums.QuestionKindState;
+import nju.seec.helper.vo.quiz.ChoiceQuestionVO;
+import nju.seec.helper.vo.quiz.QuestionVO;
+import nju.seec.helper.vo.quiz.TrueOrFalseQuestionVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Component
+public class BOKUtil {
+    @Autowired
+    private RestRequestUtil restRequestUtil;
+
+    private String searchUrl="http://bok.seecoder.cn/api/tq/search/";
+    // 应该做成bok的库
+    public void BokFindByStemLike(String stem, List<QuestionVO> Questions, Map page, Pageable pageable) {
+        Map<String,String> urlParams=new HashMap<>();
+        urlParams.put("content",stem);
+        urlParams.put("sort",pageable.getSort().toString().replaceAll(" ","").replaceAll(":",","));
+        urlParams.put("size",String.valueOf(pageable.getPageSize()));
+        urlParams.put("page",String.valueOf(1+pageable.getPageNumber()));
+        try {
+            Map ret = (Map)restRequestUtil.sendPostGet(
+                    searchUrl+"findByStemLike?content={content}&sort={sort}&size={size}&page={page}", urlParams);
+
+            List<Map> tqs= ((List)((Map)ret.get("_embedded")).get("choiceQuestions"));
+
+            List collect = parseBody(tqs);
+            try {
+                page.putAll((Map)ret.get("page"));
+                Questions.addAll(collect);
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    public List<QuestionVO> BokFindByIdIn(List<String> Ids) {
+        Map<String,String> urlParams=new HashMap<>();
+        String idsStr=Ids.stream().reduce((a,b)->{return a+","+b;}).orElse("");
+        urlParams.put("id",idsStr);
+        urlParams.put("size",String.valueOf(Ids.size()));
+        urlParams.put("page","1");
+        try {
+            Map ret = (Map)restRequestUtil.sendPostGet(
+                    searchUrl+"findByIdIn?id={id}&sort={sort}&size={size}&page={page}", urlParams);
+            List<Map> tqs= ((List)((Map)ret.get("_embedded")).get("choiceQuestions"));
+            List<QuestionVO> collect = parseBody(tqs);
+            return (collect);
+
+        }catch (Exception e){
+            e.printStackTrace();
+            throw new RuntimeException("bok request error!for findByIdIn:"+ Arrays.toString(Ids.toArray()));
+        }
+    }
+
+    private List parseBody(List<Map> tqs) {
+        final List collect =
+                tqs.stream().map(q -> {
+            switch ((String) q.get("type")) {
+                case "choice":
+                    return ChoiceQuestionVO.builder().stem((String) q.get("stem")).kind(QuestionKindState.CHOICE)
+                            .options((Map<String, String>) q.get("options")).answer(((String) q.get("answer")).replaceAll("【答案】", ""))
+                            .analysis((String) q.get("analysis")).QuestionId(String.valueOf((Integer) q.get("tq_id"))).build();
+
+                case "true_false":
+                    return TrueOrFalseQuestionVO.builder().stem((String) q.get("stem")).kind(QuestionKindState.CHOICE)
+                            .answer((Boolean) (q.get("answer")))
+                            .analysis((String) q.get("analysis")).QuestionId(String.valueOf((Integer) q.get("tq_id"))).build();
+
+            }
+            return new Exception("unknown type:" + (String) q.get("type"));
+        }).collect(Collectors.toList());
+        return collect;
+    }
+}

+ 9 - 1
src/main/java/nju/seec/helper/util/enums/SlideState.java

@@ -4,5 +4,13 @@ package nju.seec.helper.util.enums;
  * @author cst
  */
 public enum SlideState {
-    DRAFT, BEFORE_CLASS, IN_CLASS, AFTER_CLASS, FINISH
+    DRAFT(1), BEFORE_CLASS(2), IN_CLASS(3), AFTER_CLASS(4), FINISH(5);
+    private Integer num;
+    SlideState(Integer num){
+        this.num=num;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
 }

+ 20 - 0
src/main/java/nju/seec/helper/vo/quiz/BokQuestion.java

@@ -0,0 +1,20 @@
+package nju.seec.helper.vo.quiz;
+
+import lombok.Data;
+
+import java.util.Collection;
+import java.util.Map;
+
+@Data
+public class BokQuestion {
+    String tq_id;
+    String type;
+    String stem;
+    Map<String,String> options;
+    String answer;
+    String key_points;
+    String analysis;
+    Collection<String> tags;
+    Collection<String> knowledgeId;
+    String lastModified;
+}

+ 7 - 0
src/main/java/nju/seec/helper/vo/quiz/ChoiceQuestionVO.java

@@ -6,6 +6,7 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.SuperBuilder;
+import nju.seec.helper.entity.QuizStudentAnswer;
 
 import java.util.Map;
 
@@ -24,6 +25,12 @@ public class ChoiceQuestionVO extends QuestionVO{
     private String studentAnswer;
     @JsonProperty(value = "pass")
     private Boolean pass;
+
+    @Override
+    public void exAddAnswer(QuizStudentAnswer answer) {
+        this.answer=answer.getStudentAnswer();
+        this.pass = answer.getPass();
+    }
 }
 //kind: "CHOICE";
 //  options: {

+ 2 - 0
src/main/java/nju/seec/helper/vo/quiz/QuestionVO.java

@@ -6,6 +6,7 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.SuperBuilder;
+import nju.seec.helper.entity.QuizStudentAnswer;
 import nju.seec.helper.util.enums.QuestionKindState;
 import nju.seec.helper.vo.CourseVO;
 import org.springframework.beans.BeanUtils;
@@ -23,6 +24,7 @@ public abstract class QuestionVO {
     private QuestionKindState kind;
     @JsonProperty(value = "stem")
     private String stem;
+    public abstract void exAddAnswer(QuizStudentAnswer answer);
 }
 //QuestionSerializer
 //问题的详细定义

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

@@ -2,8 +2,11 @@ package nju.seec.helper.vo.quiz;
 
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
+import nju.seec.helper.entity.Quiz;
 import nju.seec.helper.entity.Slide;
 import nju.seec.helper.util.enums.QuizState;
 import nju.seec.helper.util.enums.SlideState;
@@ -14,6 +17,8 @@ import java.util.List;
 
 @Data
 @Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class QuizVO {
     @JsonProperty(value = "id")
     private String QuizId;
@@ -31,6 +36,17 @@ public class QuizVO {
     private Integer questionNumber;
     @JsonProperty(value = "questions")
     private List<QuestionVO> questions;
+
+    public QuizVO(Quiz quiz,List<QuestionVO> questions) {
+        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;
+    }
 }
 // http://47.100.18.120:3000/SEEC-BOK/API-DOC/src/master/helper/serializer/QuizSerializer.md
 // /** 已实现的枚举类 */

+ 7 - 0
src/main/java/nju/seec/helper/vo/quiz/TrueOrFalseQuestionVO.java

@@ -6,6 +6,7 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.SuperBuilder;
+import nju.seec.helper.entity.QuizStudentAnswer;
 
 import java.util.Map;
 
@@ -22,4 +23,10 @@ public class TrueOrFalseQuestionVO extends QuestionVO{
     private Boolean studentAnswer;
     @JsonProperty(value = "pass")
     private Boolean pass;
+
+    @Override
+    public void exAddAnswer(QuizStudentAnswer answer) {
+        this.pass = answer.getPass();
+        this.studentAnswer = Boolean.valueOf(answer.getStudentAnswer());
+    }
 }