瀏覽代碼

增加了文档

XuShengTao 6 年之前
父節點
當前提交
30f1f0fb03
共有 36 個文件被更改,包括 1001 次插入296 次删除
  1. 16 0
      api/QuestionTests.md
  2. 15 15
      pom.xml
  3. 0 61
      src/main/java/com/es/demo/TransportClientConfig.java
  4. 0 32
      src/main/java/com/es/demo/graphql/resolver/PostQuery.java
  5. 0 60
      src/main/java/com/es/demo/recommend/RecomRestfulController.java
  6. 3 3
      src/main/java/com/seec/bok/BokApplication.java
  7. 5 5
      src/main/java/com/seec/bok/back/controller/ChoiceQuestionController.java
  8. 28 0
      src/main/java/com/seec/bok/back/controller/QuestionController.java
  9. 23 22
      src/main/java/com/seec/bok/back/controller/WebRestfulController.java
  10. 107 0
      src/main/java/com/seec/bok/back/domainobject/QuestionDO.java
  11. 1 2
      src/main/java/com/seec/bok/back/entity/ChoiceQuestion.java
  12. 62 0
      src/main/java/com/seec/bok/back/entity/Question.java
  13. 30 0
      src/main/java/com/seec/bok/back/repository/QuestionRepository.java
  14. 145 0
      src/main/java/com/seec/bok/back/repository/QuestionRepositoryImp.java
  15. 5 6
      src/main/java/com/seec/bok/back/repository/TQRepository.java
  16. 4 19
      src/main/java/com/seec/bok/back/repository/TQRepositoryImp.java
  17. 14 0
      src/main/java/com/seec/bok/config/ExposeEntityIdRestMvcConfiguration.java
  18. 1 1
      src/main/java/com/seec/bok/config/PageableConfig.java
  19. 37 0
      src/main/java/com/seec/bok/config/RestESConfig.java
  20. 3 2
      src/main/java/com/seec/bok/config/RestRepositoryConfiguration.java
  21. 65 0
      src/main/java/com/seec/bok/config/TransportClientConfig.java
  22. 1 1
      src/main/java/com/seec/bok/freemarkerweb/TQManagement.java
  23. 32 0
      src/main/java/com/seec/bok/graphql/resolver/PostQuery.java
  24. 1 7
      src/main/java/com/seec/bok/proxy/Neo4jProxyController.java
  25. 99 0
      src/main/java/com/seec/bok/recommend/RecomRestfulController.java
  26. 1 1
      src/main/java/com/seec/bok/recommend/dto/GetRecommend.java
  27. 1 1
      src/main/java/com/seec/bok/recommend/dto/GetRecommendAnswer.java
  28. 3 3
      src/main/java/com/seec/bok/recommend/vo/AnswerTQ.java
  29. 2 2
      src/main/java/com/seec/bok/recommend/vo/NoAnswerTQ.java
  30. 1 1
      src/main/java/com/seec/bok/recommend/vo/Res.java
  31. 0 52
      src/test/java/com/es/demo/DemoApplicationTests.java
  32. 8 0
      src/test/java/com/seec/bok/HalRes.java
  33. 141 0
      src/test/java/com/seec/bok/QuestionTests.java
  34. 30 0
      src/test/java/com/seec/bok/RandomUtil.java
  35. 76 0
      src/test/java/com/seec/bok/util/Request.java
  36. 41 0
      src/test/java/com/seec/bok/util/TestUtil.java

File diff suppressed because it is too large
+ 16 - 0
api/QuestionTests.md


+ 15 - 15
pom.xml

@@ -59,23 +59,23 @@
             <optional>true</optional>
         </dependency>
 
-        <dependency>
-            <groupId>com.graphql-java</groupId>
-            <artifactId>graphql-spring-boot-starter</artifactId>
-            <version>5.0.2</version>
-        </dependency>
+        <!--<dependency>-->
+            <!--<groupId>com.graphql-java</groupId>-->
+            <!--<artifactId>graphql-spring-boot-starter</artifactId>-->
+            <!--<version>5.0.2</version>-->
+        <!--</dependency>-->
 
-        <dependency>
-            <groupId>com.graphql-java</groupId>
-            <artifactId>graphiql-spring-boot-starter</artifactId>
-            <version>5.0.2</version>
-        </dependency>
+        <!--<dependency>-->
+            <!--<groupId>com.graphql-java</groupId>-->
+            <!--<artifactId>graphiql-spring-boot-starter</artifactId>-->
+            <!--<version>5.0.2</version>-->
+        <!--</dependency>-->
 
-        <dependency>
-            <groupId>com.graphql-java</groupId>
-            <artifactId>graphql-java-tools</artifactId>
-            <version>5.2.4</version>
-        </dependency>
+        <!--<dependency>-->
+            <!--<groupId>com.graphql-java</groupId>-->
+            <!--<artifactId>graphql-java-tools</artifactId>-->
+            <!--<version>5.2.4</version>-->
+        <!--</dependency>-->
 
         <dependency>
             <groupId>org.springframework.restdocs</groupId>

+ 0 - 61
src/main/java/com/es/demo/TransportClientConfig.java

@@ -1,61 +0,0 @@
-package com.es.demo;
-
-import org.elasticsearch.client.Client;
-import org.elasticsearch.client.transport.TransportClient;
-import org.elasticsearch.common.settings.Settings;
-import org.elasticsearch.common.transport.TransportAddress;
-import org.elasticsearch.transport.client.PreBuiltTransportClient;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.convert.support.DefaultConversionService;
-import org.springframework.data.elasticsearch.config.ElasticsearchConfigurationSupport;
-import org.springframework.data.elasticsearch.core.ElasticsearchEntityMapper;
-import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
-import org.springframework.data.elasticsearch.core.EntityMapper;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-/**
- * @ClassName TransportClientConfig
- * @PackageName com.es.demo
- * @Author sheen
- * @Date 2019/12/15
- * @Version 1.0
- * @Description //TODO
- **/
-@Configuration
-public class TransportClientConfig extends ElasticsearchConfigurationSupport {
-    @Value("${bok.es.cluster.name}")
-    protected String name;
-    @Value("${bok.es.port}")
-    protected String port;
-    @Value("${bok.es.address}")
-    protected String address;
-    @Bean
-    public Client elasticsearchClient() throws UnknownHostException {
-        System.out.println(name+" "+address+" "+port);
-        Settings settings = Settings.builder().put("cluster.name", name).build();
-        TransportClient client = new PreBuiltTransportClient(settings);
-        //client.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.68.76"), 9300));
-//        client.addTransportAddress(new TransportAddress(InetAddress.getByName("http:///es.seecoder.cn")));
-        client.addTransportAddress(new TransportAddress(InetAddress.getByName(address), Integer.valueOf(port)));
-        return client;
-    }
-
-    @Bean(name = {"elasticsearchOperations", "elasticsearchTemplate"})
-    public ElasticsearchTemplate elasticsearchTemplate() throws UnknownHostException {
-        return new ElasticsearchTemplate(elasticsearchClient(), entityMapper());
-    }
-
-    // use the ElasticsearchEntityMapper
-    @Bean
-    @Override
-    public EntityMapper entityMapper() {
-        ElasticsearchEntityMapper entityMapper = new ElasticsearchEntityMapper(elasticsearchMappingContext(),
-                new DefaultConversionService());
-        entityMapper.setConversions(elasticsearchCustomConversions());
-        return entityMapper;
-    }
-}

