uncln 5 лет назад
Родитель
Сommit
07cb9abe13

+ 57 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/controller/ControllerAdvice.java

@@ -0,0 +1,57 @@
+package cn.seecoder.data.server.controller;
+
+import cn.seecoder.data.server.controller.response.ErrorResponse;
+import cn.seecoder.data.server.exception.SeecDataException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.BindException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
+
+import javax.validation.ConstraintViolationException;
+import java.util.Objects;
+
+@Slf4j
+@RestControllerAdvice
+public class ControllerAdvice {
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public ResponseEntity<ErrorResponse> handleMethodArgumentNotValidatedException(MethodArgumentNotValidException e) {
+        return ResponseEntity.badRequest().body(ErrorResponse.of(Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage()));
+    }
+
+    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
+    public ResponseEntity<ErrorResponse> handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e) {
+        log.error(e.getParameter().getParameterName(), e);
+        return ResponseEntity.badRequest().body(ErrorResponse.of("路径参数错误"));
+    }
+
+    @ExceptionHandler(ConstraintViolationException.class)
+    public ResponseEntity<ErrorResponse> handleConstraintViolationException(ConstraintViolationException e) {
+        return ResponseEntity.badRequest().body(ErrorResponse.of(e.getLocalizedMessage()));
+    }
+
+    @ExceptionHandler(BindException.class)
+    public ResponseEntity<ErrorResponse> handleBindException(BindException e) {
+        return ResponseEntity.badRequest().body(ErrorResponse.of(Objects.requireNonNull(e.getFieldError()).getDefaultMessage()));
+    }
+
+    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+    public ResponseEntity<ErrorResponse> handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
+        return ResponseEntity.status(405).body(ErrorResponse.of(e.getLocalizedMessage()));
+    }
+
+    @ExceptionHandler(SeecDataException.class)
+    public ResponseEntity<ErrorResponse> handleHelperException(SeecDataException e) {
+        return ResponseEntity.status(e.getType().getStatus()).body(ErrorResponse.of(e.getMsg()));
+    }
+
+    @ExceptionHandler(Exception.class)
+    public ResponseEntity<ErrorResponse> handleException(Exception e) {
+        log.error(e.getLocalizedMessage(), e);
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ErrorResponse.of("系统异常,请重试"));
+    }
+}

+ 14 - 2
seec-data-server/src/main/java/cn/seecoder/data/server/controller/HelperController.java

@@ -1,7 +1,10 @@
 package cn.seecoder.data.server.controller;
 
 import cn.seecoder.data.server.repository.GeneralRecordRepository;
+import cn.seecoder.data.server.service.HelperService;
 import cn.seecoder.data.server.service.Impl.EvaluateServiceImpl;
+import cn.seecoder.data.server.service.KnowledgeService;
+import cn.seecoder.data.server.vo.knowledge.KnowledgePointVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -11,6 +14,15 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 public class HelperController {
 
-    @Autowired
-    private GeneralRecordRepository generalRecordRepository;
+    private final HelperService helperService;
+
+    public HelperController(HelperService helperService) {
+        this.helperService = helperService;
+    }
+
+
+    @RequestMapping("/helper/event/{userId}")
+    public double getKnowledgeTreeOnPosition(@PathVariable("userId") int userId){
+        return helperService.getHelperEventScoreById(userId);
+    }
 }

+ 13 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/controller/response/ErrorResponse.java

@@ -0,0 +1,13 @@
+package cn.seecoder.data.server.controller.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * @author cst
+ */
+@Data
+@AllArgsConstructor(staticName = "of")
+public class ErrorResponse {
+    private String msg;
+}

+ 3 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/domain/helper/HelperEventDao.java

