Kaynağa Gözat

first commit

Bay 6 yıl önce
işleme
d5af64bc54
37 değiştirilmiş dosya ile 835 ekleme ve 0 silme
  1. 31 0
      .gitignore
  2. 19 0
      README.md
  3. 113 0
      pom.xml
  4. 14 0
      seec-anti-plagiarism/pom.xml
  5. 13 0
      seec-anti-plagiarism/src/main/java/cn/seec/seecantiplagiarism/SeecAntiPlagiarismApplication.java
  6. 26 0
      seec-anti-plagiarism/src/main/java/cn/seec/seecantiplagiarism/controller/ProficiencyController.java
  7. 27 0
      seec-anti-plagiarism/src/main/java/cn/seec/seecantiplagiarism/util/FakeProficiencyData.java
  8. 16 0
      seec-anti-plagiarism/src/main/java/cn/seec/seecantiplagiarism/vo/ProficiencyVO.java
  9. 8 0
      seec-anti-plagiarism/src/main/resources/application.yml
  10. 11 0
      seec-anti-plagiarism/src/test/java/cn/seec/seecbok/CloudMockApplicationTests.java
  11. 14 0
      seec-bok/pom.xml
  12. 13 0
      seec-bok/src/main/java/cn/seec/seecbok/SeecBokApplication.java
  13. 22 0
      seec-bok/src/main/java/cn/seec/seecbok/controller/KnowledgeController.java
  14. 69 0
      seec-bok/src/main/java/cn/seec/seecbok/controller/QuestionController.java
  15. 38 0
      seec-bok/src/main/java/cn/seec/seecbok/controller/RecordController.java
  16. 47 0
      seec-bok/src/main/java/cn/seec/seecbok/controller/UserInteractiveController.java
  17. 9 0
      seec-bok/src/main/java/cn/seec/seecbok/dto/CollectDTO.java
  18. 10 0
      seec-bok/src/main/java/cn/seec/seecbok/dto/RateDTO.java
  19. 16 0
      seec-bok/src/main/java/cn/seec/seecbok/dto/RecordDTO.java
  20. 41 0
      seec-bok/src/main/java/cn/seec/seecbok/util/FakeQuestionData.java
  21. 30 0
      seec-bok/src/main/java/cn/seec/seecbok/util/FakeRecordData.java
  22. 18 0
      seec-bok/src/main/java/cn/seec/seecbok/vo/KnowledgeNodeVO.java
  23. 14 0
      seec-bok/src/main/java/cn/seec/seecbok/vo/PageVO.java
  24. 14 0
      seec-bok/src/main/java/cn/seec/seecbok/vo/PageableQuestionListVO.java
  25. 22 0
      seec-bok/src/main/java/cn/seec/seecbok/vo/QuestionVO.java
  26. 19 0
      seec-bok/src/main/java/cn/seec/seecbok/vo/RecordVO.java
  27. 11 0
      seec-bok/src/main/resources/application.yml
  28. 11 0
      seec-bok/src/test/java/cn/seec/seecbok/CloudMockApplicationTests.java
  29. 14 0
      seec-ml/pom.xml
  30. 13 0
      seec-ml/src/main/java/cn/seec/seecml/SeecMlApplication.java
  31. 26 0
      seec-ml/src/main/java/cn/seec/seecml/controller/GraphClassificationController.java
  32. 32 0
      seec-ml/src/main/java/cn/seec/seecml/controller/RecommendationController.java
  33. 9 0
      seec-ml/src/main/java/cn/seec/seecml/dto/ClassificationDTO.java
  34. 13 0
      seec-ml/src/main/java/cn/seec/seecml/vo/ClassificationResultVO.java
  35. 13 0
      seec-ml/src/main/java/cn/seec/seecml/vo/RecommendResultVO.java
  36. 8 0
      seec-ml/src/main/resources/application.yml
  37. 11 0
      seec-ml/src/test/java/cn/seec/seecbok/CloudMockApplicationTests.java

+ 31 - 0
.gitignore

@@ -0,0 +1,31 @@
+seec-bok/HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+
+### VS Code ###
+.vscode/

+ 19 - 0
README.md

@@ -0,0 +1,19 @@
+# CLOUD MOCK
+
+## SEEC Anti Plagiarism
+
+port: 9100
+
+swagger-ui: localhost:9100/swagger-ui.html
+
+## SEEC BOK
+
+port: 9200
+
+swagger-ui: localhost:9200/swagger-ui.html
+
+## SEEC Anti Plagiarism
+
+port: 9300
+
+swagger-ui: localhost:9300/swagger-ui.html

