Quellcode durchsuchen

Merge branch 'develop' into dev/triage20200319_shaoyifu

gaodm vor 5 Jahren
Ursprung
Commit
17227f2782
67 geänderte Dateien mit 93480 neuen und 5 gelöschten Zeilen
  1. 2 1
      common/src/main/java/com/diagbot/enums/SysTypeEnum.java
  2. 6 1
      config-server/src/main/resources/shared/gateway-service-dev.yml
  3. 6 1
      config-server/src/main/resources/shared/gateway-service-local.yml
  4. 6 0
      config-server/src/main/resources/shared/gateway-service-pre.yml
  5. 6 1
      config-server/src/main/resources/shared/gateway-service-pro.yml
  6. 6 1
      config-server/src/main/resources/shared/gateway-service-test.yml
  7. 49 0
      config-server/src/main/resources/shared/ltkg-service-dev.yml
  8. 49 0
      config-server/src/main/resources/shared/ltkg-service-local.yml
  9. 49 0
      config-server/src/main/resources/shared/ltkg-service-pre.yml
  10. 49 0
      config-server/src/main/resources/shared/ltkg-service-pro.yml
  11. 49 0
      config-server/src/main/resources/shared/ltkg-service-test.yml
  12. 25 0
      ltkg-service/.gitignore
  13. 180 0
      ltkg-service/pom.xml
  14. 38 0
      ltkg-service/src/main/java/com/diagbot/LtkgServiceApplication.java
  15. 41 0
      ltkg-service/src/main/java/com/diagbot/aop/SysLoggerAspect.java
  16. 34 0
      ltkg-service/src/main/java/com/diagbot/config/CacheConfigurer.java
  17. 19 0
      ltkg-service/src/main/java/com/diagbot/config/CustomAccessTokenConverter.java
  18. 15 0
      ltkg-service/src/main/java/com/diagbot/config/GlobalMethodSecurityConfigurer.java
  19. 48 0
      ltkg-service/src/main/java/com/diagbot/config/JwtConfigurer.java
  20. 42 0
      ltkg-service/src/main/java/com/diagbot/config/ResourceServerConfigurer.java
  21. 70 0
      ltkg-service/src/main/java/com/diagbot/config/SwaggerConfigurer.java
  22. 81 0
      ltkg-service/src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java
  23. 29 0
      ltkg-service/src/main/java/com/diagbot/config/security/UrlConfigAttribute.java
  24. 79 0
      ltkg-service/src/main/java/com/diagbot/config/security/UrlFilterSecurityInterceptor.java
  25. 40 0
      ltkg-service/src/main/java/com/diagbot/config/security/UrlMetadataSourceService.java
  26. 16 0
      ltkg-service/src/main/java/com/diagbot/dto/BaseNodeDTO.java
  27. 18 0
      ltkg-service/src/main/java/com/diagbot/dto/BaseNodeRSDTO.java
  28. 19 0
      ltkg-service/src/main/java/com/diagbot/dto/CategorieDTO.java
  29. 22 0
      ltkg-service/src/main/java/com/diagbot/dto/Categories.java
  30. 29 0
      ltkg-service/src/main/java/com/diagbot/dto/GNodeDTO.java
  31. 16 0
      ltkg-service/src/main/java/com/diagbot/dto/GraDTO.java
  32. 17 0
      ltkg-service/src/main/java/com/diagbot/dto/GraphDTO.java
  33. 19 0
      ltkg-service/src/main/java/com/diagbot/dto/GraphLabelDTO.java
  34. 24 0
      ltkg-service/src/main/java/com/diagbot/dto/Link.java
  35. 23 0
      ltkg-service/src/main/java/com/diagbot/dto/LinkDTO.java
  36. 15 0
      ltkg-service/src/main/java/com/diagbot/dto/NextNodeDTO.java
  37. 28 0
      ltkg-service/src/main/java/com/diagbot/dto/Node.java
  38. 15 0
      ltkg-service/src/main/java/com/diagbot/dto/NodeDTO.java
  39. 16 0
      ltkg-service/src/main/java/com/diagbot/dto/NodeLabelsDTO.java
  40. 18 0
      ltkg-service/src/main/java/com/diagbot/dto/RelationNodesDTO.java
  41. 19 0
      ltkg-service/src/main/java/com/diagbot/dto/SchemaDTO.java
  42. 18 0
      ltkg-service/src/main/java/com/diagbot/dto/Tree.java
  43. 17 0
      ltkg-service/src/main/java/com/diagbot/dto/TreeDTO.java
  44. 73 0
      ltkg-service/src/main/java/com/diagbot/dto/TreeNodeDTO.java
  45. 16 0
      ltkg-service/src/main/java/com/diagbot/dto/Tu.java
  46. 81 0
      ltkg-service/src/main/java/com/diagbot/exception/CommonExceptionHandler.java
  47. 39 0
      ltkg-service/src/main/java/com/diagbot/exception/ServiceErrorCode.java
  48. 268 0
      ltkg-service/src/main/java/com/diagbot/facade/KgFacade.java
  49. 35 0
      ltkg-service/src/main/java/com/diagbot/mapper/KgMapper.java
  50. 23 0
      ltkg-service/src/main/java/com/diagbot/rabbit/MyProcessor.java
  51. 27 0
      ltkg-service/src/main/java/com/diagbot/rabbit/MySender.java
  52. 33 0
      ltkg-service/src/main/java/com/diagbot/service/KgService.java
  53. 62 0
      ltkg-service/src/main/java/com/diagbot/service/impl/KgServiceImpl.java
  54. 23 0
      ltkg-service/src/main/java/com/diagbot/vo/KgQueryVO.java
  55. 23 0
      ltkg-service/src/main/java/com/diagbot/vo/KgTreeVO.java
  56. 23 0
      ltkg-service/src/main/java/com/diagbot/vo/SchemaVO.java
  57. 93 0
      ltkg-service/src/main/java/com/diagbot/web/KgController.java
  58. 19 0
      ltkg-service/src/main/resources/bootstrap.yml
  59. 306 0
      ltkg-service/src/main/resources/logback-spring.xml
  60. 68 0
      ltkg-service/src/main/resources/mapper/KgMapper.xml
  61. 9 0
      ltkg-service/src/main/resources/public.cert
  62. 443 0
      ltkg-service/src/main/resources/static/index.html
  63. 90347 0
      ltkg-service/src/main/resources/static/js/echarts.js
  64. 2 0
      ltkg-service/src/main/resources/static/js/jquery-1.8.3.min.js
  65. 83 0
      ltkg-service/src/test/java/com/diagbot/CodeGeneration.java
  66. 16 0
      ltkg-service/src/test/java/com/diagbot/LtkgServiceApplicationTests.java
  67. 1 0
      pom.xml

+ 2 - 1
common/src/main/java/com/diagbot/enums/SysTypeEnum.java