+ 0 - 32
src/main/java/com/es/demo/graphql/resolver/PostQuery.java

@@ -1,32 +0,0 @@
-package com.es.demo.graphql.resolver;
-
-import com.coxautodev.graphql.tools.GraphQLQueryResolver;
-import com.es.demo.back.ChoiceQuestion;
-import com.es.demo.back.TQRepository;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-
-/**
- * @author HelloWood
- */
-@Component
-public class PostQuery implements GraphQLQueryResolver {
-
-    private final TQRepository tqRepository;
-
-    @Autowired
-    public PostQuery(@Qualifier("TQRepositoryImp") TQRepository tqRepository) {
-        this.tqRepository = tqRepository;
-    }
-
-
-    public Optional<ChoiceQuestion> tq(Integer id) {
-        return tqRepository.findById(id);
-    }
-
-}

+ 0 - 60
src/main/java/com/es/demo/recommend/RecomRestfulController.java

@@ -1,60 +0,0 @@
-package com.es.demo.recommend;
-
-import com.es.demo.back.ChoiceQuestion;
-import com.es.demo.back.TQRepository;
-import com.es.demo.recommend.dto.GetRecommend;
-import com.es.demo.recommend.dto.GetRecommendAnswer;
-import com.es.demo.recommend.vo.AnswerTQ;
-import com.es.demo.recommend.vo.NoAnswerTQ;
-import com.es.demo.recommend.vo.Res;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @ClassName recomRestfulController
- * @PackageName com.es.demo
- * @Author sheen
- * @Date 2020/1/2
- * @Version 1.0
- * @Description //TODO
- **/
-@RestController
-@RequestMapping("/api/question")
-public class RecomRestfulController {
-    private final TQRepository tqRepository;
-
-    @Autowired
-    public RecomRestfulController(@Qualifier("TQRepositoryImp") TQRepository tqRepository) {
-        this.tqRepository = tqRepository;
-    }
-
-    @PostMapping("/recommend")
-    public Res<List<NoAnswerTQ>> getRecommend(
-            @RequestBody GetRecommend body) {
-        final Page<ChoiceQuestion> all = tqRepository.findAll(PageRequest.of(0, body.questionNum.intValue()));
-
-        return new Res<List<NoAnswerTQ>>(
-                all.getContent().stream()
-                        .map(NoAnswerTQ::new)
-                        .collect(Collectors.toList()));
-    }
-    @PostMapping("/answer")
-    public Res<List<AnswerTQ>> getRecommendWithAnswer(
-            @RequestBody GetRecommendAnswer body) {
-        final Page<ChoiceQuestion> all = tqRepository.findByIdIn(body.getQuestionId(),PageRequest.of(0, body.questionId.size()));
-
-        return new Res<List<AnswerTQ>>(
-                all.getContent().stream()
-                        .map(AnswerTQ::new)
-                        .collect(Collectors.toList()));
-    }
-}

+ 3 - 3
src/main/java/com/es/demo/DemoApplication.java → src/main/java/com/seec/bok/BokApplication.java

