1
0
فهرست منبع

Merge branch 'master' of ssh://gogs.seec.seecoder.cn:3422/HaoRui/SEEC-Judgement

Bay 5 سال پیش
والد
کامیت
74d1e9d83f

+ 2 - 2
judgement-client/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>judgement</artifactId>
         <groupId>cn.seecoder</groupId>
-        <version>0.1.0</version>
+        <version>0.2.0</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -15,7 +15,7 @@
         <dependency>
             <groupId>cn.seecoder</groupId>
             <artifactId>judgement-common</artifactId>
-            <version>0.1.0</version>
+            <version>0.2.0</version>
             <scope>compile</scope>
         </dependency>
         <dependency>

+ 2 - 1
judgement-client/src/main/java/cn/seecoder/judgement/JudgementApi.java

@@ -1,9 +1,10 @@
 package cn.seecoder.judgement;
 
+import cn.seecoder.judgement.dto.StudentAnswerDTO;
 import cn.seecoder.judgement.vo.JudgedAnswersVO;
 
 import java.util.List;
 
 public interface JudgementApi {
-    JudgedAnswersVO submitQuestionStudentAnswer(List<String> questionsIds, List<Object> answers) throws JudgementException;
+    JudgedAnswersVO submitQuestionStudentAnswer(StudentAnswerDTO studentAnswerDTO) throws JudgementException;
 }

+ 13 - 11
judgement-client/src/main/java/cn/seecoder/judgement/JudgementClient.java

@@ -1,15 +1,19 @@
 package cn.seecoder.judgement;
 
 import cn.seecoder.judgement.dto.StudentAnswerDTO;
+import cn.seecoder.judgement.utils.LocalDateTimeDeserializer;
+import cn.seecoder.judgement.utils.LocalDateTimeSerializer;
 import cn.seecoder.judgement.vo.JudgedAnswersVO;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import okhttp3.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.time.LocalDateTime;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -46,7 +50,7 @@ public class JudgementClient implements JudgementApi {
             if (clazz == null) {
                 return null;
             }
-            return objectMapper.treeToValue(node.get("result"), clazz);
+            return objectMapper.treeToValue(node.get("res"), clazz);
         } catch (IOException e) {
             logger.error("IOException", e);
             throw JudgementException.IO_ERROR;
@@ -65,20 +69,18 @@ public class JudgementClient implements JudgementApi {
 
 
     @Override
-    public JudgedAnswersVO submitQuestionStudentAnswer(List<String> questionsIds, List<Object> answers) throws JudgementException{
+    public JudgedAnswersVO submitQuestionStudentAnswer(StudentAnswerDTO studentAnswerDTO) throws JudgementException{
         try {
             ObjectMapper objectMapper = new ObjectMapper();
+            JavaTimeModule timeModule = new JavaTimeModule();
+            timeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
+            timeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
+            objectMapper.registerModule(timeModule);
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
-            Map<String, StudentAnswerDTO.AnswerRecordDTO> records = new HashMap<>();
-            for (int i = 0; i < questionsIds.size(); i++){
-                StudentAnswerDTO.AnswerRecordDTO answerRecordDTO = new StudentAnswerDTO.AnswerRecordDTO();
-                answerRecordDTO.setAnswer(answers.get(i));
-                records.put(questionsIds.get(i), answerRecordDTO);
-            }
-            StudentAnswerDTO studentAnswerDTO=StudentAnswerDTO.builder()
-                    .records(records)
-                    .build();
+
+            String param = objectMapper.writeValueAsString(studentAnswerDTO);
+
             builder = builder
                     .url(host + "/api/judgement/submit")
                     .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(studentAnswerDTO)));

+ 25 - 0
judgement-client/src/main/java/cn/seecoder/judgement/utils/LocalDateTimeDeserializer.java

@@ -0,0 +1,25 @@
+package cn.seecoder.judgement.utils;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+
+//时间戳反序列化时间
+public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
+    @Override
+    public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+        Long timestamp;
+        try {
+            timestamp = jsonParser.getLongValue();
+        } catch (JsonParseException e) {
+            timestamp = Long.valueOf(jsonParser.getText());
+        }
+        return LocalDateTime.ofEpochSecond(timestamp / 1000, 0, ZoneOffset.ofHours(8));
+    }
+}

+ 17 - 0
judgement-client/src/main/java/cn/seecoder/judgement/utils/LocalDateTimeSerializer.java

@@ -0,0 +1,17 @@
+package cn.seecoder.judgement.utils;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+
+//时间序列化时变为时间戳
+public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
+    @Override
+    public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+        jsonGenerator.writeNumber(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli());
+    }
+}

+ 1 - 1
judgement-common/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>judgement</artifactId>
         <groupId>cn.seecoder</groupId>
-        <version>0.1.0</version>
+        <version>0.2.0</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 10 - 1
judgement-common/src/main/java/cn/seecoder/judgement/dto/StudentAnswerDTO.java