+ 113 - 0
pom.xml

@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.3.0.M2</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>cn.seec</groupId>
+    <artifactId>cloud-mock</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <name>cloud-mock</name>
+
+    <packaging>pom</packaging>
+
+    <!-- FIXME change it to the project's website -->
+    <url>http://www.example.com</url>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <modules>
+        <module>seec-bok</module>
+        <module>seec-anti-plagiarism</module>
+        <module>seec-ml</module>
+    </modules>
+
+    <dependencies>
+        <!-- spring-doc -->
+        <dependency>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-webflux-ui</artifactId>
+            <version>1.2.33</version>
+        </dependency>
+
+        <!-- spring -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-webflux</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>runtime</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.vintage</groupId>
+                    <artifactId>junit-vintage-engine</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>io.projectreactor</groupId>
+            <artifactId>reactor-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+
+                <configuration>
+                    <!--fork:如果没有该项配置,整个devtools不会起作用-->
+                    <fork>true</fork>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <repositories>
+        <repository>
+            <id>spring-milestones</id>
+            <name>Spring Milestones</name>
+            <url>https://repo.spring.io/milestone</url>
+        </repository>
+    </repositories>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>spring-milestones</id>
+            <name>Spring Milestones</name>
+            <url>https://repo.spring.io/milestone</url>
+        </pluginRepository>
+    </pluginRepositories>
+
+</project>

+ 14 - 0
seec-anti-plagiarism/pom.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>cn.seec</groupId>
+        <artifactId>cloud-mock</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>seec-anti-plagiarism</artifactId>
+    <name>seec-anti-plagiarism</name>
+    <description>Demo project for Spring Boot</description>
+
+</project>

+ 13 - 0
seec-anti-plagiarism/src/main/java/cn/seec/seecantiplagiarism/SeecAntiPlagiarismApplication.java

@@ -0,0 +1,13 @@
+package cn.seec.seecantiplagiarism;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/** @author Kunduin */
+@SpringBootApplication
+public class SeecAntiPlagiarismApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SeecAntiPlagiarismApplication.class, args);
+    }
+}

+ 26 - 0
seec-anti-plagiarism/src/main/java/cn/seec/seecantiplagiarism/controller/ProficiencyController.java

@@ -0,0 +1,26 @@
+package cn.seec.seecantiplagiarism.controller;
+
+import cn.seec.seecantiplagiarism.util.FakeProficiencyData;
+import cn.seec.seecantiplagiarism.vo.ProficiencyVO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/** @author Kunduin */
+@RestController
+@RequestMapping("/api/proficiency")
+public class ProficiencyController {
+
+    @GetMapping("")
+    @Operation(description = "获得用户知识点掌握程度")
+    public List<ProficiencyVO> getUserProficiency(
+            @RequestParam("userId") @Parameter(description = "用户id") String userId,
+            @RequestParam("knowledgeId") @Parameter(description = "知识点") List<String> knowledgeId) {
+        return FakeProficiencyData.buildList();
+    }
+}

+ 27 - 0
seec-anti-plagiarism/src/main/java/cn/seec/seecantiplagiarism/util/FakeProficiencyData.java

@@ -0,0 +1,27 @@
+package cn.seec.seecantiplagiarism.util;
+
+import cn.seec.seecantiplagiarism.vo.ProficiencyVO;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
+
+/** @author Kunduin */
+public class FakeProficiencyData {
+    public static List<ProficiencyVO> buildList() {
+        return Arrays.asList(build(), build(), build());
+    }
+
+    public static ProficiencyVO build() {
+        return build(UUID.randomUUID().toString());
+    }
+
+    public static ProficiencyVO build(String id) {
+        return ProficiencyVO.builder()
+                .id(id)
+                .knowledgeId("CF.CQ")
+                .percentage(0.5)
+                .userId(UUID.randomUUID().toString())
+                .build();
+    }
+}

+ 16 - 0
seec-anti-plagiarism/src/main/java/cn/seec/seecantiplagiarism/vo/ProficiencyVO.java

@@ -0,0 +1,16 @@
+package cn.seec.seecantiplagiarism.vo;
+
+import lombok.Builder;
+import lombok.Data;
+
+/** @author Kunduin */
+@Data
+@Builder
+public class ProficiencyVO {
+    String id;
+    String userId;
+    String knowledgeId;
+
+    /** 熟练度,0 至 1 */
+    Double percentage;
+}

