sky 5 лет назад
Родитель
Сommit
e030818125
43 измененных файлов с 876 добавлено и 556 удалено
  1. 28 11
      seec-data-server/pom.xml
  2. 13 0
      seec-data-server/src/main/java/cn/seecoder/data/server/configs/AnnotationOrderConfig.java
  3. 13 0
      seec-data-server/src/main/java/cn/seecoder/data/server/configs/RestTemplateConfig.java
  4. 7 5
      seec-data-server/src/main/java/cn/seecoder/data/server/controller/EvaluateController.java
  5. 6 0
      seec-data-server/src/main/java/cn/seecoder/data/server/domain/CoderDao.java
  6. 42 0
      seec-data-server/src/main/java/cn/seecoder/data/server/domain/ExtractionLogDao.java
  7. 0 40
      seec-data-server/src/main/java/cn/seecoder/data/server/domain/devcloud/BugListDao.java
  8. 0 36
      seec-data-server/src/main/java/cn/seecoder/data/server/domain/devcloud/CommitDao.java
  9. 0 40
      seec-data-server/src/main/java/cn/seecoder/data/server/domain/devcloud/TreeDao.java
  10. 21 0
      seec-data-server/src/main/java/cn/seecoder/data/server/dto/coder/CoderDto.java
  11. 13 0
      seec-data-server/src/main/java/cn/seecoder/data/server/dto/coder/CoderSonarDto.java
  12. 14 0
      seec-data-server/src/main/java/cn/seecoder/data/server/dto/coder/Response.java
  13. 0 28
      seec-data-server/src/main/java/cn/seecoder/data/server/dto/devcloud/BugListDTO.java
  14. 0 14
      seec-data-server/src/main/java/cn/seecoder/data/server/dto/devcloud/CommitDTO.java
  15. 0 35
      seec-data-server/src/main/java/cn/seecoder/data/server/dto/devcloud/Response.java
  16. 0 19
      seec-data-server/src/main/java/cn/seecoder/data/server/dto/devcloud/TreeDTO.java
  17. 0 8
      seec-data-server/src/main/java/cn/seecoder/data/server/dto/evaluate/Response.java
  18. 0 201
      seec-data-server/src/main/java/cn/seecoder/data/server/errorAndExceptions/ErrorCodeEnum.java
  19. 2 1
      seec-data-server/src/main/java/cn/seecoder/data/server/repository/CoderRepository.java
  20. 11 0
      seec-data-server/src/main/java/cn/seecoder/data/server/repository/ExtractionLogRepository.java
  21. 0 7
      seec-data-server/src/main/java/cn/seecoder/data/server/repository/devcloud/BugListRepository.java
  22. 0 7
      seec-data-server/src/main/java/cn/seecoder/data/server/repository/devcloud/CommitRepository.java
  23. 0 7
      seec-data-server/src/main/java/cn/seecoder/data/server/repository/devcloud/TreeRepository.java
  24. 73 0
      seec-data-server/src/main/java/cn/seecoder/data/server/schedule/CoderSchedule.java
  25. 0 26
      seec-data-server/src/main/java/cn/seecoder/data/server/schedule/DevcloudSchedule.java
  26. 9 0
      seec-data-server/src/main/java/cn/seecoder/data/server/schedule/EvaluateSchedule.java
  27. 21 0
      seec-data-server/src/main/java/cn/seecoder/data/server/service/ExtractionLogService.java
  28. 43 0
      seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/ExtractionLogServiceImpl.java
  29. 63 0
      seec-data-server/src/main/java/cn/seecoder/data/server/utils/aspects/DataExtractionHandlerAspectJ.java
  30. 10 0
      seec-data-server/src/main/java/cn/seecoder/data/server/utils/aspects/DataExtractor.java
  31. 36 0
      seec-data-server/src/main/java/cn/seecoder/data/server/utils/enums/ErrorCodeEnum.java
  32. 12 0
      seec-data-server/src/main/java/cn/seecoder/data/server/utils/enums/ExtractionLogStatus.java
  33. 22 0
      seec-data-server/src/main/java/cn/seecoder/data/server/utils/exception/GlobalException.java
  34. 37 0
      seec-data-server/src/main/java/cn/seecoder/data/server/utils/exception/GlobalExceptionHandler.java
  35. 33 0
      seec-data-server/src/main/java/cn/seecoder/data/server/vo/Result.java
  36. 7 3
      seec-data-server/src/main/resources/application.yml
  37. 255 0
      seec-data-server/src/main/resources/logback-spring.xml
  38. 0 45
      seec-data-server/src/test/java/cn/seecoder/data/server/dto/devcloud/BugListDTOTest.java
  39. 27 0
      seec-data-server/src/test/java/cn/seecoder/data/server/repository/ExtractionLogRepositoryTest.java
  40. 8 7
      seec-data-server/src/test/java/cn/seecoder/data/server/schedule/CoderScheduleTest.java
  41. 15 7
      seec-data-server/src/test/java/cn/seecoder/data/server/schedule/EvaluateScheduleTest.java
  42. 26 0
      seec-data-server/src/test/java/cn/seecoder/data/server/service/EvaluateServiceTest.java
  43. 9 9
      seec-data-server/src/test/java/config/PropertyTestConfig.java

+ 28 - 11
seec-data-server/pom.xml

@@ -15,6 +15,11 @@
 	<description>Demo project for Spring Boot</description>
 	<properties>
 		<java.version>1.8</java.version>
+		<aspectJVersion>1.7.2</aspectJVersion>
+		<fastjsonVersion>1.2.58</fastjsonVersion>
+		<seecoder.bok.version>0.1.2</seecoder.bok.version>
+		<seecoder.judgement.version>0.2.0</seecoder.judgement.version>
+		<httpclient.version>4.5.6</httpclient.version>
 	</properties>
 	<dependencies>
 		<dependency>
@@ -67,26 +72,38 @@
 		<dependency>
 			<groupId>com.alibaba</groupId>
 			<artifactId>fastjson</artifactId>
-			<version>1.2.58</version>
+			<version>${fastjsonVersion}</version>
 		</dependency>
+		<!-- AspectJ -->
+		<dependency>
+			<groupId>org.aspectj</groupId>
+			<artifactId>aspectjrt</artifactId>
+			<version>${aspectJVersion}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.aspectj</groupId>
+			<artifactId>aspectjweaver</artifactId>
+			<version>${aspectJVersion}</version>
+		</dependency>
+
+		<!-- Seecoder -->
 		<dependency>
 			<groupId>cn.seecoder</groupId>
 			<artifactId>seecoder-bok-client</artifactId>
