Quellcode durchsuchen

fix : Alibaba Java Coding Guidelines fixed

XuShengTao vor 6 Jahren
Ursprung
Commit
95201becac

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

@@ -8,21 +8,13 @@ import nju.seec.helper.dao.SlideDAO;
 import nju.seec.helper.dto.LoginUser;
 import nju.seec.helper.service.QuestionService;
 import nju.seec.helper.util.enums.ExceptionType;
-import nju.seec.helper.util.enums.QuizState;
-import nju.seec.helper.util.enums.SlideState;
 import nju.seec.helper.util.enums.UserType;
 import nju.seec.helper.util.exception.HelperException;
-import nju.seec.helper.vo.CourseVO;
-import nju.seec.helper.vo.SlideVO;
-import nju.seec.helper.vo.quiz.ChoiceQuestionVO;
-import nju.seec.helper.vo.quiz.QuestionVO;
-import nju.seec.helper.vo.quiz.QuizVO;
-import nju.seec.helper.vo.quiz.TrueOrFalseQuestionVO;
+import nju.seec.helper.vo.quiz.BaseQuestionVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.web.PageableDefault;
-import org.springframework.expression.ParseException;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.*;
@@ -47,7 +39,7 @@ public class QuestionController {
     @GetMapping("")
     public Map getQuestionList(LoginUser user, String stem,@PageableDefault(Integer.MAX_VALUE) Pageable pageable) throws JsonProcessingException {
 
-        final Page<QuestionVO> page = questionService.getQuestionList(user, stem, pageable);
+        final Page<BaseQuestionVO> page = questionService.getQuestionList(user, stem, pageable);
         Map ret=new LinkedHashMap(2);
         ret.put("questions",page.getContent());
         ret.put("page",PageResponse.PageInfo.of(page.getNumber()+1, page.getSize(), page.getTotalPages(), Long.valueOf(page.getTotalElements()).intValue()));
@@ -59,7 +51,7 @@ public class QuestionController {
      */
     @Auth(roles = {UserType.TEACHER}, message = "获得题目详情")
     @GetMapping("/{questionId}")
-        public QuestionVO getQuestion(LoginUser user,@PathVariable("questionId") String questionId) throws JsonProcessingException {
+        public BaseQuestionVO getQuestion(LoginUser user, @PathVariable("questionId") String questionId) throws JsonProcessingException {
         return questionService.getQuestion(questionId);
     }
 
@@ -69,10 +61,10 @@ public class QuestionController {
      */
     @Auth(roles = {UserType.TEACHER}, message = "创建题目")
     @PostMapping("")
-    public QuestionVO PostQuestion(LoginUser user,  @RequestBody Map question) {
-        if(question.get("kind")==null){throw HelperException.of(ExceptionType.PARAM_ERROR,"no kind");}
+    public BaseQuestionVO postQuestion(LoginUser user, @RequestBody Map question) {
+        if(question.get("kind")==null){throw HelperException.of(ExceptionType.PARAM_ERROR,"无类型");}
 
-        return questionService.newQuestion(QuestionVO.parse(question));
+        return questionService.newQuestion(BaseQuestionVO.parse(question));
     }
 
     /**
@@ -80,10 +72,10 @@ public class QuestionController {
      */
     @Auth(roles = {UserType.TEACHER}, message = "更新题目")
     @PutMapping("/{questionId}")
-    public QuestionVO updateQuestion(LoginUser user, @RequestBody Map question, @PathVariable("questionId") String questionId) {
-        if(question.get("kind")==null){throw HelperException.of(ExceptionType.PARAM_ERROR,"no kind");}
+    public BaseQuestionVO updateQuestion(LoginUser user, @RequestBody Map question, @PathVariable("questionId") String questionId) {
+        if(question.get("kind")==null){throw HelperException.of(ExceptionType.PARAM_ERROR,"无类型");}
 
-        return questionService.updateQuestion(QuestionVO.parse(question));
+        return questionService.updateQuestion(BaseQuestionVO.parse(question));
     }
 
 

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

@@ -1,6 +1,5 @@
 package nju.seec.helper.controller;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import nju.seec.helper.aspect.auth.Auth;
 import nju.seec.helper.controller.response.PageResponse;
 import nju.seec.helper.dao.CourseDAO;
@@ -11,14 +10,9 @@ import nju.seec.helper.dto.QuizDTO;
 import nju.seec.helper.dto.QuizUpdateDTO;
 import nju.seec.helper.entity.Quiz;
 import nju.seec.helper.service.QuizService;
-import nju.seec.helper.util.BOKUtil;
-import nju.seec.helper.util.enums.QuestionKindState;
+import nju.seec.helper.util.BokUtil;
 import nju.seec.helper.util.enums.QuizState;
-import nju.seec.helper.util.enums.SlideState;
 import nju.seec.helper.util.enums.UserType;
-import nju.seec.helper.vo.CourseVO;
-import nju.seec.helper.vo.SlideVO;
-import nju.seec.helper.vo.UserVO;
 import nju.seec.helper.vo.quiz.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -43,7 +37,7 @@ public class QuizController {
     @Autowired
     private SlideDAO slideDAO;
     @Autowired
-    private BOKUtil bokUtil;
+    private BokUtil bokUtil;
     @Autowired
     private QuizService quizService;
 
@@ -73,7 +67,7 @@ public class QuizController {
      */
     @Auth(roles = {UserType.STUDENT,UserType.TEACHER}, message = "获得某一测试的详细内容")
     @GetMapping("/{quizId}")
-    public QuizVO GetOneQuiz(LoginUser user, @PathVariable("quizId") String quizId) {
+    public QuizVO getOneQuiz(LoginUser user, @PathVariable("quizId") String quizId) {
         QuizVO quizVO = quizService.combineQuizWithAnswer(Long.valueOf(quizId), user.getId(), user.getType());
 
         if(user.getType().equals(UserType.STUDENT)&&!quizVO.getState().equals(QuizState.CLOSED)){
@@ -87,9 +81,9 @@ public class QuizController {
      */
     @Auth(roles = {UserType.TEACHER}, message = "创建测试")
     @PostMapping("")
-    public QuizVO CreateQuiz(LoginUser user,@RequestBody QuizDTO newQuiz) {
+    public QuizVO createQuiz(LoginUser user, @RequestBody QuizDTO newQuiz) {
         System.out.println(newQuiz);
-        final Quiz quiz = quizService.CreateQuiz(newQuiz.getName(), user.getId(), newQuiz.getQuizTime(),
+        final Quiz quiz = quizService.createQuiz(newQuiz.getName(), user.getId(), newQuiz.getQuizTime(),
                 Long.valueOf(newQuiz.getSlideId()), newQuiz.getQuestions());
         return quizService.combineQuiz(quiz.getId());
     }

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

@@ -1,11 +1,8 @@
 package nju.seec.helper.dto;
 
 import lombok.Data;
-import nju.seec.helper.vo.quiz.QuestionVO;
-import nju.seec.helper.vo.quiz.TrueOrFalseQuestionVO;
 
 import java.util.List;
-import java.util.Map;
 
 @Data
 public class QuizAnswerDTO {

+ 4 - 6
src/main/java/nju/seec/helper/dto/QuizDTO.java

@@ -7,12 +7,10 @@ import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import java.util.List;
 
-//interface QuizDTO {
-//  name: string; // 测试名
-//  quizTime: SlideState; // 测试时间
-//  slideId: number; // 幻灯片 id
-//  questions: number[]; // 题目 id;
-//}
+/**
+ *
+ * @author sheen
+ */
 @Data
 public class QuizDTO {
     @NotBlank

+ 4 - 6
src/main/java/nju/seec/helper/dto/QuizUpdateDTO.java

@@ -7,12 +7,10 @@ import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import java.util.List;
 
-//interface QuizDTO {
-//  name: string; // 测试名
-//  quizTime: SlideState; // 测试时间
-//  slideId: number; // 幻灯片 id
-//  questions: number[]; // 题目 id;
-//}
+/**
+ * @author sheen
+ */
+
 @Data
 public class QuizUpdateDTO {
     String id;

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

@@ -2,19 +2,33 @@ package nju.seec.helper.service;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import nju.seec.helper.dto.LoginUser;
-import nju.seec.helper.vo.quiz.QuestionVO;
+import nju.seec.helper.vo.quiz.BaseQuestionVO;
 import org.springframework.data.domain.Page;
-
-import java.awt.print.Pageable;
+import org.springframework.data.domain.Pageable;
 
 public interface QuestionService {
-    Page<QuestionVO> getQuestionList(LoginUser user, String stem, org.springframework.data.domain.Pageable pageable) throws JsonProcessingException;
+    /**
+     * @param user
+     * @param stem
+     * @param pageable
+     * @return
+     * @throws JsonProcessingException
+     */
+    Page<BaseQuestionVO> getQuestionList(LoginUser user, String stem, Pageable pageable) throws JsonProcessingException;
 
-    QuestionVO getQuestion(String questionId);
+    /**
+     * @param questionId
+     * @return
+     */
+    BaseQuestionVO getQuestion(String questionId);
 
-    QuestionVO newQuestion(QuestionVO newQuestion);
+    /**
+     * @param newQuestion
+     * @return
+     */
+    BaseQuestionVO newQuestion(BaseQuestionVO newQuestion);
 
-    QuestionVO updateQuestion(QuestionVO newQuestion);
+    BaseQuestionVO updateQuestion(BaseQuestionVO newQuestion);
 
     void deleteQuestion(String questionId);
 }

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

@@ -18,30 +18,94 @@ import java.util.Map;
 
 public interface QuizService {
 
-    @Transactional
-    Quiz CreateQuiz(String name, Long uid, SlideState quizTime,
+    /**
+     * @param name
+     * @param uid
+     * @param quizTime
+     * @param slideId
+     * @param questions
+     * @return
+     */
+    Quiz createQuiz(String name, Long uid, SlideState quizTime,
                     Long slideId, List<String> questions);
 
+    /**
+     * @param quizId
+     * @param uid
+     * @param answers
+     * @return
+     */
     Integer upStudentAnswer(Long quizId, Long uid, List<QuestionStudentAnswerDTO> answers);
 
+    /**
+     * @param slideId
+     * @param pageable
+     * @param state
+     * @param uid
+     * @return
+     */
     Page<Quiz> getAllBasicQuizBySlide(Long slideId, Pageable pageable, QuizState state, Long uid);
 
-    @Transactional
+    /**
+     * @param quiz
+     * @param slide
+     * @return
+     */
     QuizState checkQuizState(Quiz quiz, Slide slide);
 
+    /**
+     * @param quizId
+     * @param slideId
+     * @return
+     */
     QuizState checkQuizState(Long quizId, Long slideId);
 
+    /**
+     * @param quizId
+     * @return
+     */
     QuizVO combineQuiz(Long quizId);
 
+    /**
+     * @param quizId
+     * @param uid
+     * @param type
+     * @return
+     */
     QuizVO combineQuizWithAnswer(Long quizId, Long uid, UserType type);
 
+    /**
+     * @param quizId
+     * @return
+     */
     String deleteQuiz(Long quizId);
 
+    /**
+     * @param quizId
+     * @param name
+     * @param questions
+     * @param quizTime
+     * @param slideId
+     * @return
+     */
     Quiz modifyQuiz(Long quizId, String name, List<String> questions, SlideState quizTime, String slideId);
 
+    /**
+     * @param pageable
+     * @param state
+     * @param uid
+     * @return
+     */
     Page<Quiz> getAllBasicQuizByUser(Pageable pageable, QuizState state, Long uid);
 
+    /**
+     * @param aLong
+     * @return
+     */
     List<QuizResultVO> getQuizResult(Long aLong);
 
+    /**
+     * @param slide
+     */
     void modifySlideState(Slide slide);
 }

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

@@ -3,15 +3,10 @@ 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.BokUtil;
 import nju.seec.helper.util.enums.ExceptionType;
-import nju.seec.helper.util.enums.QuestionKindState;
 import nju.seec.helper.util.exception.HelperException;
-import nju.seec.helper.vo.quiz.ChoiceQuestionVO;
-import nju.seec.helper.vo.quiz.QuestionVO;
-import nju.seec.helper.vo.quiz.TrueOrFalseQuestionVO;
+import nju.seec.helper.vo.quiz.BaseQuestionVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
@@ -25,41 +20,41 @@ import java.util.Map;
 
 @Service
 public class QuestionServiceImpl implements QuestionService {
-    private final BOKUtil bokUtil;
+    private final BokUtil bokUtil;
 
     @Autowired
-    public QuestionServiceImpl(BOKUtil bokUtil) {
+    public QuestionServiceImpl(BokUtil bokUtil) {
         this.bokUtil = bokUtil;
     }
 
     @Override
-    public Page<QuestionVO> getQuestionList(LoginUser user, String stem, Pageable pageable) {
+    public Page<BaseQuestionVO> getQuestionList(LoginUser user, String stem, Pageable pageable) {
         //应该对象化
-        List<QuestionVO> Questions = new ArrayList<>();
+        List<BaseQuestionVO> questions = new ArrayList<>();
         Map page = new HashMap();
 
-        bokUtil.BokFindByStemLike(stem, Questions,page,pageable);
-        return new PageImpl<>(Questions,pageable,Long.valueOf((Integer)page.get("totalElements")));
+        bokUtil.bokFindByStemLike(stem, questions,page,pageable);
+        return new PageImpl<>(questions,pageable,Long.valueOf((Integer)page.get("totalElements")));
     }
 
     @Override
-    public QuestionVO getQuestion(String questionId) {
-        return bokUtil.BokFindById(questionId);
+    public BaseQuestionVO getQuestion(String questionId) {
+        return bokUtil.bokFindById(questionId);
     }
 
     @Override
-    public QuestionVO newQuestion(QuestionVO newQuestion) {
+    public BaseQuestionVO newQuestion(BaseQuestionVO newQuestion) {
         try {
-            return bokUtil.PostNewQuestion(newQuestion);
+            return bokUtil.postNewQuestion(newQuestion);
         } catch (JsonProcessingException e) {
             throw HelperException.of(ExceptionType.ERROR,"请求BOK题库数据错误:"+e.getMessage());
         }
     }
 
     @Override
-    public QuestionVO updateQuestion(QuestionVO newQuestion) {
+    public BaseQuestionVO updateQuestion(BaseQuestionVO newQuestion) {
         try {
-            return bokUtil.PutQuestion(newQuestion);
+            return bokUtil.putQuestion(newQuestion);
         } catch (JsonProcessingException e) {
             throw HelperException.of(ExceptionType.ERROR,"请求BOK题库数据错误:"+e.getMessage());
         }

+ 67 - 60
src/main/java/nju/seec/helper/service/impl/QuizServiceImpl.java

@@ -4,13 +4,13 @@ import nju.seec.helper.dao.*;
 import nju.seec.helper.dto.QuestionStudentAnswerDTO;
 import nju.seec.helper.entity.*;
 import nju.seec.helper.service.QuizService;
-import nju.seec.helper.util.BOKUtil;
+import nju.seec.helper.util.BokUtil;
 import nju.seec.helper.util.enums.ExceptionType;
 import nju.seec.helper.util.enums.QuizState;
 import nju.seec.helper.util.enums.SlideState;
 import nju.seec.helper.util.enums.UserType;
 import nju.seec.helper.util.exception.HelperException;
-import nju.seec.helper.vo.quiz.QuestionVO;
+import nju.seec.helper.vo.quiz.BaseQuestionVO;
 import nju.seec.helper.vo.quiz.QuizResultVO;
 import nju.seec.helper.vo.quiz.QuizVO;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -31,10 +31,10 @@ public class QuizServiceImpl implements QuizService {
     private final ChooseDAO chooseDAO;
     private final CourseDAO courseDAO;
     private final UserDAO userDAO;
-    private final BOKUtil bokUtil;
+    private final BokUtil bokUtil;
 
     @Autowired
-    public QuizServiceImpl(SlideDAO slideDAO, QuizDAO quizDAO, QuizStudentAnswerDAO quizStudentAnswerDAO, ChooseDAO chooseDAO, CourseDAO courseDAO, UserDAO userDAO, BOKUtil bokUtil) {
+    public QuizServiceImpl(SlideDAO slideDAO, QuizDAO quizDAO, QuizStudentAnswerDAO quizStudentAnswerDAO, ChooseDAO chooseDAO, CourseDAO courseDAO, UserDAO userDAO, BokUtil bokUtil) {
         this.slideDAO = slideDAO;
         this.quizDAO = quizDAO;
         this.quizStudentAnswerDAO = quizStudentAnswerDAO;
@@ -45,8 +45,8 @@ public class QuizServiceImpl implements QuizService {
     }
 
     @Override
-    @Transactional
-    public Quiz CreateQuiz(String name, Long uid, SlideState quizTime,
+    @Transactional(rollbackFor = Exception.class)
+    public Quiz createQuiz(String name, Long uid, SlideState quizTime,
                            Long slideId, List<String> questions){
         User teacher =new User();
         teacher.setId(uid);
@@ -76,13 +76,17 @@ public class QuizServiceImpl implements QuizService {
     }
 
     @Override
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public Quiz modifyQuiz(Long quizId, String name, List<String> questions, SlideState quizTime, String slideId) {
 
         Quiz quiz =quizDAO.findQuizById(quizId);
         if(quiz.getState()!=QuizState.NOT_STARTED){throw HelperException.of(ExceptionType.FORBIDDEN,"不能修改已经开始的测试!");}
-        if(name!=null) quiz.setName(name);
-        if(questions!=null) quiz.setQuestions(questions);
+        if(name!=null) {
+            quiz.setName(name);
+        }
+        if(questions!=null) {
+            quiz.setQuestions(questions);
+        }
         if(quizTime!=null) {
             quiz.setQuizTime(quizTime);
             checkQuizState(quiz,quiz.getSlide());
@@ -125,14 +129,14 @@ public class QuizServiceImpl implements QuizService {
         if(quiz.getState()!=QuizState.CLOSED){throw new RuntimeException("测试未关闭,无法得到测试结果");}
         List<QuizResultVO> retList=new ArrayList<>();
         final List<StudentScore> studentScoreList = quiz.getStudentScore();
-        Map<Long,List<QuizStudentAnswer>> IdQuizStudentAnswerMap=new HashMap<>();
+        Map<Long,List<QuizStudentAnswer>> idQuizStudentAnswerMap=new HashMap<>();
         for(QuizStudentAnswer qsa:quizStudentAnswerDAO.findAllByQuiz(quiz)){
-            IdQuizStudentAnswerMap.computeIfAbsent(qsa.getStudent().getId(), k -> new ArrayList<>());
-            IdQuizStudentAnswerMap.get(qsa.getStudent().getId()).add(qsa);
+            idQuizStudentAnswerMap.computeIfAbsent(qsa.getStudent().getId(), k -> new ArrayList<>());
+            idQuizStudentAnswerMap.get(qsa.getStudent().getId()).add(qsa);
         }
         for(StudentScore studentScore:studentScoreList){
             final User student = studentScore.getStudent();
-            final List<QuizStudentAnswer> list = IdQuizStudentAnswerMap.get(student.getId());
+            final List<QuizStudentAnswer> list = idQuizStudentAnswerMap.get(student.getId());
             retList.add(new QuizResultVO(studentScore,student,list));
         }
         return retList;
@@ -145,20 +149,20 @@ public class QuizServiceImpl implements QuizService {
     }
 
     @Override
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public Integer upStudentAnswer(Long quizId, Long uid, List<QuestionStudentAnswerDTO> answers) {
         Assert.notNull(quizId,"错误的测试!");
         final Quiz quiz = quizDAO.findQuizById(quizId);
         if(quiz.getState()!=QuizState.ONGOING){throw HelperException.of(ExceptionType.FORBIDDEN,"不能提交尚未开始的作业!");}
         User student =new User();student.setId(uid);
-        Set<QuizStudentAnswer> QuizAnswers = quizStudentAnswerDAO.findByStudentAndQuiz(student,quiz);
+        Set<QuizStudentAnswer> quizAnswers = quizStudentAnswerDAO.findByStudentAndQuiz(student,quiz);
         Set<String> questionIdSet = new HashSet<>(quiz.getQuestions());
         Map<String,QuizStudentAnswer> qsaMap=new HashMap<>(questionIdSet.size());
-        for(QuizStudentAnswer qsa: QuizAnswers){
+        for(QuizStudentAnswer qsa: quizAnswers){
             qsaMap.put(qsa.getQuestionId(),qsa);
         }
         //确定被更新或者新建的学生答案提交
-        List<QuizStudentAnswer> toSaveQSA=new ArrayList<>();
+        List<QuizStudentAnswer> quizStudentAnswers=new ArrayList<>();
         for(QuestionStudentAnswerDTO studentAnswer:answers){
             String id = studentAnswer.getQuestionId();
             String answer = studentAnswer.getStudentAnswer().toString();
@@ -169,17 +173,17 @@ public class QuizServiceImpl implements QuizService {
                 }
                 qsaMap.get(id).setStudentAnswer(answer);
                 System.out.println(answer);
-                toSaveQSA.add(qsaMap.get(id));
+                quizStudentAnswers.add(qsaMap.get(id));
             }else {
                 QuizStudentAnswer qsa=QuizStudentAnswer.builder()
                         .questionId(id).quiz(quiz).student(student).studentAnswer(answer)
                         .build();
-                toSaveQSA.add(qsa);
+                quizStudentAnswers.add(qsa);
             }
 
         }
-        Integer savedNum=toSaveQSA.size();
-        quizStudentAnswerDAO.saveAll(toSaveQSA);
+        Integer savedNum=quizStudentAnswers.size();
+        quizStudentAnswerDAO.saveAll(quizStudentAnswers);
         return savedNum;
     }
 
@@ -188,42 +192,45 @@ public class QuizServiceImpl implements QuizService {
         Assert.notNull(slideId,"错误的幻灯片!");
         Slide slide=new Slide();
         slide.setId(slideId);
-        if(state!=null)
-            return quizDAO.findAllBySlideAndState(slide,state, pageable);
-        else
-            return quizDAO.findAllBySlide(slide,pageable);
+        if(state!=null) {
+            return quizDAO.findAllBySlideAndState(slide, state, pageable);
+        }
+        else {
+            return quizDAO.findAllBySlide(slide, pageable);
+        }
     }
     @Override
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public QuizState checkQuizState(Quiz quiz, Slide slide) {
-        int QuizTime = quiz.getQuizTime().getNum();
+        int quizTime = quiz.getQuizTime().getNum();
         int slideTime = slide.getState().getNum();
-        if (quiz.getId() == null)
+        if (quiz.getId() == null){
             //未持久化的quiz
-            quiz.setState(slideTime < QuizTime ? QuizState.NOT_STARTED : QuizState.ONGOING);
+            quiz.setState(slideTime < quizTime ? QuizState.NOT_STARTED : QuizState.ONGOING);
+        }
         else {
             //持久化后,不仅仅需要推进状态,还需要判分,保存等步骤
-            if (slideTime < QuizTime) {
+            if (slideTime < quizTime) {
                 if(quiz.getState().equals(QuizState.NOT_STARTED)){return QuizState.NOT_STARTED;}
                 //未开始
                 quiz.setState(QuizState.NOT_STARTED);
-            } else if (slideTime == QuizTime) {
+            } else if (slideTime == quizTime) {
                 if(quiz.getState().equals(QuizState.ONGOING)){return QuizState.ONGOING;}
                 quiz.setState(QuizState.ONGOING);
             } else {
                 if(quiz.getState().equals(QuizState.CLOSED)){return QuizState.CLOSED;}
                 quiz.setState(QuizState.CLOSED);
-                Set<QuizStudentAnswer> QuizAnswers = quizStudentAnswerDAO.findAllByQuiz(quiz);
+                Set<QuizStudentAnswer> quizAnswers = quizStudentAnswerDAO.findAllByQuiz(quiz);
                 final Set<Long> studentIds = chooseDAO.findStudentIdsByCourseId(slide.getCourseId());
-                Student2_QuestionId2Answer triadMap = new Student2_QuestionId2Answer(studentIds, quiz.getQuestions().size());
+                Student2QuestionId2Answer triadMap = new Student2QuestionId2Answer(studentIds, quiz.getQuestions().size());
                 //将已经作答的学生答案加入
-                for (QuizStudentAnswer answers : QuizAnswers) {
+                for (QuizStudentAnswer answers : quizAnswers) {
                     triadMap.addAnswer(answers);
                 }
                 //生成未作答的学生答案
                 triadMap.fullAnswer(quiz);
                 //检查答案,赋分
-                triadMap.checkAnswerAndFullPass(bokUtil.BokFindByIdIn(quiz.getQuestions()), quiz);
+                triadMap.checkAnswerAndFullPass(bokUtil.bokFindByIdIn(quiz.getQuestions()), quiz);
                 //保存现场
                 quizStudentAnswerDAO.saveAll(triadMap.getAll());
             }
@@ -238,17 +245,17 @@ public class QuizServiceImpl implements QuizService {
         Slide slide=slideDAO.findSlideById(slideId);
         return checkQuizState(quiz,slide);
     }
-    private class Student2_QuestionId2Answer{
-        Map<Long,Map<String,QuizStudentAnswer>> Student2_QuestionId2Answer;
-        Student2_QuestionId2Answer(Set<Long> studentIds, Integer quizQuestionSize) {
-            Student2_QuestionId2Answer =new LinkedHashMap<>(studentIds.size());
+    private class Student2QuestionId2Answer {
+        Map<Long,Map<String,QuizStudentAnswer>> student2QuestionId2Answer;
+        Student2QuestionId2Answer(Set<Long> studentIds, Integer quizQuestionSize) {
+            student2QuestionId2Answer =new LinkedHashMap<>(studentIds.size());
             for(Long studentId:studentIds){
-                Map<String,QuizStudentAnswer> QuestionId2Answer= new LinkedHashMap<>(quizQuestionSize);
-                Student2_QuestionId2Answer.put(studentId,QuestionId2Answer);
+                Map<String,QuizStudentAnswer> questionId2Answer= new LinkedHashMap<>(quizQuestionSize);
+                student2QuestionId2Answer.put(studentId,questionId2Answer);
             }
         }
         void addAnswer(QuizStudentAnswer answers){
-            Map<String, QuizStudentAnswer> stringQuizStudentAnswerMap = Student2_QuestionId2Answer.get(answers.getStudent().getId());
+            Map<String, QuizStudentAnswer> stringQuizStudentAnswerMap = student2QuestionId2Answer.get(answers.getStudent().getId());
             if(stringQuizStudentAnswerMap==null){
                 return ;
             }
@@ -256,7 +263,7 @@ public class QuizServiceImpl implements QuizService {
         }
         void fullAnswer(Quiz quiz){
             List<String> questions=quiz.getQuestions();
-            Student2_QuestionId2Answer.forEach((studentId,map)->{
+            student2QuestionId2Answer.forEach((studentId, map)->{
                 if(questions.size()!=map.size()){
                     for(String questionId:questions){
                         if(map.get(questionId)==null){
@@ -270,17 +277,17 @@ public class QuizServiceImpl implements QuizService {
                 }
             });
         }
-        void checkAnswerAndFullPass(List<QuestionVO> questionVOS, Quiz quiz){
-            if(quiz.getStudentScore()==null){quiz.setStudentScore(new ArrayList<>(Student2_QuestionId2Answer.size()));}
-            Student2_QuestionId2Answer.forEach((studentId,map)->{
+        void checkAnswerAndFullPass(List<BaseQuestionVO> questionVos, Quiz quiz){
+            if(quiz.getStudentScore()==null){quiz.setStudentScore(new ArrayList<>(student2QuestionId2Answer.size()));}
+            student2QuestionId2Answer.forEach((studentId, map)->{
                 int passCount=0;
-                for(QuestionVO vo:questionVOS){
+                for(BaseQuestionVO vo:questionVos){
                     final String studentAnswer = map.get(vo.getQuestionId()).getStudentAnswer();
                     boolean pass=vo.checkAnswer(studentAnswer);
                     if(pass){passCount++;}
                     map.get(vo.getQuestionId()).setPass(pass);
                 }
-                Double score = (100.0*passCount)/questionVOS.size();
+                Double score = (100.0*passCount)/questionVos.size();
                 User student =new User();student.setId(studentId);
                 StudentScore studentScore=new StudentScore();
                 studentScore.setQuizId(quiz.getId());
@@ -291,8 +298,8 @@ public class QuizServiceImpl implements QuizService {
         }
         List<QuizStudentAnswer> getAll(){
             List<QuizStudentAnswer> list=new ArrayList<>();
-            for(Long sid:Student2_QuestionId2Answer.keySet()){
-                list.addAll(Student2_QuestionId2Answer.get(sid).values());
+            for(Long sid: student2QuestionId2Answer.keySet()){
+                list.addAll(student2QuestionId2Answer.get(sid).values());
             }
             return list;
         }
@@ -301,8 +308,8 @@ public class QuizServiceImpl implements QuizService {
     public QuizVO combineQuiz(Long quizId){
         Assert.notNull(quizId,"错误的测试!");
         final Quiz quizById = quizDAO.findQuizById(quizId);
-        final List<QuestionVO> questionVOS = bokUtil.BokFindByIdIn(quizById.getQuestions());
-        return new QuizVO(quizById,questionVOS);
+        final List<BaseQuestionVO> questionVoS = bokUtil.bokFindByIdIn(quizById.getQuestions());
+        return new QuizVO(quizById,questionVoS);
     }
     @Override
     public QuizVO combineQuizWithAnswer(Long quizId, Long uid,UserType userType){
@@ -313,27 +320,27 @@ public class QuizServiceImpl implements QuizService {
 
         if(userType==null||userType.equals(UserType.TEACHER)){
             //向老师展示
-            List<QuestionVO> questionVOS = bokUtil.BokFindByIdIn(quizById.getQuestions());
-            return new QuizVO(quizById,questionVOS);
+            List<BaseQuestionVO> questionVoS = bokUtil.bokFindByIdIn(quizById.getQuestions());
+            return new QuizVO(quizById,questionVoS);
         }
         if(quizById.getState().equals(QuizState.NOT_STARTED)){
             //未开始看不到题目
             return new QuizVO(quizById);
         }
 
-        List<QuestionVO> questionVOS = bokUtil.BokFindByIdIn(quizById.getQuestions());
-        final Set<QuizStudentAnswer> QuizAnswers = quizStudentAnswerDAO.findByStudentAndQuiz(student,quizById);
-        Map<String,QuizStudentAnswer> qsaMap=new HashMap<>(QuizAnswers.size());
-        for(QuizStudentAnswer qsa: QuizAnswers){
+        List<BaseQuestionVO> questionVos = bokUtil.bokFindByIdIn(quizById.getQuestions());
+        final Set<QuizStudentAnswer> quizAnswers = quizStudentAnswerDAO.findByStudentAndQuiz(student,quizById);
+        Map<String,QuizStudentAnswer> qsaMap=new HashMap<>(quizAnswers.size());
+        for(QuizStudentAnswer qsa: quizAnswers){
             qsaMap.put(qsa.getQuestionId(),qsa);
         }
-        for(QuestionVO vo:questionVOS){
+        for(BaseQuestionVO vo:questionVos){
             if(qsaMap.get(vo.getQuestionId())!=null){
                 vo.exAddAnswer(qsaMap.get(vo.getQuestionId()));
             }
         }
 
-        return new QuizVO(quizById,questionVOS);
+        return new QuizVO(quizById,questionVos);
     }
 
 

+ 60 - 65
src/main/java/nju/seec/helper/util/BOKUtil.java → src/main/java/nju/seec/helper/util/BokUtil.java

@@ -1,14 +1,15 @@
 package nju.seec.helper.util;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.google.common.collect.ImmutableMap;
 import lombok.Data;
 import nju.seec.helper.util.enums.ExceptionType;
 import nju.seec.helper.util.enums.QuestionKindState;
 import nju.seec.helper.util.exception.HelperException;
+import nju.seec.helper.vo.quiz.BaseQuestionVO;
 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.beans.factory.annotation.Value;
@@ -20,11 +21,10 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.client.HttpClientErrorException;
 
 import java.util.*;
-import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 @Component
-public class BOKUtil {
+public class BokUtil {
     @Autowired
     private RestRequestUtil restRequestUtil;
     @Autowired
@@ -33,8 +33,8 @@ public class BOKUtil {
     private String bokUrl="http://bok.seecoder.cn";
     private String searchUrl=bokUrl+"/api/tq/search/";
     private String tqUrl=bokUrl+"/api/tq/";
-    // 应该做成bok的库
-    public void BokFindByStemLike(String stem, List<QuestionVO> Questions, Map page, Pageable pageable) {
+
+    public void bokFindByStemLike(String stem, List<BaseQuestionVO> questions, Map page, Pageable pageable) {
 
         Map<String,String> urlParams=new HashMap<>();
         urlParams.put("content",stem);
@@ -49,7 +49,7 @@ public class BOKUtil {
             List collect = parseBody(tqs);
             try {
                 page.putAll((Map)ret.get("page"));
-                Questions.addAll(collect);
+                questions.addAll(collect);
             }catch (Exception e){
                 e.printStackTrace();
             }
@@ -59,16 +59,16 @@ public class BOKUtil {
         }
     }
     private static String CACHE_NAME="BOK";
-    public List<QuestionVO> BokFindByIdIn(List<String> Ids) {
+    public List<BaseQuestionVO> bokFindByIdIn(List<String> ids) {
         //todo: 从缓存中取Ids
-        Set<String> requestIds = new HashSet<>(Ids);
+        Set<String> requestIds = new HashSet<>(ids);
         final ImmutableMap<Object, Object> bok = cacheUtils.multiGet(CACHE_NAME,requestIds );
 
-        Map<String, QuestionVO> QuestionsMap = new HashMap<>(Ids.size());
+        Map<String, BaseQuestionVO> questionsMap = new HashMap<>(ids.size());
         bok.values().forEach(vo -> {
-            if (vo instanceof QuestionVO) {
-                QuestionVO questionVO = (QuestionVO) vo;
-                QuestionsMap.put(questionVO.getQuestionId(), questionVO);
+            if (vo instanceof BaseQuestionVO) {
+                BaseQuestionVO questionVO = (BaseQuestionVO) vo;
+                questionsMap.put(questionVO.getQuestionId(), questionVO);
                 requestIds.remove(questionVO.getQuestionId());
             }
         });
@@ -90,67 +90,52 @@ public class BOKUtil {
                 e.printStackTrace();
                 throw new RuntimeException("bok request error!for findByIdIn:" + Arrays.toString(requestIds.toArray()));
             }
-            List<QuestionVO> collect = parseBody(tqs);
+            List<BaseQuestionVO> collect = parseBody(tqs);
             Map<String,Object> newGet=new HashMap<>(collect.size());
-            for (QuestionVO vo : collect) {
-                QuestionsMap.put(vo.getQuestionId(), vo);
+            for (BaseQuestionVO vo : collect) {
+                questionsMap.put(vo.getQuestionId(), vo);
                 newGet.put(vo.getQuestionId(),vo);
             }
             cacheUtils.setAll(CACHE_NAME,newGet);
         }
 
         // todo: 按照Ids重排序
-        List<QuestionVO> ret=new ArrayList<>();
-        for (String id:Ids){
-            ret.add(QuestionsMap.get(id));
+        List<BaseQuestionVO> ret=new ArrayList<>();
+        for (String id:ids){
+            ret.add(questionsMap.get(id));
         }
         return (ret);
     }
 
     private List parseBody(List<Map> tqs) {
-        final List collect = tqs.stream().map(BOKUtil::parseOneQuestion).collect(Collectors.toList());
+        final List collect = tqs.stream().map(BokUtil::parseOneQuestion).collect(Collectors.toList());
         return collect;
     }
 
-//    private static QuestionVO parseRedisRet(Map q){
-//        switch ((String) q.get("kind")) {
-//            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")))
-//                        .analysis((String) q.get("analysis")).QuestionId((String) q.get("QuestionId")).build();
-//
-//            case "TRUE_FALSE":
-//                return TrueOrFalseQuestionVO.builder().stem((String) q.get("stem")).kind(QuestionKindState.TRUE_FALSE)
-//                        .answer(Boolean.valueOf((String) q.get("answer")))
-//                        .analysis((String) q.get("analysis")).QuestionId((String) q.get("QuestionId")).build();
-//
-//        }
-//        throw HelperException.of(ExceptionType.ERROR,"BOK-unknown type:" + (String) q.get("type"));
-//    }
-    private static QuestionVO parseOneQuestion(Map q){
+    private static BaseQuestionVO parseOneQuestion(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();
+                        .analysis((String) q.get("analysis")).questionId(String.valueOf((Integer) q.get("tqId"))).build();
 
             case "true_false":
                 return TrueOrFalseQuestionVO.builder().stem((String) q.get("stem")).kind(QuestionKindState.TRUE_FALSE)
                         .answer(Boolean.valueOf((String) q.get("answer")))
-                        .analysis((String) q.get("analysis")).QuestionId(String.valueOf((Integer) q.get("tq_id"))).build();
-
+                        .analysis((String) q.get("analysis")).questionId(String.valueOf((Integer) q.get("tqId"))).build();
+            default:
         }
         throw HelperException.of(ExceptionType.ERROR,"unknown type:" + (String) q.get("type"));
     }
-    public QuestionVO BokFindById(String questionId)  {
+    public BaseQuestionVO bokFindById(String questionId)  {
         Map<String,String> urlParams=new HashMap<>();
         Object cachedVo = cacheUtils.get(CACHE_NAME, questionId);
-        if (cachedVo instanceof QuestionVO) {
-            return (QuestionVO) cachedVo;
+        if (cachedVo instanceof BaseQuestionVO) {
+            return (BaseQuestionVO) cachedVo;
         }
         try {
             Map ret = (Map)restRequestUtil.sendGetRequest(tqUrl+questionId, urlParams);
-            final QuestionVO vo = parseOneQuestion(ret);
+            final BaseQuestionVO vo = parseOneQuestion(ret);
             cacheUtils.set(CACHE_NAME, vo.getQuestionId(), vo);
             return vo;
         } catch (JsonProcessingException e) {
@@ -159,22 +144,27 @@ public class BOKUtil {
             throw HelperException.of(ExceptionType.valueOf(e.getStatusCode()),"请求BOK题库数据错误:"+e.getMessage());
         }
     }
-    @Transactional(isolation=Isolation.SERIALIZABLE)
-    public QuestionVO PostNewQuestion(QuestionVO vo) throws JsonProcessingException {
-        if(vo.getQuestionId()!=null)
-            throw HelperException.of(ExceptionType.PARAM_ERROR,"should POST a new question");
-
+    @Transactional(isolation=Isolation.SERIALIZABLE,rollbackFor = Exception.class)
+    public BaseQuestionVO postNewQuestion(BaseQuestionVO vo) throws JsonProcessingException {
+        if(vo.getQuestionId()!=null) {
+            throw HelperException.of(ExceptionType.PARAM_ERROR, "should POST a new question");
+        }
         String questionId = null;
-        //我后悔le,我当时应该用uuid的,但是线上已经部署了,只能下次再改叻(如果有下次
-        for(int i=0;i<100;i++){
+        //我当时应该用uuid的,但是线上已经部署了,只能下次再改了(如果有下次
+        //因为线上用的也是Long Id 并且es不提供自增主键,先这样尝试插入
+        //之后对于新增bok的题目,应该有某种限制,未补全知识点的题目不允许插入
+        int tryNumber=100;
+        int randomLength=4;
+        for(int i=0;i<tryNumber;i++){
             Date date=new Date();
             Calendar calendar = Calendar.getInstance();
             int year=calendar.get(Calendar.YEAR);String month=String.valueOf(1+calendar.get(Calendar.MONTH));String day=String.valueOf(calendar.get(Calendar.DATE));
             if(month.length()<2){month="0"+month;}
             if(day.length()<2){month="0"+month;}
-            String random=String.valueOf((int)(Math.random()*10000));
-            while (random.length()<4){
-                random="0"+random;
+            Random randomGet=new Random();
+            StringBuilder random= new StringBuilder(String.valueOf(randomGet.nextInt(10000)));
+            while (random.length()<randomLength){
+                random.insert(0, "0");
             }
             questionId=""+(year-2010)+(month)+day+(random);
             try {
@@ -190,17 +180,17 @@ public class BOKUtil {
 
         vo.setQuestionId(questionId);
 
-        BOK_TQ bok_tq=new BOK_TQ(vo);
-        restRequestUtil.sendPutRequest(tqUrl+questionId, bok_tq);
+        BokTq bokTq=new BokTq(vo);
+        restRequestUtil.sendPutRequest(tqUrl+questionId, bokTq);
 
         return vo;
 
     }
-    @Transactional(isolation=Isolation.SERIALIZABLE)
-    public QuestionVO PutQuestion(QuestionVO vo) throws JsonProcessingException {
-        if(vo.getQuestionId()==null)
-            throw HelperException.of(ExceptionType.PARAM_ERROR,"should POST a present question");
-
+    @Transactional(isolation=Isolation.SERIALIZABLE,rollbackFor = Exception.class)
+    public BaseQuestionVO putQuestion(BaseQuestionVO vo) throws JsonProcessingException {
+        if(vo.getQuestionId()==null ){
+            throw HelperException.of(ExceptionType.PARAM_ERROR, "should POST a present question");
+        }
         String questionId=vo.getQuestionId();
         try {
             restRequestUtil.sendGetRequest(tqUrl+questionId, new HashMap<>());
@@ -209,7 +199,7 @@ public class BOKUtil {
                 throw HelperException.of(ExceptionType.PARAM_ERROR,"should POST a present question");
             }
         }
-        restRequestUtil.sendPutRequest(tqUrl+questionId, new BOK_TQ(vo));
+        restRequestUtil.sendPutRequest(tqUrl+questionId, new BokTq(vo));
 
         cacheUtils.remove(CACHE_NAME,questionId);
         return vo;
@@ -222,14 +212,18 @@ public class BOKUtil {
         }
         cacheUtils.remove(CACHE_NAME,questionId);
     }
-    // 来自restBok接口的对象
+
+    /**
+     * 来自restBok接口的对象
+     */
     @JsonInclude(JsonInclude.Include.NON_NULL)
     @Data
-    class BOK_TQ{
+    class BokTq {
         String id;
         String type;
         String answer;
-        String key_points;
+        @JsonProperty(value = "key_points")
+        String keyPoints;
         String analysis;
         String lastModified;
         String stem;
@@ -237,7 +231,7 @@ public class BOKUtil {
         List tags;
         List knowledgeId;
 
-        private BOK_TQ(QuestionVO vo) {
+        private BokTq(BaseQuestionVO vo) {
             this.id = vo.getQuestionId();
             this.stem = vo.getStem();
             switch(vo.getKind()){
@@ -256,9 +250,10 @@ public class BOKUtil {
                     this.analysis=tfvo.getAnalysis();
                     this.answer=tfvo.getAnswer().toString();
                     break;
+                default:
             }
 
-            this.key_points = null;
+            this.keyPoints = null;
             this.lastModified = null;
             this.tags = null;
             this.knowledgeId = null;

+ 0 - 17
src/main/java/nju/seec/helper/util/CacheUtils.java

@@ -1,17 +0,0 @@
-package nju.seec.helper.util;
-
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-public interface CacheUtils {
-    //todo: async
-    void set(String cacheName, String key, String value, long expireTime, TimeUnit timeUnit);
-
-    void setAll(String cacheName, String key, String value, long expireTime, TimeUnit timeUnit);
-
-    String get(String cacheName, String key);
-
-    List<String> multiGet(String cacheName, List<String> keys);
-
-    void remove(String cacheName, String key);
-}

+ 1 - 1
src/main/java/nju/seec/helper/util/RedisCacheUtils.java

@@ -20,7 +20,7 @@ public class RedisCacheUtils {
     public RedisCacheUtils(RedisTemplate<String, String> redisTemplate) {
         this.redisTemplate = redisTemplate;
     }
-    //todo: async
+
     public void set(String cacheName, String key, String value, long expireTime, TimeUnit timeUnit) {
         redisTemplate.opsForValue().set(cacheName + ":" + key, value, expireTime, timeUnit);
     }

+ 2 - 1
src/main/java/nju/seec/helper/util/enums/ExceptionType.java

@@ -20,8 +20,9 @@ public enum ExceptionType {
     }
     public static ExceptionType valueOf(HttpStatus status){
         for(ExceptionType exceptionType:ExceptionType.values()){
-            if(exceptionType.getStatus().equals(status))
+            if(exceptionType.getStatus().equals(status)){
                 return exceptionType;
+            }
         }
         return ExceptionType.ERROR;
     }

+ 5 - 8
src/main/java/nju/seec/helper/vo/quiz/QuestionVO.java → src/main/java/nju/seec/helper/vo/quiz/BaseQuestionVO.java

@@ -3,7 +3,6 @@ package nju.seec.helper.vo.quiz;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.SuperBuilder;
@@ -11,9 +10,6 @@ import nju.seec.helper.entity.QuizStudentAnswer;
 import nju.seec.helper.util.enums.ExceptionType;
 import nju.seec.helper.util.enums.QuestionKindState;
 import nju.seec.helper.util.exception.HelperException;
-import nju.seec.helper.vo.CourseVO;
-import org.springframework.beans.BeanUtils;
-import org.springframework.expression.ParseException;
 
 import java.util.Map;
 
@@ -24,9 +20,9 @@ import java.util.Map;
 @NoArgsConstructor
 @AllArgsConstructor
 @SuperBuilder
-public abstract class QuestionVO {
+public abstract class BaseQuestionVO {
     @JsonProperty(value = "id")
-    private String QuestionId;
+    private String questionId;
     @JsonProperty(value = "kind")
     private QuestionKindState kind;
     @JsonProperty(value = "stem")
@@ -35,9 +31,9 @@ public abstract class QuestionVO {
     public abstract boolean checkAnswer(Object answer);
     public abstract void excludeCorrectAnswer();
     private static ObjectMapper objectMapper = new ObjectMapper();
-    public static QuestionVO parse(Map question){
+    public static BaseQuestionVO parse(Map question){
         String kind = (String)question.get("kind");
-        QuestionVO newQuestion=null;
+        BaseQuestionVO newQuestion=null;
         switch (kind){
             case "CHOICE":
                 newQuestion= (objectMapper.convertValue(question, ChoiceQuestionVO.class));
@@ -45,6 +41,7 @@ public abstract class QuestionVO {
             case "TRUE_FALSE":
                 newQuestion = (objectMapper.convertValue(question, TrueOrFalseQuestionVO.class));
                 return newQuestion;
+            default:
         }
         throw HelperException.of(ExceptionType.PARAM_ERROR,"parse failed:"+question.toString());
     }

+ 8 - 2
src/main/java/nju/seec/helper/vo/quiz/BokQuestion.java

@@ -1,18 +1,24 @@
 package nju.seec.helper.vo.quiz;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.util.Collection;
 import java.util.Map;
 
+/**
+ * @author sheen
+ */
 @Data
 public class BokQuestion {
-    String tq_id;
+    @JsonProperty(value = "tq_id")
+    String tqId;
     String type;
     String stem;
     Map<String,String> options;
     String answer;
-    String key_points;
+    @JsonProperty(value = "key_points")
+    String keyPoints;
     String analysis;
     Collection<String> tags;
     Collection<String> knowledgeId;

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

@@ -2,7 +2,6 @@ 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 lombok.experimental.SuperBuilder;
@@ -14,7 +13,7 @@ import java.util.Map;
 @SuperBuilder
 @AllArgsConstructor
 @NoArgsConstructor
-public class ChoiceQuestionVO extends QuestionVO{
+public class ChoiceQuestionVO extends BaseQuestionVO {
     @JsonProperty(value = "options")
     private Map<String,String> options;
     @JsonProperty(value = "answer")

+ 6 - 7
src/main/java/nju/seec/helper/vo/quiz/QuizVO.java

@@ -8,7 +8,6 @@ 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;
 import nju.seec.helper.vo.CourseVO;
@@ -22,7 +21,7 @@ import java.util.List;
 @AllArgsConstructor
 public class QuizVO {
     @JsonProperty(value = "id")
-    private String QuizId;
+    private String quizId;
     @JsonProperty(value = "name")
     private String name;
     @JsonProperty(value = "state")
@@ -37,10 +36,10 @@ public class QuizVO {
     private Integer questionNumber;
     @JsonProperty(value = "questions")
     @JsonInclude(JsonInclude.Include.NON_NULL)
-    private List<QuestionVO> questions;
+    private List<BaseQuestionVO> questions;
 
-    public QuizVO(Quiz quiz,List<QuestionVO> questions) {
-        this.QuizId = quiz.getId().toString();
+    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());
@@ -50,7 +49,7 @@ public class QuizVO {
         this.questions = questions;
     }
     public QuizVO(Quiz quiz) {
-        this.QuizId = quiz.getId().toString();
+        this.quizId = quiz.getId().toString();
         this.name = quiz.getName();
         this.state = quiz.getState();
         this.courseVO = new CourseVO(quiz.getCourse());
@@ -59,7 +58,7 @@ public class QuizVO {
         this.questionNumber = quiz.getQuestions().size();
     }
     public void excludeCorrectAnswer(){
-        questions.forEach(QuestionVO::excludeCorrectAnswer);
+        questions.forEach(BaseQuestionVO::excludeCorrectAnswer);
     }
 }
 // http://47.100.18.120:3000/SEEC-BOK/API-DOC/src/master/helper/serializer/QuizSerializer.md

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

@@ -2,19 +2,16 @@ 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 lombok.experimental.SuperBuilder;
 import nju.seec.helper.entity.QuizStudentAnswer;
 
-import java.util.Map;
-
 @Data
 @SuperBuilder
 @AllArgsConstructor
 @NoArgsConstructor
-public class TrueOrFalseQuestionVO extends QuestionVO{
+public class TrueOrFalseQuestionVO extends BaseQuestionVO {
     @JsonProperty(value = "answer")
     private Boolean answer;
     @JsonProperty(value = "analysis")