@@ -13,6 +13,9 @@ public class HelperEventDao {
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Integer id;
 
+    @Column(name = "user_id")
+    private Integer userId;
+
     @Column(name = "type")
     private String type;
 

+ 16 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/exception/ExceptionType.java

@@ -0,0 +1,16 @@
+package cn.seecoder.data.server.exception;
+
+import lombok.Getter;
+import org.springframework.http.HttpStatus;
+
+@Getter
+public enum ExceptionType {
+    // http code
+    PARAM_ERROR(HttpStatus.BAD_REQUEST), UNAUTHORIZED(HttpStatus.UNAUTHORIZED), FORBIDDEN(HttpStatus.FORBIDDEN), NOT_FOUND(HttpStatus.NOT_FOUND), CONFLICT(HttpStatus.CONFLICT), ERROR(HttpStatus.INTERNAL_SERVER_ERROR);
+
+    private final HttpStatus status;
+
+    ExceptionType(HttpStatus status) {
+        this.status = status;
+    }
+}

+ 17 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/exception/SeecDataException.java

@@ -0,0 +1,17 @@
+package cn.seecoder.data.server.exception;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor(staticName = "of")
+public class SeecDataException extends RuntimeException{
+    private final ExceptionType type;
+    private final String msg;
+
+    @Override
+    public String getMessage() {
+        return msg;
+    }
+}

+ 7 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/repository/helper/HelperEventRepository.java

@@ -1,7 +1,14 @@
 package cn.seecoder.data.server.repository.helper;
 
 import cn.seecoder.data.server.domain.helper.HelperEventDao;
+import lombok.AllArgsConstructor;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
+@Repository
 public interface HelperEventRepository extends JpaRepository<HelperEventDao,Integer> {
+
+    List<HelperEventDao> findByUserId(int userId);
 }

+ 1 - 1
seec-data-server/src/main/java/cn/seecoder/data/server/schedule/HelperSchedule.java

@@ -89,7 +89,7 @@ public class HelperSchedule {
                 "http://localhost:8080/api/event/time?start={1}&end={2}",
                 JSONArray.class,
                 "2000-01-01 00:00:00",
-                "2021-04-27 00:00:00"
+                "2021-04-30 00:00:00"
         );
         for(int i=0;i<jsonArray.size();i++){
             HelperEventDao helperEventDao = jsonArray.getObject(i,HelperEventDao.class);

+ 1 - 1
seec-data-server/src/main/java/cn/seecoder/data/server/service/HelperService.java

@@ -2,5 +2,5 @@ package cn.seecoder.data.server.service;
 
 public interface HelperService {
 
-    public int getHelperScoreById(int id);
+    public double getHelperEventScoreById(int id);
 }

+ 22 - 7
seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/HelperServiceImpl.java

@@ -1,7 +1,8 @@
 package cn.seecoder.data.server.service.Impl;
 
-import cn.seecoder.data.server.domain.GeneralRecordDao;
+import cn.seecoder.data.server.domain.helper.HelperEventDao;
 import cn.seecoder.data.server.repository.GeneralRecordRepository;
+import cn.seecoder.data.server.repository.helper.HelperEventRepository;
 import cn.seecoder.data.server.service.HelperService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -14,13 +15,27 @@ public class HelperServiceImpl implements HelperService {
     @Autowired
     GeneralRecordRepository generalRecordRepository;
 
+    @Autowired
+    HelperEventRepository helperEventRepository;
+
     @Override
-    public int getHelperScoreById(int id) {
-        List<GeneralRecordDao> generalRecordDaos = generalRecordRepository.getByUserIdAndDataSource(id,"helper");
-        double scoreGotten = 0;
-        double scoreTotal = 0;
-        for(int i=0;i<generalRecordDaos.size();i++){
+    public double getHelperEventScoreById(int userId) {
+        List<HelperEventDao> events = helperEventRepository.findByUserId(userId);
+        double score = 0;
+        if(events.size()>0){
+            score = score + 60;
+            for(int i=0;i<events.size();i++){
+                HelperEventDao event = events.get(i);
+                if(event.getType().equals("LESSON"))
+                    score = score + 10;
+                else if(event.getType().equals("QUIZ"))
+                    score = score + 5;
+                else if(event.getType().equals("POST")){
+                    String comment = event.getDescription();
+                    score = score + 5 + (comment.length()/10.0>5?5:comment.length()/10.0);
+                }
+            }
         }
-        return 0;
+        return score;
     }
 }

+ 8 - 8
seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/KnowledgeServiceImpl.java

@@ -2,7 +2,6 @@ package cn.seecoder.data.server.service.Impl;
 
 import cn.seecoder.bok.client.SeecoderBokClient;
 import cn.seecoder.bok.common.vo.QuestionVO;
-import cn.seecoder.data.server.domain.GeneralRecordDao;
 import cn.seecoder.data.server.domain.knowledge.KnowledgeDao;
 import cn.seecoder.data.server.domain.knowledge.KnowledgeOnPositionDao;
 import cn.seecoder.data.server.domain.knowledge.PositionWeightDao;
@@ -12,7 +11,6 @@ import cn.seecoder.data.server.repository.knowledge.PositionWeightRepository;
 import cn.seecoder.data.server.service.KnowledgeService;
 import cn.seecoder.data.server.vo.knowledge.KnowledgePointVO;
 import cn.seecoder.data.server.vo.knowledge.KnowledgeVO;
-import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -73,6 +71,7 @@ public class KnowledgeServiceImpl implements KnowledgeService {
     @Override
     public KnowledgePointVO getTreeByPosition(String position) {
         List<PositionWeightDao> positionWeightDaos = positionWeightRepository.findByPosition(position);
+        SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
         KnowledgePointVO root = new KnowledgePointVO("SE","软件工程",0,0,0,0,0,0,0,null);
         for(int i=0;i<positionWeightDaos.size();i++){
             PositionWeightDao positionWeight = positionWeightDaos.get(i);
@@ -88,7 +87,6 @@ public class KnowledgeServiceImpl implements KnowledgeService {
                 if(!getAbbOnVO(upNode.getKnowledgePointVOs()).contains(tempLevel)){
                     nodeToAdd = new KnowledgePointVO(tempLevel,knowledgeInfo.getName(),0,0,0,0,0,0,0,null);
                     if(j+1==knowledgeLevel.length) {
-                        SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
                         ArrayList<String> knowledgeIds = new ArrayList<>();
                         knowledgeIds.add(tempLevel);
                         long questionNum = seecoderBokClient.getQuestionList(null, null, knowledgeIds, null).getTotalElements();
@@ -147,9 +145,9 @@ public class KnowledgeServiceImpl implements KnowledgeService {
         return root;
     }
 
-
     private KnowledgePointVO addScoreToNode(KnowledgePointVO root, Double score, Double scoreTotal, QuestionVO questionInfo,String knowledege,int deep) {
         String[] nodeKnowledge = knowledege.split("\\.");
+        double[] questionWeight = {1,1,1,1,05,1.1};
         String now = nodeKnowledge[0];
         for(int i=1;i<deep && i<nodeKnowledge.length;i++)
             now = now + "." + nodeKnowledge[i];
@@ -160,14 +158,17 @@ public class KnowledgeServiceImpl implements KnowledgeService {
             root.setScoreGotten(root.getScoreGotten()+leafNode.getScoreGotten());
             root.setScoreTotal(root.getScoreTotal()+leafNode.getScoreTotal());
             if(root.getScoreTotal()!=0)
-                root.setCorrectRate(root.getScoreGotten()/root.getScoreTotal());
+                root.setCorrectRate((root.getScoreGotten()/root.getScoreTotal())>1?1:(root.getScoreGotten()/root.getScoreTotal()));
             if(root.getQuestionsNumTotal()!=0)
-                root.setCoverageRate(root.getQuestionsNumDone()/root.getQuestionsNumTotal());
+                root.setCoverageRate((root.getQuestionsNumDone()/root.getQuestionsNumTotal())>1?1:(root.getQuestionsNumDone()/root.getQuestionsNumTotal()));
             return leafNode;
         }
         else{
             root.setQuestionsNumDone(root.getQuestionsNumDone()+1);
-            root.setScoreGotten(score*root.getLeafWeight());
+            if(questionInfo.getWeight()!=null)
+                root.setScoreGotten(score*root.getLeafWeight()*questionWeight[questionInfo.getWeight()]);
+            else
+                root.setScoreGotten(score*root.getLeafWeight());
             root.setScoreTotal(scoreTotal*root.getLeafWeight());
             if(root.getScoreTotal()!=0)
                 root.setCorrectRate(root.getScoreGotten()/root.getScoreTotal());
@@ -191,7 +192,6 @@ public class KnowledgeServiceImpl implements KnowledgeService {
         }
     }
 
-
     public ArrayList<String> getAbbOnVO(List<KnowledgePointVO> knowledgePointVOS){
         ArrayList<String> arrayList= new ArrayList<>();
         if(knowledgePointVOS!=null && knowledgePointVOS.size()>0) {

+ 3 - 1
seec-data-server/src/main/resources/application.yml

@@ -9,4 +9,6 @@ spring:
       ddl-auto: update
     show-sql: false
 urls:
-  url1: www.baidu.com
+  url1: www.baidu.com
+#server:
+#  port: 8081

+ 6 - 5
seec-data-server/src/test/java/cn/seecoder/data/server/schedule/HelperScheduleTest.java

@@ -3,6 +3,7 @@ package cn.seecoder.data.server.schedule;
 import cn.seecoder.data.server.repository.GeneralRecordRepository;
 import cn.seecoder.data.server.repository.helper.HelperEventRepository;
 import cn.seecoder.data.server.repository.helper.HelperQuizRepository;
+import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -31,9 +32,9 @@ class HelperScheduleTest {
 //        helperSchedule.HelperQuizExtraction();
 //    }
 
-//    @Test
-//    void helperEventExtractionTest(){
-//        HelperSchedule helperSchedule = new HelperSchedule(generalRecordRepository,helperQuizRepository,helperEventRepository);
-//        helperSchedule.helperEventExtraction();
-//    }
+    @Test
+    void helperEventExtractionTest(){
+        HelperSchedule helperSchedule = new HelperSchedule(generalRecordRepository,helperQuizRepository,helperEventRepository);
+        helperSchedule.helperEventExtraction();
+    }
 }