+ 8 - 0
seec-anti-plagiarism/src/main/resources/application.yml

@@ -0,0 +1,8 @@
+server:
+  port: 9100
+
+management:
+  endpoints:
+    web:
+      exposure:
+        include: httptrace

+ 11 - 0
seec-anti-plagiarism/src/test/java/cn/seec/seecbok/CloudMockApplicationTests.java

@@ -0,0 +1,11 @@
+package cn.seec.seecbok;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class CloudMockApplicationTests {
+
+    @Test
+    void contextLoads() {}
+}

+ 14 - 0
seec-bok/pom.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>cn.seec</groupId>
+        <artifactId>cloud-mock</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>seec-bok</artifactId>
+    <name>seec-bok</name>
+    <description>Demo project for Spring Boot</description>
+
+</project>

+ 13 - 0
seec-bok/src/main/java/cn/seec/seecbok/SeecBokApplication.java

@@ -0,0 +1,13 @@
+package cn.seec.seecbok;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/** @author Kunduin */
+@SpringBootApplication
+public class SeecBokApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SeecBokApplication.class, args);
+    }
+}

+ 22 - 0
seec-bok/src/main/java/cn/seec/seecbok/controller/KnowledgeController.java

@@ -0,0 +1,22 @@
+package cn.seec.seecbok.controller;
+
+import cn.seec.seecbok.vo.KnowledgeNodeVO;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Collections;
+import java.util.List;
+
+/** @author Kunduin */
+@RestController
+@RequestMapping("/api/knowledge")
+public class KnowledgeController {
+
+    @GetMapping("")
+    @Operation(description = "获得知识点列表")
+    public List<KnowledgeNodeVO> getKnowledgeNode() {
+        return Collections.emptyList();
+    }
+}

+ 69 - 0
seec-bok/src/main/java/cn/seec/seecbok/controller/QuestionController.java

@@ -0,0 +1,69 @@
+package cn.seec.seecbok.controller;
+
+import cn.seec.seecbok.util.FakeQuestionData;
+import cn.seec.seecbok.vo.PageVO;
+import cn.seec.seecbok.vo.PageableQuestionListVO;
+import cn.seec.seecbok.vo.QuestionVO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.UUID;
+
+/** @author Kunduin */
+@RestController
+@RequestMapping("/api/question")
+public class QuestionController {
+
+    @GetMapping("")
+    @Operation(description = "获得题目列表")
+    public PageableQuestionListVO getQuestionList(
+            @RequestParam(value = "id", required = false) @Parameter(description = "多id查找")
+                    List<String> id,
+            @RequestParam(value = "stem", required = false) @Parameter(description = "模糊查找题目")
+                    String stem,
+            @RequestParam(value = "size", required = false) @Parameter(description = "页面展示条数")
+                    Integer size,
+            @RequestParam(value = "page", required = false) @Parameter(description = "当前页码")
+                    Integer page,
+            @RequestParam(value = "sort", required = false) @Parameter(description = "排序方式")
+                    String sort) {
+        return PageableQuestionListVO.builder()
+                .questions(FakeQuestionData.buildList())
+                .page(
+                        PageVO.builder()
+                                .size(size)
+                                .totalPages(205)
+                                .totalElements(1022)
+                                .number(page)
+                                .build())
+                .build();
+    }
+
+    @PostMapping("")
+    @Operation(description = "新建题目")
+    public QuestionVO createQuestionById(@RequestBody QuestionVO question) {
+        question.setId(UUID.randomUUID().toString());
+        return question;
+    }
+
+    @GetMapping("/{questionId}")
+    @Operation(description = "获得题目详情")
+    public QuestionVO getQuestionById(@PathVariable String questionId) {
+        return FakeQuestionData.build(questionId);
+    }
+
+    @PutMapping("/{questionId}")
+    @Operation(description = "更新题目")
+    public QuestionVO updateQuestionById(
+            @PathVariable String questionId, @RequestBody QuestionVO question) {
+        return question;
+    }
+
+    @DeleteMapping("/{questionId}")
+    @Operation(description = "删除题目")
+    public Object deleteQuestionById(@PathVariable String questionId) {
+        return new Object();
+    }
+}

+ 38 - 0
seec-bok/src/main/java/cn/seec/seecbok/controller/RecordController.java