-			<version>0.1.2</version>
-		</dependency>
-<!--		&lt;!&ndash; https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore &ndash;&gt;-->
-<!--		<dependency>-->
-<!--			<groupId>org.apache.httpcomponents</groupId>-->
-<!--			<artifactId>httpcore</artifactId>-->
-<!--			<version>4.4.10</version>-->
-<!--		</dependency>-->
+			<version>${seecoder.bok.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>cn.seecoder</groupId>
+			<artifactId>judgement-client</artifactId>
+			<version>${seecoder.judgement.version}</version>
+		</dependency>
 
-		<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
 		<dependency>
 			<groupId>org.apache.httpcomponents</groupId>
 			<artifactId>httpclient</artifactId>
-			<version>4.5.6</version>
+			<version>${httpclient.version}</version>
 		</dependency>
+
 	</dependencies>
 
 	<build>

+ 13 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/configs/AnnotationOrderConfig.java

@@ -0,0 +1,13 @@
+package cn.seecoder.data.server.configs;
+
+import org.springframework.context.annotation.AdviceMode;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@EnableAspectJAutoProxy
+@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
+@Configuration
+public class AnnotationOrderConfig {
+}

+ 13 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/configs/RestTemplateConfig.java

@@ -0,0 +1,13 @@
+package cn.seecoder.data.server.configs;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class RestTemplateConfig {
+    @Bean
+    public RestTemplate restTemplate() {
+        return new RestTemplate();
+    }
+}

+ 7 - 5
seec-data-server/src/main/java/cn/seecoder/data/server/controller/EvaluateController.java

@@ -1,8 +1,10 @@
 package cn.seecoder.data.server.controller;
 
 import cn.seecoder.data.server.dto.evaluate.Response;
-import cn.seecoder.data.server.errorAndExceptions.ErrorCodeEnum;
+import cn.seecoder.data.server.utils.enums.ErrorCodeEnum;
 import cn.seecoder.data.server.service.EvaluateService;
+import cn.seecoder.data.server.utils.exception.GlobalException;
+import cn.seecoder.data.server.vo.Result;
 import cn.seecoder.data.server.vo.knowledge.*;
 import cn.seecoder.data.server.repository.GeneralRecordRepository;
 import cn.seecoder.data.server.repository.knowledge.KnowledgeRepository;
@@ -34,10 +36,10 @@ public class EvaluateController {
     }
 
     @RequestMapping("/eval/analysis/{examId}")
-    public Response<Object> evalAnalysisByExamId(@PathVariable("examId") Integer examId) {
+    public Result<Map<String, Map<String,Double>>> evalAnalysisByExamId(@PathVariable("examId") Integer examId) {
         Map<String, Map<String, Double>> res = evaluateService.analyzeEvalTest(examId);
-        ErrorCodeEnum serviceErrorD0001 = ErrorCodeEnum.SERVICE_ERROR_D0001;
-        if(res == null) return Response.buildFailure(serviceErrorD0001.getCode(),serviceErrorD0001.getDescription());
-        return Response.buildSuccess(evaluateService.analyzeEvalTest(examId));
+        ErrorCodeEnum serviceErrorC0001 = ErrorCodeEnum.SERVICE_ERROR_C0001;
+        if(res == null) throw new GlobalException(ErrorCodeEnum.SERVICE_ERROR_C0001);
+        return Result.buildSuccess(evaluateService.analyzeEvalTest(examId));
     }
 }

+ 6 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/domain/CoderDao.java

@@ -1,6 +1,9 @@
 package cn.seecoder.data.server.domain;
 
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 import org.hibernate.annotations.CreationTimestamp;
 import org.hibernate.annotations.UpdateTimestamp;
 
@@ -13,6 +16,9 @@ import java.time.LocalDateTime;
  * */
 
 @Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 @Entity
 @Table(name = "coder")
 public class CoderDao {

+ 42 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/domain/ExtractionLogDao.java

@@ -0,0 +1,42 @@
+package cn.seecoder.data.server.domain;
+
+import cn.seecoder.data.server.utils.enums.ExtractionLogStatus;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.CreationTimestamp;
+import org.hibernate.annotations.UpdateTimestamp;
+
+import javax.persistence.*;
+import java.lang.annotation.Target;
+import java.time.LocalDateTime;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity
+@Table(name = "extraction_log")
+public class ExtractionLogDao {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Integer id;
+
+    @Column(name = "source" , nullable = false)
+    private String source;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "status")
+    private ExtractionLogStatus status;
+
+    @CreationTimestamp
+    @Column(name = "created_at")
+    private LocalDateTime createAt;
+
+    @UpdateTimestamp
+    @Column(name = "updated_at")
+    private LocalDateTime updateAt;
+
+}

+ 0 - 40
seec-data-server/src/main/java/cn/seecoder/data/server/domain/devcloud/BugListDao.java

@@ -1,40 +0,0 @@
-package cn.seecoder.data.server.domain.devcloud;
-
-import lombok.Data;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import java.sql.Timestamp;
-
-@Data
-@Entity
-@Table(name = "devcloud_buglist")
-public class BugListDao {
-    @Id
-    @Column(name = "id" , nullable = false)
-    private Integer id;
-
-    /**
-     * 预计需要时间
-     */
-
-    @Column(name = "time_to_take" , nullable = false)
-    private Long timeToTake;
-
-    @Column(name = "start_time" , nullable = false)
-    private Timestamp startTime;
-
-    @Column(name = "end_time" , nullable = false)
-    private Timestamp endTime;
-
-    /**
-     * 关联的项目
-     */
-    @Column(name = "project_id" , nullable = false)
-    private Integer projectId;
-
-    @Column(name = "processor_id" , nullable = false)
-    private Integer processorId;
-}

+ 0 - 36
seec-data-server/src/main/java/cn/seecoder/data/server/domain/devcloud/CommitDao.java

@@ -1,36 +0,0 @@
-package cn.seecoder.data.server.domain.devcloud;
-
-import lombok.Data;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-@Data
-@Entity
-@Table(name = "devcloud_commit")
-public class CommitDao {
-
-    @Id
-    @Column(name = "id" , nullable = false)
-    private String id; //commitId
-
-    @Column(name = "user_id" , nullable = false)
-    private String userId;
-
-    @Column(name = "timestamp" , nullable = false)
-    private String timestamp; //commit time
-
-    @Column(name = "gitlab_username" , nullable = false)
-    private String gitlabUsername;
-
-    @Column(name = "related_type" , nullable = false)
-    private String relatedType; //fix or feat
-
-    @Column(name = "related_id" , nullable = false)
-    private Integer relatedId;
-
-    @Column(name = "project_id" , nullable = false)
-    private Integer projectId;
-}

+ 0 - 40
seec-data-server/src/main/java/cn/seecoder/data/server/domain/devcloud/TreeDao.java

@@ -1,40 +0,0 @@
-package cn.seecoder.data.server.domain.devcloud;
-
-import lombok.Data;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import java.sql.Timestamp;
-
-@Data
-@Entity
-@Table(name = "devcloud_tree")
-public class TreeDao {
-    @Id
-    @Column(name = "id" , nullable = false)
-    private Integer id;
-
-    /**
-     * 预计需要时间
-     */
-
-    @Column(name = "time_to_take" , nullable = false)
-    private Long timeToTake;
-
-    @Column(name = "start_time" , nullable = false)
-    private Timestamp startTime;
-
-    @Column(name = "end_time" , nullable = false)
-    private Timestamp endTime;
-
-    /**
-     * 关联的项目
-     */
-    @Column(name = "project_id" , nullable = false)
-    private Integer projectId;
-
-    @Column(name = "processor_id" , nullable = false)
-    private Integer processorId;
-}

+ 21 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/dto/coder/CoderDto.java

@@ -0,0 +1,21 @@
+package cn.seecoder.data.server.dto.coder;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+public class CoderDto {
+    private int userId;
+    private int examId;
+    private int recordId;
+    private int problemId;
+    private int commitId;
+    private LocalDateTime lastCommitAt;
+    private LocalDateTime submitAt;
+    private int score;
+    private LocalDateTime startAt;
+    private LocalDateTime endAt;
+}

+ 13 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/dto/coder/CoderSonarDto.java

@@ -0,0 +1,13 @@
+package cn.seecoder.data.server.dto.coder;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class CoderSonarDto {
+    private Integer userId;
+    private Integer commitId;
+    private Integer problemId;
+    private String sonarName;
+}

+ 14 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/dto/coder/Response.java

@@ -0,0 +1,14 @@
+package cn.seecoder.data.server.dto.coder;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class Response<T> {
+    private int code;
+
+    @JsonProperty("res")
+    private T source;
+}

+ 0 - 28
seec-data-server/src/main/java/cn/seecoder/data/server/dto/devcloud/BugListDTO.java

@@ -1,28 +0,0 @@
-package cn.seecoder.data.server.dto.devcloud;
-
-import lombok.Builder;
-import lombok.Data;
-
-import java.sql.Timestamp;
-
-@Data
-@Builder
-public class BugListDTO {
-    private Integer id;
-
-    /**
-     * 预计需要时间
-     */
-    private Long timeToTake;
-
-    private Timestamp startTime;
-
-    private Timestamp endTime;
-
-    /**
-     * 关联的项目
-     */
-    private Integer projectId;
-
-    private Integer processorId;
-}

+ 0 - 14
seec-data-server/src/main/java/cn/seecoder/data/server/dto/devcloud/CommitDTO.java

@@ -1,14 +0,0 @@
-package cn.seecoder.data.server.dto.devcloud;
-
-import lombok.Data;
-
-@Data
-public class CommitDTO {
-    private String id;
-    private String userId;
-    private String timestamp;
-    private String gitlabUsername;
-    private String relatedType;
-    private Integer relatedId;
-    private Integer projectId;
-}

+ 0 - 35
seec-data-server/src/main/java/cn/seecoder/data/server/dto/devcloud/Response.java

@@ -1,35 +0,0 @@
-package cn.seecoder.data.server.dto.devcloud;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-@Data
-public class Response<T> implements Serializable {
-
-    private Integer code;
-
-    private String msg;
-
-    private T data;
-
-    public Response(Integer code, String msg, T data) {
-        this.code = code;
-        this.msg = msg;
-        this.data = data;
-    }
-
-
-    public static Response buildSuccess() {
-        return new Response(200, "", null);
-    }
-
-
-    public static <T> Response<T> buildSuccess(T result) {
-        return new Response<T>(200, "", result);
-    }
-
-    public static  Response buildFailure(Integer code, String message) {
-        return new Response(code,message, null);
-    }
-}

+ 0 - 19
seec-data-server/src/main/java/cn/seecoder/data/server/dto/devcloud/TreeDTO.java

@@ -1,19 +0,0 @@
-package cn.seecoder.data.server.dto.devcloud;
-
-import lombok.Data;
-
-@Data
-public class TreeDTO {
-    private Integer id;
-    /**
-     * 预计完成时间花销
-     */
-    private Long timeToTake;
-    private String startTime;
-    private String endTime;
-    private Integer projectId;
-    /**
-     * 负责人 id
-     */
-    private Integer processorId;
-}

+ 0 - 8
seec-data-server/src/main/java/cn/seecoder/data/server/dto/evaluate/Response.java

@@ -17,18 +17,10 @@ public class  Response<T> implements Serializable {
 
     private T result;
 
-//    public Response(String code, String msg, T data) {
-//        this.code = code;
-//        this.msg = msg;
-//        this.result = data;
-//    }
-
-
     public static Response buildSuccess() {
         return new Response("000000", "成功", null);
     }
 
-
     public static <T> Response<T> buildSuccess(T result) {
         return new Response<T>("000000", "", result);
     }

+ 0 - 201
seec-data-server/src/main/java/cn/seecoder/data/server/errorAndExceptions/ErrorCodeEnum.java

@@ -1,201 +0,0 @@
-package cn.seecoder.data.server.errorAndExceptions;
-
-/**
- * 阿里巴巴Java编码规范,错误码
- */
-public enum ErrorCodeEnum {
-    SUCCESS("00000", "成功"),
-    USER_ERROR_0001("A0001", "用户端错误"),
-    USER_ERROR_A0100("A0100", "用户注册错误"),
-    USER_ERROR_A0101("A0101", "用户未同意隐私协议"),
-    USER_ERROR_A0102("A0102", "注册国家或地区受限"),
-    USER_ERROR_A0110("A0110", "用户名校验失败"),
-    USER_ERROR_A0111("A0111", "用户名已存在"),
-    USER_ERROR_A0112("A0112", "用户名包含敏感词"),
-    USER_ERROR_A0113("A0113", "用户名包含特殊字符"),
-    USER_ERROR_A0120("A0120", "密码校验失败"),
-    USER_ERROR_A0121("A0121", "密码长度不够"),
-    USER_ERROR_A0122("A0122", "密码强度不够"),
-    USER_ERROR_A0130("A0130", "校验码输入错误"),
-    USER_ERROR_A0131("A0131", "短信校验码输入错误"),
-    USER_ERROR_A0132("A0132", "邮件校验码输入错误"),
-    USER_ERROR_A0133("A0133", "语音校验码输入错误"),
-    USER_ERROR_A0140("A0140", "用户证件异常"),
-    USER_ERROR_A0141("A0141", "用户证件类型未选择"),
-    USER_ERROR_A0142("A0142", "大陆身份证编号校验非法"),
-    USER_ERROR_A0143("A0143", "护照编号校验非法"),
-    USER_ERROR_A0144("A0144", "军官证编号校验非法"),
-    USER_ERROR_A0150("A0150", "用户基本信息校验失败"),
-    USER_ERROR_A0151("A0151", "手机格式校验失败"),
-    USER_ERROR_A0152("A0152", "地址格式校验失败"),
-    USER_ERROR_A0153("A0153", "邮箱格式校验失败"),
-    USER_ERROR_A0200("A0200", "用户登陆异常"),
-    USER_ERROR_A0201("A0201", "用户账户不存在"),
-    USER_ERROR_A0202("A0202", "用户账户被冻结"),
-    USER_ERROR_A0203("A0203", "用户账户已作废"),
-    USER_ERROR_A0210("A0210", "用户密码错误"),
-    USER_ERROR_A0211("A0211", "用户输入密码次数超限"),
-    USER_ERROR_A0220("A0220", "用户身份校验失败"),
-    USER_ERROR_A0221("A0221", "用户指纹识别失败"),
-    USER_ERROR_A0222("A0222", "用户面容识别失败"),
-    USER_ERROR_A0223("A0223", "用户未获得第三方登陆授权"),
-    USER_ERROR_A0230("A0230", "用户登陆已过期"),
-    USER_ERROR_A0240("A0240", "用户验证码错误"),
-    USER_ERROR_A0241("A0241", "用户验证码尝试次数超限"),
-    USER_ERROR_A0300("A0300", "访问权限异常"),
-    USER_ERROR_A0301("A0301", "访问未授权"),
-    USER_ERROR_A0302("A0302", "正在授权中"),
-    USER_ERROR_A0303("A0303", "用户授权申请被拒绝"),
-    USER_ERROR_A0310("A0310", "因访问对象隐私设置被拦截"),
-    USER_ERROR_A0311("A0311", "授权已过期"),
-    USER_ERROR_A0312("A0312", "无权限使用API"),
-    USER_ERROR_A0320("A0320", "用户访问被拦截"),
-    USER_ERROR_A0321("A0321", "黑名单用户"),
-    USER_ERROR_A0322("A0322", "账号被冻结"),
-    USER_ERROR_A0323("A0323", "非法IP地址"),
-    USER_ERROR_A0324("A0324", "网关访问受限"),
-    USER_ERROR_A0325("A0325", "地域黑名单"),
-    USER_ERROR_A0330("A0330", "服务已欠费"),
-    USER_ERROR_A0340("A0340", "用户签名异常"),
-    USER_ERROR_A0341("A0341", "RSA签名错误"),
-    USER_ERROR_A0400("A0400", "用户请求参数错误"),
-    USER_ERROR_A0401("A0401", "包含非法恶意跳转链接"),
-    USER_ERROR_A0402("A0402", "无效的用户输入"),
-    USER_ERROR_A0410("A0410", "请求必填参数为空"),
-    USER_ERROR_A0411("A0411", "用户订单号为空"),
-    USER_ERROR_A0412("A0412", "订购数量为空"),
-    USER_ERROR_A0413("A0413", "缺少时间戳参数"),
-    USER_ERROR_A0414("A0414", "非法的时间戳参数"),
-    USER_ERROR_A0420("A0420", "请求参数值超出允许的范围"),
-    USER_ERROR_A0421("A0421", "参数格式不匹配"),
-    USER_ERROR_A0422("A0422", "地址不在服务范围"),
-    USER_ERROR_A0423("A0423", "时间不在服务范围"),
-    USER_ERROR_A0424("A0424", "金额超出限制"),
-    USER_ERROR_A0425("A0425", "数量超出限制"),
-    USER_ERROR_A0426("A0426", "请求批量处理总个数超出限制"),
-    USER_ERROR_A0427("A0427", "请求JSON解析失败"),
-    USER_ERROR_A0430("A0430", "用户输入内容非法"),
-    USER_ERROR_A0431("A0431", "包含违禁敏感词"),
-    USER_ERROR_A0432("A0432", "图片包含违禁信息"),
-    USER_ERROR_A0433("A0433", "文件侵犯版权"),
-    USER_ERROR_A0440("A0440", "用户操作异常"),
-    USER_ERROR_A0441("A0441", "用户支付超时"),
-    USER_ERROR_A0442("A0442", "确认订单超时"),
-    USER_ERROR_A0443("A0443", "订单已关闭"),
-    USER_ERROR_A0500("A0500", "用户请求服务异常"),
-    USER_ERROR_A0501("A0501", "请求次数超出限制"),
-    USER_ERROR_A0502("A0502", "请求并发数超出限制"),
-    USER_ERROR_A0503("A0503", "用户操作请等待"),
-    USER_ERROR_A0504("A0504", "WebSocket连接异常"),
-    USER_ERROR_A0505("A0505", "WebSocket连接断开"),
-    USER_ERROR_A0506("A0506", "用户重复请求"),
-    USER_ERROR_A0600("A0600", "用户资源异常"),
-    USER_ERROR_A0601("A0601", "账户余额不足"),
-    USER_ERROR_A0602("A0602", "用户磁盘空间不足"),
-    USER_ERROR_A0603("A0603", "用户内存空间不足"),
-    USER_ERROR_A0604("A0604", "用户OSS容量不足"),
-    USER_ERROR_A0605("A0605", "用户配额已用光"),
-    USER_ERROR_A0700("A0700", "用户上传文件异常"),
-    USER_ERROR_A0701("A0701", "用户上传文件类型不匹配"),
-    USER_ERROR_A0702("A0702", "用户上传文件太大"),
-    USER_ERROR_A0703("A0703", "用户上传图片太大"),
-    USER_ERROR_A0704("A0704", "用户上传视频太大"),
-    USER_ERROR_A0705("A0705", "用户上传压缩文件太大"),
-    USER_ERROR_A0800("A0800", "用户当前版本异常"),
-    USER_ERROR_A0801("A0801", "用户安装版本与系统不匹配"),
-    USER_ERROR_A0802("A0802", "用户安装版本过低"),
-    USER_ERROR_A0803("A0803", "用户安装版本过高"),
-    USER_ERROR_A0804("A0804", "用户安装版本已过期"),
-    USER_ERROR_A0805("A0805", "用户API请求版本不匹配"),
-    USER_ERROR_A0806("A0806", "用户API请求版本过高"),
-    USER_ERROR_A0807("A0807", "用户API请求版本过低"),
-    USER_ERROR_A0900("A0900", "用户隐私未授权"),
-    USER_ERROR_A0901("A0901", "用户隐私未签署"),
-    USER_ERROR_A0902("A0902", "用户摄像头未授权"),
-    USER_ERROR_A0903("A0903", "用户相机未授权"),
-    USER_ERROR_A0904("A0904", "用户图片库未授权"),
-    USER_ERROR_A0905("A0905", "用户文件未授权"),
-    USER_ERROR_A0906("A0906", "用户位置信息未授权"),
-    USER_ERROR_A0907("A0907", "用户通讯录未授权"),
-    USER_ERROR_A1000("A1000", "用户设备异常"),
-    USER_ERROR_A1001("A1001", "用户相机异常"),
-    USER_ERROR_A1002("A1002", "用户麦克风异常"),
-    USER_ERROR_A1003("A1003", "用户听筒异常"),
-    USER_ERROR_A1004("A1004", "用户扬声器异常"),
-    USER_ERROR_A1005("A1005", "用户GPS定位异常"),
-    SYSTEM_ERROR_B0001("B0001", "系统执行出错"),
-    SYSTEM_ERROR_B0100("B0100", "系统执行超时"),
-    SYSTEM_ERROR_B0101("B0101", "系统订单处理超时"),
-    SYSTEM_ERROR_B0200("B0200", "系统容灾功能被触发"),
-    SYSTEM_ERROR_B0210("B0210", "系统限流"),
-    SYSTEM_ERROR_B0220("B0220", "系统功能降级"),
-    SYSTEM_ERROR_B0300("B0300", "系统资源异常"),
-    SYSTEM_ERROR_B0310("B0310", "系统资源耗尽"),
-    SYSTEM_ERROR_B0311("B0311", "系统磁盘空间耗尽"),
-    SYSTEM_ERROR_B0312("B0312", "系统内存耗尽"),
-    SYSTEM_ERROR_B0313("B0313", "文件句柄耗尽"),
-    SYSTEM_ERROR_B0314("B0314", "系统连接池耗尽"),
-    SYSTEM_ERROR_B0315("B0315", "系统线程池耗尽"),
-    SYSTEM_ERROR_B0320("B0320", "系统资源访问异常"),
-    SYSTEM_ERROR_B0321("B0321", "系统读取磁盘文件失败"),
-    SERVICE_ERROR_C0001("C0001", "调用第三方服务出错"),
-    SERVICE_ERROR_C0100("C0100", "中间件服务出错"),
-    SERVICE_ERROR_C0110("C0110", "RPC服务出错"),
-    SERVICE_ERROR_C0111("C0111", "RPC服务未找到"),
-    SERVICE_ERROR_C0112("C0112", "RPC服务未注册"),
-    SERVICE_ERROR_C0113("C0113", "接口不存在"),
-    SERVICE_ERROR_C0120("C0120", "消息服务出错"),
-    SERVICE_ERROR_C0121("C0121", "消息投递出错"),
-    SERVICE_ERROR_C0122("C0122", "消息消费出错"),
-    SERVICE_ERROR_C0123("C0123", "消息订阅出错"),
-    SERVICE_ERROR_C0124("C0124", "消息分组未查到"),
-    SERVICE_ERROR_C0130("C0130", "缓存服务出错"),
-    SERVICE_ERROR_C0131("C0131", "key长度超过限制"),
-    SERVICE_ERROR_C0132("C0132", "value长度超过限制"),
-    SERVICE_ERROR_C0133("C0133", "存储容量已满"),
-    SERVICE_ERROR_C0134("C0134", "不支持的数据格式"),
-    SERVICE_ERROR_C0140("C0140", "配置服务出错"),
-    SERVICE_ERROR_C0150("C0150", "网络资源服务出错"),
-    SERVICE_ERROR_C0151("C0151", "VPN服务出错"),
-    SERVICE_ERROR_C0152("C0152", "CDN服务出错"),
-    SERVICE_ERROR_C0153("C0153", "域名解析服务出错"),
-    SERVICE_ERROR_C0154("C0154", "网关服务出错"),
-    SERVICE_ERROR_C0200("C0200", "第三方系统执行超时"),
-    SERVICE_ERROR_C0210("C0210", "RPC执行超时"),
-    SERVICE_ERROR_C0220("C0220", "消息投递超时"),
-    SERVICE_ERROR_C0230("C0230", "缓存服务超时"),
-    SERVICE_ERROR_C0240("C0240", "配置服务超时"),
-    SERVICE_ERROR_C0250("C0250", "数据库服务超时"),
-    SERVICE_ERROR_C0300("C0300", "数据库服务出错"),
-    SERVICE_ERROR_C0311("C0311", "表不存在"),
-    SERVICE_ERROR_C0312("C0312", "列不存在"),
-    SERVICE_ERROR_C0321("C0321", "多表关联中存在多个相同名称的列"),
-    SERVICE_ERROR_C0331("C0331", "数据库死锁"),
-    SERVICE_ERROR_C0341("C0341", "主键冲突"),
-    SERVICE_ERROR_C0400("C0400", "第三方容灾系统被触发"),
-    SERVICE_ERROR_C0401("C0401", "第三方系统限流"),
-    SERVICE_ERROR_C0402("C0402", "第三方功能降级"),
-    SERVICE_ERROR_C0500("C0500", "通知服务出错"),
-    SERVICE_ERROR_C0501("C0501", "短信提醒服务失败"),
-    SERVICE_ERROR_C0502("C0502", "语音提醒服务失败"),
-    SERVICE_ERROR_C0503("C0503", "邮件提醒服务失败"),
-
-    SERVICE_ERROR_D0001("D0001", "无本次考试记录");
-
-
-    private final String code;
-    private final String description;
-
-    ErrorCodeEnum(String code, String description) {
-        this.code = code;
-        this.description = description;
-    }
-
-    public String getCode() {
-        return code;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-}

+ 2 - 1
seec-data-server/src/main/java/cn/seecoder/data/server/repository/CoderRepository.java

@@ -2,8 +2,10 @@ package cn.seecoder.data.server.repository;
 
 import cn.seecoder.data.server.domain.CoderDao;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 @Repository
@@ -12,5 +14,4 @@ public interface CoderRepository extends JpaRepository<CoderDao,Integer> {
     List<CoderDao> findByUserId(Integer userId);
 
     List<CoderDao> findByExamIdAndProblemIdOrderByLastCommitAt(Integer examId, Integer problemId);
-
 }

+ 11 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/repository/ExtractionLogRepository.java

@@ -0,0 +1,11 @@
+package cn.seecoder.data.server.repository;
+
+import cn.seecoder.data.server.domain.ExtractionLogDao;
+import cn.seecoder.data.server.utils.enums.ExtractionLogStatus;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+public interface ExtractionLogRepository extends PagingAndSortingRepository<ExtractionLogDao,Integer> {
+    Page<ExtractionLogDao> findBySourceAndStatus(String source, ExtractionLogStatus status, Pageable pageable);
+}

+ 0 - 7
seec-data-server/src/main/java/cn/seecoder/data/server/repository/devcloud/BugListRepository.java

@@ -1,7 +0,0 @@
-package cn.seecoder.data.server.repository.devcloud;
-
-import cn.seecoder.data.server.domain.devcloud.BugListDao;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-public interface BugListRepository  extends JpaRepository<BugListDao,Integer> {
-}

+ 0 - 7
seec-data-server/src/main/java/cn/seecoder/data/server/repository/devcloud/CommitRepository.java

@@ -1,7 +0,0 @@
-package cn.seecoder.data.server.repository.devcloud;
-
-import cn.seecoder.data.server.domain.devcloud.CommitDao;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-public interface CommitRepository extends JpaRepository<CommitDao,Integer> {
-}

+ 0 - 7
seec-data-server/src/main/java/cn/seecoder/data/server/repository/devcloud/TreeRepository.java

@@ -1,7 +0,0 @@
-package cn.seecoder.data.server.repository.devcloud;
-
-import cn.seecoder.data.server.domain.devcloud.TreeDao;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-public interface TreeRepository  extends JpaRepository<TreeDao,Integer> {
-}

+ 73 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/schedule/CoderSchedule.java

@@ -0,0 +1,73 @@
+package cn.seecoder.data.server.schedule;
+
+import cn.seecoder.data.server.domain.CoderDao;
+import cn.seecoder.data.server.domain.GeneralRecordDao;
+import cn.seecoder.data.server.dto.coder.CoderDto;
+import cn.seecoder.data.server.dto.coder.Response;
+import cn.seecoder.data.server.dto.evaluate.ExamDetailsDto;
+import cn.seecoder.data.server.repository.CoderRepository;
+import cn.seecoder.data.server.service.ExtractionLogService;
+import cn.seecoder.data.server.utils.aspects.DataExtractor;
+import cn.seecoder.data.server.utils.enums.ErrorCodeEnum;
+import cn.seecoder.data.server.utils.exception.GlobalException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
+
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class CoderSchedule {
+
+    @Value("${remoteUrls.coder}")
+    private String coderBaseUrl;
+
+    @Autowired
+    private ExtractionLogService extractionLogService;
+
+    @Autowired
+    private CoderRepository coderRepository;
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    private final String source = "coder";
+
+//    @Scheduled(cron = "00 00 00 * * ?")
+    @DataExtractor(source)
+    @Transactional(rollbackFor = Exception.class)
+    public void coderDataExtraction() throws Exception {
+        LocalDateTime start = extractionLogService.getExtractionStartTime(source,1);
+        LocalDateTime end = extractionLogService.getExtractionEndTime(source);
+        Map<String,String> param = new HashMap<>();
+        param.put("startTime",start.toString());
+        param.put("endTime",end.toString());
+        System.out.println(param);
+        String coderApi1 = "/xxx?startTime={startTime}&endTime={endTime}";
+        String url = coderBaseUrl + coderApi1;
+        ParameterizedTypeReference<Response<List<CoderDto>>> responseType = new ParameterizedTypeReference<Response<List<CoderDto>>>() {};
+        ResponseEntity<Response<List<CoderDto>>> r = restTemplate.exchange(url, HttpMethod.GET,null,responseType,param );
+        Response<List<CoderDto>> body = r.getBody();
+        if (body == null || body.getCode()!=200) throw new GlobalException(ErrorCodeEnum.SERVICE_ERROR_C0002);
+        List<CoderDto> source = body.getSource();
+        if(source == null || source.size()==0) throw new GlobalException(ErrorCodeEnum.SERVICE_ERROR_C0003);
+        List<CoderDao> target = new LinkedList<>();
+        source.forEach(data -> {
+            CoderDao c = CoderDao.builder().commitId(data.getCommitId()).examId(data.getExamId()).endAt(data.getEndAt())
+                    .lastCommitAt(data.getLastCommitAt()).problemId(data.getProblemId()).recordId(data.getRecordId())
+                    .score(data.getScore()).userId(data.getUserId()).submitAt(data.getSubmitAt()).startAt(data.getStartAt())
+                    .id(null).createdAt(null).updatedAt(null).build();
+            target.add(c);
+        });
+        coderRepository.saveAll(target);
+    }
+}

+ 0 - 26
seec-data-server/src/main/java/cn/seecoder/data/server/schedule/DevcloudSchedule.java

@@ -1,26 +0,0 @@
-package cn.seecoder.data.server.schedule;
-
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-@Component
-public class DevcloudSchedule {
-
-//    @Scheduled
-    public void devcloudDataExtration() {
-        String url = this.addrPrefix + "/query/commits";
-    }
-
-    public String getAddrPrefix() {
-        return addrPrefix;
-    }
-
-    public void setAddrPrefix(String addrPrefix) {
-        this.addrPrefix = addrPrefix;
-    }
-
-    @Value("${urls.url1}")
-    private String addrPrefix; //需要在服务器中对 'devcloud/' 开头的url进行反向代理
-
-}

+ 9 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/schedule/EvaluateSchedule.java

@@ -2,6 +2,7 @@ package cn.seecoder.data.server.schedule;
 
 
 import cn.seecoder.data.server.repository.EvaluateRepository;
+import cn.seecoder.data.server.utils.aspects.DataExtractor;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -34,6 +35,14 @@ public class EvaluateSchedule {
         this.evaluateRepository = evaluateRepository;
     }
 
+
+
+    @DataExtractor("evaluate")
+    public void testEvaluateDataExtraction(){
+        System.out.println("妙啊");
+    }
+
+    @DataExtractor("evaluate")
     @Scheduled(cron = "00 00 00 * * ?")
     public void evaluateDataExtration(){
         Date date = new Date();

+ 21 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/service/ExtractionLogService.java

@@ -0,0 +1,21 @@
+package cn.seecoder.data.server.service;
+
+import java.time.LocalDateTime;
+
+/**
+ * 注意: 该service只能在数据抽取函数( schedule.*.*Extraction )里面使用
+ * */
+public interface ExtractionLogService {
+    /**
+     * 参数 back 默认为0
+     * */
+    LocalDateTime getExtractionStartTime(String source);
+
+    /**
+     * @param back back==0时,返回上次成功抽取的时间(可用作本次的开始时间);
+     *             back==n时,往前追溯第n次成功抽取的时间(用作本次开始时间),防止一些之前抽取时正在发生变化的数据抽取不到
+     * */
+    LocalDateTime getExtractionStartTime(String source,Integer back);
+
+    LocalDateTime getExtractionEndTime(String source);
+}

+ 43 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/ExtractionLogServiceImpl.java

@@ -0,0 +1,43 @@
+package cn.seecoder.data.server.service.Impl;
+
+import cn.seecoder.data.server.domain.ExtractionLogDao;
+import cn.seecoder.data.server.repository.ExtractionLogRepository;
+import cn.seecoder.data.server.service.ExtractionLogService;
+import cn.seecoder.data.server.utils.enums.ExtractionLogStatus;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.stream.Stream;
+
+@Service
+public class ExtractionLogServiceImpl implements ExtractionLogService {
+
+    @Autowired
+    private ExtractionLogRepository extractionLogRepository;
+
+    @Override
+    public LocalDateTime getExtractionStartTime(String source) {//返回上一次成功进行抽取数据的时间
+        return this.getExtractionStartTime(source, 0);
+    }
+
+    @Override
+    public LocalDateTime getExtractionStartTime(String source, Integer back) {
+        PageRequest pr = PageRequest.of(back,1,Sort.by(Sort.Direction.DESC,"id"));
+        Page<ExtractionLogDao> extractionLogs= extractionLogRepository.findBySourceAndStatus(source,ExtractionLogStatus.SUCCESS,pr);
+        if(extractionLogs.get().count()==0) return LocalDateTime.of(2000, 1, 1, 0, 0, 0); //随便传一个比较早的时间
+        return extractionLogs.get().findFirst().get().getCreateAt();
+    }
+
+    @Override
+    public LocalDateTime getExtractionEndTime(String source) { //返回刚创建的时间
+        PageRequest pr = PageRequest.of(0,1,Sort.by(Sort.Direction.DESC,"id"));
+        Page<ExtractionLogDao> extractionLogs= extractionLogRepository.findBySourceAndStatus(source,ExtractionLogStatus.RUNNING,pr);
+        if(extractionLogs.get().count()==0) return LocalDateTime.now(); //返回现在的时间(一般不会调用到这里,除非在数据抽取函数以外的地方使用
+        return extractionLogs.get().findFirst().get().getCreateAt();
+    }
+}

+ 63 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/utils/aspects/DataExtractionHandlerAspectJ.java

@@ -0,0 +1,63 @@
+package cn.seecoder.data.server.utils.aspects;
+
+import cn.seecoder.data.server.domain.ExtractionLogDao;
+import cn.seecoder.data.server.repository.ExtractionLogRepository;
+import cn.seecoder.data.server.utils.enums.ErrorCodeEnum;
+import cn.seecoder.data.server.utils.enums.ExtractionLogStatus;
+import cn.seecoder.data.server.utils.exception.GlobalException;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+
+@Aspect
+@Component
+public class DataExtractionHandlerAspectJ {
+    @Autowired
+    private ExtractionLogRepository extractionLogRepository;
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Pointcut("execution(* *(..)) && @annotation(DataExtractor)")
+    public void dataExtractorLogic() {}
+
+    @Around("dataExtractorLogic()")
+    public void dataExtractorAddition(ProceedingJoinPoint joinPoint) {
+        DataExtractor annotation = getMethodAnnotation(joinPoint,DataExtractor.class);
+        if (annotation == null || annotation.value().equals("")) throw new GlobalException(ErrorCodeEnum.SYSTEM_ERROR_B0004);
+        ExtractionLogDao extractionLogDao = null;
+        try {
+            logger.info(annotation.value() + ": 数据开始抽取..");
+            extractionLogDao = ExtractionLogDao.builder().source(annotation.value()).status(ExtractionLogStatus.RUNNING).build();
+            extractionLogDao = extractionLogRepository.save(extractionLogDao);
+            joinPoint.proceed();
+            extractionLogDao.setStatus(ExtractionLogStatus.SUCCESS);
+            extractionLogRepository.save(extractionLogDao);
+            logger.info(annotation.value() + ": 数据抽取完成..");
+        } catch (Throwable e) {
+            if((e instanceof GlobalException) && ((GlobalException) e).getError()==ErrorCodeEnum.SERVICE_ERROR_C0003){
+                logger.info(annotation.value() + ": 未抽取到数据!");
+            }
+            else {
+                logger.error(annotation.value() + ": 数据抽取失败!",e);
+            }
+            if(extractionLogDao!=null) {
+                extractionLogDao.setStatus(ExtractionLogStatus.FAILURE);
+                extractionLogRepository.save(extractionLogDao);
+            }
+        }
+    }
+    private <T extends Annotation> T getMethodAnnotation(ProceedingJoinPoint joinPoint, Class<T> clazz) {
+        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
+        Method method = methodSignature.getMethod();
+        return method.getAnnotation(clazz);
+    }
+}

+ 10 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/utils/aspects/DataExtractor.java

@@ -0,0 +1,10 @@
+package cn.seecoder.data.server.utils.aspects;
+
+import java.lang.annotation.*;
+
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface DataExtractor {
+    String value();
+}

+ 36 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/utils/enums/ErrorCodeEnum.java

@@ -0,0 +1,36 @@
+package cn.seecoder.data.server.utils.enums;
+
+/**
+ * 自定义错误码
+ */
+public enum ErrorCodeEnum {
+    SUCCESS("00000", "成功"),
+
+    USER_ERROR_A0001("A0001", "无效的Token"),
+
+    SYSTEM_ERROR_B0001("B0001", "未知的系统错误"),
+    SYSTEM_ERROR_B0002("B0002", "系统执行出错"),
+    SYSTEM_ERROR_B0003("B0003", "系统执行超时"),
+    SYSTEM_ERROR_B0004("B0004", "未知的数据抽取来源"),
+
+    SERVICE_ERROR_C0001("C0001", "无本次考试记录"),
+    SERVICE_ERROR_C0002("C0002", "数据抽取源错误"),
+    SERVICE_ERROR_C0003("C0003", "数据抽取源无数据");
+
+
+    private final String code;
+    private final String description;
+
+    ErrorCodeEnum(String code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 12 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/utils/enums/ExtractionLogStatus.java

@@ -0,0 +1,12 @@
+package cn.seecoder.data.server.utils.enums;
+
+public enum ExtractionLogStatus {
+    /* 等待运行 */
+    WAITING,
+    /* 正在运行 */
+    RUNNING,
+    /* 数据抽取成功 */
+    SUCCESS,
+    /* 数据抽取失败 */
+    FAILURE
+}

+ 22 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/utils/exception/GlobalException.java

@@ -0,0 +1,22 @@
+package cn.seecoder.data.server.utils.exception;
+
+import cn.seecoder.data.server.utils.enums.ErrorCodeEnum;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class GlobalException extends RuntimeException {
+
+    ErrorCodeEnum error = ErrorCodeEnum.SYSTEM_ERROR_B0001;
+
+    public GlobalException(ErrorCodeEnum error) {
+        super(error.getDescription());
+        this.error = error;
+    }
+
+    public GlobalException(ErrorCodeEnum error, Throwable e) {
+        super(error.getDescription(), e);
+        this.error = error;
+    }
+}

+ 37 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/utils/exception/GlobalExceptionHandler.java

@@ -0,0 +1,37 @@
+package cn.seecoder.data.server.utils.exception;
+
+import cn.seecoder.data.server.utils.enums.ErrorCodeEnum;
+import cn.seecoder.data.server.vo.Result;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import cn.seecoder.data.server.utils.enums.ErrorCodeEnum;
+
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 处理 Exception 异常
+     * @param e 异常
+     * @return 处理结果
+     */
+    @ExceptionHandler(Exception.class)
+    public Result<Object> handlerException(Exception e) {
+        logger.error(e.getMessage(), e);
+        return Result.buildFailure(ErrorCodeEnum.SYSTEM_ERROR_B0001);
+    }
+
+    /**
+     * 处理自定义异常
+     * @param e 异常
+     * @return 处理结果
+     */
+    @ExceptionHandler(GlobalException.class)
+    public Result<Object> handlerGlobalException(GlobalException e) {
+        logger.error(e.getMessage(), e);
+        return Result.buildFailure(e.getError());
+    }
+}

+ 33 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/vo/Result.java

@@ -0,0 +1,33 @@
+package cn.seecoder.data.server.vo;
+
+import cn.seecoder.data.server.utils.enums.ErrorCodeEnum;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class  Result<T> implements Serializable {
+
+    private static ErrorCodeEnum success = ErrorCodeEnum.SUCCESS;
+    private String code;
+
+    private String msg;
+
+    private T result;
+
+    public static  Result<Object> buildSuccess() {
+        return new Result<Object>(success.getCode(), success.getDescription(), null);
+    }
+
+    public static <T> Result<T> buildSuccess(T result) {
+        return new Result<T>(success.getCode(), success.getDescription(), result);
+    }
+
+    public static Result<Object> buildFailure(ErrorCodeEnum error) {
+        return new Result<Object>(error.getCode(),error.getDescription(), null);
+    }
+}

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

@@ -7,6 +7,10 @@ spring:
   jpa:
     hibernate:
       ddl-auto: update
-    show-sql: false
-urls:
-  url1: www.baidu.com
+    show-sql: true
+remoteUrls:
+  coder: 'coder.seecoder.cn'
+logging:
+  config: classpath:logback-spring.xml
+  file:
+    path: logs

+ 255 - 0
seec-data-server/src/main/resources/logback-spring.xml

@@ -0,0 +1,255 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
+<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
+<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。
+                 当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
+<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
+<!--
+总体说明:根节点下有2个属性,三个节点
+属性: contextName 上下文名称; property 设置变量
+节点: appender,  root, logger
+-->
+<configuration scan="true" scanPeriod="10 seconds">
+    <!--
+       contextName说明:
+       每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,
+       用于区分不同应用程序的记录。一旦设置,不能修改,可以通过%contextName来打印日志上下文名称。
+     -->
+    <contextName>logback-spring</contextName>
+    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
+    <property name="logging.path" value="myLogs"/>
+
+    <!--0. 日志格式和颜色渲染 -->
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr"
+                    converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+
+    <!--1. 输出到控制台-->
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>debug</level>
+        </filter>
+
+        <!--日志文档输出格式-->
+        <encoder>
+            <!--指定日志格式-->
+            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
+            <!--设置字符集-->
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+
+    <!--输出到文档-->
+    <!-- 时间滚动输出 level为 DEBUG 日志 -->
+    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名~~~~~file设置打印的文件的路径及文件名,建议绝对路径-->
+        <file>${logging.path}/web_debug.log</file>
+
+        <!--日志文档输出格式-->
+        <encoder>
+            <!--指定日志格式-->
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
+        </encoder>
+
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <!--
+            日志记录器的滚动策略
+            SizeAndTimeBasedRollingPolicy 按日期,大小记录日志
+            另外一种方式:
+                rollingPolicy的class设置为ch.qos.logback.core.rolling.TimeBasedRollingPolicy
+
+        -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志归档 -->
+            <!--
+                归档的日志文件的路径,例如今天是2018-08-23日志,当前写的日志文件路径为file节点指定,
+                可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+                而2018-08-23的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引
+             -->
+            <fileNamePattern>${logging.path}/web-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+
+            <!--
+               配置日志文件不能超过100M,若超过100M,日志文件会以索引0开始,命名日志文件
+               例如error.20180823.0.txt
+               -->
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+
+            <!--日志文档保留天数-->
+            <maxHistory>15</maxHistory>
+        </rollingPolicy>
+
+        <!-- 此日志文档只记录debug级别的 -->
+        <!-- 过滤策略:
+            LevelFilter : 只打印level标签设置的日志级别
+            ThresholdFilter:打印大于等于level标签设置的级别,小的舍弃
+         -->
+        <!--<filter class="ch.qos.logback.classic.filter.ThresholdFilter">-->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的日志级别 -->
+            <level>debug</level>
+            <!--匹配到就允许-->
+            <onMatch>ACCEPT</onMatch>
+            <!--没有匹配到就禁止-->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 2.2 level为 INFO 日志,时间滚动输出  -->
+    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文档的路径及文档名 -->
+        <file>${logging.path}/web_info.log</file>
+        <!--日志文档输出格式-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 每天日志归档路径以及格式 -->
+            <fileNamePattern>${logging.path}/web-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--日志文档保留天数-->
+            <maxHistory>15</maxHistory>
+        </rollingPolicy>
+        <!-- 此日志文档只记录info级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>info</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 2.3 level为 WARN 日志,时间滚动输出  -->
+    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文档的路径及文档名 -->
+        <file>${logging.path}/web_warn.log</file>
+        <!--日志文档输出格式-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+        </encoder>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${logging.path}/web-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--日志文档保留天数-->
+            <maxHistory>15</maxHistory>
+        </rollingPolicy>
+        <!-- 此日志文档只记录warn级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>warn</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 2.4 level为 ERROR 日志,时间滚动输出  -->
+    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文档的路径及文档名 -->
+        <file>${logging.path}/web_error.log</file>
+        <!--日志文档输出格式-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+        </encoder>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${logging.path}/web-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--日志文档保留天数-->
+            <maxHistory>15</maxHistory>
+        </rollingPolicy>
+        <!-- 此日志文档只记录ERROR级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+
+
+
+    <!--
+      <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
+      以及指定<appender>。<logger>仅有一个name属性,
+      一个可选的level和一个可选的addtivity属性。
+      name:用来指定受此logger约束的某一个包或者具体的某一个类。
+      level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
+            还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
+            如果未设置此属性,那么当前logger将会继承上级的级别。
+      addtivity:是否向上级logger传递打印信息。默认是true。
+      <logger name="org.springframework.web" level="info"/>
+      <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
+  -->
+
+    <!--
+        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
+        第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
+        第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
+        【logging.level.org.mybatis=debug logging.level.dao=debug】
+     -->
+
+    <!--
+        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
+        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
+        不能设置为INHERITED或者同义词NULL。默认是DEBUG
+        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
+    -->
+
+
+
+    <!-- 4. 最终的策略 -->
+    <!-- 4.1 开发环境:打印控制台-->
+    <springProfile name="dev">
+         <logger name="cn.seecoder.data.server.repository" level="debug"/>
+     </springProfile>
+
+    <!--
+        root指定最基础的日志输出级别,level属性指定
+        appender-ref标识的appender将会添加到这个logger
+    -->
+    <root level="info">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="DEBUG_FILE"/>
+        <appender-ref ref="INFO_FILE"/>
+        <appender-ref ref="WARN_FILE"/>
+        <appender-ref ref="ERROR_FILE"/>
+    </root>
+
+    <!-- 4.2 生产环境:输出到文档
+    <springProfile name="pro">
+        <root level="info">
+            <appender-ref ref="CONSOLE" />
+            <appender-ref ref="DEBUG_FILE" />
+            <appender-ref ref="INFO_FILE" />
+            <appender-ref ref="ERROR_FILE" />
+            <appender-ref ref="WARN_FILE" />
+        </root>
+    </springProfile> -->
+
+</configuration>

+ 0 - 45
seec-data-server/src/test/java/cn/seecoder/data/server/dto/devcloud/BugListDTOTest.java

@@ -1,45 +0,0 @@
-package cn.seecoder.data.server.dto.devcloud;
-
-import com.alibaba.fastjson.JSON;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import java.sql.Timestamp;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-public class BugListDTOTest {
-
-    private BugListDTO bugListDTO;
-
-    @Value("${urls.testUrl1}")
-    private String url;
-
-    @Before
-    public void buildBugListDTO() {
-        this.bugListDTO = BugListDTO.builder()
-                .id(0)
-                .endTime(new Timestamp(System.currentTimeMillis()))
-                .startTime(new Timestamp(System.currentTimeMillis()))
-                .processorId(123)
-                .projectId(456)
-                .timeToTake((long) 24)
-                .build();
-    }
-
-    @Test
-    public void testBugListDTO() {
-        String s = JSON.toJSONString(this.bugListDTO);
-        System.out.println(s);
-    }
-
-    @After
-    public void clearBugListDTO() {
-        this.bugListDTO = null;
-    }
-
-}

+ 27 - 0
seec-data-server/src/test/java/cn/seecoder/data/server/repository/ExtractionLogRepositoryTest.java

@@ -0,0 +1,27 @@
+package cn.seecoder.data.server.repository;
+
+import cn.seecoder.data.server.domain.ExtractionLogDao;
+import cn.seecoder.data.server.utils.enums.ExtractionLogStatus;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import static org.junit.Assert.*;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest
+public class ExtractionLogRepositoryTest {
+
+    @Autowired
+    private ExtractionLogRepository repository;
+    @Test
+    public void findBySourceAndStatus() {
+        Page<ExtractionLogDao> extractionLogPage = repository.findBySourceAndStatus("coder", ExtractionLogStatus.SUCCESS, PageRequest.of(11, 1, Sort.by(Sort.Direction.DESC, "id")));
+        System.out.println(extractionLogPage.get().count());
+    }
+}

+ 8 - 7
seec-data-server/src/test/java/cn/seecoder/data/server/schedule/DevcloudScheduleTest.java → seec-data-server/src/test/java/cn/seecoder/data/server/schedule/CoderScheduleTest.java

@@ -1,24 +1,25 @@
 package cn.seecoder.data.server.schedule;
 
 import config.PropertyTestConfig;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
 import static org.junit.jupiter.api.Assertions.*;
 
-@ContextConfiguration(classes = PropertyTestConfig.class)
+//@ContextConfiguration(classes = PropertyTestConfig.class)
 @RunWith(SpringJUnit4ClassRunner.class)
-public class DevcloudScheduleTest {
+@SpringBootTest
+class CoderScheduleTest {
 
     @Autowired
-    DevcloudSchedule devcloudSchedule;
+    CoderSchedule coderSchedule;
 
     @Test
-    public void testUrlInject() {
-        Assert.assertEquals("www.baidu.com",devcloudSchedule.getAddrPrefix());
+    void coderDataExtraction() throws Exception {
+        coderSchedule.coderDataExtraction();
     }
 }

+ 15 - 7
seec-data-server/src/test/java/cn/seecoder/data/server/schedule/EvaluateScheduleTest.java

@@ -3,6 +3,7 @@ package cn.seecoder.data.server.schedule;
 import cn.seecoder.data.server.repository.EvaluateRepository;
 import cn.seecoder.data.server.repository.knowledge.KnowledgeRepository;
 import cn.seecoder.data.server.repository.GeneralRecordRepository;
+import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -12,17 +13,24 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 @RunWith(SpringJUnit4ClassRunner.class)
 @Rollback(value = false)
 @SpringBootTest
+public class EvaluateScheduleTest {
 
-class EvaluateScheduleTest {
+//    @Autowired
+//    EvaluateRepository evaluateRepository;
+//
+//    @Autowired
+//    GeneralRecordRepository generalRecordRepository;
+//
+//    @Autowired
+//    KnowledgeRepository knowledgeRepository;
 
     @Autowired
-    EvaluateRepository evaluateRepository;
+    private EvaluateSchedule evaluateSchedule;
 
-    @Autowired
-    GeneralRecordRepository generalRecordRepository;
-
-    @Autowired
-    KnowledgeRepository knowledgeRepository;
+    @Test
+    public void testAspectJExtraction() {
+        evaluateSchedule.testEvaluateDataExtraction();
+    }
 
 //    @Test
 //    void evaluateDataExtrationTest() {

+ 26 - 0
seec-data-server/src/test/java/cn/seecoder/data/server/service/EvaluateServiceTest.java

@@ -3,6 +3,9 @@ package cn.seecoder.data.server.service;
 import cn.seecoder.data.server.dto.evaluate.ExamDetailsDto;
 import cn.seecoder.data.server.dto.evaluate.ExamQuestionAndScoreDto;
 import cn.seecoder.data.server.dto.evaluate.Response;
+import cn.seecoder.judgement.PlaygroundClient;
+import cn.seecoder.judgement.PlaygroundException;
+import cn.seecoder.judgement.StudentAnswerRecordVO;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.junit.jupiter.api.Test;
@@ -63,4 +66,27 @@ class EvaluateServiceTest {
         ResponseEntity<Response<List<ExamDetailsDto>>> r = restTemplate.exchange(url, HttpMethod.GET,null,responseType,param );
         System.out.println(r.getBody());
     }
+    @Test
+    public void test1() {
+        PlaygroundClient playgroundClient = new PlaygroundClient("http://localhost:8801","");
+        try{
+            List<StudentAnswerRecordVO> studentAnswerRecordVOList = playgroundClient.getLevel("2017-09-28 17:07:05","2027-09-28 17:07:04");
+            System.out.println(1);
+        } catch (PlaygroundException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void test3() throws Exception {
+        try {
+            throw new Exception();
+        } finally {
+            System.out.println("妙啊");
+        }
+    }
+
+    private void test3_inner() {
+
+    }
 }

+ 9 - 9
seec-data-server/src/test/java/config/PropertyTestConfig.java

@@ -1,6 +1,6 @@
 package config;
 
-import cn.seecoder.data.server.schedule.DevcloudSchedule;
+//import cn.seecoder.data.server.schedule.DevcloudSchedule;
 import cn.seecoder.data.server.schedule.EvaluateSchedule;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -12,12 +12,12 @@ import org.springframework.test.context.TestPropertySource;
 @Configuration
 @PropertySource("classpath:config.properties")
 public class PropertyTestConfig {
-    @Bean
-    public DevcloudSchedule devcloudSchedule() {
-        return new DevcloudSchedule();
-    }
-    @Bean
-    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
-        return new PropertySourcesPlaceholderConfigurer();
-    }
+//    @Bean
+//    public DevcloudSchedule devcloudSchedule() {
+//        return new DevcloudSchedule();
+//    }
+//    @Bean
+//    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
+//        return new PropertySourcesPlaceholderConfigurer();
+//    }
 }