@@ -30,7 +30,8 @@ public enum SysTypeEnum implements KeyedNamed {
     PREC_SERVICE(17, "prec-service"),
     PRECMAN_SERVICE(18, "precman-service"),
     MRQCMAN_SERVICE(19, "mrqcman-service"),
-    MRMAN_SERVICE(20, "mrman-service");
+    MRMAN_SERVICE(20, "mrman-service"),
+    LTKG_SERVICE(30, "ltkg-service");
 
     @Setter
     private int key;

+ 6 - 1
config-server/src/main/resources/shared/gateway-service-dev.yml

@@ -164,7 +164,6 @@ spring:
         predicates:
         - Path=/api/mrqcman/**
         filters:
-        #        - SwaggerHeaderFilter
         - StripPrefix=2
       - id: mrman-service
         uri: lb://mrman-service
@@ -172,6 +171,12 @@ spring:
         - Path=/api/mrman/**
         filters:
         - StripPrefix=2
+      - id: ltkg-service
+        uri: lb://ltkg-service
+        predicates:
+        - Path=/api/ltkg/**
+        filters:
+        - StripPrefix=2
 
 server:
   port: 5050

+ 6 - 1
config-server/src/main/resources/shared/gateway-service-local.yml

@@ -164,7 +164,6 @@ spring:
         predicates:
         - Path=/api/mrqcman/**
         filters:
-        #        - SwaggerHeaderFilter
         - StripPrefix=2
       - id: mrman-service
         uri: lb://mrman-service
@@ -172,6 +171,12 @@ spring:
         - Path=/api/mrman/**
         filters:
         - StripPrefix=2
+      - id: ltkg-service
+        uri: lb://ltkg-service
+        predicates:
+        - Path=/api/ltkg/**
+        filters:
+        - StripPrefix=2
 
 server:
   port: 5050

+ 6 - 0
config-server/src/main/resources/shared/gateway-service-pre.yml

@@ -181,6 +181,12 @@ spring:
         - Path=/api/mrman/**
         filters:
         - StripPrefix=2
+      - id: ltkg-service
+        uri: lb://ltkg-service
+        predicates:
+        - Path=/api/ltkg/**
+        filters:
+        - StripPrefix=2
 
 server:
   port: 5050

+ 6 - 1
config-server/src/main/resources/shared/gateway-service-pro.yml

@@ -164,7 +164,6 @@ spring:
         predicates:
         - Path=/api/mrqcman/**
         filters:
-        #        - SwaggerHeaderFilter
         - StripPrefix=2
       - id: mrman-service
         uri: lb://mrman-service
@@ -172,6 +171,12 @@ spring:
         - Path=/api/mrman/**
         filters:
         - StripPrefix=2
+      - id: ltkg-service
+        uri: lb://ltkg-service
+        predicates:
+        - Path=/api/ltkg/**
+        filters:
+        - StripPrefix=2
 
 server:
   port: 5050

+ 6 - 1
config-server/src/main/resources/shared/gateway-service-test.yml

@@ -164,7 +164,6 @@ spring:
         predicates:
         - Path=/api/mrqcman/**
         filters:
-        #        - SwaggerHeaderFilter
         - StripPrefix=2
       - id: mrman-service
         uri: lb://mrman-service
@@ -172,6 +171,12 @@ spring:
         - Path=/api/mrman/**
         filters:
         - StripPrefix=2
+      - id: ltkg-service
+        uri: lb://ltkg-service
+        predicates:
+        - Path=/api/ltkg/**
+        filters:
+        - StripPrefix=2
 
 server:
   port: 5050

+ 49 - 0
config-server/src/main/resources/shared/ltkg-service-dev.yml

@@ -0,0 +1,49 @@
+server:
+  port: 8775
+
+# 驱动配置信息
+spring:
+  profiles:
+    active: local
+  datasource:
+    driver-class-name: org.neo4j.jdbc.Driver
+    url: jdbc:neo4j:http://192.168.3.150:7474
+    username: neo4j
+    password: 12345678
+    #定义初始连接数
+    initialSize: 0
+    #定义最大连接数
+    maxActive: 20
+    #定义最大空闲
+    maxIdle: 20
+    #定义最小空闲
+    minIdle: 1
+    #定义最长等待时间
+    maxWait: 60000
+
+  cloud:
+    stream:
+      bindings:
+        outputLog:
+          destination: myLog
+  #          contentType: text/plain      # 实体 json string 在传递的类型装换 查看 http://docs.spring
+
+  #mq
+  rabbitmq:
+    host: 192.168.2.236
+    port: 5672
+    username: lantone
+    password: lantone
+    publisher-confirms: true
+    virtual-host: /
+
+  # 配置缓存,初始缓存容量,最大容量
+  cache:
+    type: caffeine
+    caffeine:
+      spec: initialCapacity=10,maximumSize=200
+
+#mybatis
+mybatis:
+  type-aliases-package: com.diagbot.entity
+  mapper-locations: classpath:mapper/**/*.xml

+ 49 - 0
config-server/src/main/resources/shared/ltkg-service-local.yml

@@ -0,0 +1,49 @@
+server:
+  port: 8775
+
+# 驱动配置信息
+spring:
+  profiles:
+    active: local
+  datasource:
+    driver-class-name: org.neo4j.jdbc.Driver
+    url: jdbc:neo4j:http://192.168.3.150:7474
+    username: neo4j
+    password: 12345678
+    #定义初始连接数
+    initialSize: 0
+    #定义最大连接数
+    maxActive: 20
+    #定义最大空闲
+    maxIdle: 20
+    #定义最小空闲
+    minIdle: 1
+    #定义最长等待时间
+    maxWait: 60000
+
+  cloud:
+    stream:
+      bindings:
+        outputLog:
+          destination: myLog
+  #          contentType: text/plain      # 实体 json string 在传递的类型装换 查看 http://docs.spring
+
+  #mq
+  rabbitmq:
+    host: localhost
+    port: 5672
+    username: guest
+    password: guest
+    publisher-confirms: true
+    virtual-host: /
+
+  # 配置缓存,初始缓存容量,最大容量
+  cache:
+    type: caffeine
+    caffeine:
+      spec: initialCapacity=10,maximumSize=200
+
+#mybatis
+mybatis:
+  type-aliases-package: com.diagbot.entity
+  mapper-locations: classpath:mapper/**/*.xml

+ 49 - 0
config-server/src/main/resources/shared/ltkg-service-pre.yml

@@ -0,0 +1,49 @@
+server:
+  port: 8775
+
+# 驱动配置信息
+spring:
+  profiles:
+    active: local
+  datasource:
+    driver-class-name: org.neo4j.jdbc.Driver
+    url: jdbc:neo4j:http://192.168.3.150:7474
+    username: neo4j
+    password: 12345678
+    #定义初始连接数
+    initialSize: 0
+    #定义最大连接数
+    maxActive: 20
+    #定义最大空闲
+    maxIdle: 20
+    #定义最小空闲
+    minIdle: 1
+    #定义最长等待时间
+    maxWait: 60000
+
+  cloud:
+    stream:
+      bindings:
+        outputLog:
+          destination: myLog
+  #          contentType: text/plain      # 实体 json string 在传递的类型装换 查看 http://docs.spring
+
+  #mq
+  rabbitmq:
+    host: 192.168.2.121
+    port: 5672
+    username: lantone
+    password: lantone
+    publisher-confirms: true
+    virtual-host: /
+
+  # 配置缓存,初始缓存容量,最大容量
+  cache:
+    type: caffeine
+    caffeine:
+      spec: initialCapacity=10,maximumSize=200
+
+#mybatis
+mybatis:
+  type-aliases-package: com.diagbot.entity
+  mapper-locations: classpath:mapper/**/*.xml

+ 49 - 0
config-server/src/main/resources/shared/ltkg-service-pro.yml

@@ -0,0 +1,49 @@
+server:
+  port: 8775
+
+# 驱动配置信息
+spring:
+  profiles:
+    active: local
+  datasource:
+    driver-class-name: org.neo4j.jdbc.Driver
+    url: jdbc:neo4j:http://192.168.3.150:7474
+    username: neo4j
+    password: 12345678
+    #定义初始连接数
+    initialSize: 0
+    #定义最大连接数
+    maxActive: 20
+    #定义最大空闲
+    maxIdle: 20
+    #定义最小空闲
+    minIdle: 1
+    #定义最长等待时间
+    maxWait: 60000
+
+  cloud:
+    stream:
+      bindings:
+        outputLog:
+          destination: myLog
+  #          contentType: text/plain      # 实体 json string 在传递的类型装换 查看 http://docs.spring
+
+  #mq
+  rabbitmq:
+    host: 192.168.2.122
+    port: 5672
+    username: lantone
+    password: lantone
+    publisher-confirms: true
+    virtual-host: /
+
+  # 配置缓存,初始缓存容量,最大容量
+  cache:
+    type: caffeine
+    caffeine:
+      spec: initialCapacity=10,maximumSize=200
+
+#mybatis
+mybatis:
+  type-aliases-package: com.diagbot.entity
+  mapper-locations: classpath:mapper/**/*.xml

+ 49 - 0
config-server/src/main/resources/shared/ltkg-service-test.yml

@@ -0,0 +1,49 @@
+server:
+  port: 8775
+
+# 驱动配置信息
+spring:
+  profiles:
+    active: local
+  datasource:
+    driver-class-name: org.neo4j.jdbc.Driver
+    url: jdbc:neo4j:http://192.168.3.150:7474
+    username: neo4j
+    password: 12345678
+    #定义初始连接数
+    initialSize: 0
+    #定义最大连接数
+    maxActive: 20
+    #定义最大空闲
+    maxIdle: 20
+    #定义最小空闲
+    minIdle: 1
+    #定义最长等待时间
+    maxWait: 60000
+
+  cloud:
+    stream:
+      bindings:
+        outputLog:
+          destination: myLog
+  #          contentType: text/plain      # 实体 json string 在传递的类型装换 查看 http://docs.spring
+
+  #mq
+  rabbitmq:
+    host: 192.168.2.241
+    port: 5672
+    username: lantone
+    password: lantone
+    publisher-confirms: true
+    virtual-host: /
+
+  # 配置缓存,初始缓存容量,最大容量
+  cache:
+    type: caffeine
+    caffeine:
+      spec: initialCapacity=10,maximumSize=200
+
+#mybatis
+mybatis:
+  type-aliases-package: com.diagbot.entity
+  mapper-locations: classpath:mapper/**/*.xml

+ 25 - 0
ltkg-service/.gitignore

@@ -0,0 +1,25 @@
+/target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/

+ 180 - 0
ltkg-service/pom.xml

@@ -0,0 +1,180 @@
+<?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>
+
+    <groupId>com.diagbot</groupId>
+    <artifactId>ltkg-service</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>ltkg-service</name>
+    <description>朗通知识图谱 service for Spring Boot</description>
+
+    <parent>
+        <groupId>com.diagbot</groupId>
+        <artifactId>diagbotcloud</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.diagbot</groupId>
+            <artifactId>common</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+        </dependency>
+
+        <!-- 配置-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-config</artifactId>
+        </dependency>
+
+        <!-- 开启web-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
+        </dependency>
+
+        <!-- 开启feign-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+        <!-- dashboard -->
+        <!-- actuator-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <!--hystrix-dashboard-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
+        </dependency>
+        <!--hystrix -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
+        </dependency>
+
+        <!-- zipkin-->
+        <!--<dependency>-->
+            <!--<groupId>org.springframework.cloud</groupId>-->
+            <!--<artifactId>spring-cloud-starter-zipkin</artifactId>-->
+        <!--</dependency>-->
+
+        <!--swagger-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+        </dependency>
+        <!--database-->
+        <dependency>
+            <groupId>org.neo4j</groupId>
+            <artifactId>neo4j-jdbc-driver</artifactId>
+            <version>3.4.0</version>
+        </dependency>
+        <!--security-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-oauth2</artifactId>
+        </dependency>
+
+        <!-- mq -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>net.logstash.logback</groupId>
+            <artifactId>logstash-logback-encoder</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
+        </dependency>
+
+
+        <!-- springboot整合mybatis(核心就这一个) -->
+        <!-- 注意顺序,这个一定要放在最下面 -->
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-cache</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <!-- 添加docker-maven插件 -->
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>docker-maven-plugin</artifactId>
+                <configuration>
+                    <imageName>${docker.image.prefix}/${project.artifactId}:${project.version}</imageName>
+                    <forceTags>true</forceTags>
+                    <!--镜像的FROM,使用压缩的小镜像-->
+                    <baseImage>frolvlad/alpine-oraclejre8:slim</baseImage>
+                    <entryPoint>["java", "-jar", "-Xms256m", "-Xmx1024m", "-Duser.timezone=GMT+8", "/${project.build.finalName}.jar"]</entryPoint>
+                    <resources>
+                        <resource>
+                            <targetPath>/</targetPath>
+                            <directory>${project.build.directory}</directory>
+                            <include>${project.build.finalName}.jar</include>
+                        </resource>
+                    </resources>
+                    <serverId>docker-registry</serverId>
+                    <registryUrl>${registryUrl}</registryUrl>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 38 - 0
ltkg-service/src/main/java/com/diagbot/LtkgServiceApplication.java

@@ -0,0 +1,38 @@
+package com.diagbot;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
+import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration;
+import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
+import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.cloud.netflix.hystrix.EnableHystrix;
+import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+/**
+ * @Description: 互动反馈启动文件
+ * @author: gaodm
+ * @time: 2018/8/7 9:26
+ */
+@SpringBootApplication(exclude = { HibernateJpaAutoConfiguration.class,
+        JmxAutoConfiguration.class, ThymeleafAutoConfiguration.class })
+@EnableEurekaClient
+@EnableFeignClients({ "com.diagbot.client" })
+@EnableHystrixDashboard
+@EnableHystrix
+@EnableCircuitBreaker
+@RefreshScope
+@ConfigurationPropertiesScan
+@MapperScan("com.diagbot.mapper")
+public class LtkgServiceApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(LtkgServiceApplication.class, args);
+    }
+}

+ 41 - 0
ltkg-service/src/main/java/com/diagbot/aop/SysLoggerAspect.java

@@ -0,0 +1,41 @@
+package com.diagbot.aop;
+
+import com.diagbot.biz.log.entity.SysLog;
+import com.diagbot.enums.SysTypeEnum;
+import com.diagbot.rabbit.MySender;
+import com.diagbot.util.AopUtil;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 日志拦截切面
+ * @author: gaodm
+ * @time: 2018/8/2 13:36
+ */
+@Aspect
+@Component
+@ConditionalOnProperty(prefix = "syslog", value = { "enable" }, havingValue = "true")
+public class SysLoggerAspect {
+    @Autowired
+    private MySender mySender;
+
+    @Pointcut("@annotation(com.diagbot.annotation.SysLogger)")
+    public void loggerPointCut() {
+
+    }
+
+    @Before("loggerPointCut()")
+    public void saveSysLog(JoinPoint joinPoint) {
+        //入参设置
+        SysLog sysLog = AopUtil.sysLoggerAspect(joinPoint, SysTypeEnum.LTKG_SERVICE.getKey());
+        //保存系统日志
+        mySender.outputLogSend(sysLog);
+    }
+
+}
+

+ 34 - 0
ltkg-service/src/main/java/com/diagbot/config/CacheConfigurer.java

@@ -0,0 +1,34 @@
+package com.diagbot.config;
+
+import com.github.benmanes.caffeine.cache.CacheLoader;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@EnableCaching
+public class CacheConfigurer {
+    /**
+     * 必须要指定这个Bean,refreshAfterWrite=xs这个配置属性才生效
+     *
+     * @return
+     */
+    @Bean
+    public CacheLoader<Object, Object> cacheLoader() {
+        CacheLoader<Object, Object> cacheLoader = new CacheLoader<Object, Object>() {
+
+            @Override
+            public Object load(Object key) throws Exception {
+                return null;
+            }
+
+            // 重写这个方法将oldValue值返回回去,进而刷新缓存
+            @Override
+            public Object reload(Object key, Object oldValue) throws Exception {
+                return oldValue;
+            }
+        };
+
+        return cacheLoader;
+    }
+}

+ 19 - 0
ltkg-service/src/main/java/com/diagbot/config/CustomAccessTokenConverter.java

@@ -0,0 +1,19 @@
+package com.diagbot.config;
+
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
+import org.springframework.security.oauth2.provider.token.DefaultAccessTokenConverter;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+@Component
+public class CustomAccessTokenConverter extends DefaultAccessTokenConverter {
+
+    @Override
+    public OAuth2Authentication extractAuthentication(Map<String, ?> claims) {
+        OAuth2Authentication authentication = super.extractAuthentication(claims);
+        authentication.setDetails(claims);
+        return authentication;
+    }
+
+}

+ 15 - 0
ltkg-service/src/main/java/com/diagbot/config/GlobalMethodSecurityConfigurer.java