@@ -20,9 +20,10 @@ import java.util.Map;
 @NoArgsConstructor
 @AllArgsConstructor
 public class StudentAnswerDTO implements Serializable {
-    private static final long serialVersionUID = -5846899734313166305L;
 //    @NotEmpty(message = "回答不能为空")
 //    private Map<String, Object> answers;
+    @NotNull(message = "用户id不能为空")
+    String userId;
 
     @NotNull(message = "缺少做题记录")
     @Valid
@@ -32,5 +33,13 @@ public class StudentAnswerDTO implements Serializable {
     public static class AnswerRecordDTO {
         @NotNull(message = "缺少答案")
         private Object answer;
+
+        @NotNull(message = "缺少做题开始时间")
+        @Past(message = "开始时间错误")
+        private LocalDateTime startAt;
+
+        @NotNull(message = "缺少做题结束时间")
+        @Past(message = "结束时间错误")
+        private LocalDateTime endAt;
     }
 }

+ 3 - 0
judgement-common/src/main/java/cn/seecoder/judgement/vo/JudgedAnswersVO.java

@@ -4,6 +4,7 @@ import cn.seecoder.judgement.dto.StudentAnswerDTO;
 import cn.seecoder.judgement.vo.question.BaseQuestionVO;
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 import lombok.NonNull;
 
 import java.math.BigDecimal;
@@ -16,6 +17,7 @@ import java.util.stream.Collectors;
  * @author cst
  */
 @Data
+@NoArgsConstructor
 public class JudgedAnswersVO {
     /**
      * 回答情况
@@ -60,6 +62,7 @@ public class JudgedAnswersVO {
     }
 
     @Data
+    @NoArgsConstructor
     @AllArgsConstructor(staticName = "of")
     public static class QuestionStudentAnswerInfo {
         private String questionId;

+ 2 - 0
judgement-common/src/main/java/cn/seecoder/judgement/vo/question/BaseQuestionVO.java

@@ -32,6 +32,8 @@ public abstract class BaseQuestionVO {
                 return new ChoiceQuestionVO(questionVO, withAnswer);
             case true_false:
                 return new TrueOrFalseQuestionVO(questionVO, withAnswer);
+            case blank:
+                return new BlankQuestionVO(questionVO, withAnswer);
 //            case multiple_choice:
 //                return new MultipleChoiceQuestionVO(questionVO, withAnswer);
             default:

+ 31 - 0
judgement-common/src/main/java/cn/seecoder/judgement/vo/question/BlankQuestionVO.java

@@ -0,0 +1,31 @@
+package cn.seecoder.judgement.vo.question;
+
+import cn.seecoder.bok.common.vo.QuestionVO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+
+/**
+ * @author xst
+ * <p>
+ * updated by cst
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class BlankQuestionVO extends BaseQuestionVO {
+    private String answer;
+
+    public BlankQuestionVO(@NonNull QuestionVO questionVO, boolean withAnswer) {
+        super(questionVO);
+
+        if (withAnswer) {
+            this.answer = questionVO.getAnswer();
+            this.analysis = questionVO.getAnalysis();
+        }
+    }
+
+    @Override
+    public boolean pass(Object answer) {
+        return this.answer.equals(String.valueOf(answer));
+    }
+}

+ 3 - 3
judgement-server/pom.xml

@@ -18,7 +18,7 @@
     <parent>
         <artifactId>judgement</artifactId>
         <groupId>cn.seecoder</groupId>
-        <version>0.1.0</version>
+        <version>0.2.0</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
@@ -61,13 +61,13 @@
         <dependency>
             <groupId>cn.seecoder</groupId>
             <artifactId>judgement-common</artifactId>
-            <version>0.1.0</version>
+            <version>0.2.0</version>
             <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>cn.seecoder</groupId>
             <artifactId>judgement-client</artifactId>
-            <version>0.1.0</version>
+            <version>0.2.0</version>
         </dependency>
     </dependencies>
     <build>

+ 19 - 1
judgement-server/src/main/java/cn/seecoder/judgement/controller/JudgementController.java

@@ -4,9 +4,16 @@ import cn.seecoder.judgement.dto.StudentAnswerDTO;
 import cn.seecoder.judgement.service.JudgementService;
 import cn.seecoder.judgement.response.ResourceResponse;
 import cn.seecoder.judgement.response.Response;
+import cn.seecoder.judgement.utils.LocalDateTimeDeserializer;
+import cn.seecoder.judgement.utils.LocalDateTimeSerializer;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.time.LocalDateTime;
+
 /**
  * author:hr
  */
@@ -20,7 +27,18 @@ public class JudgementController {
     }
 
     @RequestMapping("/submit")
-    public Response submitQuestionsStudentAnswer(@Validated @RequestBody StudentAnswerDTO studentAnswerDTO) {
+    public Response submitQuestionsStudentAnswer(@RequestBody String studentAnswer) {
+        ObjectMapper objectMapper = new ObjectMapper();
+        JavaTimeModule timeModule = new JavaTimeModule();
+        timeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
+        timeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
+        objectMapper.registerModule(timeModule);
+        StudentAnswerDTO studentAnswerDTO = null;
+        try {
+            studentAnswerDTO = objectMapper.readValue(studentAnswer, StudentAnswerDTO.class);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
         return new ResourceResponse(judgementService.submitQuestionsStudentAnswer(studentAnswerDTO));
     }
 }

+ 31 - 5
judgement-server/src/main/java/cn/seecoder/judgement/service/impl/JudgementServiceImpl.java

@@ -1,5 +1,7 @@
 package cn.seecoder.judgement.service.impl;
 
+import cn.seecoder.bok.client.SeecoderBokClient;
+import cn.seecoder.bok.common.vo.RecordVO;
 import cn.seecoder.judgement.dto.StudentAnswerDTO;
 import cn.seecoder.judgement.service.JudgementService;
 import cn.seecoder.judgement.service.QuestionService;
@@ -7,10 +9,7 @@ import cn.seecoder.judgement.vo.JudgedAnswersVO;
 import cn.seecoder.judgement.vo.question.BaseQuestionVO;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
@@ -26,12 +25,21 @@ public class JudgementServiceImpl implements JudgementService {
     }
     @Override
     public JudgedAnswersVO submitQuestionsStudentAnswer(StudentAnswerDTO studentAnswerDTO) {
+        System.out.println(new Date());
+        System.out.println("start judging, students'answers are:");
+        System.out.println(studentAnswerDTO);
+
+        String userId = studentAnswerDTO.getUserId();
         Map<String, StudentAnswerDTO.AnswerRecordDTO> records = studentAnswerDTO.getRecords();
         List<String> questionIds = new ArrayList<>(records.keySet());
         List<BaseQuestionVO> questionVOList = questionService.getQuestionsByIds(questionIds);
+        System.out.println("questions from bok are as follows:");
+        System.out.println(questionVOList);
 
         AtomicInteger correct = new AtomicInteger();
 
+        List<RecordVO> judgedAnswerRecords = new ArrayList<>();
+
         Map<String, JudgedAnswersVO.QuestionStudentAnswerInfo> judgedAnswers = new HashMap<>();
         questionVOList.forEach(baseQuestionVO -> {
             String questionId = baseQuestionVO.getId();
@@ -41,8 +49,26 @@ public class JudgementServiceImpl implements JudgementService {
                 correct.getAndIncrement();
             }
             judgedAnswers.put(questionId, JudgedAnswersVO.QuestionStudentAnswerInfo.of(questionId, answer, isTrue));
+
+            //保存做题数据
+            StudentAnswerDTO.AnswerRecordDTO answerRecordDTO = records.get(questionId);
+            RecordVO record = new RecordVO();
+            record.setUserId(userId);
+            record.setQuestionId(questionId);
+            record.setPass(isTrue);
+            record.setStudentAnswer(String.valueOf(answer));
+            record.setStartAt(answerRecordDTO.getStartAt());
+            record.setFinishAt(answerRecordDTO.getEndAt());
+
+            judgedAnswerRecords.add(record);
         });
+        JudgedAnswersVO res = new JudgedAnswersVO(judgedAnswers);
+
+        SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seecoder.cn", 0);
+        List<RecordVO> recordVOS = seecoderBokClient.createUserRecord(judgedAnswerRecords);
 
-        return new JudgedAnswersVO(judgedAnswers);
+        System.out.println("results are as follows:");
+        System.out.println(res);
+        return res;
     }
 }

+ 1 - 0
judgement-server/src/main/java/cn/seecoder/judgement/service/impl/QuestionServiceImpl.java

@@ -1,6 +1,7 @@
 package cn.seecoder.judgement.service.impl;
 
 import cn.seecoder.bok.client.SeecoderBokClient;
+import cn.seecoder.bok.common.vo.RecordVO;
 import cn.seecoder.judgement.service.QuestionService;
 import cn.seecoder.judgement.vo.question.BaseQuestionVO;
 import org.springframework.beans.factory.annotation.Autowired;

+ 3 - 2
pom.xml

@@ -17,13 +17,13 @@
     </parent>
     <groupId>cn.seecoder</groupId>
     <artifactId>judgement</artifactId>
-    <version>0.1.0</version>
+    <version>0.2.0</version>
     <name>judgement</name>
     <description>Demo project for Spring Boot</description>
 
     <properties>
         <java.version>1.8</java.version>
-        <judgement-version>0.1.0</judgement-version>
+        <judgement-version>0.2.0</judgement-version>
     </properties>
 
     <dependencies>
@@ -58,6 +58,7 @@
         <dependency>
             <groupId>com.squareup.okhttp3</groupId>
             <artifactId>okhttp</artifactId>
+            <version>4.8.0</version>
         </dependency>
 
         <dependency>