@@ -0,0 +1,38 @@
+package cn.seec.seecbok.controller;
+
+import cn.seec.seecbok.dto.RecordDTO;
+import cn.seec.seecbok.util.FakeRecordData;
+import cn.seec.seecbok.vo.RecordVO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 用户的做题记录
+ *
+ * @author Kunduin
+ */
+@RestController
+@RequestMapping("/api/record")
+public class RecordController {
+
+    @PostMapping("")
+    @Operation(description = "新增用户的做题记录")
+    public List<RecordVO> createUserRecord(@RequestBody List<RecordDTO> records) {
+        return FakeRecordData.buildList();
+    }
+
+    @GetMapping("")
+    @Operation(description = "获得用户做题记录")
+    public List<RecordVO> getUserRecord(
+            @RequestParam(value = "userId", required = false) @Parameter(description = "用户id")
+                    List<String> userIdList,
+            @RequestParam(value = "questionId", required = false) @Parameter(description = "题目id")
+                    List<String> questionIdList,
+            @RequestParam(value = "recordId", required = false) @Parameter(description = "记录id")
+                    List<String> recordIdList) {
+        return FakeRecordData.buildList();
+    }
+}

+ 47 - 0
seec-bok/src/main/java/cn/seec/seecbok/controller/UserInteractiveController.java

@@ -0,0 +1,47 @@
+package cn.seec.seecbok.controller;
+
+import cn.seec.seecbok.dto.CollectDTO;
+import cn.seec.seecbok.dto.RateDTO;
+import cn.seec.seecbok.util.FakeQuestionData;
+import cn.seec.seecbok.vo.QuestionVO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/** @author Kunduin */
+@RestController
+@RequestMapping("/api/user")
+public class UserInteractiveController {
+
+    @PostMapping("/{userId}/question/{questionId}/rate")
+    @Operation(description = "记录用户对题目的评分信息")
+    public Object userRateQuestion(
+            @PathVariable String userId,
+            @PathVariable String questionId,
+            @RequestBody RateDTO rateDTO) {
+        return new Object();
+    }
+
+    @PostMapping("/{userId}/question/{questionId}/collection")
+    @Operation(description = "记录用户对题目的收藏情况")
+    public Object userCollectQuestion(
+            @PathVariable String userId,
+            @PathVariable String questionId,
+            @RequestBody CollectDTO collectDTO) {
+        return new Object();
+    }
+
+    @GetMapping("/{userId}/question")
+    @Operation(description = "获得某用户交互的题目列表")
+    public List<QuestionVO> getUserInteractiveQuestions(
+            @PathVariable String userId,
+            @Parameter(description = "是否是用户收藏的题目")
+                    @RequestParam(value = "collection", required = false)
+                    Boolean collection,
+            @Parameter(description = "是否是用户打分的题目") @RequestParam(value = "rate", required = false)
+                    Boolean rate) {
+        return FakeQuestionData.buildList();
+    }
+}

+ 9 - 0
seec-bok/src/main/java/cn/seec/seecbok/dto/CollectDTO.java

@@ -0,0 +1,9 @@
+package cn.seec.seecbok.dto;
+
+import lombok.Data;
+
+/** @author Kunduin */
+@Data
+public class CollectDTO {
+    Boolean collect;
+}

+ 10 - 0
seec-bok/src/main/java/cn/seec/seecbok/dto/RateDTO.java

@@ -0,0 +1,10 @@
+package cn.seec.seecbok.dto;
+
+import lombok.Data;
+
+/** @author Kunduin */
+@Data
+public class RateDTO {
+    /** 取值 1-5 */
+    Integer rate;
+}

+ 16 - 0
seec-bok/src/main/java/cn/seec/seecbok/dto/RecordDTO.java

@@ -0,0 +1,16 @@
+package cn.seec.seecbok.dto;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/** @author Kunduin */
+@Data
+public class RecordDTO {
+    String questionId;
+    String studentId;
+    Object studentAnswer;
+    Boolean pass;
+    LocalDateTime startAt;
+    LocalDateTime finishAt;
+}

+ 41 - 0
seec-bok/src/main/java/cn/seec/seecbok/util/FakeQuestionData.java