@@ -0,0 +1,15 @@
+package com.diagbot.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+
+/**
+ * @Description: 安全配置类
+ * @author: gaodm
+ * @time: 2018/8/2 13:38
+ */
+@Configuration
+@EnableGlobalMethodSecurity(prePostEnabled = true)
+public class GlobalMethodSecurityConfigurer {
+
+}

+ 48 - 0
ltkg-service/src/main/java/com/diagbot/config/JwtConfigurer.java

@@ -0,0 +1,48 @@
+package com.diagbot.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.security.oauth2.provider.token.TokenStore;
+import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
+import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;
+import org.springframework.util.FileCopyUtils;
+
+import java.io.IOException;
+
+/**
+ * @Description: JWT配置类
+ * @author: gaodm
+ * @time: 2018/8/2 13:38
+ */
+@Configuration
+public class JwtConfigurer {
+    @Autowired
+    private CustomAccessTokenConverter customAccessTokenConverter;
+
+    @Bean
+    @Qualifier("tokenStore")
+    public TokenStore tokenStore() {
+
+        System.out.println("Created JwtTokenStore");
+        return new JwtTokenStore(jwtTokenEnhancer());
+    }
+
+    @Bean
+    protected JwtAccessTokenConverter jwtTokenEnhancer() {
+        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
+        Resource resource = new ClassPathResource("public.cert");
+        String publicKey;
+        try {
+            publicKey = new String(FileCopyUtils.copyToByteArray(resource.getInputStream()));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        converter.setVerifierKey(publicKey);
+        converter.setAccessTokenConverter(customAccessTokenConverter);
+        return converter;
+    }
+}

+ 42 - 0
ltkg-service/src/main/java/com/diagbot/config/ResourceServerConfigurer.java

@@ -0,0 +1,42 @@
+package com.diagbot.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
+import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
+import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
+import org.springframework.security.oauth2.provider.token.TokenStore;
+
+/**
+ * @Description: 权限资源配置类
+ * @author: gaodm
+ * @time: 2018/8/2 14:21
+ */
+@Configuration
+@EnableResourceServer
+public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
+    Logger log = LoggerFactory.getLogger(ResourceServerConfigurer.class);
+
+    @Override
+    public void configure(HttpSecurity http) throws Exception {
+        http
+                .csrf().disable()
+                .authorizeRequests()
+                .regexMatchers(".*swagger.*", ".*v2.*", ".*webjars.*", "/druid.*", "/actuator.*", "/hystrix.*").permitAll()
+//                .antMatchers("/**").authenticated();
+                .antMatchers("/**").permitAll();
+    }
+
+
+    @Override
+    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
+        log.info("Configuring ResourceServerSecurityConfigurer ");
+        resources.resourceId("user-service").tokenStore(tokenStore);
+    }
+
+    @Autowired
+    TokenStore tokenStore;
+}

+ 70 - 0
ltkg-service/src/main/java/com/diagbot/config/SwaggerConfigurer.java

@@ -0,0 +1,70 @@
+package com.diagbot.config;
+
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.ParameterBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.service.Parameter;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @Description: Swagger配置类
+ * @author: gaodm
+ * @time: 2018/8/2 14:21
+ */
+@Configuration
+@ConditionalOnProperty(prefix = "swagger", value = { "enable" }, havingValue = "true")
+@EnableSwagger2
+public class SwaggerConfigurer {
+    /**
+     * 全局参数
+     *
+     * @return
+     */
+    private List<Parameter> parameter() {
+        List<Parameter> params = new ArrayList<>();
+//        params.add(new ParameterBuilder().name("Authorization")
+//                .description("Authorization Bearer token")
+//                .modelRef(new ModelRef("string"))
+//                .parameterType("header")
+//                .required(false).build());
+        return params;
+    }
+
+
+    @Bean
+    public Docket sysApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.diagbot.web"))
+                .paths(PathSelectors.any())
+                .build().globalOperationParameters(parameter());
+        //.securitySchemes(newArrayList(oauth()))
+        // .securityContexts(newArrayList(securityContext()));
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title(" ltkg-service api ")
+                .description("朗通知识图谱 微服务")
+                .termsOfServiceUrl("")
+                .contact(new Contact("diagbot","",""))
+                .version("1.0")
+                .build();
+    }
+
+}

+ 81 - 0
ltkg-service/src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java

@@ -0,0 +1,81 @@
+package com.diagbot.config.security;
+
+import org.springframework.security.access.AccessDecisionManager;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.access.ConfigAttribute;
+import org.springframework.security.authentication.InsufficientAuthenticationException;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.web.FilterInvocation;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Collection;
+
+
+/**
+ * @Description: 自定义权限拦截
+ * @author: gaodm
+ * @time: 2018/8/23 13:46
+ */
+@Service
+public class UrlAccessDecisionManager implements AccessDecisionManager {
+    @Override
+    public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException {
+//        HttpServletRequest request = ((FilterInvocation) object).getHttpRequest();
+//        String url, method;
+//        if (matchPermitAllUrl(request)) {
+//            return;
+//        }
+//        if ("anonymousUser".equals(authentication.getPrincipal())) {
+//            throw new AccessDeniedException("no right");
+//        } else {
+//            for (GrantedAuthority ga : authentication.getAuthorities()) {
+//                String[] authority = ga.getAuthority().split(";");
+//                url = authority[0];
+//                method = authority[1];
+//                if (matchers(url, request)) {
+//                    if (method.equals(request.getMethod()) || "ALL".equals(method)) {
+//                        return;
+//                    }
+//                }
+//            }
+//        }
+//        throw new AccessDeniedException("no right");
+    }
+
+
+    @Override
+    public boolean supports(ConfigAttribute attribute) {
+        return true;
+    }
+
+    @Override
+    public boolean supports(Class<?> clazz) {
+        return true;
+    }
+
+    private Boolean matchPermitAllUrl(HttpServletRequest request){
+        if (matchers("/swagger/**", request)
+                || matchers("/v2/**", request)
+                || matchers("/swagger-ui.html/**", request)
+                || matchers("/swagger-resources/**", request)
+                || matchers("/webjars/**", request)
+                || matchers("/druid/**", request)
+                || matchers("/actuator/**", request)
+                || matchers("/hystrix/**", request)
+                || matchers("/", request)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean matchers(String url, HttpServletRequest request) {
+        AntPathRequestMatcher matcher = new AntPathRequestMatcher(url);
+        if (matcher.matches(request)) {
+            return true;
+        }
+        return false;
+    }
+}

+ 29 - 0
ltkg-service/src/main/java/com/diagbot/config/security/UrlConfigAttribute.java

@@ -0,0 +1,29 @@
+package com.diagbot.config.security;
+
+import org.springframework.security.access.ConfigAttribute;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @Description: 自定义权限拦截
+ * @author: gaodm
+ * @time: 2018/8/23 13:47
+ */
+public class UrlConfigAttribute implements ConfigAttribute {
+
+    private final HttpServletRequest httpServletRequest;
+
+    public UrlConfigAttribute(HttpServletRequest httpServletRequest) {
+        this.httpServletRequest = httpServletRequest;
+    }
+
+
+    @Override
+    public String getAttribute() {
+        return null;
+    }
+
+    public HttpServletRequest getHttpServletRequest() {
+        return httpServletRequest;
+    }
+}

+ 79 - 0
ltkg-service/src/main/java/com/diagbot/config/security/UrlFilterSecurityInterceptor.java

@@ -0,0 +1,79 @@
+package com.diagbot.config.security;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.SecurityMetadataSource;
+import org.springframework.security.access.intercept.AbstractSecurityInterceptor;
+import org.springframework.security.access.intercept.InterceptorStatusToken;
+import org.springframework.security.web.FilterInvocation;
+import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import java.io.IOException;
+
+/**
+ * @Description: 自定义权限拦截
+ * @author: gaodm
+ * @time: 2018/8/23 13:47
+ */
+@Service
+public class UrlFilterSecurityInterceptor extends AbstractSecurityInterceptor implements Filter {
+
+
+    @Autowired
+    private FilterInvocationSecurityMetadataSource securityMetadataSource;
+
+    @Autowired
+    public void setUrlAccessDecisionManager(UrlAccessDecisionManager urlAccessDecisionManager) {
+        super.setAccessDecisionManager(urlAccessDecisionManager);
+    }
+
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+
+        FilterInvocation fi = new FilterInvocation(request, response, chain);
+        invoke(fi);
+    }
+
+
+    public void invoke(FilterInvocation fi) throws IOException, ServletException {
+        //fi里面有一个被拦截的url
+        //里面调用UrlMetadataSource的getAttributes(Object object)这个方法获取fi对应的所有权限
+        //再调用UrlAccessDecisionManager的decide方法来校验用户的权限是否足够
+        InterceptorStatusToken token = super.beforeInvocation(fi);
+        try {
+            //执行下一个拦截器
+            fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
+        } finally {
+            super.afterInvocation(token, null);
+        }
+    }
+
+
+    @Override
+    public void destroy() {
+
+    }
+
+    @Override
+    public Class<?> getSecureObjectClass() {
+        return FilterInvocation.class;
+
+    }
+
+    @Override
+    public SecurityMetadataSource obtainSecurityMetadataSource() {
+        return this.securityMetadataSource;
+    }
+}

+ 40 - 0
ltkg-service/src/main/java/com/diagbot/config/security/UrlMetadataSourceService.java

@@ -0,0 +1,40 @@
+package com.diagbot.config.security;
+
+import org.springframework.security.access.ConfigAttribute;
+import org.springframework.security.web.FilterInvocation;
+import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @Description: 自定义权限拦截
+ * @author: gaodm
+ * @time: 2018/8/23 13:47
+ */
+@Service
+public class UrlMetadataSourceService implements
+        FilterInvocationSecurityMetadataSource {
+
+    @Override
+    public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
+        final HttpServletRequest request = ((FilterInvocation) object).getRequest();
+        Set<ConfigAttribute> allAttributes = new HashSet<>();
+        ConfigAttribute configAttribute = new UrlConfigAttribute(request);
+        allAttributes.add(configAttribute);
+        return allAttributes;
+    }
+
+    @Override
+    public Collection<ConfigAttribute> getAllConfigAttributes() {
+        return null;
+    }
+
+    @Override
+    public boolean supports(Class<?> clazz) {
+        return true;
+    }
+}

+ 16 - 0
ltkg-service/src/main/java/com/diagbot/dto/BaseNodeDTO.java

@@ -0,0 +1,16 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/3/16 11:02
+ */
+@Getter
+@Setter
+public class BaseNodeDTO {
+    private String name;
+    private String label;
+}

+ 18 - 0
ltkg-service/src/main/java/com/diagbot/dto/BaseNodeRSDTO.java

@@ -0,0 +1,18 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/3/16 11:02
+ */
+@Getter
+@Setter
+public class BaseNodeRSDTO {
+    private String rType;
+    private List<NextNodeDTO> eNodeDTOS;
+}

+ 19 - 0
ltkg-service/src/main/java/com/diagbot/dto/CategorieDTO.java

@@ -0,0 +1,19 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/3/17 15:08
+ */
+@Getter
+@Setter
+public class CategorieDTO {
+    private String name;
+
+    public CategorieDTO(String name){
+        this.name = name;
+    }
+}

+ 22 - 0
ltkg-service/src/main/java/com/diagbot/dto/Categories.java

@@ -0,0 +1,22 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: zhoutg
+ * @time: 2020/3/16 17:06
+ */
+@Data
+public class Categories {
+    private String name;
+    private String symbol = "circle";
+    private Integer symbolSize = 28;
+
+    public Categories() {
+    }
+
+    public Categories(String name) {
+        this.name = name;
+    }
+}

+ 29 - 0
ltkg-service/src/main/java/com/diagbot/dto/GNodeDTO.java

@@ -0,0 +1,29 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/3/16 10:11
+ */
+@Getter
+@Setter
+public class GNodeDTO {
+    private String type;
+    private Integer category;
+    private String label;
+    private Integer name;
+    private String symbol;
+    private Integer symbolSize;
+
+    public GNodeDTO(String type, Integer category, String label, Integer name, String symbol, Integer symbolSize) {
+        this.type = type;
+        this.category = category;
+        this.label = label;
+        this.name = name;
+        this.symbol = symbol;
+        this.symbolSize = symbolSize;
+    }
+}