@@ -1,14 +1,14 @@
-package com.es.demo;
+package com.seec.bok;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 @SpringBootApplication
-public class DemoApplication {
+public class BokApplication {
 
     public static void main(String[] args) {
 
-        SpringApplication.run(DemoApplication.class, args);
+        SpringApplication.run(BokApplication.class, args);
     }
 
 }

+ 5 - 5
src/main/java/com/es/demo/back/ChoiceQuestionController.java → src/main/java/com/seec/bok/back/controller/ChoiceQuestionController.java

@@ -1,13 +1,12 @@
-package com.es.demo.back;
+package com.seec.bok.back.controller;
 
+import com.seec.bok.back.entity.ChoiceQuestion;
+import com.seec.bok.back.repository.TQRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler;
 import org.springframework.data.rest.webmvc.RepositoryRestController;
-import org.springframework.data.web.PagedResourcesAssembler;
-import org.springframework.hateoas.server.RepresentationModelAssembler;
 import org.springframework.http.HttpStatus;
-import org.springframework.http.RequestEntity;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.data.rest.webmvc.support.RepositoryEntityLinks;
@@ -29,8 +28,9 @@ public class ChoiceQuestionController {
     private RepositoryEntityLinks entityLinks;
     @RequestMapping(value = "/{tqId}",method= RequestMethod.PUT, produces = "application/hal+json")
     public @ResponseBody ResponseEntity<?>
-            updateTQ(@PathVariable Integer tqId, @RequestBody ChoiceQuestion person,PersistentEntityResourceAssembler resourcesAssembler) {
+            updateTQ(@PathVariable Long tqId, @RequestBody ChoiceQuestion person, PersistentEntityResourceAssembler resourcesAssembler) {
         final ChoiceQuestion saved = tqRepository.save(person);
         return new ResponseEntity(resourcesAssembler.toFullResource(saved), HttpStatus.OK);
     }
+
 }

+ 28 - 0
src/main/java/com/seec/bok/back/controller/QuestionController.java

@@ -0,0 +1,28 @@
+package com.seec.bok.back.controller;
+
+import com.seec.bok.back.entity.ChoiceQuestion;
+import com.seec.bok.back.entity.Question;
+import com.seec.bok.back.repository.QuestionRepository;
+import com.seec.bok.back.repository.TQRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler;
+import org.springframework.data.rest.webmvc.RepositoryRestController;
+import org.springframework.data.rest.webmvc.support.RepositoryEntityLinks;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @ClassName ChoiceQuestionController
+ * @PackageName com.es.demo.back
+ * @Author sheen
+ * @Date 2019/12/26
+ * @Version 1.0
+ * @Description //TODO
+ **/
+@RepositoryRestController
+@RequestMapping("/question")
+public class QuestionController {
+
+}

+ 23 - 22
src/main/java/com/es/demo/WebRestfulController.java → src/main/java/com/seec/bok/back/controller/WebRestfulController.java

@@ -1,24 +1,17 @@
-package com.es.demo;
+package com.seec.bok.back.controller;
 
-import com.es.demo.back.ChoiceQuestion;
-import com.es.demo.back.TQRepository;
+import com.seec.bok.back.entity.ChoiceQuestion;
+import com.seec.bok.back.repository.TQRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
-import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
-import org.springframework.data.elasticsearch.core.query.GetQuery;
-import org.springframework.data.elasticsearch.core.query.IndexQuery;
-import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
 import org.springframework.util.Assert;
 import org.springframework.web.bind.annotation.*;
-import sun.security.util.Length;
 
 import java.util.*;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 /**
  * @ClassName WebRestfulController
@@ -31,20 +24,27 @@ import java.util.stream.Stream;
 @RestController
 @RequestMapping("/rest")
 public class WebRestfulController {
-    private ElasticsearchOperations elasticsearchOperations;
     @Autowired
     @Qualifier("TQRepositoryImp")
     private TQRepository tqRepository;
     @Autowired
-    public WebRestfulController(ElasticsearchOperations elasticsearchOperations) {
-        this.elasticsearchOperations = elasticsearchOperations;
-    }
+    public WebRestfulController() { }
 
     @PostMapping("/tq")
     public String save(@RequestBody ChoiceQuestion person) {
         return saveChoiceQuestion(person);
     }
     private String saveChoiceQuestion(ChoiceQuestion tq){
+        if(tq.getAnswer()!=null){
+            tq.setAnswer(tq.getAnswer().replaceAll("【答案】",""));
+        }
+        if(tq.getAnalysis()!=null){
+            tq.setAnalysis(tq.getAnalysis().replaceAll("【解析】",""));
+        }
+        if(tq.getKey_points()!=null){
+            tq.setKey_points(tq.getKey_points().replaceAll("【考点】",""));
+        }
+
         System.out.println("save:"+tq.toString());
         return tqRepository.save(tq).toString();
     }
@@ -60,8 +60,8 @@ public class WebRestfulController {
         return all;
     }
     @GetMapping("/tq/{id}")
-    public ChoiceQuestion findById(@PathVariable("id")  Long id) {
-        ChoiceQuestion tq = tqRepository.findById(id.intValue()).orElseThrow(()->{return new RuntimeException("not found id:"+id);});
+    public ChoiceQuestion findById(@PathVariable("id")  Integer id) {
+        ChoiceQuestion tq = tqRepository.findById(id).orElseThrow(()->{return new RuntimeException("not found id:"+id);});
         return tq;
     }
 
@@ -69,7 +69,7 @@ public class WebRestfulController {
     @RequestMapping(value="/postChapter",method = RequestMethod.POST,produces = "text/plain; charset=utf-8")
     public String saveAll(@RequestParam String chapeter,@RequestBody String content) {
         try {
-            Map<Integer,ChoiceQuestion> questions=new LinkedHashMap<>();
+            Map<Integer, ChoiceQuestion> questions=new LinkedHashMap<>();
             final int answerStartPos = content.lastIndexOf("## 参考答案与解析");
             final int choiceStartPos = content.lastIndexOf("## 单项选择题");
             final int completionStartPos = content.lastIndexOf("## 填空题");
@@ -87,9 +87,10 @@ public class WebRestfulController {
 
 
             String answerContent=content.substring(answerStartPos);
+//            System.out.println(answerContent);
             SetAnswer(chapeter, answerContent, questions);
 
-            System.out.println(questions.toString());
+//            System.out.println(questions.toString());
             questions.forEach((k,v)->{
                 if(v.questionIsLegal()){
                     saveChoiceQuestion(v);
@@ -104,7 +105,7 @@ public class WebRestfulController {
     }
 
 
-    private void SetQuestion(String chapeter,String content, Map<Integer, ChoiceQuestion> questions) {
+    private void SetQuestion(String chapeter, String content, Map<Integer, ChoiceQuestion> questions) {
         int num=1;
         String type="choice";
         while (true){
@@ -114,7 +115,7 @@ public class WebRestfulController {
             if(startPos==-1){ break;}
             content = content.substring(startPos);
             int endPos=getEndPos(num,content);
-            Integer id=Integer.valueOf(chapeter)*1000+num;
+            Integer id=Integer.valueOf(String.valueOf(Long.valueOf(chapeter)*1000+num));
             String problem=content.substring(startTag.length(),endPos);
             int A_Pos=0;
             int firstA=problem.indexOf("\nA.");
@@ -154,7 +155,7 @@ public class WebRestfulController {
         }
         System.out.println(questions);
     }
-    private void SetAnswer(String chapeter,String content, Map<Integer, ChoiceQuestion> questions) {
+    private void SetAnswer(String chapeter, String content, Map<Integer, ChoiceQuestion> questions) {
         int num=1;
         while (true){
             String startTag="\n"+num+".";
@@ -163,7 +164,7 @@ public class WebRestfulController {
             if(startPos==-1){ break;}
             content = content.substring(startPos);
             int endPos=getEndPos(num,content);
-            Integer id=Integer.valueOf(chapeter)*1000+num;
+            Long id=Long.valueOf(chapeter)*1000+num;
             String solve = content.substring(0, endPos);
             int answerStart=solve.indexOf("【答案】");
             int keyPointsStart=solve.indexOf("【考点】");

+ 107 - 0
src/main/java/com/seec/bok/back/domainobject/QuestionDO.java

@@ -0,0 +1,107 @@
+package com.seec.bok.back.domainobject;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.seec.bok.back.entity.ChoiceQuestion;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Set;
+
+/**
+ * 核心域实体
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class QuestionDO {
+    @JsonProperty(value = "id")
+    private String id;
+
+    @NotNull(message = "请填写类型:", groups = {PostMapping.class, PutMapping.class})
+    @JsonProperty(value = "type")
+    private String type;
+
+    @JsonProperty(value = "stem")
+    @NotNull(message = "请填写题干:", groups = {PostMapping.class, PutMapping.class})
+    private String stem;
+
+    @JsonProperty(value = "options")
+    private HashMap<String,Object> options;
+
+    @JsonProperty(value = "answer")
+    private String answer;
+
+    @JsonProperty(value = "key_points")
+    private String keyPoints;
+
+    @JsonProperty(value = "analysis")
+    private String analysis;
+
+    @JsonProperty(value = "tags")
+    private Set<String> tags;
+
+    @JsonProperty(value = "knowledgeId")
+    private Set<String> knowledgeId;
+
+    @JsonProperty(value = "lastModified")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date lastModifiedTime;
+
+    @JsonProperty(value = "tq_id")
+    public String getTqId() {
+        return id;
+    }
+
+    public void setTqId(String id) {
+        this.id=id;
+    }
+
+    public QuestionDO(ChoiceQuestion choiceQuestion) {
+
+        BeanUtils.copyProperties(choiceQuestion,this);
+    }
+
+    public ChoiceQuestion toEntity(){
+        ChoiceQuestion choiceQuestion=new ChoiceQuestion();
+        BeanUtils.copyProperties(this,choiceQuestion);
+        return choiceQuestion;
+    }
+
+    public void initProblem(String id, String type, String stem, HashMap options){
+        this.id=id;
+        this.type=type;
+        this.stem=stem;
+        this.options=options;
+    }
+
+    public void initAnswer(String answer,String keyPoints,String analysis){
+        this.answer=answer;
+        this.keyPoints=keyPoints;
+        this.analysis=analysis;
+    }
+
+    public boolean isLegal() {
+        return this.getStem().length()>4||this.getOptions().size()>2;
+    }
+
+    @Override
+    public String toString() {
+        return "\n\nQuestion{" +
+                "\nid=" + id +
+                ", \ntype='" + type + '\'' +
+                ", \nstem='" + stem + '\'' +
+                ", \noptions=" + options +
+                ", \nanswer='" + answer + '\'' +
+                ", \nkey_points='" + keyPoints + '\'' +
+                ", \nanalysis='" + analysis + '\'' +
+                '}';
+    }
+}

+ 1 - 2
src/main/java/com/es/demo/back/ChoiceQuestion.java → src/main/java/com/seec/bok/back/entity/ChoiceQuestion.java

@@ -1,4 +1,4 @@
-package com.es.demo.back;
+package com.seec.bok.back.entity;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -28,7 +28,6 @@ public class ChoiceQuestion {
 
     @Id
     private Integer id;
-
     @JsonProperty(value = "type")
     private String type;
 

+ 62 - 0
src/main/java/com/seec/bok/back/entity/Question.java

@@ -0,0 +1,62 @@
+package com.seec.bok.back.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.elasticsearch.annotations.Document;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Set;
+
+@Data
+@NoArgsConstructor
+@Document(indexName = "question", type = "_doc")
+public class Question {
+    @Id
+    private String id;
+
+    @JsonProperty(value = "type")
+    private String type;
+
+    @JsonProperty(value = "stem")
+    private String stem;
+
+    @JsonProperty(value = "options")
+    private HashMap options;
+
+    @JsonProperty(value = "answer")
+    private String answer;
+
+    @JsonProperty(value = "key_points")
+    private String key_points;
+
+    @JsonProperty(value = "analysis")
+    private String analysis;
+
+    @JsonProperty(value = "tags")
+    private Set<String> tags;
+
+    @JsonProperty(value = "knowledgeId")
+    private Set<String> knowledge_id;
+
+    @JsonProperty(value = "lastModified")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date lastModifiedTime;
+
+    @JsonProperty(value = "tq_id")
+    public String getTqId() {
+        return id;
+    }
+
+    public void setTqId(String id) {
+        this.id=id;
+    }
+    public Question(ChoiceQuestion choiceQuestion) {
+        BeanUtils.copyProperties(choiceQuestion,this);
+        this.id=""+choiceQuestion.getId();
+    }
+}

+ 30 - 0
src/main/java/com/seec/bok/back/repository/QuestionRepository.java

@@ -0,0 +1,30 @@
+package com.seec.bok.back.repository;
+
+import com.seec.bok.back.entity.ChoiceQuestion;
+import com.seec.bok.back.entity.Question;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
+import org.springframework.data.repository.query.Param;
+import org.springframework.data.rest.core.annotation.RepositoryRestResource;
+import org.springframework.stereotype.Repository;
+
+import java.util.Collection;
+import java.util.Optional;
+
+@RepositoryRestResource(path = "question")
+@Repository("QuestionRepository")
+public interface QuestionRepository extends ElasticsearchRepository<Question,String> {
+    @Override
+    Page<Question> findAll(Pageable pageable);
+    Page<Question> findByIdIn(@Param("id")Collection<String> id, Pageable pageable);
+    Page<Question> findByStemLike(String content,Pageable pageable);
+    @Override
+    void deleteById(String integer);
+    @Override
+    Optional<Question> findById(String integer);
+    Page<Question> findAllByTagsContaining(String tag, Pageable pageable);
+    Page<Question> findAllByTagsNotIn(Collection<String> tags, Pageable pageable);
+    @Override
+    <S extends Question> S save(S s);
+}

+ 145 - 0
src/main/java/com/seec/bok/back/repository/QuestionRepositoryImp.java

@@ -0,0 +1,145 @@
+package com.seec.bok.back.repository;
+
+import com.seec.bok.back.entity.Question;
+import org.elasticsearch.index.query.QueryBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.elasticsearch.core.query.SearchQuery;
+import org.springframework.stereotype.Repository;
+
+import java.util.Collection;
+import java.util.Optional;
+@Repository("QuestionRepositoryImp")
+public class QuestionRepositoryImp implements QuestionRepository{
+    @Autowired
+    @Qualifier("QuestionRepository") // inject Spring implementation here
+    private QuestionRepository questionRepository;
+
+    @Override
+    public Page<Question> findAll(Pageable pageable) {
+        return questionRepository.findAll(pageable);
+    }
+
+    @Override
+    public Page<Question> findByIdIn(Collection<String> id, Pageable pageable) {
+        return questionRepository.findByIdIn(id, pageable);
+    }
+
+    @Override
+    public Page<Question> findByStemLike(String content, Pageable pageable) {
+        return questionRepository.findByStemLike(content, pageable);
+    }
+
+    @Override
+    public void deleteById(String integer) {
+        questionRepository.deleteById(integer);
+    }
+
+    @Override
+    public Optional<Question> findById(String integer) {
+        return questionRepository.findById(integer);
+    }
+
+    @Override
+    public Page<Question> findAllByTagsContaining(String tag, Pageable pageable) {
+        return questionRepository.findAllByTagsContaining(tag, pageable);
+    }
+
+    @Override
+    public Page<Question> findAllByTagsNotIn(Collection<String> tags, Pageable pageable) {
+        return questionRepository.findAllByTagsNotIn(tags, pageable);
+    }
+
+    @Override
+    public <S extends Question> S save(S s) {
+        return questionRepository.save(s);
+    }
+
+    @Override
+    public <S extends Question> S index(S entity) {
+        return questionRepository.index(entity);
+    }
+
+    @Override
+    public <S extends Question> S indexWithoutRefresh(S entity) {
+        return questionRepository.indexWithoutRefresh(entity);
+    }
+
+    @Override
+    public Iterable<Question> search(QueryBuilder query) {
+        return questionRepository.search(query);
+    }
+
+    @Override
+    public Page<Question> search(QueryBuilder query, Pageable pageable) {
+        return questionRepository.search(query, pageable);
+    }
+
+    @Override
+    public Page<Question> search(SearchQuery searchQuery) {
+        return questionRepository.search(searchQuery);
+    }
+
+    @Override
+    public Page<Question> searchSimilar(Question entity, String[] fields, Pageable pageable) {
+        return questionRepository.searchSimilar(entity, fields, pageable);
+    }
+
+    @Override
+    public void refresh() {
+        questionRepository.refresh();
+    }
+
+    @Override
+    public Class<Question> getEntityClass() {
+        return questionRepository.getEntityClass();
+    }
+
+    @Override
+    public Iterable<Question> findAll(Sort sort) {
+        return questionRepository.findAll(sort);
+    }
+
+    @Override
+    public <S extends Question> Iterable<S> saveAll(Iterable<S> iterable) {
+        return questionRepository.saveAll(iterable);
+    }
+
+    @Override
+    public boolean existsById(String s) {
+        return questionRepository.existsById(s);
+    }
+
+    @Override
+    public Iterable<Question> findAll() {
+        return questionRepository.findAll();
+    }
+
+    @Override
+    public Iterable<Question> findAllById(Iterable<String> iterable) {
+        return questionRepository.findAllById(iterable);
+    }
+
+    @Override
+    public long count() {
+        return questionRepository.count();
+    }
+
+    @Override
+    public void delete(Question question) {
+        questionRepository.delete(question);
+    }
+
+    @Override
+    public void deleteAll(Iterable<? extends Question> iterable) {
+        questionRepository.deleteAll(iterable);
+    }
+
+    @Override
+    public void deleteAll() {
+        questionRepository.deleteAll();
+    }
+}

+ 5 - 6
src/main/java/com/es/demo/back/TQRepository.java → src/main/java/com/seec/bok/back/repository/TQRepository.java

@@ -1,14 +1,13 @@
-package com.es.demo.back;
+package com.seec.bok.back.repository;
 
+import com.seec.bok.back.entity.ChoiceQuestion;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
 import org.springframework.data.rest.core.annotation.RepositoryRestResource;
 
 import java.util.Collection;
-import java.util.List;
 import java.util.Optional;
-import java.util.Set;
 
 /**
  * @ClassName TQRepository
@@ -20,13 +19,13 @@ import java.util.Set;
  **/
 @RepositoryRestResource(path = "tq")
 public interface  TQRepository extends ElasticsearchRepository<ChoiceQuestion,Integer> {
+    @Override
     Page<ChoiceQuestion> findAll(Pageable pageable);
     Page<ChoiceQuestion> findByIdIn(Collection<Integer> id, Pageable pageable);
-    Page<ChoiceQuestion> findAllByIdBetween( Pageable pageable,Integer start, Integer end);
     Page<ChoiceQuestion> findByStemLike(String content,Pageable pageable);
-    int countAllByIdBetween(Integer id, Integer id2);
-    int deleteAllByIdBetween(Integer id, Integer id2);
+    @Override
     void deleteById(Integer integer);
+    @Override
     Optional<ChoiceQuestion> findById(Integer integer);
     Page<ChoiceQuestion> findAllByTagsContaining(String tag, Pageable pageable);
     Page<ChoiceQuestion> findAllByTagsNotIn(Collection<String> tags, Pageable pageable);

+ 4 - 19
src/main/java/com/es/demo/back/TQRepositoryImp.java → src/main/java/com/seec/bok/back/repository/TQRepositoryImp.java

@@ -1,5 +1,7 @@
-package com.es.demo.back;
+package com.seec.bok.back.repository;
 
+import com.seec.bok.back.entity.ChoiceQuestion;
+import com.seec.bok.back.repository.TQRepository;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -7,13 +9,11 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.elasticsearch.core.query.SearchQuery;
-import org.springframework.data.rest.core.annotation.RepositoryRestResource;
 import org.springframework.stereotype.Repository;
 
 import java.util.Collection;
 import java.util.Date;
 import java.util.Optional;
-import java.util.Set;
 
 /**
  * @ClassName TQRepositoryImp
@@ -25,7 +25,7 @@ import java.util.Set;
  **/
 @Repository("TQRepositoryImp")
 
-public class TQRepositoryImp  implements TQRepository {
+public class TQRepositoryImp  implements com.seec.bok.back.repository.TQRepository {
 
     @Autowired
     @Qualifier("TQRepository") // inject Spring implementation here
@@ -41,26 +41,11 @@ public class TQRepositoryImp  implements TQRepository {
         return TQRepository.findByIdIn(id,pageable);
     }
 
-    @Override
-    public Page<ChoiceQuestion> findAllByIdBetween(Pageable pageable, Integer start, Integer end) {
-        return TQRepository.findAllByIdBetween(pageable, start, end);
-    }
-
     @Override
     public Page<ChoiceQuestion> findByStemLike(String content, Pageable pageable) {
         return TQRepository.findByStemLike(content, pageable);
     }
 
-    @Override
-    public int countAllByIdBetween(Integer id, Integer id2) {
-        return TQRepository.countAllByIdBetween(id, id2);
-    }
-
-    @Override
-    public int deleteAllByIdBetween(Integer id, Integer id2) {
-        return TQRepository.deleteAllByIdBetween(id,id2);
-    }
-
     @Override
     public void deleteById(Integer integer) {
         TQRepository.deleteById(integer);

+ 14 - 0
src/main/java/com/seec/bok/config/ExposeEntityIdRestMvcConfiguration.java

@@ -0,0 +1,14 @@
+package com.seec.bok.config;
+
+import com.seec.bok.back.entity.Question;
+import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
+import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter;
+import org.springframework.stereotype.Component;
+@Component
+public class ExposeEntityIdRestMvcConfiguration extends RepositoryRestConfigurerAdapter {
+
+    @Override
+    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
+        config.exposeIdsFor(Question.class);
+    }
+}

+ 1 - 1
src/main/java/com/es/demo/PageableConfig.java → src/main/java/com/seec/bok/config/PageableConfig.java

@@ -1,4 +1,4 @@
-package com.es.demo;
+package com.seec.bok.config;
 
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;

+ 37 - 0
src/main/java/com/seec/bok/config/RestESConfig.java

@@ -0,0 +1,37 @@
+package com.seec.bok.config;
+
+import org.elasticsearch.client.RestHighLevelClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.convert.support.DefaultConversionService;
+import org.springframework.data.elasticsearch.client.ClientConfiguration;
+import org.springframework.data.elasticsearch.client.RestClients;
+import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
+import org.springframework.data.elasticsearch.core.ElasticsearchEntityMapper;
+import org.springframework.data.elasticsearch.core.EntityMapper;
+// 使用rest接口的es client
+@Configuration
+public class RestESConfig extends AbstractElasticsearchConfiguration {
+    @Bean
+    public RestHighLevelClient elasticsearchClient() {
+
+        ClientConfiguration clientConfiguration = ClientConfiguration.builder()
+                .connectedTo("es.seecoder.cn:80")
+                .withBasicAuth("elastic","changeme")
+                .build();
+
+        return RestClients.create(clientConfiguration).rest();
+    }
+    // no special bean creation needed
+
+    // use the ElasticsearchEntityMapper
+    @Bean
+    @Override
+    public EntityMapper entityMapper() {
+        ElasticsearchEntityMapper entityMapper = new ElasticsearchEntityMapper(elasticsearchMappingContext(),
+                new DefaultConversionService());
+        entityMapper.setConversions(elasticsearchCustomConversions());
+
+        return entityMapper;
+    }
+}

+ 3 - 2
src/main/java/com/es/demo/RestRepositoryConfiguration.java → src/main/java/com/seec/bok/config/RestRepositoryConfiguration.java

@@ -1,6 +1,6 @@
-package com.es.demo;
+package com.seec.bok.config;
 
-import com.es.demo.back.ChoiceQuestion;
+import com.seec.bok.back.entity.ChoiceQuestion;
 import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
 import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter;
 
@@ -13,6 +13,7 @@ import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapt
  * @Description //TODO
  **/
 public class RestRepositoryConfiguration extends RepositoryRestConfigurerAdapter {
+    @Override
     public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
         config.exposeIdsFor(ChoiceQuestion.class);
     }

+ 65 - 0
src/main/java/com/seec/bok/config/TransportClientConfig.java

@@ -0,0 +1,65 @@
+package com.seec.bok.config;
+
+import org.elasticsearch.client.Client;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.client.transport.TransportClient;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.common.transport.TransportAddress;
+import org.elasticsearch.transport.client.PreBuiltTransportClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.convert.support.DefaultConversionService;
+import org.springframework.data.elasticsearch.client.ClientConfiguration;
+import org.springframework.data.elasticsearch.client.RestClients;
+import org.springframework.data.elasticsearch.config.ElasticsearchConfigurationSupport;
+import org.springframework.data.elasticsearch.core.ElasticsearchEntityMapper;
+import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
+import org.springframework.data.elasticsearch.core.EntityMapper;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * @ClassName TransportClientConfig
+ * @PackageName com.es.demo
+ * @Author sheen
+ * @Date 2019/12/15
+ * @Version 1.0
+ * @Description //TODO
+ **/
+//@Configuration
+public class TransportClientConfig extends ElasticsearchConfigurationSupport {
+    @Value("${bok.es.cluster.name}")
+    protected String name;
+    @Value("${bok.es.port}")
+    protected String port;
+    @Value("${bok.es.address}")
+    protected String address;
+
+//    @Bean
+//    public Client elasticsearchClient() throws UnknownHostException {
+//        System.out.println(name+" "+address+" "+port);
+//        Settings settings = Settings.builder().put("cluster.name", name).build();
+//        TransportClient client = new PreBuiltTransportClient(settings);
+//        //client.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.68.76"), 9300));
+////        client.addTransportAddress(new TransportAddress(InetAddress.getByName("http:///es.seecoder.cn")));
+//        client.addTransportAddress(new TransportAddress(InetAddress.getByName(address), Integer.valueOf(port)));
+//        return client;
+//    }
+//    @Bean(name = {"elasticsearchOperations", "elasticsearchTemplate"})
+//    public ElasticsearchTemplate elasticsearchTemplate() throws UnknownHostException {
+//        return new ElasticsearchTemplate(client(), entityMapper());
+//    }
+
+//    // use the ElasticsearchEntityMapper
+//    @Bean
+//    @Override
+//    public EntityMapper entityMapper() {
+//        ElasticsearchEntityMapper entityMapper = new ElasticsearchEntityMapper(elasticsearchMappingContext(),
+//                new DefaultConversionService());
+//        entityMapper.setConversions(elasticsearchCustomConversions());
+//        return entityMapper;
+//    }
+}

+ 1 - 1
src/main/java/com/es/demo/freemarkerweb/TQManagement.java → src/main/java/com/seec/bok/freemarkerweb/TQManagement.java

@@ -1,4 +1,4 @@
-package com.es.demo.freemarkerweb;
+package com.seec.bok.freemarkerweb;
 
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;

+ 32 - 0
src/main/java/com/seec/bok/graphql/resolver/PostQuery.java

@@ -0,0 +1,32 @@
+package com.seec.bok.graphql.resolver;
+
+//import com.coxautodev.graphql.tools.GraphQLQueryResolver;
+//import ChoiceQuestion;
+//import TQRepository;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.annotation.Qualifier;
+//import org.springframework.stereotype.Component;
+//
+//import java.util.ArrayList;
+//import java.util.List;
+//import java.util.Optional;
+
+/**
+ * @author HelloWood
+ */
+//@Component
+//public class PostQuery implements GraphQLQueryResolver {
+    public class PostQuery  {
+//    private final TQRepository tqRepository;
+//
+//    @Autowired
+//    public PostQuery(@Qualifier("TQRepositoryImp") TQRepository tqRepository) {
+//        this.tqRepository = tqRepository;
+//    }
+//
+//
+//    public Optional<ChoiceQuestion> tq(Integer id) {
+//        return tqRepository.findById(id);
+//    }
+
+}

+ 1 - 7
src/main/java/com/es/demo/proxy/Neo4jProxyController.java → src/main/java/com/seec/bok/proxy/Neo4jProxyController.java

@@ -1,21 +1,15 @@
-package com.es.demo.proxy;
+package com.seec.bok.proxy;
 
-import com.es.demo.back.ChoiceQuestion;
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.MediaType;
-import org.springframework.util.MultiValueMap;
 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 org.springframework.web.client.RestTemplate;
 import org.springframework.http.*;
-import org.springframework.util.MultiValueMap;
-import org.springframework.web.client.RestTemplate;
 
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 

+ 99 - 0
src/main/java/com/seec/bok/recommend/RecomRestfulController.java

@@ -0,0 +1,99 @@
+package com.seec.bok.recommend;
+
+import com.seec.bok.back.entity.ChoiceQuestion;
+import com.seec.bok.back.entity.Question;
+import com.seec.bok.back.repository.QuestionRepository;
+import com.seec.bok.back.repository.TQRepository;
+import com.seec.bok.recommend.dto.GetRecommend;
+import com.seec.bok.recommend.dto.GetRecommendAnswer;
+import com.seec.bok.recommend.vo.AnswerTQ;
+import com.seec.bok.recommend.vo.NoAnswerTQ;
+import com.seec.bok.recommend.vo.Res;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName recomRestfulController
+ * @PackageName com.es.demo
+ * @Author sheen
+ * @Date 2020/1/2
+ * @Version 1.0
+ * @Description //TODO
+ **/
+@RestController
+@RequestMapping("/api/question")
+public class RecomRestfulController {
+    private final TQRepository tqRepository;
+
+
+    private final QuestionRepository questionRepository;
+    @Autowired
+
+    public RecomRestfulController(@Qualifier("TQRepositoryImp") TQRepository tqRepository,@Qualifier("QuestionRepositoryImp")  QuestionRepository questionRepository) {
+        this.tqRepository = tqRepository;
+        this.questionRepository = questionRepository;
+    }
+
+    @PostMapping("/recommend")
+    public Res<List<NoAnswerTQ>> getRecommend(
+            @RequestBody GetRecommend body) {
+        final Page<ChoiceQuestion> all = tqRepository.findAll(PageRequest.of(0, body.questionNum.intValue()));
+
+        return new Res<List<NoAnswerTQ>>(
+                all.getContent().stream()
+                        .map(NoAnswerTQ::new)
+                        .collect(Collectors.toList()));
+    }
+    @PostMapping("/answer")
+    public Res<List<AnswerTQ>> getRecommendWithAnswer(
+            @RequestBody GetRecommendAnswer body) {
+        final Page<ChoiceQuestion> all = tqRepository.findByIdIn(body.getQuestionId(),PageRequest.of(0, body.questionId.size()));
+
+        return new Res<List<AnswerTQ>>(
+                all.getContent().stream()
+                        .map(AnswerTQ::new)
+                        .collect(Collectors.toList()));
+    }
+
+    @GetMapping("/test")
+    public void testTQ() {
+        int pageNumber=1;
+        int pageSize=100;
+        String sord="desc";
+        String sort="id";
+        //生成Sort变量
+        Sort sort1 =  Sort.by("id");
+        //生成Pageable变量
+        Pageable pageable = PageRequest.of(pageNumber - 1, pageSize,sort1);
+        Page<ChoiceQuestion> all = tqRepository.findAll(pageable);
+        while (all!=null&&all.getContent().size()!=0){
+            for(ChoiceQuestion pq:all.getContent()){
+                if(pq.getAnswer()!=null){
+                    pq.setAnswer(pq.getAnswer().replaceAll("【答案】",""));
+                }
+                if(pq.getAnalysis()!=null){
+                    pq.setAnalysis(pq.getAnalysis().replaceAll("【解析】",""));
+                }
+                if(pq.getKey_points()!=null){
+                    pq.setKey_points(pq.getKey_points().replaceAll("【考点】",""));
+                }
+                }
+            questionRepository.saveAll(all.getContent().stream().map(Question::new).collect(Collectors.toList()));
+
+//            tqRepository.saveAll(all.getContent());
+            all = null;
+            pageNumber++;
+            pageable = PageRequest.of(pageNumber - 1, pageSize,sort1);
+            all = tqRepository.findAll(pageable);
+        }
+
+    }
+}

+ 1 - 1
src/main/java/com/es/demo/recommend/dto/GetRecommend.java → src/main/java/com/seec/bok/recommend/dto/GetRecommend.java

@@ -1,4 +1,4 @@
-package com.es.demo.recommend.dto;
+package com.seec.bok.recommend.dto;
 
 import lombok.Data;
 

+ 1 - 1
src/main/java/com/es/demo/recommend/dto/GetRecommendAnswer.java → src/main/java/com/seec/bok/recommend/dto/GetRecommendAnswer.java

@@ -1,4 +1,4 @@
-package com.es.demo.recommend.dto;
+package com.seec.bok.recommend.dto;
 
 import lombok.Data;
 

+ 3 - 3
src/main/java/com/es/demo/recommend/vo/AnswerTQ.java → src/main/java/com/seec/bok/recommend/vo/AnswerTQ.java

@@ -1,6 +1,6 @@
-package com.es.demo.recommend.vo;
+package com.seec.bok.recommend.vo;
 
-import com.es.demo.back.ChoiceQuestion;
+import com.seec.bok.back.entity.ChoiceQuestion;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
@@ -22,7 +22,7 @@ import java.util.Set;
 @Data
 public class AnswerTQ {
     @JsonProperty(value = "id")
-    private Integer id;
+    private String id;
 
     @JsonProperty(value = "type")
     private String type;

+ 2 - 2
src/main/java/com/es/demo/recommend/vo/NoAnswerTQ.java → src/main/java/com/seec/bok/recommend/vo/NoAnswerTQ.java

@@ -1,6 +1,6 @@
-package com.es.demo.recommend.vo;
+package com.seec.bok.recommend.vo;
 
-import com.es.demo.back.ChoiceQuestion;
+import com.seec.bok.back.entity.ChoiceQuestion;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;

+ 1 - 1
src/main/java/com/es/demo/recommend/vo/Res.java → src/main/java/com/seec/bok/recommend/vo/Res.java

@@ -1,4 +1,4 @@
-package com.es.demo.recommend.vo;
+package com.seec.bok.recommend.vo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;

+ 0 - 52
src/test/java/com/es/demo/DemoApplicationTests.java

@@ -1,52 +0,0 @@
-package com.es.demo;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.http.MediaType;
-import org.springframework.restdocs.JUnitRestDocumentation;
-import org.springframework.restdocs.RestDocumentationContextProvider;
-import org.springframework.restdocs.RestDocumentationExtension;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.setup.MockMvcBuilders;
-
-import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName;
-import static org.springframework.restdocs.headers.HeaderDocumentation.requestHeaders;
-import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
-import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
-import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields;
-import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
-import static org.springframework.restdocs.request.RequestDocumentation.requestParameters;
-import static org.springframework.restdocs.snippet.Attributes.*;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
-import org.springframework.web.context.WebApplicationContext;
-
-@ExtendWith({RestDocumentationExtension.class, SpringExtension.class})
-@SpringBootTest
-class DemoApplicationTests {
-//    private MockMvc mockMvc;
-//    @BeforeEach
-//    public void setUp(WebApplicationContext webApplicationContext,
-//                      RestDocumentationContextProvider restDocumentation) {
-//        this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
-//                .apply(documentationConfiguration(restDocumentation))
-//                .build();
-//    }
-//    @Test
-//    void contextLoads() throws Exception{
-//        this.mockMvc.perform(get("/api/tq?page=1&size=2").accept(MediaType.APPLICATION_JSON))
-//                .andExpect(status().isOk())
-//                .andDo(document("index",requestParameters(
-//                        parameterWithName("page").description("从1开始的页号"),
-//                        parameterWithName("size").description("每页大小")
-//                        )));
-//    }
-
-}

+ 8 - 0
src/test/java/com/seec/bok/HalRes.java

@@ -0,0 +1,8 @@
+package com.seec.bok;
+
+import lombok.Data;
+
+@Data
+public class HalRes {
+
+}

+ 141 - 0
src/test/java/com/seec/bok/QuestionTests.java

@@ -0,0 +1,141 @@
+package com.seec.bok;
+
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.seec.bok.back.domainobject.QuestionDO;
+import com.seec.bok.util.Request;
+import com.seec.bok.util.TestUtil;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.boot.web.client.RestTemplateBuilder;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.http.HttpMethod;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.HashMap;
+import java.util.Map;
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = {BokApplication.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class QuestionTests {
+    private TestUtil testUtil;
+    @LocalServerPort
+    int randomServerPort;
+    @LocalServerPort
+    public void setRandomServerPort(int randomServerPort) {
+        Request.PORT = randomServerPort;
+    }
+    ObjectMapper mapper = new ObjectMapper();
+    @Autowired
+    public void setTestUtil(RestTemplateBuilder builder) {
+        testUtil = new TestUtil(new TestRestTemplate(builder),randomServerPort);
+    }
+
+    //    private MockMvc mockMvc;
+//    @BeforeEach
+//    public void setUp(WebApplicationContext webApplicationContext,
+//                      RestDocumentationContextProvider restDocumentation) {
+//        this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
+//                .apply(documentationConfiguration(restDocumentation))
+//                .build();
+//    }
+//    @Test
+//    void contextLoads() throws Exception{
+//        this.mockMvc.perform(get("/api/tq?page=1&size=2").accept(MediaType.APPLICATION_JSON))
+//                .andExpect(status().isOk())
+//                .andDo(document("index",requestParameters(
+//                        parameterWithName("page").description("从1开始的页号"),
+//                        parameterWithName("size").description("每页大小")
+//                        )));
+//    }
+
+    @Test
+    public void test01_GetQuestionIdsIn() throws Exception {
+        Request request=new Request(HttpMethod.GET,"/api/question/search/findByIdIn?id={id}&page={page}&size={size}&sort={sort}");
+        request.put("id",new int[]{1001,1002});
+        request.put("page",1);
+        request.put("size",5);
+        request.put("sort","lastModified,DESC");
+        Map ret = request.execute(Map.class);
+        System.out.println(request.OutToString(
+                "GetQuestionIdsIn:得到给定id序列的相关问题"
+        ));
+    }
+
+    static String json="{\"type\" : \"choice\",\n" +
+            "  \"stem\" : \"一次测试\",\n" +
+            "  \"options\" : {\n" +
+            "    \"A\" : \"2^k-1 >= n + k\",\n" +
+            "    \"B\" : \"2n-1 <= n + k\",\n" +
+            "    \"C\" : \"n = k\",\n" +
+            "    \"D\" : \"n-1 <= k\"\n" +
+            "  },\n" +
+            "  \"answer\" : \"A\",\n" +
+            "  \"key_points\" : \"空\",\n" +
+            "  \"analysis\" : \"这里是分析\",\n" +
+            "  \"tags\" : null,\n" +
+            "  \"knowledgeId\" : [ \"CF.CQ\" ],\n" +
+            "  \"id\" : \"uuidtestuuidtestuuidtestuuidtestuuidtestuuidtestuuidtest\"\n" +
+            "}";
+
+
+    @Test
+    public void test02_PostQuestion() throws Exception {
+        Request request=new Request(HttpMethod.POST,"/api/question");
+        final Map map = mapper.readValue(json, Map.class);
+        request.setRequest(map);
+        Map ret = request.execute(Map.class);
+        System.out.println(request.OutToString(
+                "PostQuestion:新增问题,需要提供id"
+        ));
+    }
+    @Test
+    public void test03_PutQuestion() throws Exception {
+        Request request=new Request(HttpMethod.PUT,"/api/question/{id}");
+        final Map map = mapper.readValue(json, Map.class);
+        request.put("id",map.get("id"));
+        map.put("analysis","这里新的分析");
+        request.setRequest(map);
+        Map ret = request.execute(Map.class);
+        System.out.println(request.OutToString(
+                "PutQuestion:更改问题,需要提供id"
+        ));
+    }
+    @Test
+    public void test04_GetQuestion() throws Exception {
+        Request request=new Request(HttpMethod.GET,"/api/question/{id}");
+        request.put("id","9");
+        QuestionDO forObject = request.execute(QuestionDO.class);
+        System.out.println(request.OutToString(
+                "GetQuestion:查询问题,需要提供id"
+        ));
+    }
+    @Test
+    public void test05_DeleteQuestion() throws Exception {
+        Request request=new Request(HttpMethod.DELETE,"/api/question/{id}");
+        final Map map = mapper.readValue(json, Map.class);
+        request.put("id",map.get("id"));
+        Map forObject = request.execute(Map.class);
+        System.out.println(request.OutToString(
+                "DeleteQuestion:删除问题,需要提供id"
+        ));
+    }
+
+    @Test
+    public void test06_findByStemLike() throws Exception {
+        Request request=new Request(HttpMethod.GET,"/api/question/search/findByStemLike?content={content}&page={page}&size={size}&sort={sort}");
+        request.put("content","测试");
+        request.put("page",1);
+        request.put("size",1);
+        request.put("sort","lastModified,DESC");
+        Map ret = request.execute(Map.class);
+        System.out.println(request.OutToString(
+                "findByStemLike:根据题干模糊问题,需要提供stem"
+        ));
+    }
+}

+ 30 - 0
src/test/java/com/seec/bok/RandomUtil.java

@@ -0,0 +1,30 @@
+package com.seec.bok;
+
+public class RandomUtil {
+    private static final String CHARMODE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+    private static final String NUMBERMODE="0123456789";
+
+    public static String getRandomString(int length){
+        StringBuilder ret= new StringBuilder();
+        for(int i=0;i<length;++i){
+            ret.append(CHARMODE.charAt((int) (Math.random() * CHARMODE.length())));
+        }
+        return ret.toString();
+    }
+    public static String getRandomNumber(int length){
+        StringBuilder ret= new StringBuilder();
+        for(int i=0;i<length;++i){
+            ret.append(NUMBERMODE.charAt((int) (Math.random() * NUMBERMODE.length())));
+        }
+        return ret.toString();
+    }
+
+    public static String getRandomNumberAndCharacter(int length){
+        StringBuilder ret= new StringBuilder();
+        String numberAndCharacter=CHARMODE+NUMBERMODE;
+        for(int i=0;i<length;++i){
+            ret.append(numberAndCharacter.charAt((int) (Math.random() * numberAndCharacter.length())));
+        }
+        return ret.toString();
+    }
+}

+ 76 - 0
src/test/java/com/seec/bok/util/Request.java

@@ -0,0 +1,76 @@
+package com.seec.bok.util;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.Builder;
+import lombok.Data;
+import lombok.Setter;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.http.HttpMethod;
+import org.springframework.web.client.HttpMessageConverterExtractor;
+import org.springframework.web.client.RequestCallback;
+import org.springframework.web.client.RestTemplate;
+
+import javax.validation.constraints.NotNull;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Request {
+
+    public static int PORT;
+    private static ObjectMapper mapper = new ObjectMapper();
+    @LocalServerPort
+    public void setRandomServerPort(int randomServerPort) {
+        PORT = randomServerPort;
+    }
+
+    private static RestTemplate RESTTEMPLATE  = new RestTemplate();;
+    @NotNull
+    HttpMethod requestMethod;
+    @NotNull
+    String url;
+    @NotNull
+    String path;
+    @Setter
+    Object request;
+    Map<String,Object> urlVariables;
+
+    Object resDemo;
+    public Request(@NotNull HttpMethod requestMethod, @NotNull String path) {
+        this.requestMethod = requestMethod;
+        this.url = "http://localhost:" + PORT +path;
+        this.path=path;
+        urlVariables=new HashMap<>();
+    }
+
+    public Object put(String key, Object value) {
+        return urlVariables.put(key, value);
+    }
+
+    public<T> T execute(Class<T> retType){
+        RequestCallback requestCallback;
+        if(request==null){
+            requestCallback = RESTTEMPLATE.acceptHeaderRequestCallback(retType);
+        }else {
+            requestCallback = RESTTEMPLATE.httpEntityCallback(request, retType);
+        }
+        HttpMessageConverterExtractor<T> responseExtractor =
+                new HttpMessageConverterExtractor<T>(retType, RESTTEMPLATE.getMessageConverters());
+        T ret= RESTTEMPLATE.execute(url,requestMethod,requestCallback,responseExtractor,urlVariables);
+        resDemo=ret;
+        return ret;
+    }
+
+
+    public String OutToString(String methodMessage) throws JsonProcessingException {
+        return "\n### Request \n" +methodMessage+
+                "\n#### requestMethod \n" + requestMethod +
+                "\n#### url \n" + url +
+                "\n#### path \n" + path  +
+                "\n#### urlVariables \n" + mapper.writeValueAsString(urlVariables) +
+                "\n#### reqBodyDemo \n``` json\n" + mapper.writeValueAsString(request) +
+                "\n```" +
+                "\n#### resBodyDemo \n``` json\n" + mapper.writeValueAsString(resDemo)+
+                "\n```";
+    }
+}

+ 41 - 0
src/test/java/com/seec/bok/util/TestUtil.java

@@ -0,0 +1,41 @@
+package com.seec.bok.util;
+import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.web.client.RestClientException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class TestUtil {
+    private TestRestTemplate restTemplate;
+    private int port;
+
+
+    public TestUtil(TestRestTemplate restTemplate, int port) {
+        this.restTemplate = restTemplate;
+        this.port = port;
+    }
+
+    public static String URL(int port,String path,Map<String, ?> urlVariables){
+        StringBuilder parameters= new StringBuilder("?");
+        for(String paraName:urlVariables.keySet()){
+            parameters.append(paraName).append("={").append(paraName).append("}&");
+        }
+        if(!parameters.toString().equals("?")){
+            parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1));
+        }
+        return "http://localhost:" + port +path+parameters;
+    }
+
+    public <T> T getForObject(String path, Class<T> responseType, Map<String, String> urlVariables) throws RestClientException {
+        String url=URL(port,path,urlVariables);
+        return restTemplate.getForObject(url, responseType, urlVariables);
+    }
+    public String getForString(String path, Map<String, String> urlVariables) throws RestClientException {
+        return getForObject(path,String.class,urlVariables);
+    }
+
+    public <T> T postForObject(String path, Object request, Class<T> responseType, Map<String, ?> urlVariables) throws RestClientException {
+        String url=URL(port,path,urlVariables);
+        return restTemplate.postForObject(url,request, responseType, urlVariables);
+    }
+}

Some files were not shown because too many files changed in this diff