@@ -0,0 +1,41 @@
+package cn.seec.seecbok.util;
+
+import cn.seec.seecbok.vo.QuestionVO;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+
+/** @author Kunduin */
+public class FakeQuestionData {
+
+    public static List<QuestionVO> buildList() {
+        return Arrays.asList(build("1001"), build("1002"), build("1003"));
+    }
+
+    public static QuestionVO build() {
+        return build("1001");
+    }
+
+    public static QuestionVO build(String id) {
+        return QuestionVO.builder()
+                .id(id)
+                .type("choice")
+                .stem("海明校验码是在 n 个数据位之外增设上个校验位,从而形成一个 k+n 位的新的码字, 使新的码字的码距比较均匀地拉大。n 与 k 的关系是( )。")
+                .options(
+                        new HashMap<String, String>() {
+                            {
+                                put("A", "2^k-1 >= n + k");
+                                put("B", "2^k-1 >= n + k");
+                                put("C", "2^k-1 >= n + k");
+                                put("D", "2^k-1 >= n + k");
+                            }
+                        })
+                .answer("A")
+                .analysis(
+                        "假设有k个校验位,一个位子有0或1两种情况,k个位子就有2^k种排列情况,能表示2^k种状态。其中一个状态用来表示正确(没有错误发生)的这种情况。其余的2^k-1种状态来表示错误发生在哪一位。")
+                .knowledgeId(Collections.singletonList("CF.CQ"))
+                .build();
+    }
+}

+ 30 - 0
seec-bok/src/main/java/cn/seec/seecbok/util/FakeRecordData.java

@@ -0,0 +1,30 @@
+package cn.seec.seecbok.util;
+
+import cn.seec.seecbok.vo.RecordVO;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
+
+/** @author Kunduin */
+public class FakeRecordData {
+    public static List<RecordVO> buildList() {
+        return Arrays.asList(build(), build(), build());
+    }
+
+    public static RecordVO build() {
+        return build(UUID.randomUUID().toString());
+    }
+
+    public static RecordVO build(String recordId) {
+        return RecordVO.builder()
+                .id(recordId)
+                .questionId("1001")
+                .studentAnswer("A")
+                .pass(false)
+                .startAt(LocalDateTime.now())
+                .finishAt(LocalDateTime.now())
+                .build();
+    }
+}

+ 18 - 0
seec-bok/src/main/java/cn/seec/seecbok/vo/KnowledgeNodeVO.java

@@ -0,0 +1,18 @@
+package cn.seec.seecbok.vo;
+
+import lombok.Builder;
+import lombok.Data;
+
+/** @author Kunduin */
+@Data
+@Builder
+public class KnowledgeNodeVO {
+
+    /** 缩写为实际使用的唯一标识 */
+    private String abbreviation;
+
+    private String name;
+    private String englishName;
+    private String parentId;
+    private String parentName;
+}

+ 14 - 0
seec-bok/src/main/java/cn/seec/seecbok/vo/PageVO.java

@@ -0,0 +1,14 @@
+package cn.seec.seecbok.vo;
+
+import lombok.Builder;
+import lombok.Data;
+
+/** @author Kunduin */
+@Data
+@Builder
+public class PageVO {
+    Integer size;
+    Integer totalElements;
+    Integer totalPages;
+    Integer number;
+}

+ 14 - 0
seec-bok/src/main/java/cn/seec/seecbok/vo/PageableQuestionListVO.java

@@ -0,0 +1,14 @@
+package cn.seec.seecbok.vo;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+/** @author Kunduin */
+@Data
+@Builder
+public class PageableQuestionListVO {
+    List<QuestionVO> questions;
+    PageVO page;
+}

+ 22 - 0
seec-bok/src/main/java/cn/seec/seecbok/vo/QuestionVO.java

@@ -0,0 +1,22 @@
+package cn.seec.seecbok.vo;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+/** @author Kunduin */
+@Data
+@Builder
+public class QuestionVO {
+    String id;
+    String type;
+    String stem;
+    Map<String, String> options;
+    String answer;
+    String keyPoints;
+    String analysis;
+    List<String> tags;
+    List<String> knowledgeId;
+}

+ 19 - 0
seec-bok/src/main/java/cn/seec/seecbok/vo/RecordVO.java

@@ -0,0 +1,19 @@
+package cn.seec.seecbok.vo;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/** @author Kunduin */
+@Data
+@Builder
+public class RecordVO {
+    String id;
+    String userId;
+    String questionId;
+    Object studentAnswer;
+    Boolean pass;
+    LocalDateTime startAt;
+    LocalDateTime finishAt;
+}

+ 11 - 0
seec-bok/src/main/resources/application.yml

@@ -0,0 +1,11 @@
+server:
+  port: 9200
+
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"
+  trace:
+    http:
+      include: RESPONSE_HEADERS