+ 16 - 0
ltkg-service/src/main/java/com/diagbot/dto/GraDTO.java

@@ -0,0 +1,16 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+import java.util.List;
+
+/**
+ * @description:
+ * @author: zhoutg
+ * @time: 2020/3/16 17:06
+ */
+@Data
+public class GraDTO {
+    private List<Categories> categoriesList;
+    private List<Node> nodeList;
+    private List<Link> linksList;
+}

+ 17 - 0
ltkg-service/src/main/java/com/diagbot/dto/GraphDTO.java

@@ -0,0 +1,17 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/3/16 10:57
+ */
+@Getter
+@Setter
+public class GraphDTO extends BaseNodeDTO{
+    private List<BaseNodeRSDTO> eNodeRSDTOS;
+}

+ 19 - 0
ltkg-service/src/main/java/com/diagbot/dto/GraphLabelDTO.java

@@ -0,0 +1,19 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/3/16 15:06
+ */
+@Getter
+@Setter
+public class GraphLabelDTO {
+    private List<CategorieDTO> categories;
+    private List<GNodeDTO> node;
+    private List<LinkDTO> links;
+}

+ 24 - 0
ltkg-service/src/main/java/com/diagbot/dto/Link.java

@@ -0,0 +1,24 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: zhoutg
+ * @time: 2020/3/17 9:49
+ */
+@Data
+public class Link {
+    private Long source;
+    private Long target;
+    private String value = "";
+
+    public Link() {
+    }
+
+    public Link(Long source, Long target, String value) {
+        this.source = source;
+        this.target = target;
+        this.value = value;
+    }
+}

+ 23 - 0
ltkg-service/src/main/java/com/diagbot/dto/LinkDTO.java

@@ -0,0 +1,23 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/3/17 15:09
+ */
+@Getter
+@Setter
+public class LinkDTO {
+    private Integer source;
+    private Integer target;
+    private String value;
+
+    public LinkDTO(Integer source, Integer target, String value) {
+        this.source = source;
+        this.target = target;
+        this.value = value;
+    }
+}

+ 15 - 0
ltkg-service/src/main/java/com/diagbot/dto/NextNodeDTO.java

@@ -0,0 +1,15 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/3/16 11:02
+ */
+@Getter
+@Setter
+public class NextNodeDTO extends BaseNodeDTO {
+    private Integer pCount;
+}

+ 28 - 0
ltkg-service/src/main/java/com/diagbot/dto/Node.java

@@ -0,0 +1,28 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: zhoutg
+ * @time: 2020/3/17 9:49
+ */
+@Data
+public class Node {
+    private Integer category; // 所属列
+    private String label = ""; // 显示名称
+    private Long name;  // 主键
+    private String symbol; // 呈现形态,中心节点:默认,关系:diamond,末梢节点如果有扩展,默认类型,无扩展,rect
+    private String type; // 标签类型
+    private Integer symbolSize = 0;
+
+    public Node() {
+    }
+
+    public Node(Integer category, String lalel, Long name, Integer symbolSize) {
+        this.category = category;
+        this.label = lalel;
+        this.name = name;
+        this.symbolSize = symbolSize;
+    }
+}

+ 15 - 0
ltkg-service/src/main/java/com/diagbot/dto/NodeDTO.java

@@ -0,0 +1,15 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/3/16 10:11
+ */
+@Getter
+@Setter
+public class NodeDTO {
+    private String Name;
+}

+ 16 - 0
ltkg-service/src/main/java/com/diagbot/dto/NodeLabelsDTO.java

@@ -0,0 +1,16 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2020-03-16 11:43
+ */
+@Setter
+@Getter
+public class NodeLabelsDTO {
+    private String name;
+
+}

+ 18 - 0
ltkg-service/src/main/java/com/diagbot/dto/RelationNodesDTO.java

@@ -0,0 +1,18 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2020-03-18 17:01
+ */
+@Setter
+@Getter
+public class RelationNodesDTO {
+    private String name;
+    private List<NodeLabelsDTO> children;
+}

+ 19 - 0
ltkg-service/src/main/java/com/diagbot/dto/SchemaDTO.java

@@ -0,0 +1,19 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2020-03-16 11:39
+ */
+@Setter
+@Getter
+public class SchemaDTO {
+    private String name;
+    private List<RelationNodesDTO> children;
+
+}

+ 18 - 0
ltkg-service/src/main/java/com/diagbot/dto/Tree.java

@@ -0,0 +1,18 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/3/18 9:55
+ */
+@Getter
+@Setter
+public class Tree {
+    private String name;
+    private List<Tree> sNode;
+}

+ 17 - 0
ltkg-service/src/main/java/com/diagbot/dto/TreeDTO.java

@@ -0,0 +1,17 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/3/17 9:04
+ */
+@Getter
+@Setter
+public class TreeDTO {
+    private List<TreeNodeDTO> nodes;
+}

+ 73 - 0
ltkg-service/src/main/java/com/diagbot/dto/TreeNodeDTO.java

@@ -0,0 +1,73 @@
+package com.diagbot.dto;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/3/18 9:18
+ */
+public class TreeNodeDTO {
+
+    private String icon;
+    private String iconOpen;
+    private String iconClose;
+    private Integer id;
+    private String name;
+    private Integer pId;
+
+    public TreeNodeDTO(String icon, String iconOpen, String iconClose, Integer id, String name, Integer pId) {
+        this.icon = icon;
+        this.iconOpen = iconOpen;
+        this.iconClose = iconClose;
+        this.id = id;
+        this.name = name;
+        this.pId = pId;
+    }
+
+    public String getIcon() {
+        return icon;
+    }
+
+    public void setIcon(String icon) {
+        this.icon = icon;
+    }
+
+    public String getIconOpen() {
+        return iconOpen;
+    }
+
+    public void setIconOpen(String iconOpen) {
+        this.iconOpen = iconOpen;
+    }
+
+    public String getIconClose() {
+        return iconClose;
+    }
+
+    public void setIconClose(String iconClose) {
+        this.iconClose = iconClose;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getpId() {
+        return pId;
+    }
+
+    public void setpId(Integer pId) {
+        this.pId = pId;
+    }
+}

+ 16 - 0
ltkg-service/src/main/java/com/diagbot/dto/Tu.java

@@ -0,0 +1,16 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: zhoutg
+ * @time: 2020/3/16 17:06
+ */
+@Data
+public class Tu {
+    private String rel; // 关系
+    private String subName; // 子节点
+    private String subLabel; // 子节点标签名称
+    private Integer subNextCount;  // 子节点指向的节点数量
+}

+ 81 - 0
ltkg-service/src/main/java/com/diagbot/exception/CommonExceptionHandler.java

@@ -0,0 +1,81 @@
+package com.diagbot.exception;
+
+import com.diagbot.dto.RespDTO;
+import com.diagbot.util.GsonUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.BindException;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * @Description: 错误通用处理
+ * @author: gaodm
+ * @time: 2018/8/2 14:22
+ */
+@ControllerAdvice
+@ResponseBody
+@Slf4j
+public class CommonExceptionHandler {
+
+    @ExceptionHandler(Exception.class)
+    public ResponseEntity<RespDTO> handleException(Exception e) {
+        RespDTO resp = new RespDTO();
+        if (e instanceof BindException) {
+            BindException ex = (BindException) e;
+            Map<String, String> stringMap = new HashMap<>();
+            for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
+                stringMap.put(fieldError.getField(), fieldError.getDefaultMessage());
+            }
+            String msg = GsonUtil.toJson(stringMap);
+            log.warn("【参数异常】:{}", msg);
+            resp.code = CommonErrorCode.PARAM_ERROR.getCode();
+            resp.msg = msg;
+            return new ResponseEntity(resp, HttpStatus.OK);
+        }
+        if (e instanceof MethodArgumentNotValidException) {
+            MethodArgumentNotValidException ex = (MethodArgumentNotValidException) e;
+            Map<String, String> stringMap = new HashMap<>();
+            for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
+                stringMap.put(fieldError.getField(), fieldError.getDefaultMessage());
+            }
+            String msg = GsonUtil.toJson(stringMap);
+            log.warn("【参数异常】:{}", msg);
+            resp.code = CommonErrorCode.PARAM_ERROR.getCode();
+            resp.msg = msg;
+            return new ResponseEntity(resp, HttpStatus.OK);
+        }
+        if (e instanceof MissingServletRequestParameterException) {
+            MissingServletRequestParameterException ex = (MissingServletRequestParameterException) e;
+            Map<String, String> stringMap = new HashMap<>();
+            stringMap.put(ex.getParameterName(), "不能为null");
+            String msg = GsonUtil.toJson(stringMap);
+            log.warn("【参数异常】:{}", msg);
+            resp.code = CommonErrorCode.PARAM_ERROR.getCode();
+            resp.msg = msg;
+            return new ResponseEntity(resp, HttpStatus.OK);
+        }
+        if (e instanceof CommonException) {
+            CommonException taiChiException = (CommonException) e;
+            resp.code = taiChiException.getCode();
+            resp.msg = e.getMessage();
+            log.error("【业务异常】:{}", e.getMessage());
+            return new ResponseEntity(resp, HttpStatus.OK);
+        }
+        resp.code = CommonErrorCode.FAIL.getCode();
+        resp.msg = e.getMessage();
+        log.error("【系统异常】:{}", e.getMessage());
+        e.printStackTrace();
+        return new ResponseEntity(resp, HttpStatus.OK);
+    }
+
+}

+ 39 - 0
ltkg-service/src/main/java/com/diagbot/exception/ServiceErrorCode.java