+ 11 - 0
seec-bok/src/test/java/cn/seec/seecbok/CloudMockApplicationTests.java

@@ -0,0 +1,11 @@
+package cn.seec.seecbok;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class CloudMockApplicationTests {
+
+    @Test
+    void contextLoads() {}
+}

+ 14 - 0
seec-ml/pom.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>cn.seec</groupId>
+        <artifactId>cloud-mock</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>seec-ml</artifactId>
+    <name>seec-ml</name>
+    <description>Demo project for Spring Boot</description>
+
+</project>

+ 13 - 0
seec-ml/src/main/java/cn/seec/seecml/SeecMlApplication.java

@@ -0,0 +1,13 @@
+package cn.seec.seecml;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/** @author Kunduin */
+@SpringBootApplication
+public class SeecMlApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SeecMlApplication.class, args);
+    }
+}

+ 26 - 0
seec-ml/src/main/java/cn/seec/seecml/controller/GraphClassificationController.java

@@ -0,0 +1,26 @@
+package cn.seec.seecml.controller;
+
+import cn.seec.seecml.dto.ClassificationDTO;
+import cn.seec.seecml.vo.ClassificationResultVO;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+
+/** @author Kunduin */
+@RestController
+@RequestMapping("/api/graph")
+public class GraphClassificationController {
+
+    @PostMapping("/classification")
+    @Operation(description = "根据文本自动判断知识点")
+    public ClassificationResultVO classifyKnowledgeByText(
+            @RequestBody(required = true) ClassificationDTO classificationDTO) {
+        return ClassificationResultVO.builder()
+                .knowledgeIdList(Arrays.asList("SR.SRF.DSR", "SR.SRF.PPR"))
+                .build();
+    }
+}

+ 32 - 0
seec-ml/src/main/java/cn/seec/seecml/controller/RecommendationController.java

@@ -0,0 +1,32 @@
+package cn.seec.seecml.controller;
+
+import cn.seec.seecml.vo.RecommendResultVO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.List;
+
+/** @author Kunduin */
+@RestController
+@RequestMapping("/api/recommendation")
+public class RecommendationController {
+
+    @GetMapping("")
+    @Operation(description = "获得推荐列表")
+    public RecommendResultVO getRecommendResult(
+            @RequestParam(name = "userId") @Parameter(description = "用户唯一标识") String userId,
+            @RequestParam(name = "knowledgeId") @Parameter(description = "知识点 id 列表")
+                    List<String> knowledgeId,
+            @RequestParam(name = "questionNum", required = false)
+                    @Parameter(description = "推荐的题目数量")
+                    Integer questionNum) {
+        return RecommendResultVO.builder()
+                .questionIdList(Arrays.asList("1001", "1002", "1003"))
+                .build();
+    }
+}

+ 9 - 0
seec-ml/src/main/java/cn/seec/seecml/dto/ClassificationDTO.java

@@ -0,0 +1,9 @@
+package cn.seec.seecml.dto;
+
+import lombok.Data;
+
+/** @author Kunduin */
+@Data
+public class ClassificationDTO {
+    String text;
+}

+ 13 - 0
seec-ml/src/main/java/cn/seec/seecml/vo/ClassificationResultVO.java

@@ -0,0 +1,13 @@
+package cn.seec.seecml.vo;
+
+import lombok.Builder;
+import lombok.Value;
+
+import java.util.List;
+
+/** @author Kunduin */
+@Value
+@Builder
+public class ClassificationResultVO {
+    List<String> knowledgeIdList;
+}

+ 13 - 0
seec-ml/src/main/java/cn/seec/seecml/vo/RecommendResultVO.java

@@ -0,0 +1,13 @@
+package cn.seec.seecml.vo;
+
+import lombok.Builder;
+import lombok.Value;
+
+import java.util.List;
+
+/** @author Kunduin */
+@Value
+@Builder
+public class RecommendResultVO {
+    List<String> questionIdList;
+}

+ 8 - 0
seec-ml/src/main/resources/application.yml

@@ -0,0 +1,8 @@
+server:
+  port: 9300
+
+management:
+  endpoints:
+    web:
+      exposure:
+        include: httptrace

+ 11 - 0
seec-ml/src/test/java/cn/seec/seecbok/CloudMockApplicationTests.java

@@ -0,0 +1,11 @@
+package cn.seec.seecbok;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class CloudMockApplicationTests {
+
+    @Test
+    void contextLoads() {}
+}