@@ -0,0 +1,39 @@
+package com.diagbot.exception;
+
+/**
+ * @Description: 本服务错误码
+ * 系统码(3位) + 等级码(1位) + 4位顺序号
+ * 系统码 通用码 000;用户中心 100; 管理中心 200;
+ * @author: gaodm
+ * @time: 2018/9/10 11:11
+ */
+public enum ServiceErrorCode implements ErrorCode {
+    LOG_IS_NOT_EXIST("90020001", "该日志不存在");
+
+    private String code;
+    private String msg;
+
+
+    ServiceErrorCode(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public static ServiceErrorCode codeOf(String code) {
+        for (ServiceErrorCode state : values()) {
+            if (state.getCode() == code) {
+                return state;
+            }
+        }
+        return null;
+    }
+}

+ 268 - 0
ltkg-service/src/main/java/com/diagbot/facade/KgFacade.java

@@ -0,0 +1,268 @@
+package com.diagbot.facade;
+
+import com.diagbot.dto.BaseNodeDTO;
+import com.diagbot.dto.BaseNodeRSDTO;
+import com.diagbot.dto.CategorieDTO;
+import com.diagbot.dto.Categories;
+import com.diagbot.dto.GNodeDTO;
+import com.diagbot.dto.GraDTO;
+import com.diagbot.dto.GraphDTO;
+import com.diagbot.dto.GraphLabelDTO;
+import com.diagbot.dto.Link;
+import com.diagbot.dto.LinkDTO;
+import com.diagbot.dto.NextNodeDTO;
+import com.diagbot.dto.Node;
+import com.diagbot.dto.Tree;
+import com.diagbot.dto.TreeDTO;
+import com.diagbot.dto.TreeNodeDTO;
+import com.diagbot.dto.Tu;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.service.impl.KgServiceImpl;
+import com.diagbot.util.EntityUtil;
+import com.diagbot.util.FastJsonUtils;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.StringUtil;
+import com.diagbot.vo.KgQueryVO;
+import com.diagbot.vo.KgTreeVO;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 用户日志业务层
+ * @author: gaodm
+ * @time: 2018/8/6 9:11
+ */
+@Component
+public class KgFacade extends KgServiceImpl {
+
+    public GraphLabelDTO getGraphFac(KgQueryVO kgQueryVO) {
+        GraphLabelDTO graphLabelDTO = new GraphLabelDTO();
+        List<CategorieDTO> categories = new ArrayList<>();
+        List<GNodeDTO> node = new ArrayList<>();
+        List<LinkDTO> links = new ArrayList<>();
+        List<GraphDTO> res = this.getGraph(kgQueryVO);
+        if (ListUtil.isEmpty(res)) {
+            throw new CommonException(CommonErrorCode.NOT_EXISTS);
+        } else {
+            Integer nodeId = 0;
+            categories.add(new CategorieDTO("中心词"));
+            categories.add(new CategorieDTO("关系"));
+            Map<String, Integer> cMap = new HashMap<>();
+            cMap.put("中心词", 0);
+            cMap.put("关系", 1);
+
+            GraphDTO graphDTO = res.get(0);
+            GNodeDTO gNodeDTO
+                    = new GNodeDTO(graphDTO.getLabel(), 0, graphDTO.getName(), nodeId, "circle", 50);
+            nodeId++;
+            node.add(gNodeDTO);
+            if (ListUtil.isNotEmpty(graphDTO.getENodeRSDTOS())) {
+                Integer rsId = 2;
+                for (BaseNodeRSDTO baseNodeRSDTO : graphDTO.getENodeRSDTOS()) {
+                    if (null == cMap.get(baseNodeRSDTO.getRType())) {
+                        cMap.put(baseNodeRSDTO.getRType(), rsId);
+                        categories.add(new CategorieDTO(baseNodeRSDTO.getRType()));
+                        rsId++;
+                    }
+                    GNodeDTO nNodeDTO
+                            = new GNodeDTO("", 1, "", nodeId, "diamond", 10);
+                    node.add(nNodeDTO);
+                    links.add(new LinkDTO(gNodeDTO.getName(), nNodeDTO.getName(), baseNodeRSDTO.getRType()));
+                    nodeId++;
+                    if (ListUtil.isNotEmpty(baseNodeRSDTO.getENodeDTOS())) {
+                        for (NextNodeDTO baseNodeDTO : baseNodeRSDTO.getENodeDTOS()) {
+                            String symbol = "diamond";
+                            if (baseNodeDTO.getPCount() > 0){
+                                symbol = "circle";
+                            }
+                            GNodeDTO eNodeDTO
+                                    = new GNodeDTO(baseNodeDTO.getLabel(), cMap.get(baseNodeRSDTO.getRType()),
+                                    baseNodeDTO.getName(), nodeId, symbol, 28);
+                            nodeId++;
+                            node.add(eNodeDTO);
+                            links.add(new LinkDTO(nNodeDTO.getName(), eNodeDTO.getName(), ""));
+                        }
+                    }
+                }
+            }
+            graphLabelDTO.setCategories(categories);
+            graphLabelDTO.setNode(node);
+            graphLabelDTO.setLinks(links);
+        }
+
+        return graphLabelDTO;
+    }
+
+//    private String random() {
+//        //先随机产生一个下标再获取元素
+//        String random = "";
+//        String[] doc = { "circle", "diamond" };
+//        int index = (int) (Math.random() * doc.length);
+//        random = doc[index];
+//        return random;
+//    }
+
+    public TreeDTO getTreeFac(KgTreeVO kgTreeVO) {
+        TreeDTO treeDTO = new TreeDTO();
+        if (kgTreeVO.getType() == 1
+                && kgTreeVO.getSubType() == 1) {
+            KgQueryVO kgQueryVO = new KgQueryVO();
+            kgQueryVO.setLabelName("诊断依据");
+            kgQueryVO.setInputStr("诊断依据");
+            String tree = this.getTree(kgQueryVO);
+            if (StringUtil.isBlank(tree)) {
+                throw new CommonException(CommonErrorCode.NOT_EXISTS);
+            } else {
+                treeDTO = getTreeDTO(tree);
+            }
+        } else {
+            throw new CommonException(CommonErrorCode.PARAM_IS_ERROR);
+        }
+        return treeDTO;
+    }
+
+    private TreeDTO getTreeDTO(String tree) {
+        TreeDTO treeDTO = new TreeDTO();
+        List<TreeNodeDTO> nodes = new ArrayList<>();
+        Tree treeObj = FastJsonUtils.getJsonToBean(tree, Tree.class);
+        if (null != treeObj) {
+            Map<String, Integer> treeMap = new HashMap<>();
+            treeMap.put("根节点", 0);
+            addTree(nodes, treeObj, treeMap, "根节点");
+        }
+
+        treeDTO.setNodes(nodes);
+        return treeDTO;
+    }
+
+    private void addTree(List<TreeNodeDTO> nodes, Tree treeObj, Map<String, Integer> treeMap, String pName) {
+        if (null == treeMap.get(treeObj.getName())) {
+            treeMap.put(treeObj.getName(), treeMap.size());
+        }
+
+        TreeNodeDTO node = new TreeNodeDTO("/images/icon.png",
+                "/images/iconOpen.png",
+                "/images/iconClose.png",
+                treeMap.get(treeObj.getName()), treeObj.getName(), treeMap.get(pName));
+        nodes.add(node);
+        if (ListUtil.isNotEmpty(treeObj.getSNode())) {
+            for (Tree tree : treeObj.getSNode()) {
+                addTree(nodes, tree, treeMap, treeObj.getName());
+            }
+        } else {
+            node.setIcon("/images/node.png");
+            node.setIconOpen("");
+            node.setIconClose("");
+        }
+    }
+
+    public GraDTO getTuFac(KgQueryVO kgQueryVO) {
+        GraDTO graDTO = new GraDTO();
+        List<Tu> tu = this.getTu(kgQueryVO);
+        Map<String, List<Tu>> map = EntityUtil.makeEntityListMap(tu, "rel");
+
+        List<Categories> categoriesList = new ArrayList<>();
+        List<Node> nodeList = new ArrayList<>();
+        List<Link> linksList = new ArrayList<>();
+
+        // 添加第一个节点:中心节点
+        Node node = new Node(0, kgQueryVO.getInputStr(), 0L, 50);
+        nodeList.add(node);
+
+        // 设置categories
+        Map<String, Integer> relMap = new LinkedHashMap<>();
+        int i = 0; // 设置category
+        Categories c1 = new Categories("中心词");
+        categoriesList.add(c1);
+        relMap.put("中心词", i++);
+        Categories c2 = new Categories("关系");
+        categoriesList.add(c2);
+        relMap.put("关系", i++);
+        Long j = 1L; // 设置节点编号
+        for (String key : map.keySet()) {
+            Categories bean = new Categories(key);
+            categoriesList.add(bean);
+            relMap.put(key, i);
+
+            // 添加关系节点
+            Node nodeRel = new Node(1, "", j, 10);
+            nodeRel.setSymbol("diamond");
+            nodeList.add(nodeRel);
+
+            // 添加中心节点与关系的关联
+            Link linkRel = new Link(0L, j, key);
+            linksList.add(linkRel);
+
+            List<Tu> inner = map.get(key);
+            for (Tu t : inner) {
+                // 添加关系下的节点
+                Node nodeLabel = new Node(i, t.getSubName(), ++j, 28);
+                if (t.getSubNextCount() == 0) {
+                    nodeLabel.setSymbol("rect");
+                }
+                nodeLabel.setType(t.getSubLabel());
+                nodeList.add(nodeLabel);
+
+                // 添加关系和节点的关联
+                Link linkLabel = new Link(linkRel.getTarget(), j, "");
+                linksList.add(linkLabel);
+            }
+            i++;
+            j++;
+        }
+        graDTO.setCategoriesList(categoriesList);
+        graDTO.setNodeList(nodeList);
+        graDTO.setLinksList(linksList);
+
+        return graDTO;
+    }
+
+
+    private static final String jsonStr = "{\n" +
+            "\t\"name\": \"疾病\",\n" +
+            "\t\"sNode\": [\n" +
+            "\t\t{\n" +
+            "\t\t\t\"name\": \"A00-B99-某些传染病和寄生虫病\",\n" +
+            "\t\t\t\"sNode\": [\n" +
+            "\t\t\t\t{\n" +
+            "\t\t\t\t\t\"name\": \"A00\",\n" +
+            "\t\t\t\t\t\"sNode\": [\n" +
+            "\t\t\t\t\t\t{\n" +
+            "\t\t\t\t\t\t\t\"name\": \"A00.000 霍乱,由于O1群霍乱弧菌,霍乱生物型所致\",\n" +
+            "\t\t\t\t\t\t\t\"sNode\": [\n" +
+            "\t\t\t\t\t\t\t]\n" +
+            "\t\t\t\t\t\t},\n" +
+            "\t\t\t\t\t\t{\n" +
+            "\t\t\t\t\t\t\t\"name\": \"A00.000x001 古典生物型霍乱\",\n" +
+            "\t\t\t\t\t\t\t\"sNode\": [\n" +
+            "\t\t\t\t\t\t\t]\n" +
+            "\t\t\t\t\t\t}\n" +
+            "\t\t\t\t\t]\n" +
+            "\t\t\t\t}\n" +
+            "\t\t\t]\n" +
+            "\t\t},\n" +
+            "\t\t{\n" +
+            "\t\t\t\"name\": \"A22-B22-某些传染病和寄生虫病\",\n" +
+            "\t\t\t\"sNode\": [\n" +
+            "\t\t\t\t{\n" +
+            "\t\t\t\t\t\"name\": \"A22\",\n" +
+            "\t\t\t\t\t\"sNode\": [\n" +
+            "\t\t\t\t\t\t{\n" +
+            "\t\t\t\t\t\t\t\"name\": \"胆囊炎\",\n" +
+            "\t\t\t\t\t\t\t\"sNode\": [\n" +
+            "\t\t\t\t\t\t\t]\n" +
+            "\t\t\t\t\t\t}\n" +
+            "\t\t\t\t\t]\n" +
+            "\t\t\t\t}\n" +
+            "\t\t\t]\n" +
+            "\t\t}\n" +
+            "\t]\n" +
+            "}";
+
+}

+ 35 - 0
ltkg-service/src/main/java/com/diagbot/mapper/KgMapper.java

@@ -0,0 +1,35 @@
+package com.diagbot.mapper;
+
+import com.diagbot.dto.Categories;
+import com.diagbot.dto.GraphDTO;
+import com.diagbot.dto.NodeDTO;
+import com.diagbot.dto.Tu;
+import com.diagbot.dto.SchemaDTO;
+import com.diagbot.vo.KgQueryVO;
+import com.diagbot.vo.SchemaVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2018-08-02
+ */
+public interface KgMapper {
+
+    List<NodeDTO> getNode(KgQueryVO kgQueryVO);
+
+    List<GraphDTO> getGraph(KgQueryVO kgQueryVO);
+
+    String getTree(KgQueryVO kgQueryVO);
+
+    List<SchemaDTO> getSchema(SchemaVO schemaVO);
+
+    List<Tu> getTu(KgQueryVO kgQueryVO);
+}

+ 23 - 0
ltkg-service/src/main/java/com/diagbot/rabbit/MyProcessor.java

@@ -0,0 +1,23 @@
+package com.diagbot.rabbit;
+
+import org.springframework.cloud.stream.annotation.Input;
+import org.springframework.cloud.stream.annotation.Output;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.messaging.SubscribableChannel;
+
+/**
+ * @Description: 自定义Stream发布和消费对象
+ * @author: gaodm
+ * @time: 2018/8/29 13:39
+ */
+public interface MyProcessor {
+
+    String INPUT_LOG = "inputLog";
+    String OUTPUT_LOG = "outputLog";
+
+    @Input(INPUT_LOG)
+    SubscribableChannel inputLog();
+
+    @Output(OUTPUT_LOG)
+    MessageChannel outputLog();
+}

+ 27 - 0
ltkg-service/src/main/java/com/diagbot/rabbit/MySender.java

@@ -0,0 +1,27 @@
+package com.diagbot.rabbit;
+
+import com.diagbot.biz.log.entity.SysLog;
+import com.diagbot.util.GsonUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.integration.support.MessageBuilder;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 发布者
+ * @author: gaodm
+ * @time: 2018/8/29 13:41
+ */
+@Component
+@EnableBinding({ MyProcessor.class })
+public class MySender {
+    @Autowired
+    @Qualifier("outputLog")
+    MessageChannel outputLog;
+
+    public void outputLogSend(SysLog sysLog) {
+        outputLog.send(MessageBuilder.withPayload(GsonUtil.toJson(sysLog)).build());
+    }
+}

+ 33 - 0
ltkg-service/src/main/java/com/diagbot/service/KgService.java

@@ -0,0 +1,33 @@
+package com.diagbot.service;
+
+import com.diagbot.dto.GraDTO;
+import com.diagbot.dto.GraphDTO;
+import com.diagbot.dto.NodeDTO;
+import com.diagbot.dto.Tu;
+import com.diagbot.dto.SchemaDTO;
+import com.diagbot.vo.KgQueryVO;
+import com.diagbot.vo.SchemaVO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2018-08-02
+ */
+public interface KgService {
+
+    List<NodeDTO> getNode(KgQueryVO kgQueryVO);
+
+    List<GraphDTO> getGraph(KgQueryVO kgQueryVO);
+
+    String getTree(KgQueryVO kgQueryVO);
+
+    List<SchemaDTO> getSchema(SchemaVO schemaVO);
+
+    List<Tu> getTu(KgQueryVO kgQueryVO);
+}

+ 62 - 0
ltkg-service/src/main/java/com/diagbot/service/impl/KgServiceImpl.java

@@ -0,0 +1,62 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.dto.Categories;
+import com.diagbot.dto.GraDTO;
+import com.diagbot.dto.GraphDTO;
+import com.diagbot.dto.Link;
+import com.diagbot.dto.Node;
+import com.diagbot.dto.NodeDTO;
+import com.diagbot.dto.Tu;
+import com.diagbot.dto.SchemaDTO;
+import com.diagbot.mapper.KgMapper;
+import com.diagbot.service.KgService;
+import com.diagbot.util.EntityUtil;
+import com.diagbot.vo.KgQueryVO;
+import com.diagbot.vo.SchemaVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2018-08-02
+ */
+@Service
+public class KgServiceImpl implements KgService {
+    @Autowired
+    private KgMapper kgMapper;
+
+    @Override
+    public List<NodeDTO> getNode(KgQueryVO kgQueryVO){
+        return kgMapper.getNode(kgQueryVO);
+    }
+
+    @Override
+    public List<GraphDTO> getGraph(KgQueryVO kgQueryVO){
+        return kgMapper.getGraph(kgQueryVO);
+    }
+
+    @Override
+    public String getTree(KgQueryVO kgQueryVO){
+        return kgMapper.getTree(kgQueryVO);
+    }
+
+    @Override
+    public List<SchemaDTO> getSchema(SchemaVO schemaVO){
+        return kgMapper.getSchema( schemaVO);
+    }
+
+    @Override
+    public List<Tu> getTu(KgQueryVO kgQueryVO) {
+        return kgMapper.getTu(kgQueryVO);
+    }
+}

+ 23 - 0
ltkg-service/src/main/java/com/diagbot/vo/KgQueryVO.java

@@ -0,0 +1,23 @@
+package com.diagbot.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/3/16 9:47
+ */
+@Getter
+@Setter
+public class KgQueryVO {
+    @ApiModelProperty(value = "标签名")
+    @NotBlank(message = "标签名不能为空")
+    private String labelName;
+    @ApiModelProperty(value = "搜索内容")
+    @NotBlank(message = "搜索内容不能为空")
+    private String inputStr;
+}

+ 23 - 0
ltkg-service/src/main/java/com/diagbot/vo/KgTreeVO.java

@@ -0,0 +1,23 @@
+package com.diagbot.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/3/17 9:00
+ */
+@Getter
+@Setter
+public class KgTreeVO {
+    @ApiModelProperty(value = "类型 疾病:1")
+    @NotNull(message = "类型不能为空")
+    private Integer type;
+    @ApiModelProperty(value = "子类型 默认:0 ICD10:1")
+    @NotNull(message = "子类型不能为空")
+    private Integer subType;
+}

+ 23 - 0
ltkg-service/src/main/java/com/diagbot/vo/SchemaVO.java

@@ -0,0 +1,23 @@
+package com.diagbot.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2020-03-13 16:11
+ */
+@Setter
+@Getter
+public class SchemaVO {
+    @ApiModelProperty(value = "标签名")
+    @NotBlank(message = "标签名不能为空")
+    private String labelName;
+    @ApiModelProperty(value = "搜索内容")
+    @NotBlank(message = "搜索内容不能为空")
+    private String pramNme;
+}

+ 93 - 0
ltkg-service/src/main/java/com/diagbot/web/KgController.java

@@ -0,0 +1,93 @@
+package com.diagbot.web;
+
+import com.diagbot.annotation.SysLogger;
+import com.diagbot.dto.GraDTO;
+import com.diagbot.dto.GraphLabelDTO;
+import com.diagbot.dto.NodeDTO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.dto.SchemaDTO;
+import com.diagbot.dto.TreeDTO;
+import com.diagbot.facade.KgFacade;
+import com.diagbot.vo.KgQueryVO;
+import com.diagbot.vo.KgTreeVO;
+import com.diagbot.vo.SchemaVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+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 springfox.documentation.annotations.ApiIgnore;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * @Description: 朗通知识图谱控制层
+ * @author: gaodm
+ * @time: 2018/8/30 10:12
+ */
+@RestController
+@RequestMapping("/kg")
+@Api(value = "朗通知识图谱API", tags = { "朗通知识图谱API" })
+@SuppressWarnings("unchecked")
+@Slf4j
+public class KgController {
+    private static final String KGTREECACHE = "KgTreeCache";
+
+    @Autowired
+    private KgFacade kgFacade;
+
+    @ApiOperation(value = "查询节点", notes = "查询节点")
+    @PostMapping("/getNode")
+    @SysLogger("getNode")
+    public RespDTO<List<NodeDTO>> getNode(@RequestBody @Valid KgQueryVO kgQueryVO) {
+        return RespDTO.onSuc(kgFacade.getNode(kgQueryVO));
+    }
+
+    @ApiOperation(value = "获取图谱", notes = "获取图谱")
+    @PostMapping("/getGraph")
+    @SysLogger("getGraph")
+    public RespDTO<GraphLabelDTO> getGraph(@RequestBody @Valid KgQueryVO kgQueryVO) {
+        return RespDTO.onSuc(kgFacade.getGraphFac(kgQueryVO));
+    }
+
+    @ApiOperation(value = "获取树形分类", notes = "获取树形分类")
+    @PostMapping("/getTree")
+    @SysLogger("getTree")
+    @Cacheable(value = KGTREECACHE, key = "'kgtree:t_' + #kgTreeVO.type + '_st_' + #kgTreeVO.subType")
+    public RespDTO<TreeDTO> getTree(@RequestBody @Valid KgTreeVO kgTreeVO) {
+        log.info("获取树形分类缓存成功");
+        return RespDTO.onSuc(kgFacade.getTreeFac(kgTreeVO));
+    }
+
+    @ApiOperation(value = "获取描述框架", notes = "获取描述框架")
+    @PostMapping("/getSchema")
+    @SysLogger("getSchema")
+    public RespDTO<List<SchemaDTO>> getSchema(@RequestBody @Valid SchemaVO schemaVO) {
+        return RespDTO.onSuc(kgFacade.getSchema(schemaVO));
+    }
+
+    @ApiOperation(value = "获取图", notes = "获取图")
+    @PostMapping("/getTu")
+    @SysLogger("getTu")
+    @ApiIgnore
+    public RespDTO<GraDTO> getTu(@RequestBody KgQueryVO kgQueryVO) {
+        return RespDTO.onSuc(kgFacade.getTuFac(kgQueryVO));
+    }
+
+
+    @ApiOperation(value = "清理树形分类缓存", notes = "清理树形分类缓存")
+    @PostMapping("/delKgTreeCache")
+    @SysLogger("delKgTreeCache")
+    @CacheEvict(cacheNames = KGTREECACHE, allEntries = true)
+    public RespDTO<Boolean> delKgTreeCache() {
+        log.info("清理树形分类缓存成功");
+        return RespDTO.onSuc(true);
+    }
+}
+

+ 19 - 0
ltkg-service/src/main/resources/bootstrap.yml

@@ -0,0 +1,19 @@
+spring:
+  application:
+    name: ltkg-service
+  cloud:
+    config:
+      #uri: http://${myuri}:8769
+      fail-fast: true
+      discovery:
+        enabled: true
+        serviceId: config-server
+  profiles:
+    active: local
+
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://${myuri}:8761/eureka/
+
+myuri: localhost

+ 306 - 0
ltkg-service/src/main/resources/logback-spring.xml

@@ -0,0 +1,306 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <!-- 项目名称 -->
+    <property name="APPDIR" value="ltkg-service"/>
+    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
+    <property name="LOG_PATH" value="../logs"/>
+
+    <!-- 彩色日志 -->
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr"
+                    converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- 彩色日志格式 -->
+    <!--<property name="CONSOLE_LOG_PATTERN"-->
+    <!--value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(-&#45;&#45;){faint} %clr([%15.15t]){faint} %clr(%logger){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>-->
+    <!--包名输出缩进对齐-->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+
+    <!--  日志记录器,日期滚动记录
+            ERROR 级别
+     -->
+    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/${APPDIR}/${APPDIR}_error.log</file>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 归档的日志文件的路径,例如今天是1992-11-06日志,当前写的日志文件路径为file节点指定,
+            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+            而1992-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/${APPDIR}/error/${APPDIR}-error-%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <!--  保留日志天数 -->
+            <maxHistory>30</maxHistory>
+            <!-- 除按日志记录之外,还配置了日志文件不能超过10MB,若超过10MB,日志文件会以索引0开始,
+            命名日志文件,例如log-error-1992-11-06.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger Line:%-3L - %msg%n
+            </pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <!-- 此日志文件记录error级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>error</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录
+            WARN  级别
+     -->
+    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/${APPDIR}/${APPDIR}_warn.log</file>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 归档的日志文件的路径,例如今天1992-11-06日志,当前写的日志文件路径为file节点指定,
+            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+            而1992-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/${APPDIR}/warn/${APPDIR}-warn-%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <!--  保留日志天数 -->
+            <maxHistory>15</maxHistory>
+            <!-- 除按日志记录之外,还配置了日志文件不能超过10MB,若超过10MB,日志文件会以索引0开始,
+            命名日志文件,例如log-warn-1992-11-06.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger Line:%-3L - %msg%n
+            </pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <!-- 此日志文件只记录warn级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>warn</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录
+            INFO  级别
+    -->
+    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/${APPDIR}/${APPDIR}_info.log</file>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 归档的日志文件的路径,例如今天是1992-11-06日志,当前写的日志文件路径为file节点指定,
+            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+            而1992-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/${APPDIR}/info/${APPDIR}-info-%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <!--  保留日志天数 -->
+            <maxHistory>15</maxHistory>
+            <!-- 除按日志记录之外,还配置了日志文件不能超过10MB,若超过10MB,日志文件会以索引0开始,
+            命名日志文件,例如log-info-1992-11-06.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger Line:%-3L - %msg%n
+            </pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <!-- 此日志文件只记录info级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>info</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录
+            DEBUG  级别
+    -->
+    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/${APPDIR}/${APPDIR}_debug.log</file>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 归档的日志文件的路径,例如今天是1992-11-06日志,当前写的日志文件路径为file节点指定,
+            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+            而1992-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/${APPDIR}/debug/${APPDIR}-debug-%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <!--  保留日志天数 -->
+            <maxHistory>15</maxHistory>
+            <!-- 除按日志记录之外,还配置了日志文件不能超过10MB,若超过10MB,日志文件会以索引0开始,
+            命名日志文件,例如log-debug-1992-11-06.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger Line:%-3L - %msg%n
+            </pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <!-- 此日志文件只记录debug级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>debug</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- ConsoleAppender 控制台输出日志 -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <!--encoder 默认配置为PatternLayoutEncoder-->
+        <encoder>
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+            <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level -&#45;&#45; [%thread] %logger Line:%-3L - %msg%n</pattern>-->
+            <charset>utf-8</charset>
+        </encoder>
+        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>debug</level>
+        </filter>
+    </appender>
+
+
+    <!--&lt;!&ndash;输出到mysql数据库的appender配置     &ndash;&gt;-->
+    <!--<appender name="db" class="ch.qos.logback.classic.db.DBAppender">-->
+    <!--<connectionSource-->
+    <!--class="ch.qos.logback.core.db.DriverManagerConnectionSource">-->
+    <!--<driverClass>com.mysql.cj.jdbc.Driver</driverClass>-->
+    <!--<url>jdbc:mysql://120.77.222.42:3306/logback_member?characterEncoding=utf8</url>-->
+    <!--<user>root</user>-->
+    <!--<password>a123456789</password>-->
+    <!--</connectionSource>-->
+    <!--</appender>-->
+
+    <!-- FrameworkServlet日志-->
+    <logger name="org.springframework" level="WARN"/>
+
+    <!-- mybatis日志打印-->
+    <logger name="org.apache.ibatis" level="DEBUG"/>
+    <logger name="java.sql" level="DEBUG"/>
+
+    <!--  项目 mapper 路径
+            console控制台显示sql语句:STDOUT.filter.level -> debug级别
+    -->
+    <logger name="com.diagbot.mapper" level="DEBUG"/>
+
+    <appender name="LOGSTASHDEV" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+        <destination>192.168.2.236:5044</destination>
+        <!-- encoder必须配置,有多种可选 -->
+        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
+            <customFields>{"appname":"ltkg-service"}</customFields>
+        </encoder>
+    </appender>
+
+    <appender name="LOGSTASHTEST" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+        <destination>192.168.2.241:5044</destination>
+        <!-- encoder必须配置,有多种可选 -->
+        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
+            <customFields>{"appname":"ltkg-service"}</customFields>
+        </encoder>
+    </appender>
+
+    <appender name="LOGSTASHPRE" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+        <destination>192.168.2.121:5044</destination>
+        <!-- encoder必须配置,有多种可选 -->
+        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
+            <customFields>{"appname":"ltkg-service"}</customFields>
+        </encoder>
+    </appender>
+
+    <appender name="LOGSTASHPRO" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+        <destination>192.168.2.122:5044</destination>
+        <!-- encoder必须配置,有多种可选 -->
+        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
+            <customFields>{"appname":"ltkg-service"}</customFields>
+        </encoder>
+    </appender>
+
+    <!-- 本地环境下的日志配置 -->
+    <springProfile name="local">
+        <root level="INFO">
+            <appender-ref ref="ERROR"/>
+            <appender-ref ref="WARN"/>
+            <appender-ref ref="INFO"/>
+            <appender-ref ref="DEBUG"/>
+            <appender-ref ref="STDOUT"/>
+        </root>
+    </springProfile>
+
+    <!-- 开发环境下的日志配置 -->
+    <springProfile name="dev">
+        <root level="INFO">
+            <appender-ref ref="ERROR"/>
+            <appender-ref ref="WARN"/>
+            <appender-ref ref="INFO"/>
+            <appender-ref ref="DEBUG"/>
+            <appender-ref ref="STDOUT"/>
+            <appender-ref ref="LOGSTASHDEV"/>
+        </root>
+    </springProfile>
+
+    <!-- 测试环境下的日志配置 -->
+    <springProfile name="test">
+        <root level="INFO">
+            <appender-ref ref="ERROR"/>
+            <appender-ref ref="WARN"/>
+            <appender-ref ref="INFO"/>
+            <appender-ref ref="DEBUG"/>
+            <appender-ref ref="STDOUT"/>
+            <appender-ref ref="LOGSTASHTEST"/>
+        </root>
+    </springProfile>
+
+    <!-- 预发布环境下的日志配置 -->
+    <springProfile name="pre">
+        <root level="INFO">
+            <appender-ref ref="ERROR"/>
+            <appender-ref ref="WARN"/>
+            <appender-ref ref="INFO"/>
+            <appender-ref ref="DEBUG"/>
+            <appender-ref ref="STDOUT"/>
+            <appender-ref ref="LOGSTASHPRE"/>
+        </root>
+    </springProfile>
+
+    <!-- 生产环境下的日志配置 -->
+    <springProfile name="pro">
+        <root level="INFO">
+            <appender-ref ref="ERROR"/>
+            <appender-ref ref="WARN"/>
+            <appender-ref ref="INFO"/>
+            <appender-ref ref="DEBUG"/>
+            <appender-ref ref="STDOUT"/>
+            <appender-ref ref="LOGSTASHPRO"/>
+        </root>
+    </springProfile>
+</configuration>

+ 68 - 0
ltkg-service/src/main/resources/mapper/KgMapper.xml

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.KgMapper">
+
+    <resultMap id="GraphResultMap" type="com.diagbot.dto.GraphDTO">
+        <result column="sName" property="name"/>
+        <result column="sLabel" property="label"/>
+        <collection property="eNodeRSDTOS" ofType="com.diagbot.dto.BaseNodeRSDTO">
+            <result column="rType" property="rType"/>
+            <collection property="eNodeDTOS" ofType="com.diagbot.dto.NextNodeDTO">
+                <result column="eName" property="name"/>
+                <result column="eLabel" property="label"/>
+                <result column="pCount" property="pCount"/>
+            </collection>
+        </collection>
+    </resultMap>
+    <resultMap id="SchemaResultMap" type="com.diagbot.dto.SchemaDTO">
+        <result column="diseaseNode" property="name"/>
+        <collection property="children" ofType="com.diagbot.dto.RelationNodesDTO">
+            <result column="relationNode" property="name"/>
+            <collection property="children" ofType="com.diagbot.dto.NodeLabelsDTO">
+                <result column="node" property="name"/>
+            </collection>
+        </collection>
+    </resultMap>
+
+    <select id="getNode" parameterType='com.diagbot.vo.KgQueryVO' resultType="com.diagbot.dto.NodeDTO">
+        Match (n:${labelName}) where n.name = #{inputStr} with collect(n.name) as rows0
+        OPTIONAL Match (n:${labelName}) where n.name STARTS WITH #{inputStr} with rows0 + collect(n.name) as rows1
+        OPTIONAL Match (n:${labelName}) where n.name CONTAINS #{inputStr} with rows1 + collect(n.name) as rows
+        unwind rows as row
+        with distinct row as x
+        return x as name
+        limit 20
+    </select>
+
+    <select id="getGraph" parameterType='com.diagbot.vo.KgQueryVO' resultMap="GraphResultMap">
+        MATCH (n:${labelName})-[r]->(m)
+        where n.name = #{inputStr}
+        OPTIONAL MATCH p=(m)-[]->(o) where head(Labels(m)) in ["diagnose","symptom"]
+        RETURN head(Labels(n)) as sLabel,n.name as sName,Type (r) as rType, head(Labels(m)) as eLabel,m.name as eName, count(p) as pCount
+        ORDER BY rType
+        LIMIT 100
+    </select>
+
+    <select id="getTree" resultType="java.lang.String">
+      Match (n:${labelName}) where n.name = #{inputStr} return n.describe
+    </select>
+
+    <select id="getSchema" parameterType='com.diagbot.vo.SchemaVO' resultMap="SchemaResultMap">
+      match(d:${labelName})-[r]->(h)
+      where d.name = #{pramNme}
+      return
+       d.name as diseaseNode ,
+      type(r) as relationNode ,
+      h.name as node
+    </select>
+
+    <select id="getTu" resultType="com.diagbot.dto.Tu">
+      match (n:${labelName})-[r]->(m) where n.name=#{inputStr}
+      with r,m
+      optional match (m)-->(fof)
+      return type(r) as rel,m.name as subName, head(labels(m)) as subLabel, count(fof) as subNextCount
+      order by rel
+    </select>
+
+</mapper>

+ 9 - 0
ltkg-service/src/main/resources/public.cert

@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxXZWH/WgxW9eTT6AmPRo
+GFY3T5V1+F1458dcQFw0EZejjHuGwEeHvxcgl4059Me2B1xXTs3FDXTWQ5z19EtP
+3ITYtnFTo2cxhwxiwqN8ZqFdpq5Uac0mzjlYKcyGp8x6t+Nc2cv3D3Ul2VIbGvbP
+sQOeKvt3WxWwdpQ+q3RXjRUFQGiygSD7yuXHIUpcOsm4ZWDlUkjfwX1q4pjiwFfA
+Mq5xgkzPwolUKnI0NFnom3Th3i4oFXzUg2s6cEj7jL7YU35c2/9kE7WQPbeYhoSi
+XH2OwWgBk/2Ki6+Q0Yq/eAsXSBjp1jqh337vvKBk5ocPG1Imi8uTLIgYQCMwzvg+
+VQIDAQAB
+-----END PUBLIC KEY-----

+ 443 - 0
ltkg-service/src/main/resources/static/index.html

@@ -0,0 +1,443 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>ECharts 关系图</title>
+    <script src="js/jquery-1.8.3.min.js"></script>
+    <script src="js/echarts.js"></script>
+</head>
+
+<body>
+<h1><select id="sel" style="height: 26px;margin-right: 10px;"><option value="Disease">诊断</option><option value="Symptom">症状</option><option value="Treat">治疗</option></select><input id="inputStr" style="height: 20px;"><input type="button" id="search" value="搜索" style="margin-left: 10px;"></h1>
+<div id="main" style="width:1000px;height:800px"></div>
+<script type="text/javascript">
+    var myChart = echarts.init(document.getElementById('main'));
+    var categories = [
+        // {
+        //     "name":"中心词"
+        // },
+        // {
+        //     "name":"关系"
+        // },
+        // {
+        //     "name":"相关症状",
+        //     "symbol":"circle",
+        //     "symbolSize":28
+        // },
+        // {
+        //     "name":"发病部位",
+        //     "symbol":"circle",
+        //     "symbolSize":28
+        // },
+        // {
+        //     "name":"所属科室",
+        //     "symbol":"circle",
+        //     "symbolSize":28
+        // },
+        // {
+        //     "name":"检查",
+        //     "symbol":"circle",
+        //     "symbolSize":28
+        // },
+        // {
+        //     "name":"相关疾病",
+        //     "symbol":"circle",
+        //     "symbolSize":28
+        // }
+    ];
+    var data = {"labelName":"Disease", "inputStr": "糖尿病"};
+    $.ajax({
+        type: "post",
+        url: "http://localhost:5050/api/ltkg/kg/getTu",
+        data: JSON.stringify(data),
+        contentType: "application/json;charset=UTF-8",
+        dataType: "json",
+        success: function(res){
+            console.log(res);
+            var data = res.data;
+            option.series[0].data = data.nodeList;
+            option.series[0].links = data.linksList;
+            option.series[0].categories = data.categoriesList;
+            option.legend[0].data = data.categoriesList.slice(2, data.categoriesList.length);
+            myChart.setOption(option);
+        }
+    });
+
+    option = {
+        // 图的标题
+        title: {
+            text: 'ECharts 关系图'
+        },
+        // 提示框的配置
+        tooltip: {
+            formatter: function (x) {
+                return x.data.des;
+            }
+        },
+        // 工具箱
+        toolbox: {
+            // 显示工具箱
+            show: true,
+            feature: {
+                mark: {
+                    show: true
+                },
+                // 还原
+                restore: {
+                    show: true
+                },
+                // 保存为图片
+                saveAsImage: {
+                    show: true
+                }
+            }
+        },
+        legend: [{
+            // selectedMode: 'single',
+            data: categories.map(function (a) {
+                return a.name;
+            })
+        }],
+        series: [{
+            type: 'graph', // 类型:关系图
+            layout: 'force', //图的布局,类型为力导图
+            // symbolSize: 40, // 调整节点的大小
+            roam: true, // 是否开启鼠标缩放和平移漫游。默认不开启。如果只想要开启缩放或者平移,可以设置成 'scale' 或者 'move'。设置成 true 为都开启
+            edgeSymbol: ['circle', 'arrow'],
+            edgeSymbolSize: [2, 10],
+            edgeLabel: {
+                normal: {
+                    textStyle: {
+                        fontSize: 20
+                    }
+                }
+            },
+            force: {
+                repulsion: 200,
+                edgeLength: [10,50],
+                layoutAnimation: false
+            },
+            draggable: true,
+            lineStyle: {
+                normal: {
+                    width: 2,
+                    color: '#4b565b'
+                }
+            },
+            edgeLabel: {
+                normal: {
+                    show: true,
+                    formatter: function (x) {
+                        return x.data.value;
+                    }
+                }
+            },
+            label: {
+                normal: {
+                    show: true,
+                    formatter: function (x) {
+                        return x.data.label;
+                    },
+                    textStyle: {}
+                }
+            },
+
+            // 数据
+            data: [
+                {
+                    "category":0,
+                    "label":"咳嗽",
+                    "name":0,
+                    "symbolSize":50
+                },
+                {
+                    "category":1,
+                    "label":"",
+                    "name":1,
+                    "symbol":"diamond",
+                    "symbolSize":10
+                },
+                {
+                    "category":2,
+                    "label":"点滴状便血",
+                    "name":2,
+                    "symbolSize":28
+                },
+                {
+                    "category":2,
+                    "label":"膀胱蓄热小便失禁",
+                    "name":3,
+                    "symbolSize":28
+                },
+                {
+                    "category":2,
+                    "label":"百日咳",
+                    "name":4,
+                    "symbolSize":28
+                },
+                {
+                    "category":2,
+                    "label":"大量胸水",
+                    "name":5,
+                    "symbolSize":28
+                },
+                {
+                    "category":1,
+                    "label":"",
+                    "name":6,
+                    "symbol":"diamond",
+                    "symbolSize":10
+                },
+                {
+                    "category":3,
+                    "label":"头部",
+                    "name":7,
+                    "symbol":"rect",
+                    "symbolSize":28
+                },
+                {
+                    "category":1,
+                    "label":"",
+                    "name":8,
+                    "symbol":"diamond",
+                    "symbolSize":10
+                },
+                {
+                    "category":4,
+                    "label":"五官科",
+                    "name":9,
+                    "symbol":"rect",
+                    "symbolSize":28
+                },
+                {
+                    "category":4,
+                    "label":"中西医结合科",
+                    "name":10,
+                    "symbol":"rect",
+                    "symbolSize":28
+                },
+                {
+                    "category":4,
+                    "label":"腹部损伤",
+                    "name":11,
+                    "symbolSize":28
+                },
+                {
+                    "category":4,
+                    "label":"内科",
+                    "name":12,
+                    "symbol":"rect",
+                    "symbolSize":28
+                },
+                {
+                    "category":1,
+                    "label":"",
+                    "name":13,
+                    "symbol":"diamond",
+                    "symbolSize":10
+                },
+                {
+                    "category":5,
+                    "label":"巨噬细胞或白细胞移动抑制试验mmit",
+                    "name":14,
+                    "symbolSize":28
+                },
+                {
+                    "category":5,
+                    "label":"浆膜腔积液",
+                    "name":15,
+                    "symbol":"rect",
+                    "symbolSize":28
+                },
+                {
+                    "category":5,
+                    "label":"浆膜腔积液葡萄糖",
+                    "name":16,
+                    "symbol":"rect",
+                    "symbolSize":28
+                },
+                {
+                    "category":5,
+                    "label":"结核菌素试验(OT,PPD)",
+                    "name":17,
+                    "symbol":"rect",
+                    "symbolSize":28
+                },
+                {
+                    "category":1,
+                    "label":"",
+                    "name":18,
+                    "symbol":"diamond",
+                    "symbolSize":10
+                },
+                {
+                    "category":6,
+                    "label":"HIV相关呼吸道感染",
+                    "name":19,
+                    "symbolSize":28
+                },
+                {
+                    "category":6,
+                    "label":"热带型肺嗜酸性粒细胞肺炎",
+                    "name":20,
+                    "symbolSize":28
+                }
+            ],
+            links: [
+                {
+                    "source":0,
+                    "target":1,
+                    "value":"相关症状"
+                },
+                {
+                    "source":1,
+                    "target":2,
+                    "value":""
+                },
+                {
+                    "source":1,
+                    "target":3,
+                    "value":""
+                },
+                {
+                    "source":1,
+                    "target":4,
+                    "value":""
+                },
+                {
+                    "source":1,
+                    "target":5,
+                    "value":""
+                },
+                {
+                    "source":0,
+                    "target":6,
+                    "value":"发病部位"
+                },
+                {
+                    "source":6,
+                    "target":7,
+                    "value":""
+                },
+                {
+                    "source":0,
+                    "target":8,
+                    "value":"所属科室"
+                },
+                {
+                    "source":8,
+                    "target":9,
+                    "value":""
+                },
+                {
+                    "source":8,
+                    "target":10,
+                    "value":""
+                },
+                {
+                    "source":8,
+                    "target":11,
+                    "value":""
+                },
+                {
+                    "source":8,
+                    "target":12,
+                    "value":""
+                },
+                {
+                    "source":0,
+                    "target":13,
+                    "value":"检查"
+                },
+                {
+                    "source":13,
+                    "target":14,
+                    "value":""
+                },
+                {
+                    "source":13,
+                    "target":15,
+                    "value":""
+                },
+                {
+                    "source":13,
+                    "target":16,
+                    "value":""
+                },
+                {
+                    "source":13,
+                    "target":17,
+                    "value":""
+                },
+                {
+                    "source":0,
+                    "target":18,
+                    "value":"相关疾病"
+                },
+                {
+                    "source":18,
+                    "target":19,
+                    "value":""
+                },
+                {
+                    "source":18,
+                    "target":20,
+                    "value":""
+                }
+            ],
+            categories: categories,
+        }]
+    };
+
+    $("#search").click(function() {
+        var data = {};
+        data.labelName = $("#sel").val();
+        data.inputStr = $("#inputStr").val().trim();
+        $.ajax({
+            type: "post",
+            url: "/kg/getTu",
+            data: JSON.stringify(data),
+            contentType: "application/json;charset=UTF-8",
+            dataType: "json",
+            success: function(res){
+                console.log(res);
+                var data = res.data;
+                option.series[0].data = data.nodeList;
+                option.series[0].links = data.linksList;
+                option.series[0].categories = data.categoriesList;
+                option.legend[0].data = data.categoriesList.slice(2, data.categoriesList.length);
+                myChart.setOption(option);
+            }
+        });
+    });
+    myChart.on('click', function (param){
+        console.log('param---->', param);  // 打印出param, 可以看到里边有很多参数可以使用
+        //获取节点点击的数组序号
+        var arrayIndex = param.dataIndex;
+        if (param.dataType == 'node' && !param.data.symbol) {
+            var data = {};
+            // data.labelName = $("#sel").val();
+            data.labelName = param.data.type;
+            data.inputStr = param.data.label.trim();
+            $.ajax({
+                type: "post",
+                url: "/kg/getTu",
+                data: JSON.stringify(data),
+                contentType: "application/json;charset=UTF-8",
+                dataType: "json",
+                success: function(res){
+                    console.log(res);
+                    var data = res.data;
+                    option.series[0].data = data.nodeList;
+                    option.series[0].links = data.linksList;
+                    option.series[0].categories = data.categoriesList;
+                    option.legend[0].data = data.categoriesList.slice(2, data.categoriesList.length);
+                    myChart.setOption(option);
+                }
+            });
+        }
+    });
+
+</script>
+</body>
+</html>

Datei-Diff unterdrückt, da er zu groß ist
+ 90347 - 0
ltkg-service/src/main/resources/static/js/echarts.js


Datei-Diff unterdrückt, da er zu groß ist
+ 2 - 0
ltkg-service/src/main/resources/static/js/jquery-1.8.3.min.js


+ 83 - 0
ltkg-service/src/test/java/com/diagbot/CodeGeneration.java

@@ -0,0 +1,83 @@
+//package com.diagbot;
+//
+//import com.baomidou.mybatisplus.annotation.DbType;
+//import com.baomidou.mybatisplus.generator.AutoGenerator;
+//import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+//import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+//import com.baomidou.mybatisplus.generator.config.PackageConfig;
+//import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+//import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+//import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
+//
+///**
+// * @Description: 代码生成器
+// * @author: gaodm
+// * @time: 2018/8/2 10:15
+// */
+//public class CodeGeneration {
+//
+//    /**
+//     *
+//     * @Title: main
+//     * @Description: 生成
+//     * @param args
+//     */
+//    public static void main(String[] args) {
+//        AutoGenerator mpg = new AutoGenerator();
+//
+//        // 全局配置
+//        GlobalConfig gc = new GlobalConfig();
+//        gc.setOutputDir("E://code//feedbackservice");
+//        gc.setFileOverride(true);
+//        gc.setActiveRecord(false);// 不需要ActiveRecord特性的请改为false
+//        gc.setEnableCache(false);// XML 二级缓存
+//        gc.setBaseResultMap(true);// XML ResultMap
+//        gc.setBaseColumnList(false);// XML columList
+//        gc.setAuthor("gaodm");// 作者
+//
+//        // 自定义文件命名,注意 %s 会自动填充表实体属性!
+//        gc.setControllerName("%sController");
+//        gc.setServiceName("%sService");
+//        gc.setServiceImplName("%sServiceImpl");
+//        gc.setMapperName("%sMapper");
+//        gc.setXmlName("%sMapper");
+//        mpg.setGlobalConfig(gc);
+//
+//        // 数据源配置
+//        DataSourceConfig dsc = new DataSourceConfig();
+//        dsc.setDbType(DbType.MYSQL);
+//        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
+//        dsc.setUsername("root");
+//        dsc.setPassword("root");
+//        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/sys-log?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8");
+//        mpg.setDataSource(dsc);
+//
+//        // 策略配置
+//        StrategyConfig strategy = new StrategyConfig();
+////        strategy.setTablePrefix(new String[] { "sys_" });// 此处可以修改为您的表前缀
+//        strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
+//        strategy.setInclude(new String[] { "sys_log" }); // 需要生成的表
+//
+//        strategy.setSuperServiceClass(null);
+//        strategy.setSuperServiceImplClass(null);
+//        strategy.setSuperMapperClass(null);
+//
+//        mpg.setStrategy(strategy);
+//
+//        // 包配置
+//        PackageConfig pc = new PackageConfig();
+//        pc.setParent("com.diagbot");
+//        pc.setController("web");
+//        pc.setService("service");
+//        pc.setServiceImpl("service.impl");
+//        pc.setMapper("mapper");
+//        pc.setEntity("entity");
+//        pc.setXml("resources.mapper");
+//        mpg.setPackageInfo(pc);
+//
+//        // 执行生成
+//        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
+//        mpg.execute();
+//
+//    }
+//}

+ 16 - 0
ltkg-service/src/test/java/com/diagbot/LtkgServiceApplicationTests.java

@@ -0,0 +1,16 @@
+package com.diagbot;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class LtkgServiceApplicationTests {
+
+    @Test
+    public void contextLoads() {
+    }
+
+}

+ 1 - 0
pom.xml

@@ -35,6 +35,7 @@
         <module>mrqcman-service</module>
         <module>mrman-service</module>
         <module>common-biz-client</module>
+        <module>ltkg-service</module>
     </modules>
 
     <parent>