liuchang 4 년 전
커밋
f5e0811842
100개의 변경된 파일4588개의 추가작업 그리고 0개의 파일을 삭제
  1. 21 0
      LICENSE
  2. 77 0
      README.md
  3. 21 0
      consumer-demo/pom.xml
  4. 31 0
      consumer-demo/src/main/java/com/tsf/demo/consumer/ConsumerApplication.java
  5. 84 0
      consumer-demo/src/main/java/com/tsf/demo/consumer/controller/ConsumerController.java
  6. 15 0
      consumer-demo/src/main/java/com/tsf/demo/consumer/entity/CustomMetadata.java
  7. 11 0
      consumer-demo/src/main/java/com/tsf/demo/consumer/proxy/MeshUserService.java
  8. 21 0
      consumer-demo/src/main/java/com/tsf/demo/consumer/proxy/ProviderDemoService.java
  9. 27 0
      consumer-demo/src/main/java/com/tsf/demo/consumer/proxy/ProviderService.java
  10. 71 0
      consumer-demo/src/main/java/com/tsf/demo/consumer/schedule/ScheduledProviderDemo.java
  11. 8 0
      consumer-demo/src/main/resources/application.yml
  12. 41 0
      consumer-demo/src/main/resources/bootstrap.yml
  13. 61 0
      doc/scg-demo.md
  14. 16 0
      kafka-demo/kafka-consumer/pom.xml
  15. 30 0
      kafka-demo/kafka-consumer/src/main/java/com/tsf/kafka/consumer/KafkaConsumer.java
  16. 37 0
      kafka-demo/kafka-consumer/src/main/java/com/tsf/kafka/consumer/cumsumer/KafkaReceiver.java
  17. 39 0
      kafka-demo/kafka-consumer/src/main/resources/application.yml
  18. 16 0
      kafka-demo/kafka-producer/pom.xml
  19. 28 0
      kafka-demo/kafka-producer/src/main/java/com/tsf/kafka/producer/KafkaProducer.java
  20. 42 0
      kafka-demo/kafka-producer/src/main/java/com/tsf/kafka/producer/beans/Message.java
  21. 27 0
      kafka-demo/kafka-producer/src/main/java/com/tsf/kafka/producer/controller/SenderController.java
  22. 40 0
      kafka-demo/kafka-producer/src/main/java/com/tsf/kafka/producer/schedule/ScheduleKafkaSender.java
  23. 40 0
      kafka-demo/kafka-producer/src/main/resources/application.yml
  24. 39 0
      kafka-demo/pom.xml
  25. 33 0
      mongodb-demo/pom.xml
  26. 29 0
      mongodb-demo/src/main/java/com/tsf/demo/mongodb/MongodbDemoApplication.java
  27. 74 0
      mongodb-demo/src/main/java/com/tsf/demo/mongodb/dto/User.java
  28. 55 0
      mongodb-demo/src/main/java/com/tsf/demo/mongodb/schedule/ScheduleMongodb.java
  29. 74 0
      mongodb-demo/src/main/java/com/tsf/demo/mongodb/service/MongoDbService.java
  30. 18 0
      mongodb-demo/src/main/resources/application.yml
  31. 21 0
      msgw-demo/msgw-scg/pom.xml
  32. 21 0
      msgw-demo/msgw-scg/src/main/java/com/tencent/tsf/msgw/scg/Application.java
  33. 35 0
      msgw-demo/msgw-scg/src/main/java/com/tencent/tsf/msgw/scg/filter/TestFilter.java
  34. 31 0
      msgw-demo/msgw-scg/src/main/resources/application.yml
  35. 30 0
      msgw-demo/msgw-zuul1/pom.xml
  36. 21 0
      msgw-demo/msgw-zuul1/src/main/java/com.tencent.tsf.msgw.zuul1/Application.java
  37. 44 0
      msgw-demo/msgw-zuul1/src/main/java/com.tencent.tsf.msgw.zuul1/filter/TestFilter.java
  38. 26 0
      msgw-demo/msgw-zuul1/src/main/resources/application.yml
  39. 20 0
      msgw-demo/pom.xml
  40. 71 0
      mysql-demo/pom.xml
  41. 22 0
      mysql-demo/schema/demo.sql
  42. 46 0
      mysql-demo/src/main/java/com/tsf/demo/mysql/MysqlDemoApplication.java
  43. 27 0
      mysql-demo/src/main/java/com/tsf/demo/mysql/config/DruidConfiguration.java
  44. 39 0
      mysql-demo/src/main/java/com/tsf/demo/mysql/dao/TsfCountDao.java
  45. 26 0
      mysql-demo/src/main/java/com/tsf/demo/mysql/dao/TsfMybatisUserDao.java
  46. 60 0
      mysql-demo/src/main/java/com/tsf/demo/mysql/dao/TsfUserDao.java
  47. 34 0
      mysql-demo/src/main/java/com/tsf/demo/mysql/domain/User.java
  48. 64 0
      mysql-demo/src/main/java/com/tsf/demo/mysql/schedule/ScheduledDemo.java
  49. 8 0
      mysql-demo/src/main/resources/application.yml
  50. 32 0
      mysql-demo/src/main/resources/bootstrap.yml
  51. 119 0
      opensource-scg-demo/pom.xml
  52. 25 0
      opensource-scg-demo/src/main/java/com/tencent/tsf/gateway/GatewayServerApplication.java
  53. 27 0
      opensource-scg-demo/src/main/resources/application.yml
  54. 20 0
      opensource-scg-demo/src/test/java/com/tencent/tsf/AppTest.java
  55. 23 0
      opensource-zuul-demo/pom.xml
  56. 25 0
      opensource-zuul-demo/src/main/java/com/tencent/tsf/demo/zuul/ZuulApplication.java
  57. 58 0
      opensource-zuul-demo/src/main/java/com/tencent/tsf/demo/zuul/filter/TestFilter.java
  58. 48 0
      opensource-zuul-demo/src/main/resources/application.yml
  59. 94 0
      pom.xml
  60. 77 0
      provider-demo/pom.xml
  61. 17 0
      provider-demo/src/main/java/com/tsf/demo/provider/ProviderApplication.java
  62. 61 0
      provider-demo/src/main/java/com/tsf/demo/provider/bean/po/MpMsCardApplicationLog.java
  63. 37 0
      provider-demo/src/main/java/com/tsf/demo/provider/bean/po/MpMsEcardApplicationLog.java
  64. 26 0
      provider-demo/src/main/java/com/tsf/demo/provider/bean/po/MpNation.java
  65. 98 0
      provider-demo/src/main/java/com/tsf/demo/provider/bean/po/MpUser.java
  66. 89 0
      provider-demo/src/main/java/com/tsf/demo/provider/bean/po/MpUserIdentification.java
  67. 37 0
      provider-demo/src/main/java/com/tsf/demo/provider/bean/po/MpUserIdentificationLog.java
  68. 51 0
      provider-demo/src/main/java/com/tsf/demo/provider/bean/po/MpUserToken.java
  69. 78 0
      provider-demo/src/main/java/com/tsf/demo/provider/bean/vo/MpUserVO.java
  70. 86 0
      provider-demo/src/main/java/com/tsf/demo/provider/common/BaseConstant.java
  71. 30 0
      provider-demo/src/main/java/com/tsf/demo/provider/common/ErrorResultCode.java
  72. 13 0
      provider-demo/src/main/java/com/tsf/demo/provider/common/IErrorCode.java
  73. 42 0
      provider-demo/src/main/java/com/tsf/demo/provider/common/IResultCode.java
  74. 21 0
      provider-demo/src/main/java/com/tsf/demo/provider/common/ObjectUtil.java
  75. 212 0
      provider-demo/src/main/java/com/tsf/demo/provider/common/R.java
  76. 113 0
      provider-demo/src/main/java/com/tsf/demo/provider/common/ResultCode.java
  77. 46 0
      provider-demo/src/main/java/com/tsf/demo/provider/common/enumcommon/OccupationEnum.java
  78. 51 0
      provider-demo/src/main/java/com/tsf/demo/provider/common/enumcommon/SexEnum.java
  79. 164 0
      provider-demo/src/main/java/com/tsf/demo/provider/common/siyuan/BeanSortUtil.java
  80. 16 0
      provider-demo/src/main/java/com/tsf/demo/provider/common/siyuan/CommonReq.java
  81. 12 0
      provider-demo/src/main/java/com/tsf/demo/provider/common/siyuan/Testa.java
  82. 20 0
      provider-demo/src/main/java/com/tsf/demo/provider/config/ProviderNameConfig.java
  83. 22 0
      provider-demo/src/main/java/com/tsf/demo/provider/config/ProviderNameConfigChangeListener.java
  84. 74 0
      provider-demo/src/main/java/com/tsf/demo/provider/controller/CardController.java
  85. 24 0
      provider-demo/src/main/java/com/tsf/demo/provider/controller/EnumController.java
  86. 54 0
      provider-demo/src/main/java/com/tsf/demo/provider/controller/LogController.java
  87. 35 0
      provider-demo/src/main/java/com/tsf/demo/provider/controller/MpUserController.java
  88. 14 0
      provider-demo/src/main/java/com/tsf/demo/provider/controller/MpUserIdentificationController.java
  89. 13 0
      provider-demo/src/main/java/com/tsf/demo/provider/controller/MpUserTokenController.java
  90. 26 0
      provider-demo/src/main/java/com/tsf/demo/provider/controller/NationController.java
  91. 122 0
      provider-demo/src/main/java/com/tsf/demo/provider/controller/ProviderController.java
  92. 62 0
      provider-demo/src/main/java/com/tsf/demo/provider/controller/SiYuanController.java
  93. 200 0
      provider-demo/src/main/java/com/tsf/demo/provider/controller/SiYuanUserController.java
  94. 104 0
      provider-demo/src/main/java/com/tsf/demo/provider/controller/SpanController.java
  95. 170 0
      provider-demo/src/main/java/com/tsf/demo/provider/controller/TenController.java
  96. 7 0
      provider-demo/src/main/java/com/tsf/demo/provider/dao/MpMsCardApplicationLogDao.java
  97. 7 0
      provider-demo/src/main/java/com/tsf/demo/provider/dao/MpMsEcardApplicationLogDao.java
  98. 7 0
      provider-demo/src/main/java/com/tsf/demo/provider/dao/MpNationDao.java
  99. 7 0
      provider-demo/src/main/java/com/tsf/demo/provider/dao/MpUserDao.java
  100. 0 0
      provider-demo/src/main/java/com/tsf/demo/provider/dao/MpUserIdentificationDao.java

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 腾讯云
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 77 - 0
README.md

@@ -0,0 +1,77 @@
+## Demo 工程目录
+
+|工程名称|工程说明|
+|---|---|
+|consumer-demo|TSF微服务治理服务消费者|
+|provider-demo|TSF微服务治理服务提供者|
+|msgw-demo|基于TSF Spring Cloud MS Gateway 网关示例|
+|opensource-zuul-demo|基于开源 Zuul 的微服务网关示例|
+|opensource-scg-demo|基于开源Spring Cloud Gateway的微服务网关示例|
+|rocketmq-producer|支持RocketMQ 消息队列调用链的消息生产者示例|
+|rocketmq-consumer|支持RocketMQ 消息队列调用链的消息消费者示例|
+|kafka-demo|支持Kafka调用链的示例,包含了消息消费者和生产者,|
+|mongodb-demo|支持MongoDB调用链的微服务示例|
+|mysql-demo|支持MySQL调用链的微服务示例|
+|redis-demo|支持Redis调用链的微服务示例||
+|task-schedule-demo|TCT分布式任务调度示例|
+
+## 依赖说明
+
+pom.xml 中定义了工程需要的依赖包(以下以基于 Spring Cloud Greenwich 版本 SDK 举例说明):
+
+```xml
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>com.tencent.tsf</groupId>
+        <artifactId>spring-cloud-tsf-dependencies</artifactId>
+        <version>1.23.0-Greenwich-RELEASE</version>
+    </parent>
+
+    <groupId>com.tencent.tsf</groupId>
+    <artifactId>tsf-demo</artifactId>
+    <version>1.23.0-Greenwich-RELEASE</version>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>provider-demo</module>
+        <module>consumer-demo</module>
+        <module>opensource-zuul-demo</module>
+        <module>rocketmq-demo</module>
+        <module>mysql-demo</module>
+        <module>redis-demo</module>
+        <module>mongodb-demo</module>
+        <module>kafka-demo</module>
+        <module>msgw-demo</module>
+        <module>opensource-scg-demo</module>
+    </modules>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+</project>
+
+```
+
+其中 parent 描述了不同微服务 demo 共同的 TSF 依赖。
+
+```xml
+<parent>
+        <groupId>com.tencent.tsf</groupId>
+        <artifactId>spring-cloud-tsf-dependencies</artifactId>
+        <version><!-- 调整为 SDK 最新版本号 --></version>
+</parent>
+```

+ 21 - 0
consumer-demo/pom.xml

@@ -0,0 +1,21 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>com.tencent.tsf</groupId>
+		<artifactId>tsf-demo</artifactId>
+		<version>1.23.0-Greenwich-RELEASE</version>
+	</parent>
+	<artifactId>consumer-demo</artifactId>
+	<packaging>jar</packaging>
+	<name>consumer-demo</name>
+
+	<dependencies>
+		<!-- TSF 启动器 -->
+		<dependency>
+			<groupId>com.tencent.tsf</groupId>
+			<artifactId>spring-cloud-tsf-starter</artifactId>
+		</dependency>
+	</dependencies>
+</project>

+ 31 - 0
consumer-demo/src/main/java/com/tsf/demo/consumer/ConsumerApplication.java

@@ -0,0 +1,31 @@
+package com.tsf.demo.consumer;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.loadbalancer.LoadBalanced;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.Bean;
+import org.springframework.tsf.annotation.EnableTsf;
+import org.springframework.web.client.AsyncRestTemplate;
+import org.springframework.web.client.RestTemplate;
+
+@SpringBootApplication
+@EnableFeignClients // 使用Feign微服务调用时请启用
+@EnableTsf
+public class ConsumerApplication {
+    @LoadBalanced
+    @Bean
+    public RestTemplate restTemplate() {
+        return new RestTemplate();
+    }
+
+    @LoadBalanced
+    @Bean
+    public AsyncRestTemplate asyncRestTemplate() {
+        return new AsyncRestTemplate();
+    }
+
+    public static void main(String[] args) throws InterruptedException {
+        SpringApplication.run(ConsumerApplication.class, args);
+    }
+}

+ 84 - 0
consumer-demo/src/main/java/com/tsf/demo/consumer/controller/ConsumerController.java

@@ -0,0 +1,84 @@
+package com.tsf.demo.consumer.controller;
+
+import com.tsf.demo.consumer.entity.CustomMetadata;
+import com.tsf.demo.consumer.proxy.MeshUserService;
+import com.tsf.demo.consumer.proxy.ProviderDemoService;
+import com.tsf.demo.consumer.proxy.ProviderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.tsf.core.TsfContext;
+import org.springframework.util.StringUtils;
+import org.springframework.util.concurrent.ListenableFuture;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.client.AsyncRestTemplate;
+import org.springframework.web.client.RestTemplate;
+
+@RestController
+public class ConsumerController {
+	@Autowired
+	private RestTemplate restTemplate;
+	@Autowired
+	private AsyncRestTemplate asyncRestTemplate;
+    @Autowired
+    private ProviderService providerService;
+	@Autowired
+	private ProviderDemoService providerDemoService;
+	@Autowired
+	private MeshUserService meshUserService;
+
+	@RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET)
+	public String restProvider(@PathVariable String str,
+							   @RequestParam(required = false) String tagName,
+							   @RequestParam(required = false) String tagValue) {
+		if (!StringUtils.isEmpty(tagName)) {
+			TsfContext.putTag(tagName, tagValue);
+            TsfContext.putCustomMetadata(new CustomMetadata(tagName, tagValue));
+		}
+		return restTemplate.getForObject("http://provider-demo/echo/" + str, String.class);
+	}
+
+	@RequestMapping(value = "/echo-async-rest/{str}", method = RequestMethod.GET)
+	public String asyncRestProvider(@PathVariable String str,
+									@RequestParam(required = false) String tagName,
+									@RequestParam(required = false) String tagValue) throws Exception {
+		if (!StringUtils.isEmpty(tagName)) {
+			TsfContext.putTag(tagName, tagValue);
+            TsfContext.putCustomMetadata(new CustomMetadata(tagName, tagValue));
+		}
+		ListenableFuture<ResponseEntity<String>> future = asyncRestTemplate
+				.getForEntity("http://provider-demo/echo/" + str, String.class);
+		return future.get().getBody();
+	}
+
+	@RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET)
+	public String feignProvider(@PathVariable String str,
+								@RequestParam(required = false) String tagName,
+								@RequestParam(required = false) String tagValue) {
+		if (!StringUtils.isEmpty(tagName)) {
+			TsfContext.putTag(tagName, tagValue);
+            TsfContext.putCustomMetadata(new CustomMetadata(tagName, tagValue));
+		}
+		return providerDemoService.echo(str);
+	}
+
+    @RequestMapping(value = "/echo-feign-url/{str}", method = RequestMethod.GET)
+    public String feignUrlProvider(@PathVariable String str,
+                                   @RequestParam(required = false) String tagName,
+                                   @RequestParam(required = false) String tagValue) {
+        if (!StringUtils.isEmpty(tagName)) {
+            TsfContext.putTag(tagName, tagValue);
+            TsfContext.putCustomMetadata(new CustomMetadata(tagName, tagValue));
+        }
+        return providerService.echo(str);
+    }
+
+	@RequestMapping(value = "/user-feign", method = RequestMethod.GET)
+	public String feignMeshUser(@RequestParam(required = false) String tagName,
+								@RequestParam(required = false) String tagValue) {
+		if (!StringUtils.isEmpty(tagName)) {
+			TsfContext.putTag(tagName, tagValue);
+            TsfContext.putCustomMetadata(new CustomMetadata(tagName, tagValue));
+		}
+		return meshUserService.create();
+	}
+}

+ 15 - 0
consumer-demo/src/main/java/com/tsf/demo/consumer/entity/CustomMetadata.java

@@ -0,0 +1,15 @@
+package com.tsf.demo.consumer.entity;
+
+/**
+ * 用户自定义 Metadata
+ */
+public class CustomMetadata {
+
+    private String name;
+    private String value;
+
+    public CustomMetadata(String name, String value) {
+        this.name = name;
+        this.value = value;
+    }
+}

+ 11 - 0
consumer-demo/src/main/java/com/tsf/demo/consumer/proxy/MeshUserService.java

@@ -0,0 +1,11 @@
+package com.tsf.demo.consumer.proxy;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@FeignClient(name = "user")
+public interface MeshUserService {
+    @RequestMapping(value = "/api/v6/user/create", method = RequestMethod.GET)
+    String create();
+}

+ 21 - 0
consumer-demo/src/main/java/com/tsf/demo/consumer/proxy/ProviderDemoService.java

@@ -0,0 +1,21 @@
+package com.tsf.demo.consumer.proxy;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@FeignClient(name = "provider-demo")
+public interface ProviderDemoService {
+    @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
+    String echo(@PathVariable("str") String str);
+
+    @RequestMapping(value = "/echoTracer/{str}", method = RequestMethod.GET)
+    String echoTracer(@PathVariable("str") String str);
+
+    @RequestMapping(value = "/echo/error/{str}", method = RequestMethod.GET)
+    String echoError(@PathVariable("str") String str);
+
+    @RequestMapping(value = "/echo/slow/{str}", method = RequestMethod.GET)
+    String echoSlow(@PathVariable("str") String str);
+}

+ 27 - 0
consumer-demo/src/main/java/com/tsf/demo/consumer/proxy/ProviderService.java

@@ -0,0 +1,27 @@
+package com.tsf.demo.consumer.proxy;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * 测试通过URL配置FeignClient
+ * 使用时修改provider-ip:provider-port配置
+ */
+@FeignClient(name = "provider", url = "http://127.0.0.1:18081", fallback = FeignClientFallback.class)
+public interface ProviderService {
+
+    @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
+    String echo(@PathVariable("str") String str);
+
+}
+
+@Component
+class FeignClientFallback implements ProviderService {
+    @Override
+    public String echo(String str) {
+        return "tsf-fault-tolerance-" + str;
+    }
+}

+ 71 - 0
consumer-demo/src/main/java/com/tsf/demo/consumer/schedule/ScheduledProviderDemo.java

@@ -0,0 +1,71 @@
+package com.tsf.demo.consumer.schedule;
+
+import com.tsf.demo.consumer.entity.CustomMetadata;
+import com.tsf.demo.consumer.proxy.ProviderDemoService;
+import com.tsf.demo.consumer.proxy.ProviderService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.tsf.faulttolerance.annotation.TsfFaultTolerance;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.tsf.core.TsfContext;
+
+import com.tsf.demo.consumer.proxy.ProviderDemoService;
+
+@EnableScheduling
+@Service
+public class ScheduledProviderDemo {
+    private static final Logger LOG = LoggerFactory.getLogger(ScheduledProviderDemo.class);
+
+    @Autowired
+    private ProviderService providerService;
+
+    @Autowired
+    private ProviderDemoService providerDemoService;
+
+    @Scheduled(fixedDelayString = "${consumer.auto.test.interval:1000}")
+    public void doWork() throws InterruptedException {
+        TsfContext.putTag("test", "123");
+        TsfContext.putCustomMetadata(new CustomMetadata("test", "123"));
+        String response = providerDemoService.echo("auto-test");
+        LOG.info("consumer-demo auto test, response: [" + response + "]");
+    }
+
+    // 异常熔断测试,需要测试熔断时打开注释
+    @Scheduled(fixedDelayString = "${consumer.auto.test.interval:1000}")
+//    @TsfFaultTolerance(fallbackMethod = "doWorkFallback")
+//    public void doWorkWithError() throws InterruptedException {
+//        String response = providerDemoService.echoError("auto-test-error");
+//        LOG.info("consumer-demo auto test, response: [" + response + "]");
+//    }
+
+    // 慢请求熔断测试,需要测试熔断时打开注释
+//    @Scheduled(fixedDelayString = "${consumer.auto.test.interval:100}")
+//    @TsfFaultTolerance(fallbackMethod = "doWorkFallback")
+//    public void doWorkWithError() throws InterruptedException {
+//        String response = providerDemoService.echoSlow("auto-test-slow");
+//        LOG.info("consumer-demo auto test, response: [" + response + "]");
+//    }
+
+    public void doWorkFallback() {
+        LOG.info("consumer-demo auto test fallback.");
+    }
+
+    //测试URL配置FeignClient时启用
+    /*@Scheduled(fixedDelayString = "${consumer.auto.test.interval:10000}")
+    public void doUrlTest() throws InterruptedException {
+        TsfContext.putTag("test", "123");
+        String response = providerService.echo("auto-test");
+        LOG.info("consumer-demo auto test, response: [" + response + "]");
+    }*/
+
+    @Scheduled(fixedDelayString = "${consumer.auto.test.interval:1000}")
+    public void doWorkTracer() throws InterruptedException {
+        TsfContext.putTag("test", "123");
+        TsfContext.putCustomMetadata(new CustomMetadata("test", "123"));
+        String response = providerDemoService.echoTracer("auto-test");
+        LOG.info("consumer-demo auto test, response: [" + response + "]");
+    }
+}

+ 8 - 0
consumer-demo/src/main/resources/application.yml

@@ -0,0 +1,8 @@
+logging:
+  file: /tsf-demo-logs/${spring.application.name}/root.log
+  level: 
+    root: INFO
+management:
+  security:
+    enabled: false
+

+ 41 - 0
consumer-demo/src/main/resources/bootstrap.yml

@@ -0,0 +1,41 @@
+server:
+  port: 18083
+spring:
+  application:
+    name: consumer-demo
+
+feign:
+  tsf:
+    enabled: true
+
+#本地测试时打开
+tsf_namespace_id: default_namespace
+
+#方便本地自测调试
+tsf:
+  circuit-breaker:
+    rules:
+      - targetServiceName: provider-demo
+        isolationLevel: SERVICE
+        targetNamespaceId: "default_namespace"
+        strategyList:
+          - slidingWindowSize: 10
+            minimumNumberOfCalls: 10
+            failureRateThreshold: 40
+            waitDurationInOpenState: 5
+            maxEjectionPercent: 51
+            slowCallDurationThreshold: 800
+            slowCallRateThreshold: 50
+            apiList:
+              - method: GET
+                path: "/echo/{param}"
+              - method: GET
+                path: "/echo2/{str}"
+
+ribbon:
+  MaxAutoRetries: 0
+  # 同一个微服务其他实例的最大重试次数,不包括第一次调用的实例。默认值为1
+  MaxAutoRetriesNextServer: 0
+  # 是否所有操作(GET、POST等)都允许重试。默认值为false
+  OkToRetryOnAllOperations: false
+  ReadTimeout: 10000

+ 61 - 0
doc/scg-demo.md

@@ -0,0 +1,61 @@
+# scg-demo 
+
+## 说明
+ scg-demo 是基于spring-cloud-gateway v2.0.2,且集成TSF服务注册发现功能的一个简单网关应用DEMO。
+
+
+## 物料准备
+### 物料列表
+- provider-demo
+- scg-demo
+
+## 服务部署
+### provider-demo
+1. 编译打包
+```
+cd ./tsf-demo-simple/provider-demo
+mvn clean complie install
+```
+2. 启动应用
+```
+cd ./tsf-demo-simple/provider-demo/target
+java -jar provider-demo-xxx.jar
+```
+- `xxx` 版本号, 按需改动 
+
+### scg-demo
+
+1. 编译打包
+```
+cd ./tsf-demo-simple/scg-demo
+mvn clean complie install
+```
+2. 启动应用
+```
+cd ./tsf-demo-simple/scg-demo/target
+java -jar scg-demo-xxx.jar
+```
+- `xxx` 版本号, 按需改动 
+## 功能测试 
+
+provider-demo 中提供了多个API接口, 可通过scg进行代理访问。以/echo/{param}接口为例进行说明。
+
+### API访问
+
+可通过curl命令或者浏览器发送请命令。
+
+```
+curl -i -X GET http://<网关IP>:<网关PORT>/provider-demo/echo/123
+```
+> <网关IP>:<网关port> 自行替换
+
+- 预期返回
+```
+request param: 2, response from echo-provider-default-nam
+```
+
+
+
+
+
+ 

+ 16 - 0
kafka-demo/kafka-consumer/pom.xml

@@ -0,0 +1,16 @@
+<?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">
+    <parent>
+        <artifactId>kafka-demo</artifactId>
+        <groupId>com.tencent.tsf</groupId>
+        <version>1.23.0-Greenwich-RELEASE</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kafka-consumer</artifactId>
+    <name>kafka-consumer</name>
+    <packaging>jar</packaging>
+
+</project>

+ 30 - 0
kafka-demo/kafka-consumer/src/main/java/com/tsf/kafka/consumer/KafkaConsumer.java

@@ -0,0 +1,30 @@
+package com.tsf.kafka.consumer;
+
+import com.tencent.tsf.monitor.annotation.EnableTsfMonitor;
+import com.tencent.tsf.sleuth.annotation.EnableTsfSleuth;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.cloud.tsf.route.annotation.EnableTsfRoute;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.tsf.auth.annotation.EnableTsfAuth;
+import org.springframework.tsf.ratelimit.annotation.EnableTsfRateLimit;
+
+
+@SpringBootApplication
+@EnableDiscoveryClient // 使用服务注册发现时请启用
+@EnableFeignClients // 使用Feign微服务调用时请启用
+@EnableScheduling
+@EnableTsfAuth
+@EnableTsfRoute
+@EnableTsfRateLimit
+@EnableTsfSleuth
+@EnableTsfMonitor
+public class KafkaConsumer {
+
+
+    public static void main(String[] args) {
+        SpringApplication.run(KafkaConsumer.class, args);
+    }
+}

+ 37 - 0
kafka-demo/kafka-consumer/src/main/java/com/tsf/kafka/consumer/cumsumer/KafkaReceiver.java

@@ -0,0 +1,37 @@
+package com.tsf.kafka.consumer.cumsumer;
+
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.kafka.annotation.KafkaListener;
+import org.springframework.stereotype.Component;
+
+import java.util.Optional;
+
+@Component
+public class KafkaReceiver {
+    private static final Logger logger = LoggerFactory.getLogger(KafkaReceiver.class);
+
+
+
+    @KafkaListener(topics = "zhizhang3")
+    public void listen(ConsumerRecord<?, ?> record) {
+
+        Optional<?> kafkaMessage = Optional.ofNullable(record.value());
+
+        try{
+            Thread.sleep(10);
+        }catch (Exception e){
+
+        }
+
+        if (kafkaMessage.isPresent()) {
+
+            Object message = kafkaMessage.get();
+
+            logger.info("----------------- record =" + record);
+            logger.info("------------------ message =" + message);
+        }
+
+    }
+}

+ 39 - 0
kafka-demo/kafka-consumer/src/main/resources/application.yml

@@ -0,0 +1,39 @@
+server:
+  servlet:
+    context-path: /
+  port: 28080
+spring:
+  application:
+    name: consumer-demo
+  kafka:
+    bootstrap-servers: 127.0.0.1:9092
+    #生产者的配置,大部分我们可以使用默认的,这里列出几个比较重要的属性
+    producer:
+      #每批次发送消息的数量
+      batch-size: 16
+      #设置大于0的值将使客户端重新发送任何数据,一旦这些数据发送失败。注意,这些重试与客户端接收到发送错误时的重试没有什么不同。允许重试将潜在的改变数据的顺序,如果这两个消息记录都是发送到同一个partition,则第一个消息失败第二个发送成功,则第二条消息会比第一条消息出现要早。
+      retries: 0
+      #producer可以用来缓存数据的内存大小。如果数据产生速度大于向broker发送的速度,producer会阻塞或者抛出异常,以“block.on.buffer.full”来表明。这项设置将和producer能够使用的总内存相关,但并不是一个硬性的限制,因为不是producer使用的所有内存都是用于缓存。一些额外的内存会用于压缩(如果引入压缩机制),同样还有一些用于维护请求。
+      buffer-memory: 33554432
+      #key序列化方式
+      key-serializer: org.apache.kafka.common.serialization.StringSerializer
+      value-serializer: org.apache.kafka.common.serialization.StringSerializer
+    #消费者的配置
+    consumer:
+      #Kafka中没有初始偏移或如果当前偏移在服务器上不再存在时,默认区最新 ,有三个选项 【latest, earliest, none】
+      auto-offset-reset: latest
+      #是否开启自动提交
+      enable-auto-commit: true
+      #自动提交的时间间隔
+      auto-commit-interval: 100
+      #key的解码方式
+      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+      #value的解码方式
+      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+      #在/usr/local/etc/kafka/consumer.properties中有配置
+      group-id: test-consumer-group
+tsf:
+  swagger:
+    enabled: false
+logging:
+  file: /tsf-demo-logs/${spring.application.name}/root.log

+ 16 - 0
kafka-demo/kafka-producer/pom.xml

@@ -0,0 +1,16 @@
+<?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">
+    <parent>
+        <artifactId>kafka-demo</artifactId>
+        <groupId>com.tencent.tsf</groupId>
+        <version>1.23.0-Greenwich-RELEASE</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kafka-producer</artifactId>
+    <name>kafka-producer</name>
+    <packaging>jar</packaging>
+
+</project>

+ 28 - 0
kafka-demo/kafka-producer/src/main/java/com/tsf/kafka/producer/KafkaProducer.java

@@ -0,0 +1,28 @@
+package com.tsf.kafka.producer;
+
+import com.tencent.tsf.monitor.annotation.EnableTsfMonitor;
+import com.tencent.tsf.sleuth.annotation.EnableTsfSleuth;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.cloud.tsf.route.annotation.EnableTsfRoute;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.tsf.auth.annotation.EnableTsfAuth;
+import org.springframework.tsf.ratelimit.annotation.EnableTsfRateLimit;
+
+@SpringBootApplication
+@EnableDiscoveryClient // 使用服务注册发现时请启用
+@EnableFeignClients // 使用Feign微服务调用时请启用
+@EnableScheduling
+@EnableTsfAuth
+@EnableTsfRoute
+@EnableTsfRateLimit
+@EnableTsfSleuth
+@EnableTsfMonitor
+public class KafkaProducer {
+
+    public static void main(String[] args) {
+        SpringApplication.run(KafkaProducer.class, args);
+    }
+}

+ 42 - 0
kafka-demo/kafka-producer/src/main/java/com/tsf/kafka/producer/beans/Message.java

@@ -0,0 +1,42 @@
+package com.tsf.kafka.producer.beans;
+
+
+import java.util.Date;
+
+
+public class Message {
+    private Long id;    //id
+
+    private String msg; //消息
+
+    private Date sendTime;  //时间戳
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public Date getSendTime() {
+        return sendTime;
+    }
+
+    public void setSendTime(Date sendTime) {
+        this.sendTime = sendTime;
+    }
+
+    @Override
+    public String toString() {
+        return "id:"+id+",msg:"+msg+",sendTime:"+sendTime.toString();
+    }
+}

+ 27 - 0
kafka-demo/kafka-producer/src/main/java/com/tsf/kafka/producer/controller/SenderController.java

@@ -0,0 +1,27 @@
+package com.tsf.kafka.producer.controller;
+
+import com.tsf.kafka.producer.schedule.ScheduleKafkaSender;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Controller
+@RequestMapping("/producer")
+public class SenderController {
+
+    @Autowired
+    private ScheduleKafkaSender scheduleKafkaSender;
+
+
+    @ResponseBody
+    @RequestMapping("/send")
+    public String send(){
+        try{
+            scheduleKafkaSender.doWork();
+        }catch (Exception e){
+            return "error";
+        }
+        return "success";
+    }
+}

+ 40 - 0
kafka-demo/kafka-producer/src/main/java/com/tsf/kafka/producer/schedule/ScheduleKafkaSender.java

@@ -0,0 +1,40 @@
+package com.tsf.kafka.producer.schedule;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.tsf.kafka.producer.beans.Message;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicLong;
+
+@Service
+public class ScheduleKafkaSender {
+    private static final Logger logger = LoggerFactory.getLogger(ScheduleKafkaSender.class);
+    @Autowired
+    private KafkaTemplate<String, String> kafkaTemplate;
+
+    private Gson gson = new GsonBuilder().create();
+
+    private static final AtomicLong id = new AtomicLong(0);
+
+    @Scheduled(fixedDelayString = "${consumer.auto.test.interval:5000}")
+    public void doWork() throws Exception{
+
+        Message message = new Message();
+        message.setId(id.getAndAdd(1));
+        message.setMsg(UUID.randomUUID().toString());
+        message.setSendTime(new Date());
+        logger.info("+++++++++++++++++++++  message = {}", gson.toJson(message));
+
+        Thread.sleep(5);
+
+        kafkaTemplate.send("zhizhang3", gson.toJson(message));
+    }
+}

+ 40 - 0
kafka-demo/kafka-producer/src/main/resources/application.yml

@@ -0,0 +1,40 @@
+server:
+  servlet:
+    context-path: /
+  port: 18080
+spring:
+  application:
+    name: producer-demo
+  kafka:
+    bootstrap-servers: 127.0.0.1:9092
+    #生产者的配置,大部分我们可以使用默认的,这里列出几个比较重要的属性
+    producer:
+      #每批次发送消息的数量
+      batch-size: 16
+      #设置大于0的值将使客户端重新发送任何数据,一旦这些数据发送失败。注意,这些重试与客户端接收到发送错误时的重试没有什么不同。允许重试将潜在的改变数据的顺序,如果这两个消息记录都是发送到同一个partition,则第一个消息失败第二个发送成功,则第二条消息会比第一条消息出现要早。
+      retries: 0
+      #producer可以用来缓存数据的内存大小。如果数据产生速度大于向broker发送的速度,producer会阻塞或者抛出异常,以“block.on.buffer.full”来表明。这项设置将和producer能够使用的总内存相关,但并不是一个硬性的限制,因为不是producer使用的所有内存都是用于缓存。一些额外的内存会用于压缩(如果引入压缩机制),同样还有一些用于维护请求。
+      buffer-memory: 33554432
+      #key序列化方式
+      key-serializer: org.apache.kafka.common.serialization.StringSerializer
+      value-serializer: org.apache.kafka.common.serialization.StringSerializer
+    #消费者的配置
+    consumer:
+      #Kafka中没有初始偏移或如果当前偏移在服务器上不再存在时,默认区最新 ,有三个选项 【latest, earliest, none】
+      auto-offset-reset: latest
+      #是否开启自动提交
+      enable-auto-commit: true
+      #自动提交的时间间隔
+      auto-commit-interval: 100
+      #key的解码方式
+      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+      #value的解码方式
+      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+      #在/usr/local/etc/kafka/consumer.properties中有配置
+      group-id: test-consumer-group
+
+tsf:
+  swagger:
+    enabled: false
+logging:
+  file: /tsf-demo-logs/${spring.application.name}/root.log

+ 39 - 0
kafka-demo/pom.xml

@@ -0,0 +1,39 @@
+<?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">
+    <parent>
+        <artifactId>tsf-demo</artifactId>
+        <groupId>com.tencent.tsf</groupId>
+        <version>1.23.0-Greenwich-RELEASE</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kafka-demo</artifactId>
+    <name>kafka-demo</name>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>kafka-producer</module>
+        <module>kafka-consumer</module>
+    </modules>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <!-- TSF 启动器 -->
+        <dependency>
+            <groupId>com.tencent.tsf</groupId>
+            <artifactId>spring-cloud-tsf-starter</artifactId>
+        </dependency>
+
+        <!--支持kafka使用调用链-->
+        <dependency>
+            <groupId>org.springframework.kafka</groupId>
+            <artifactId>spring-kafka</artifactId>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+</project>

+ 33 - 0
mongodb-demo/pom.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.tencent.tsf</groupId>
+        <artifactId>tsf-demo</artifactId>
+        <version>1.23.0-Greenwich-RELEASE</version>
+    </parent>
+
+    <artifactId>mongodb-demo</artifactId>
+    <packaging>jar</packaging>
+    <name>mongodb-demo</name>
+    <description>Demo project for Spring Boot</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <!-- TSF 启动器 -->
+        <dependency>
+            <groupId>com.tencent.tsf</groupId>
+            <artifactId>spring-cloud-tsf-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-mongodb</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 29 - 0
mongodb-demo/src/main/java/com/tsf/demo/mongodb/MongodbDemoApplication.java

@@ -0,0 +1,29 @@
+package com.tsf.demo.mongodb;
+
+import com.tencent.tsf.monitor.annotation.EnableTsfMonitor;
+import com.tencent.tsf.sleuth.annotation.EnableTsfSleuth;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.cloud.tsf.route.annotation.EnableTsfRoute;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.tsf.auth.annotation.EnableTsfAuth;
+import org.springframework.tsf.ratelimit.annotation.EnableTsfRateLimit;
+
+@SpringBootApplication
+@EnableDiscoveryClient // 使用服务注册发现时请启用
+@EnableFeignClients // 使用Feign微服务调用时请启用
+@EnableScheduling
+@EnableTsfAuth
+@EnableTsfRoute
+@EnableTsfRateLimit
+@EnableTsfSleuth
+@EnableTsfMonitor
+public class MongodbDemoApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(MongodbDemoApplication.class, args);
+    }
+
+}

+ 74 - 0
mongodb-demo/src/main/java/com/tsf/demo/mongodb/dto/User.java

@@ -0,0 +1,74 @@
+package com.tsf.demo.mongodb.dto;
+
+import java.io.Serializable;
+
+public class User implements Serializable {
+    private Long id;
+    private String name;
+    private Integer age;
+    private String gender;
+    private String address;
+
+    public User(){
+
+    }
+
+    public User(Long id, String name, Integer age, String gender, String address) {
+        this.id = id;
+        this.name = name;
+        this.age = age;
+        this.gender = gender;
+        this.address = address;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getAge() {
+        return age;
+    }
+
+    public void setAge(Integer age) {
+        this.age = age;
+    }
+
+    public String getGender() {
+        return gender;
+    }
+
+    public void setGender(String gender) {
+        this.gender = gender;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    @Override
+    public String toString() {
+        return "User{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", age=" + age +
+                ", gender='" + gender + '\'' +
+                ", address='" + address + '\'' +
+                '}';
+    }
+}

+ 55 - 0
mongodb-demo/src/main/java/com/tsf/demo/mongodb/schedule/ScheduleMongodb.java

@@ -0,0 +1,55 @@
+package com.tsf.demo.mongodb.schedule;
+
+import com.tsf.demo.mongodb.dto.User;
+import com.tsf.demo.mongodb.service.MongoDbService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import java.util.Iterator;
+import java.util.List;
+
+@Service
+public class ScheduleMongodb {
+    private static final Logger logger = LoggerFactory.getLogger(ScheduleMongodb.class);
+
+    @Autowired
+    private MongoDbService mongoDbService;
+
+    private static  User user = new User((long)100,"mongodb-auto-test",26,"man","深圳");
+
+    private static  User userUpdater = new User((long)100,"mongodb-auto-test",23,"girl","上海");
+
+    private static HttpEntity<User> request = new HttpEntity<>(user);
+
+    @Scheduled(fixedDelayString = "${consumer.auto.test.interval:5000}")
+    public void doWork() throws InterruptedException, Exception{
+
+        mongoDbService.save(user);
+        findResult();
+
+        mongoDbService.update(userUpdater);
+        findResult();
+
+        mongoDbService.deleteById(100L);
+    }
+
+    private void findResult(){
+        User userById = mongoDbService.findById(100L);
+        logger.info("find user by id: {},result is: {}",100,userById);
+        List<User> usersList = mongoDbService.findByName("mongodb-auto-test");
+        for (User user1 : usersList) {
+            logger.info("find user by name: {},result is: {}","mongodb-auto-test",user1);
+        }
+
+        List<User> all = mongoDbService.findAll();
+        Iterator<User> iterator = all.iterator();
+        while (iterator.hasNext()){
+            logger.info("find all, result is: {}",iterator.next());
+        }
+    }
+
+}

+ 74 - 0
mongodb-demo/src/main/java/com/tsf/demo/mongodb/service/MongoDbService.java

@@ -0,0 +1,74 @@
+package com.tsf.demo.mongodb.service;
+
+import com.tsf.demo.mongodb.dto.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.regex.Pattern;
+
+@Component
+public class MongoDbService {
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+
+    public void save(User user) {
+        mongoTemplate.save(user);
+    }
+
+
+    public void update(User user) {
+        //创建更新条件
+        Query query = new Query();
+        Criteria criteria = Criteria.where("id").is(user.getId());
+        query.addCriteria(criteria);
+
+        //创建更新对象
+        Update update = new Update();
+        update.set("name", user.getName());
+        update.set("age", user.getAge());
+        update.set("gender", user.getGender());
+        update.set("address", user.getAddress());
+
+        //更新所有符合条件的记录
+        mongoTemplate.updateMulti(query, update, User.class);
+    }
+
+
+    public void deleteById(Long id) {
+        //创建删除条件
+        Query query = new Query();
+        Criteria criteria = Criteria.where("id").is(id);
+        query.addCriteria(criteria);
+        mongoTemplate.remove(query, User.class);
+    }
+
+
+    public User findById(Long id) {
+        Query query = new Query();
+        Criteria criteria = Criteria.where("id").is(id);
+        query.addCriteria(criteria);
+        return mongoTemplate.findOne(query, User.class);
+    }
+
+
+    public List<User> findAll() {
+        return mongoTemplate.findAll(User.class);
+    }
+
+
+    public List<User> findByName(String name) {
+        Query query = new Query();
+        //模糊查询,不区分大小写
+        Pattern pattern = Pattern.compile("^.*" + name + ".*$", Pattern.CASE_INSENSITIVE);
+        Criteria criteria = Criteria.where("name").regex(pattern);
+        query.addCriteria(criteria);
+        return mongoTemplate.find(query, User.class);
+    }
+}

+ 18 - 0
mongodb-demo/src/main/resources/application.yml

@@ -0,0 +1,18 @@
+server:
+  port: 18101
+spring:
+  application:
+    name: mongodb-demo
+  data:
+    mongodb:
+      uri: mongodb://localhost:27017/test
+
+
+logging:
+  file: /tsf-demo-logs/${spring.application.name}/root.log
+  level:
+    root: INFO
+
+tsf:
+  swagger:
+    enabled: false

+ 21 - 0
msgw-demo/msgw-scg/pom.xml

@@ -0,0 +1,21 @@
+<?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">
+  <parent>
+    <artifactId>msgw-demo</artifactId>
+    <groupId>com.tencent.tsf</groupId>
+    <version>1.23.0-Greenwich-RELEASE</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>msgw-scg</artifactId>
+
+
+  <dependencies>
+    <dependency>
+      <groupId>com.tencent.tsf</groupId>
+      <artifactId>spring-cloud-tsf-msgw-scg</artifactId>
+    </dependency>
+  </dependencies>
+</project>

+ 21 - 0
msgw-demo/msgw-scg/src/main/java/com/tencent/tsf/msgw/scg/Application.java

@@ -0,0 +1,21 @@
+package com.tencent.tsf.msgw.scg;
+
+import com.tencent.tsf.monitor.annotation.EnableTsfMonitor;
+import com.tencent.tsf.sleuth.annotation.EnableTsfSleuth;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+/**
+ * @author seanlxliu
+ */
+@SpringBootApplication
+@EnableDiscoveryClient
+@EnableTsfSleuth
+@EnableTsfMonitor
+public class Application {
+
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+}

+ 35 - 0
msgw-demo/msgw-scg/src/main/java/com/tencent/tsf/msgw/scg/filter/TestFilter.java

@@ -0,0 +1,35 @@
+package com.tencent.tsf.msgw.scg.filter;
+
+import com.tencent.tsf.gateway.core.annotation.TsfGatewayFilter;
+import com.tencent.tsf.gateway.scg.AbstractTsfGlobalFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+/**
+ * @author seanlxliu
+ */
+@TsfGatewayFilter
+public class TestFilter extends AbstractTsfGlobalFilter {
+
+    private static final Logger logger = LoggerFactory.getLogger(TestFilter.class);
+
+    @Override
+    public int getOrder() {
+        return 100;
+    }
+
+    @Override
+    public boolean shouldFilter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        return true;
+    }
+
+    @Override
+    public Mono<Void> doFilter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        System.out.println("hello world");
+        logger.info("hello world");
+        return chain.filter(exchange);
+    }
+}

+ 31 - 0
msgw-demo/msgw-scg/src/main/resources/application.yml

@@ -0,0 +1,31 @@
+server:
+  port: 8080
+  error:
+    include-exception: true
+spring:
+  application:
+    name: msgw-scg
+  cloud:
+    gateway:
+      discovery:
+        locator:
+          enabled: true
+          lower-case-service-id: false
+      httpclient:
+        # The connect timeout in millis, the default is 45s.
+        connectTimeout: 200
+        responseTimeout: 10s
+      # 设置msgw-scg全局代理,使用TSF API分组管理
+      routes:
+      - id: wildcard_tsf_gateway
+        uri: lb://wildcard_tsf_gateway
+        predicates:
+        - Path= /**
+    consul:
+        enabled: true
+        scheme: HTTP
+
+logging:
+  file: /tsf-demo-logs/${spring.application.name}/root.log
+  level:
+    root: INFO

+ 30 - 0
msgw-demo/msgw-zuul1/pom.xml

@@ -0,0 +1,30 @@
+<?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">
+  <parent>
+    <artifactId>msgw-demo</artifactId>
+    <groupId>com.tencent.tsf</groupId>
+    <version>1.23.0-Greenwich-RELEASE</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>msgw-zuul1</artifactId>
+
+  <dependencies>
+    <!--TSF gateway 依赖-->
+    <dependency>
+      <groupId>com.tencent.tsf</groupId>
+      <artifactId>spring-cloud-tsf-msgw-zuul</artifactId>
+      <version>${tsf.version}</version>
+    </dependency>
+
+    <!--TSF 其它 SDK 依赖-->
+    <dependency>
+      <groupId>com.tencent.tsf</groupId>
+      <artifactId>spring-cloud-tsf-starter</artifactId>
+    </dependency>
+  </dependencies>
+
+
+</project>

+ 21 - 0
msgw-demo/msgw-zuul1/src/main/java/com.tencent.tsf.msgw.zuul1/Application.java

@@ -0,0 +1,21 @@
+package com.tencent.tsf.msgw.zuul1;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.tsf.annotation.EnableTsf;
+
+/**
+ * @author seanlxliu
+ * @since 2019/9/5
+ */
+@SpringBootApplication
+@EnableZuulProxy
+@EnableFeignClients // 使用Feign微服务调用时请启用
+@EnableTsf
+public class Application {
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+}

+ 44 - 0
msgw-demo/msgw-zuul1/src/main/java/com.tencent.tsf.msgw.zuul1/filter/TestFilter.java

@@ -0,0 +1,44 @@
+package com.tencent.tsf.msgw.zuul1.filter;
+
+import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
+
+import com.netflix.zuul.exception.ZuulException;
+import com.tencent.tsf.gateway.core.annotation.TsfGatewayFilter;
+import com.tencent.tsf.gateway.zuul1.filter.TsfGatewayZuulFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 自定义Filter
+ * @author seanlxliu
+ * @since 2019/9/5
+ */
+@TsfGatewayFilter
+public class TestFilter extends TsfGatewayZuulFilter {
+
+    private Logger logger = LoggerFactory.getLogger(TestFilter.class);
+
+
+    @Override
+    public String filterType() {
+        return PRE_TYPE;
+    }
+
+    @Override
+    public int filterOrder() {
+        return 100;
+    }
+
+    @Override
+    public boolean shouldFilter() {
+        return true;
+    }
+
+    @Override
+    public Object run() throws ZuulException {
+        System.out.println("hello world");
+        logger.info("hello world");
+
+        return null;
+    }
+}

+ 26 - 0
msgw-demo/msgw-zuul1/src/main/resources/application.yml

@@ -0,0 +1,26 @@
+spring:
+  application:
+    name: msgw-zuul1
+
+# 设置超时
+ribbon:
+  ReadTimeout: 10000
+  ConnectTimeout: 5000
+
+hystrix:
+  command:
+    default:
+      execution:
+        timeout:
+          enabled: false
+#        isolation:
+#          thread:
+#            timeoutInMilliseconds: 30000
+logging:
+  file: /tsf-demo-logs/${spring.application.name}/root.log
+  level:
+    root: INFO
+tct:
+  enabled: false
+zuul:
+  sensitive-headers: 

+ 20 - 0
msgw-demo/pom.xml

@@ -0,0 +1,20 @@
+<?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">
+  <parent>
+    <artifactId>tsf-demo</artifactId>
+    <groupId>com.tencent.tsf</groupId>
+    <version>1.23.0-Greenwich-RELEASE</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>msgw-demo</artifactId>
+
+  <packaging>pom</packaging>
+
+  <modules>
+    <module>msgw-zuul1</module>
+    <module>msgw-scg</module>
+  </modules>
+</project>

+ 71 - 0
mysql-demo/pom.xml

@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>com.tencent.tsf</groupId>
+		<artifactId>tsf-demo</artifactId>
+		<version>1.23.0-Greenwich-RELEASE</version>
+	</parent>
+
+	<artifactId>mysql-demo</artifactId>
+    <packaging>jar</packaging>
+    <name>mysql-demo</name>
+	<description>Demo for TSF Mysql Storaging</description>
+
+	<properties>
+		<java.version>1.8</java.version>
+	</properties>
+
+    <dependencies>
+        <!-- TSF 启动器 -->
+        <dependency>
+            <groupId>com.tencent.tsf</groupId>
+            <artifactId>spring-cloud-tsf-starter</artifactId>
+        </dependency>
+
+        <!-- 需要使用MYSQL数据库 -->
+        <!-- spring-boot-starter-jdbc -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+        <!-- mysql -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <!-- dbcp -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-dbcp2</artifactId>
+            <version>2.1.1</version>
+        </dependency>
+        <!-- tomcat-jdbc -->
+        <dependency>
+            <groupId>org.apache.tomcat</groupId>
+            <artifactId>tomcat-jdbc</artifactId>
+            <version>8.5.32</version>
+        </dependency>
+        <!-- druid -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.0.25</version>
+        </dependency>
+        <!-- mybatis -->
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>1.3.2</version>
+        </dependency>
+        <!-- Bean注入 -->
+        <dependency>
+            <groupId>javax.inject</groupId>
+            <artifactId>javax.inject</artifactId>
+            <version>1</version>
+        </dependency>
+    </dependencies>
+
+</project>

+ 22 - 0
mysql-demo/schema/demo.sql

@@ -0,0 +1,22 @@
+-- Create tsf_apm schema
+DROP SCHEMA IF EXISTS `tsf_test`;
+CREATE SCHEMA `tsf_test` ;
+
+-- Create Tables of tsf_user
+-- tsf_user
+DROP TABLE IF EXISTS `tsf_test`.`tsf_user`;
+CREATE TABLE `tsf_test`.`tsf_user` (
+	`user_id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'user identifier',
+	`user_name` varchar(60) NOT NULL COMMENT 'user name',
+	`user_token` varchar(32) NOT NULL COMMENT 'user token',
+	`creation_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'user creation time',
+	UNIQUE INDEX unique_name(`user_name`)
+);
+
+-- Create Tables of tsf_count
+-- tsf_count
+DROP TABLE IF EXISTS `tsf_test`.`tsf_count`;
+CREATE TABLE `tsf_test`.`tsf_count` (
+	`count_id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'count identifier',
+	`insertion_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'insertion time'
+);

+ 46 - 0
mysql-demo/src/main/java/com/tsf/demo/mysql/MysqlDemoApplication.java

@@ -0,0 +1,46 @@
+package com.tsf.demo.mysql;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.tencent.tsf.monitor.annotation.EnableTsfMonitor;
+import com.tencent.tsf.sleuth.annotation.EnableTsfSleuth;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.cloud.tsf.route.annotation.EnableTsfRoute;
+import org.springframework.context.annotation.Bean;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.tsf.auth.annotation.EnableTsfAuth;
+import org.springframework.tsf.ratelimit.annotation.EnableTsfRateLimit;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+
+@SpringBootApplication
+@EnableDiscoveryClient // 使用服务注册发现时请启用
+@EnableFeignClients // 使用Feign微服务调用时请启用
+@EnableScheduling
+@EnableTsfAuth
+@EnableTsfRoute
+@EnableTsfRateLimit
+@EnableTsfSleuth
+@EnableTsfMonitor
+public class MysqlDemoApplication {
+
+    // 测试用户自定义DataSource时开启
+	/*@Bean
+	//@Primary  //在同样的DataSource中,首先使用被标注的DataSource
+	public DataSource dataSource() throws SQLException {
+		DruidDataSource datasource = new DruidDataSource();
+		datasource.setUrl("jdbc:mysql://127.0.0.1:3306/tsf_test?characterEncoding=utf8");
+		datasource.setUsername("root");
+		datasource.setPassword("123456");
+		datasource.setDriverClassName("com.mysql.jdbc.Driver");
+		return datasource;
+	}*/
+
+	public static void main(String[] args) {
+		SpringApplication.run(MysqlDemoApplication.class, args);
+	}
+
+}

+ 27 - 0
mysql-demo/src/main/java/com/tsf/demo/mysql/config/DruidConfiguration.java

@@ -0,0 +1,27 @@
+package com.tsf.demo.mysql.config;
+
+import com.alibaba.druid.filter.Filter;
+import com.alibaba.druid.pool.DruidDataSource;
+import com.google.common.collect.Lists;
+import org.springframework.context.annotation.Configuration;
+import java.util.List;
+import javax.inject.Inject;
+import javax.sql.DataSource;
+
+/**
+ * 测试自定义DruidDataSource配置
+ */
+@Configuration
+public class DruidConfiguration {
+    // 需要时开启,并定义CustomFilter进行测试
+    /*
+    @Inject
+    DruidConfiguration(DataSource dataSource)
+    {
+        //CustomFilter filter = new CustomFilter();
+        DruidDataSource druidDataSource = (DruidDataSource)dataSource;
+        List<Filter> list = Lists.newArrayList();
+        //list.add(filter);
+        druidDataSource.setProxyFilters(list);
+    }*/
+}

+ 39 - 0
mysql-demo/src/main/java/com/tsf/demo/mysql/dao/TsfCountDao.java

@@ -0,0 +1,39 @@
+package com.tsf.demo.mysql.dao;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataAccessException;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.PreparedStatementSetter;
+import org.springframework.stereotype.Component;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Types;
+
+/**
+ * Created by chazling on 2019/5/26.
+ */
+@Component
+public class TsfCountDao {
+
+    private static final Logger LOG = LoggerFactory.getLogger(TsfCountDao.class);
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    public int insert() throws Exception {
+
+        String sql = "INSERT INTO `tsf_count` (`insertion_time`) VALUES (CURRENT_TIMESTAMP) ";
+
+        try {
+            LOG.info("insert into table tsf_count");
+            return jdbcTemplate.update(sql);
+        } catch (DataAccessException dae) {
+            // 数据库连接异常
+            LOG.error("insert into table tsf_count failed, errinfo : {}", dae.getMessage());
+            throw new Exception("insert into table tsf_count failed", dae);
+        }
+    }
+}

+ 26 - 0
mysql-demo/src/main/java/com/tsf/demo/mysql/dao/TsfMybatisUserDao.java

@@ -0,0 +1,26 @@
+package com.tsf.demo.mysql.dao;
+
+import com.tsf.demo.mysql.domain.User;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+/**
+ * Created by chazling on 2019/7/16.
+ */
+@Mapper
+public interface TsfMybatisUserDao {
+
+    /**
+     * 插入用户信息
+     */
+    @Insert("INSERT INTO `tsf_user` (`user_name`, `user_token`, `creation_time`) VALUES (#{name}, #{token}, CURRENT_TIMESTAMP) ON DUPLICATE KEY UPDATE `creation_time` = CURRENT_TIMESTAMP")
+    void insertUser(@Param("name") String name, @Param("token") String token);
+
+    /**
+     * 通过名字查询用户信息
+     */
+    @Select("SELECT `user_name`, `user_token` FROM `tsf_user` WHERE `user_name` = #{name}")
+    User findUserByName(@Param("name") String name);
+}

+ 60 - 0
mysql-demo/src/main/java/com/tsf/demo/mysql/dao/TsfUserDao.java

@@ -0,0 +1,60 @@
+package com.tsf.demo.mysql.dao;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataAccessException;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.PreparedStatementSetter;
+import org.springframework.stereotype.Component;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Types;
+
+/**
+ * Created by chazling on 2019/5/26.
+ */
+@Component
+public class TsfUserDao {
+
+    private static final Logger LOG = LoggerFactory.getLogger(TsfUserDao.class);
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    public int create(final String userName) throws Exception {
+
+        String sql = "INSERT INTO `tsf_user` (`user_name`, `user_token`, `creation_time`) VALUES (?, ?, CURRENT_TIMESTAMP) " +
+                "ON DUPLICATE KEY UPDATE `creation_time` = CURRENT_TIMESTAMP";
+
+        try {
+            String userToken = "token:" + userName;
+            LOG.info("insert into table tsf_user, user_name [{}] user token [{}]", userName, userToken);
+            return jdbcTemplate.update(sql, new PreparedStatementSetter() {
+                @Override
+                public void setValues(PreparedStatement ps) throws SQLException {
+                    ps.setObject(1, userName, Types.VARCHAR);
+                    ps.setObject(2, userToken, Types.VARCHAR);
+                }
+            });
+        } catch (DataAccessException dae) {
+            // 数据库连接异常
+            LOG.error("insert into table tsf_user failed, errinfo : {}", dae.getMessage());
+            throw new Exception("insert into table tsf_user failed", dae);
+        }
+    }
+
+    public String query(final String userName) throws Exception {
+        try {
+            String sql = "SELECT `user_token` FROM `tsf_user` WHERE `user_name` = '" + userName + "'";
+
+            LOG.info("query from table tsf_user, user_name [{}]", userName);
+            return jdbcTemplate.queryForObject(sql, String.class);
+        } catch (DataAccessException dae) {
+            // 数据库连接异常
+            LOG.error("query from table tsf_user failed, errinfo : {}", dae.getMessage());
+            throw new Exception("query from table tsf_user failed", dae);
+        }
+    }
+}

+ 34 - 0
mysql-demo/src/main/java/com/tsf/demo/mysql/domain/User.java

@@ -0,0 +1,34 @@
+package com.tsf.demo.mysql.domain;
+
+/**
+ * Created by chazling on 2019/7/16.
+ */
+public class User {
+
+    private String user_name = "";
+    private String user_token = "";
+
+    public String getUser_name() {
+        return user_name;
+    }
+
+    public void setUser_name(String user_name) {
+        this.user_name = user_name;
+    }
+
+    public String getUser_token() {
+        return user_token;
+    }
+
+    public void setUser_token(String user_token) {
+        this.user_token = user_token;
+    }
+
+    @Override
+    public String toString() {
+        return "User{" +
+                "user_name='" + user_name + '\'' +
+                ", user_token='" + user_token + '\'' +
+                '}';
+    }
+}

+ 64 - 0
mysql-demo/src/main/java/com/tsf/demo/mysql/schedule/ScheduledDemo.java

@@ -0,0 +1,64 @@
+package com.tsf.demo.mysql.schedule;
+
+import com.tsf.demo.mysql.dao.TsfCountDao;
+import com.tsf.demo.mysql.dao.TsfMybatisUserDao;
+import com.tsf.demo.mysql.domain.User;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import com.tsf.demo.mysql.dao.TsfUserDao;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ScheduledDemo {
+	private static final Logger LOG = LoggerFactory.getLogger(ScheduledDemo.class);
+
+	private static int index = 1;
+
+	@Autowired
+	private TsfUserDao userDao;
+
+	@Autowired
+	private TsfCountDao countDao;
+
+	@Autowired
+	private TsfMybatisUserDao mybatisUserDao;
+
+	@Scheduled(fixedDelayString = "${consumer.auto.test.interval:10000}")
+	public void doWork() throws InterruptedException, Exception {
+		String username = "test-user-" + index;
+		LOG.info("mysql-demo auto test, create user: [" + username + "]");
+
+		LOG.info("mysql-demo auto test, save user into mysql: [" + username + "]");
+		userDao.create(username);
+
+		Thread.sleep(3000);
+
+		String token = userDao.query(username);
+		LOG.info("mysql-demo auto test, query user token from mysql: [" + token + "]");
+
+		Thread.sleep(3000);
+
+		LOG.info("mysql-demo auto test, save mybatis user into mysql: [" + username + "]");
+		mybatisUserDao.insertUser(username, "token:" + username);
+
+		Thread.sleep(3000);
+
+		User user = mybatisUserDao.findUserByName(username);
+		LOG.info("mysql-demo auto test, query mybatis user token from mysql: [" + user.getUser_token() + "]");
+
+		Thread.sleep(3000);
+
+		countDao.insert();
+		LOG.info("mysql-demo auto test, insert count into mysql");
+
+		index++;
+		if (index > 9) index = 1;
+
+        //测试事务时启用
+        //throw new RuntimeException("test-exception");
+	}
+}

+ 8 - 0
mysql-demo/src/main/resources/application.yml

@@ -0,0 +1,8 @@
+logging:
+  file: /tsf-demo-logs/${spring.application.name}/root.log
+  level: 
+    root: INFO
+management:
+  security:
+    enabled: false
+

+ 32 - 0
mysql-demo/src/main/resources/bootstrap.yml

@@ -0,0 +1,32 @@
+server:
+  port: 18086
+spring:
+  sleuth:
+    jdbc:
+      enabled: true
+  application:
+    name: mysql-demo
+  datasource:
+    driverClassName: com.mysql.jdbc.Driver
+    url: jdbc:mysql://127.0.0.1:3306/tsf_test?characterEncoding=utf8&serverTimezone=UTC
+    username:
+    password:
+#    测试DBCP连接池时启用
+#    type: org.apache.commons.dbcp2.BasicDataSource
+#    dbcp2:
+#      max-wait-millis: 10000
+#      min-idle: 5
+#      initial-size: 5
+#    测试Tomcat连接池时启用
+#    type: org.apache.tomcat.jdbc.pool.DataSource
+#    tomcat:
+#      max-active: 200
+#      max-wait: 10000
+#      test-on-borrow: true
+#    测试Druid连接池时启用
+#    type: com.alibaba.druid.pool.DruidDataSource
+#  druid:
+#    initialSize: 3
+#    minIdle: 3
+#    maxActive: 10
+#    maxWait: 10000

+ 119 - 0
opensource-scg-demo/pom.xml

@@ -0,0 +1,119 @@
+<?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">
+    <parent>
+        <groupId>com.tencent.tsf</groupId>
+        <artifactId>spring-cloud-tsf-dependencies</artifactId>
+        <version>1.23.0-Greenwich-RELEASE</version>
+        <relativePath/>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>opensource-scg-demo</artifactId>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+    </properties>
+
+
+    <dependencies>
+        <!-- gateway dependency -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-gateway</artifactId>
+        </dependency>
+
+
+        <!--consul discovery-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.cloud</groupId>
+                    <artifactId>spring-cloud-consul-discovery</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.springframework.cloud</groupId>
+                    <artifactId>spring-cloud-consul-core</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.tencent.tsf</groupId>
+            <artifactId>spring-cloud-tsf-consul-discovery</artifactId>
+        </dependency>
+
+        <!--logging-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-logging</artifactId>
+        </dependency>
+
+        <!--actuator-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
+        <!--hystrix-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
+        </dependency>
+
+        <!--tracing & monitoring-->
+        <dependency>
+            <groupId>com.tencent.tsf</groupId>
+            <artifactId>spring-cloud-tsf-sleuth</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>joda-time</groupId>
+            <artifactId>joda-time</artifactId>
+            <version>2.9.9</version>
+        </dependency>
+
+        <!-- Test Dependency -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.11</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-core</artifactId>
+                </exclusion>
+            </exclusions>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure</artifactId>
+            <version>1.5.12.RELEASE</version>
+        </dependency>
+
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <mainClass>com.tencent.tsf.gateway.GatewayServerApplication</mainClass>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 25 - 0
opensource-scg-demo/src/main/java/com/tencent/tsf/gateway/GatewayServerApplication.java

@@ -0,0 +1,25 @@
+package com.tencent.tsf.gateway;
+
+import com.tencent.tsf.monitor.annotation.EnableTsfMonitor;
+import com.tencent.tsf.sleuth.annotation.EnableTsfSleuth;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.ApplicationPidFileWriter;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+/**
+ * Kysonli
+ */
+@SpringBootApplication
+@EnableDiscoveryClient
+@EnableTsfSleuth
+@EnableTsfMonitor
+public class GatewayServerApplication
+{
+    public static void main( String[] args )
+    {
+        SpringApplication springApplication = new SpringApplication(GatewayServerApplication.class);
+        springApplication.addListeners(new ApplicationPidFileWriter());
+        springApplication.run(args);
+    }
+}

+ 27 - 0
opensource-scg-demo/src/main/resources/application.yml

@@ -0,0 +1,27 @@
+server:
+  port: 8080
+  error:
+    include-exception: true
+spring:
+  application:
+    name: sc-gateway
+  cloud:
+    gateway:
+      discovery:
+        locator:
+          enabled: true
+          lower-case-service-id: false
+      httpclient:
+        connectTimeout: 10
+        responseTimeout: 20s
+#    consul:
+#        host: 127.0.0.1
+#        port: 8500
+#        enabled: true
+#        scheme: HTTP
+
+logging:
+  file: /var/logs/${spring.application.name}/${spring.application.name}.log
+  level:
+    root: INFO
+    com.tencent.tsf: INFO

+ 20 - 0
opensource-scg-demo/src/test/java/com/tencent/tsf/AppTest.java

@@ -0,0 +1,20 @@
+package com.tencent.tsf;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+{
+    /**
+     * Rigorous Test :-)
+     */
+    @Test
+    public void shouldAnswerWithTrue()
+    {
+        assertTrue( true );
+    }
+}

+ 23 - 0
opensource-zuul-demo/pom.xml

@@ -0,0 +1,23 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.tencent.tsf</groupId>
+		<artifactId>tsf-demo</artifactId>
+		<version>1.23.0-Greenwich-RELEASE</version>
+	</parent>
+	<artifactId>opensource-zuul-demo</artifactId>
+
+	<dependencies>
+		<!-- TSF 启动器 -->
+		<dependency>
+			<groupId>com.tencent.tsf</groupId>
+			<artifactId>spring-cloud-tsf-starter</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
+		</dependency>
+	</dependencies>
+</project>

+ 25 - 0
opensource-zuul-demo/src/main/java/com/tencent/tsf/demo/zuul/ZuulApplication.java

@@ -0,0 +1,25 @@
+package com.tencent.tsf.demo.zuul;
+
+import com.tencent.tsf.demo.zuul.filter.TestFilter;
+import org.springframework.boot.SpringApplication;
+import org.springframework.cloud.client.SpringCloudApplication;
+import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.Bean;
+import org.springframework.tsf.annotation.EnableTsf;
+
+@SpringCloudApplication
+@EnableZuulProxy
+@EnableFeignClients
+@EnableTsf
+public class ZuulApplication {
+
+    @Bean
+    public TestFilter testFilter() {
+        return new TestFilter();
+    }
+
+    public static void main(String[] args) {
+        SpringApplication.run(ZuulApplication.class, args);
+    }
+}

+ 58 - 0
opensource-zuul-demo/src/main/java/com/tencent/tsf/demo/zuul/filter/TestFilter.java

@@ -0,0 +1,58 @@
+package com.tencent.tsf.demo.zuul.filter;
+
+import com.netflix.zuul.ZuulFilter;
+import com.netflix.zuul.context.RequestContext;
+import com.netflix.zuul.exception.ZuulException;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
+import org.springframework.cloud.netflix.zuul.util.ZuulRuntimeException;
+import org.springframework.http.HttpStatus;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class TestFilter extends ZuulFilter {
+
+    private static final String ACTION_PARAMETER = "action";
+
+    @Override
+    public String filterType() {
+        // pre 类型的过滤器
+        return FilterConstants.PRE_TYPE;
+    }
+
+    @Override
+    public int filterOrder() {
+        // token 检验应该放在第一位来进行校验,因此需要放在最前面
+        return FilterConstants.SERVLET_DETECTION_FILTER_ORDER - 1;
+    }
+
+    @Override
+    public boolean shouldFilter() {
+        // 过滤器是否应该执行, true:表示应该执行  false:表示跳过这个过滤器执行
+        return true;
+    }
+
+    @Override
+    public Object run() {
+        RequestContext requestContext = RequestContext.getCurrentContext();
+        // 获取到 request
+        HttpServletRequest request = requestContext.getRequest();
+        // 判断请求参数中是否存在  action  参数
+        String action = request.getParameter(ACTION_PARAMETER);
+        if (StringUtils.isNotBlank(action)) {
+            // 不进行路由
+            if (action.equals("no_routing")) {
+                requestContext.setSendZuulResponse(false);
+            }
+            else if (action.equals("forbidden")) {
+                requestContext.setSendZuulResponse(false);
+                requestContext.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
+            }
+            else if (action.equals("unauthorized")) {
+                throw new ZuulRuntimeException(new ZuulException(this.filterType() + ":" + this.getClass().getSimpleName(), HttpStatus.UNAUTHORIZED.value(), "Unauthorized"));
+            }
+        }
+
+        return null;
+    }
+}

+ 48 - 0
opensource-zuul-demo/src/main/resources/application.yml

@@ -0,0 +1,48 @@
+server:
+  port: 18000
+spring:
+  application:
+    name: zuul-demo
+  cloud:
+    consul:
+      host: 127.0.0.1
+      port: 8500
+      discovery:
+        heartbeat:
+          enabled: true
+          ttl-value: 5
+          ttl-unit: s
+        preferIpAddress: true
+ribbon:
+  ReadTimeout: 10000
+  ConnectTimeout: 5000
+zuul:
+  max:
+    host:
+      connections: 500
+  host:
+    socket-timeout-millis: 10000
+    connect-timeout-millis: 5000
+  routes:
+    api-v1:
+      path: /v1/**
+      serviceId: provider-demo
+      stripPrefix: true
+    api-v2:
+      path: /v2/**
+      url: http://127.0.0.1:18081
+      stripPrefix: true
+    api-v3:
+      path: /*/v3/**
+      serviceId: provider-demo
+      stripPrefix: true
+  ignored-patterns: /**/ignore/**
+hystrix:
+  command:
+    default:
+      execution:
+        timeout:
+          enabled: true
+        isolation:
+          thread:
+            timeoutInMilliseconds: 30000

+ 94 - 0
pom.xml

@@ -0,0 +1,94 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>com.tencent.tsf</groupId>
+		<artifactId>spring-cloud-tsf-dependencies</artifactId>
+		<version>1.23.0-Greenwich-RELEASE</version>
+	</parent>
+
+	<artifactId>tsf-demo</artifactId>
+	<version>1.23.0-Greenwich-RELEASE</version>
+	<packaging>pom</packaging>
+
+	<modules>
+		<module>provider-demo</module>
+		<module>consumer-demo</module>
+		<module>opensource-zuul-demo</module>
+		<module>mysql-demo</module>
+		<module>redis-demo</module>
+		<module>mongodb-demo</module>
+		<module>kafka-demo</module>
+		<module>opensource-scg-demo</module>
+		<module>rocketmq-demo</module>
+		<module>task-schedule-demo</module>
+		<module>msgw-demo</module>
+	</modules>
+	<dependencies>
+	<dependency>
+		<groupId>com.tencent.tsf</groupId>
+		<artifactId>spring-cloud-tsf-starter</artifactId>
+	</dependency>
+		<!-- RESTful APIs swagger2 -->
+		<dependency>
+			<groupId>io.springfox</groupId>
+			<artifactId>springfox-swagger2</artifactId>
+			<version>2.9.2</version>
+			<exclusions>
+				<exclusion>
+					<groupId>io.swagger</groupId>
+					<artifactId>swagger-annotations</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>io.swagger</groupId>
+					<artifactId>swagger-models</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>io.springfox</groupId>
+			<artifactId>springfox-swagger-ui</artifactId>
+			<version>2.9.2</version>
+		</dependency>
+		<dependency>
+			<groupId>io.swagger</groupId>
+			<artifactId>swagger-annotations</artifactId>
+			<version>1.5.21</version>
+		</dependency>
+		<dependency>
+			<groupId>io.swagger</groupId>
+			<artifactId>swagger-models</artifactId>
+			<version>1.5.21</version>
+		</dependency>
+		<dependency>
+			<groupId>com.github.xiaoymin</groupId>
+			<artifactId>swagger-bootstrap-ui</artifactId>
+			<version>1.9.4</version>
+		</dependency>
+	</dependencies>
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+		<java.version>1.8</java.version>
+	</properties>
+
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<encoding>UTF-8</encoding>
+					<target>1.8</target>
+					<source>1.8</source>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>

+ 77 - 0
provider-demo/pom.xml

@@ -0,0 +1,77 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.tencent.tsf</groupId>
+        <artifactId>tsf-demo</artifactId>
+        <version>1.23.0-Greenwich-RELEASE</version>
+    </parent>
+
+    <artifactId>provider-demo</artifactId>
+    <packaging>jar</packaging>
+    <name>provider-demo</name>
+
+    <dependencies>
+        <!-- TSF 启动器 -->
+        <dependency>
+            <groupId>joda-time</groupId>
+            <artifactId>joda-time</artifactId>
+            <version>2.9.4</version>
+        </dependency>
+        <dependency>
+            <groupId>com.tencent.tsf</groupId>
+            <artifactId>spring-cloud-tsf-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.tencentcloudapi</groupId>
+            <artifactId>tencentcloud-sdk-java</artifactId>
+            <version>3.1.49</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.1.10</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore</artifactId>
+            <version>4.4.6</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpmime</artifactId>
+            <version>4.5.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.51</version>
+            <scope>compile</scope>
+        </dependency>
+        <!--工具包-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.4.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.12</version>
+        </dependency>
+    </dependencies>
+</project>

+ 17 - 0
provider-demo/src/main/java/com/tsf/demo/provider/ProviderApplication.java

@@ -0,0 +1,17 @@
+package com.tsf.demo.provider;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.tsf.annotation.EnableTsf;
+
+@SpringBootApplication
+@EnableFeignClients // 使用Feign微服务调用时请启用
+//@EnableTsf
+@ComponentScan(basePackages = {"com.tsf.demo.provider.*"})
+public class ProviderApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ProviderApplication.class, args);
+    }
+}

+ 61 - 0
provider-demo/src/main/java/com/tsf/demo/provider/bean/po/MpMsCardApplicationLog.java

@@ -0,0 +1,61 @@
+package com.tsf.demo.provider.bean.po;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+/**
+ * 小程序端实体卡数据库实体
+ */
+@Entity
+@Table(name = "mp_ms_card_application_log")
+@Getter
+@Setter
+public class MpMsCardApplicationLog {
+            @Id
+            @GeneratedValue(strategy = GenerationType.IDENTITY)
+            private String id;
+            // varchar(60) DEFAULT NULL COMMENT '用户ID',
+            @Column(name = "mp_user_id")
+            private Long mpUserId;
+            //varchar(60) DEFAULT NULL COMMENT 'unionid',
+            @Column(name = "unionid")
+            private String unionid;
+            //varchar(60) DEFAULT NULL COMMENT '收件人',
+            @Column(name = "name")
+            private String name;
+            //varchar(60) DEFAULT NULL COMMENT '手机号',
+            @Column(name = "mobile")
+            private String mobile;
+            //varchar(60) DEFAULT NULL COMMENT '快递地址',
+            @Column(name = "address")
+            private String address;
+            //varchar(60) DEFAULT NULL COMMENT '发货状态',
+            @Column(name = "expressage_status")
+            private Integer expressageStatus;
+            //varchar(60) DEFAULT NULL COMMENT '快递单号',
+            @Column(name = "courier_number")
+            private String courierNumber;
+            //varchar(60) DEFAULT NULL COMMENT '申领方式',(0 网点自取 1 邮递)
+            @Column(name = "method")
+            private Integer method;
+            // varchar(60) DEFAULT NULL COMMENT '备注',
+            @Column(name = "comment")
+            private String comment;
+            //tinyint(4) DEFAULT NULL COMMENT '数据状态',
+            @Column(name = "status")
+            private Integer status;
+            //varchar(32) DEFAULT NULL COMMENT '创建人',
+            @Column(name = "created_by")
+            private String createdBy;
+            //datetime DEFAULT NULL COMMENT '创建时间',
+            @Column(name = "created_time")
+            private Timestamp createdTime;
+            //varchar(32) DEFAULT NULL COMMENT '更新人',
+            @Column(name = "updated_by")
+            private String updatedBy;
+            @Column(name = "updated_time")
+            private Timestamp updatedTime;
+}

+ 37 - 0
provider-demo/src/main/java/com/tsf/demo/provider/bean/po/MpMsEcardApplicationLog.java

@@ -0,0 +1,37 @@
+package com.tsf.demo.provider.bean.po;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+@Entity
+@Table(name = "mp_ms_ecard_application_log")
+@Getter
+@Setter
+public class MpMsEcardApplicationLog {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+    // varchar(60) DEFAULT NULL COMMENT '用户ID',
+    @Column(name = "mp_user_id")
+    private Long mpUserId;
+    //varchar(60) DEFAULT NULL COMMENT 'unionid',
+    @Column(name = "unionid")
+    private String unionid;
+    //tinyint(4) DEFAULT NULL COMMENT '数据状态',
+    @Column(name = "status")
+    private Integer status;
+    //varchar(32) DEFAULT NULL COMMENT '创建人',
+    @Column(name = "created_by")
+    private String createdBy;
+    //datetime DEFAULT NULL COMMENT '创建时间',
+    @Column(name = "created_time")
+    private Timestamp createdTime;
+    //varchar(32) DEFAULT NULL COMMENT '更新人',
+    @Column(name = "updated_by")
+    private String updatedBy;
+    @Column(name = "updated_time")
+    private Timestamp updatedTime;
+}

+ 26 - 0
provider-demo/src/main/java/com/tsf/demo/provider/bean/po/MpNation.java

@@ -0,0 +1,26 @@
+package com.tsf.demo.provider.bean.po;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "mp_nation")
+@Getter
+@Setter
+public class MpNation {
+    @Id //这是一个主键
+    @GeneratedValue(strategy = GenerationType.IDENTITY)//自增主键
+    private Long id;
+    /**
+     * 民族名字
+     */
+    @Column(name = "nation_name")
+    private String nationName;
+    /**
+     * 民族编码
+     */
+    @Column(name = "nation_code")
+    private String nationCode;
+}

+ 98 - 0
provider-demo/src/main/java/com/tsf/demo/provider/bean/po/MpUser.java

@@ -0,0 +1,98 @@
+package com.tsf.demo.provider.bean.po;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+@Entity //告诉JPA这是一个实体类(和数据表映射的类)
+@Table(name = "mp_user") //@Table来指定和哪个数据表对应;如果省略默认表名就是user;
+@Getter
+@Setter
+public class MpUser {
+    @Id //这是一个主键
+    @GeneratedValue(strategy = GenerationType.IDENTITY)//自增主键
+    private Long id;
+    /**
+     * 用户名
+     */
+    @Column(name = "username")
+    private String userName;
+    /**
+     * 密码
+     */
+    @Column(name = "password")
+    private String password;
+    /**
+     * 昵称
+     */
+    @Column(name = "nickname")
+    private String nickName;
+    /**
+     * openid
+     */
+    @Column(name = "openid")
+    private String openid;
+    /**
+     * unionid
+     */
+    @Column(name = "unionid")
+    private String unionid;
+
+    /**
+     * '国家'
+     */
+    @Column(name = "country")
+    private String country;
+    /**
+     * '省份'
+     */
+    @Column(name = "province")
+    private String province;
+    /**
+     * 城市
+     */
+    @Column(name = "city")
+    private String city;
+    /**
+     * 地址
+     */
+    @Column(name = "address")
+    private String address;
+    /**
+     * 性别 0 男 1 女
+     */
+    @Column(name = "sex")
+    private Integer sex;
+    /**
+     * 手机号
+     */
+    @Column(name = "phone")
+    private String phone;
+    /**
+     * 数据状态 0 启用 1 禁用
+     */
+    @Column(name = "status")
+    private Integer status;
+    /**
+     * 创建人
+     */
+    @Column(name = "created_by")
+    private String createdBy;
+    /**
+     * 创建时间
+     */
+    @Column(name = "created_time")
+    private  Timestamp createdTime;
+    /**
+     * 更新人
+     */
+    @Column(name = "updated_by")
+    private String updatedBy;
+    /**
+     * 更新时间
+     */
+    @Column(name = "updated_time")
+    private Timestamp updatedTime;
+}

+ 89 - 0
provider-demo/src/main/java/com/tsf/demo/provider/bean/po/MpUserIdentification.java

@@ -0,0 +1,89 @@
+package com.tsf.demo.provider.bean.po;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+@Entity
+@Table(name = "mp_user_identification")
+@Getter
+@Setter
+public class MpUserIdentification {
+           @Id
+           @GeneratedValue(strategy = GenerationType.IDENTITY)
+           private Long id;
+           //varchar(60) DEFAULT NULL COMMENT '用户ID',
+           @Column(name = "mp_user_id")
+           private Long mpUserId;
+           //varchar(60) DEFAULT NULL COMMENT 'unionid',
+           @Column(name = "unionid")
+           private String unionid;
+           //varchar(60) DEFAULT NULL COMMENT '证件类型',
+           @Column(name = "card_type")
+           private String cardType;
+           //varchar(60) DEFAULT NULL COMMENT '证件号码',
+           @Column(name = "cardNo")
+           private String cardNo;
+           //varchar(60) DEFAULT NULL COMMENT '证件有效期限开始时间',
+           @Column(name = "card_validity_begin")
+           private String cardValidityBegin;
+           //varchar(60) DEFAULT NULL COMMENT '证件有效期限结束时间',
+           @Column(name = "card_validity_end")
+           //varchar(60) DEFAULT NULL COMMENT '姓名',
+           private String card_validity_end;
+           @Column(name = "name")
+           private String name;
+           //tinyint(4) DEFAULT NULL COMMENT '性别',
+           @Column(name = "sex")
+           private Integer sex;
+           //varchar(60) DEFAULT NULL COMMENT '出生日期',
+           @Column(name = "birth")
+           private String birth;
+           //varchar(60) DEFAULT NULL COMMENT '国籍',
+           @Column(name = "nationality")
+           private String nationality;
+           //varchar(60) DEFAULT NULL COMMENT '民族',
+           @Column(name = "nation")
+           private String nation;
+           //varchar(60) DEFAULT NULL COMMENT '职业',
+           @Column(name = "occupation")
+           private Integer occupation;
+           //varchar(60) DEFAULT NULL COMMENT '常住所在地地址',
+           @Column(name = "address_per")
+           private String addressPer;
+           //varchar(60) DEFAULT NULL COMMENT '学历',
+           @Column(name = "degree")
+           private String degree;
+           //varchar(60) DEFAULT NULL COMMENT '婚姻状况',
+           @Column(name = "marriage_status")
+           private Integer marriageStatus;
+           @Column(name = "area_code")
+           private String areaCode;
+           //varchar(60) DEFAULT NULL COMMENT '认证方式',
+           @Column(name = "certification_method")
+           private String certificationMethod;
+           // varchar(60) DEFAULT NULL COMMENT '手机',
+           @Column(name = "phone")
+           private String phone;
+           //varchar(60) DEFAULT NULL COMMENT '电话',
+           @Column(name = "tel")
+           private String tel;
+           //varchar(32) DEFAULT NULL COMMENT '数据状态',
+           @Column(name = "status")
+           private Integer status;
+           //varchar(32) DEFAULT NULL COMMENT '创建人',
+           @Column(name = "created_by")
+           private String createdBy;
+           //datetime DEFAULT NULL COMMENT '创建时间',
+           @Column(name = "created_time")
+           private Timestamp createdTime;
+           //varchar(32) DEFAULT NULL COMMENT '更新人',
+           @Column(name = "updated_by")
+           private String updatedBy;
+           //datetime DEFAULT NULL COMMENT '更新时间',
+           @Column(name = "updated_time")
+           private Timestamp updatedTime;
+
+}

+ 37 - 0
provider-demo/src/main/java/com/tsf/demo/provider/bean/po/MpUserIdentificationLog.java

@@ -0,0 +1,37 @@
+package com.tsf.demo.provider.bean.po;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+@Entity
+@Table(name = "mp_user_identification_log")
+@Getter
+@Setter
+public class MpUserIdentificationLog {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+    @Column(name = "mp_user_identification_id")
+    private Long mpUserIdentificationId;
+    @Column(name = "mp_user_id")
+    private Long mpUserId;
+    @Column(name = "unionid")
+    private String unionid;
+    //tinyint(4) DEFAULT NULL COMMENT '数据状态',
+    @Column(name = "status")
+    private Integer status;
+    //varchar(32) DEFAULT NULL COMMENT '创建人',
+    @Column(name = "created_by")
+    private String createdBy;
+    //datetime DEFAULT NULL COMMENT '创建时间',
+    @Column(name = "created_time")
+    private Timestamp createdTime;
+    //varchar(32) DEFAULT NULL COMMENT '更新人',
+    @Column(name = "updated_by")
+    private String updatedBy;
+    @Column(name = "updated_time")
+    private Timestamp updatedTime;
+}

+ 51 - 0
provider-demo/src/main/java/com/tsf/demo/provider/bean/po/MpUserToken.java

@@ -0,0 +1,51 @@
+package com.tsf.demo.provider.bean.po;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+@Entity
+@Table(name = "mp_user_token")
+@Getter
+@Setter
+public class MpUserToken {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+    @Column(name = "mp_user_identification_id")
+    private Long mpUserIdentificationId;
+    @Column(name = "mp_user_id")
+    private Long mpUserId;
+    @Column(name = "unionid")
+    private String unionid;
+    //varchar(60) DEFAULT NULL COMMENT 'IP地址',
+    @Column(name = "ip")
+    private String ip;
+    // varchar(60) DEFAULT NULL COMMENT '登录状态',
+    @Column(name = "login_status")
+    private Integer login_status;
+    //varchar(60) DEFAULT NULL COMMENT '登录方式',
+    @Column(name = "login_method")
+    private Integer login_method;
+    // varchar(60) DEFAULT NULL COMMENT '卡中心token',
+    @Column(name = "card_token")
+    private String cardToken;
+    // varchar(60) DEFAULT NULL COMMENT '用户中心token',
+    @Column(name = "user_token")
+    private String userToken;
+    @Column(name = "status")
+    private Integer status;
+    //varchar(32) DEFAULT NULL COMMENT '创建人',
+    @Column(name = "created_by")
+    private String createdBy;
+    //datetime DEFAULT NULL COMMENT '创建时间',
+    @Column(name = "created_time")
+    private Timestamp createdTime;
+    //varchar(32) DEFAULT NULL COMMENT '更新人',
+    @Column(name = "updated_by")
+    private String updatedBy;
+    @Column(name = "updated_time")
+    private Timestamp updatedTime;
+}

+ 78 - 0
provider-demo/src/main/java/com/tsf/demo/provider/bean/vo/MpUserVO.java

@@ -0,0 +1,78 @@
+package com.tsf.demo.provider.bean.vo;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.Column;
+import java.sql.Timestamp;
+@Getter
+@Setter
+public class MpUserVO {
+    private Long id;
+    /**
+     * 用户名
+     */
+    private String userName;
+    /**
+     * 密码
+     */
+    private String password;
+    /**
+     * 昵称
+     */
+    private String nickName;
+    /**
+     * openid
+     */
+    private String openid;
+    /**
+     * unionid
+     */
+    private String unionid;
+
+    /**
+     * '国家'
+     */
+    private String country;
+    /**
+     * '省份'
+     */
+    private String province;
+    /**
+     * 城市
+     */
+    private String city;
+    /**
+     * 地址
+     */
+    private String address;
+    /**
+     * 性别 0 男 1 女
+     */
+    private Integer sex;
+    /**
+     * 手机号
+     */
+    private String phone;
+    /**
+     * 数据状态 0 启用 1 禁用
+     */
+    private Integer status;
+    /**
+     * 创建人
+     */
+    private String createdBy;
+    /**
+     * 创建时间
+     */
+    private Timestamp createdTime;
+    /**
+     * 更新人
+     */
+    private String updatedBy;
+    /**
+     * 更新时间
+     */
+    private Timestamp updatedTime;
+}

+ 86 - 0
provider-demo/src/main/java/com/tsf/demo/provider/common/BaseConstant.java

@@ -0,0 +1,86 @@
+package com.tsf.demo.provider.common;
+
+/**
+ * 系统常量
+ *
+ * @author huijun
+ */
+public interface BaseConstant {
+
+	/**
+	 * 编码
+	 */
+	String UTF_8 = "UTF-8";
+
+	/**
+	 * contentType
+	 */
+	String CONTENT_TYPE_NAME = "Content-type";
+
+	/**
+	 * JSON 资源
+	 */
+	String CONTENT_TYPE = "application/json;charset=utf-8";
+
+
+	/**
+	 * 主键字段名
+	 */
+	String DB_PRIMARY_KEY = "id";
+
+	/**
+	 * 业务状态[1:正常]
+	 */
+	int DB_STATUS_NORMAL = 1;
+
+
+	/**
+	 * 删除状态[0:正常,1:删除]
+	 */
+	int DB_NOT_DELETED = 0;
+	int DB_IS_DELETED = 1;
+
+	/**
+	 * 用户锁定状态
+	 */
+	int DB_ADMIN_NON_LOCKED = 0;
+	int DB_ADMIN_LOCKED = 1;
+
+	/**
+	 * 顶级父节点id
+	 */
+	Long TOP_PARENT_ID = 0L;
+
+	/**
+	 * 顶级父节点名称
+	 */
+	String TOP_PARENT_NAME = "顶级";
+
+	/**
+	 * 管理员对应的租户ID
+	 */
+	String ADMIN_TENANT_ID = "000000";
+
+	/**
+	 * 日志默认状态
+	 */
+	String LOG_NORMAL_TYPE = "1";
+
+	/**
+	 * 默认为空消息
+	 */
+	String DEFAULT_NULL_MESSAGE = "暂无承载数据";
+	/**
+	 * 默认成功消息
+	 */
+	String DEFAULT_SUCCESS_MESSAGE = "操作成功";
+	/**
+	 * 默认失败消息
+	 */
+	String DEFAULT_FAILURE_MESSAGE = "操作失败";
+	/**
+	 * 默认未授权消息
+	 */
+	String DEFAULT_UNAUTHORIZED_MESSAGE = "签名认证失败";
+
+}

+ 30 - 0
provider-demo/src/main/java/com/tsf/demo/provider/common/ErrorResultCode.java

@@ -0,0 +1,30 @@
+package com.tsf.demo.provider.common;
+
+/**
+ * <p> </p>
+ *
+ * @author huijun
+ * @date 2020/10/17
+ */
+public enum ErrorResultCode implements IErrorCode {
+    SUCCESS(200, "操作成功"),
+    FAILED(500, "操作失败"),
+    VALIDATE_FAILED(404, "参数检验失败"),
+    UNAUTHORIZED(401, "暂未登录或token已经过期"),
+    FORBIDDEN(403, "没有相关权限");
+    private int code;
+    private String message;
+
+    private ErrorResultCode(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+}

+ 13 - 0
provider-demo/src/main/java/com/tsf/demo/provider/common/IErrorCode.java

@@ -0,0 +1,13 @@
+package com.tsf.demo.provider.common;
+
+/**
+ * <p> </p>
+ *
+ * @author huijun
+ * @date 2020/10/17
+ */
+public interface IErrorCode {
+    int getCode();
+
+    String getMessage();
+}

+ 42 - 0
provider-demo/src/main/java/com/tsf/demo/provider/common/IResultCode.java

@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.tsf.demo.provider.common;
+
+import java.io.Serializable;
+
+/**
+ * 业务代码接口
+ *
+ * @author huijun
+ */
+public interface IResultCode extends Serializable {
+
+	/**
+	 * 获取消息
+	 *
+	 * @return
+	 */
+	String getMessage();
+
+	/**
+	 * 获取状态码
+	 *
+	 * @return
+	 */
+	int getCode();
+
+}

+ 21 - 0
provider-demo/src/main/java/com/tsf/demo/provider/common/ObjectUtil.java

@@ -0,0 +1,21 @@
+package com.tsf.demo.provider.common;
+
+import org.springframework.lang.Nullable;
+
+/**
+ * 对象工具类
+ *
+ * @author huijun
+ */
+public class ObjectUtil extends org.springframework.util.ObjectUtils {
+
+	/**
+	 * 判断元素不为空
+	 * @param obj object
+	 * @return boolean
+	 */
+	public static boolean isNotEmpty(@Nullable Object obj) {
+		return !ObjectUtil.isEmpty(obj);
+	}
+
+}

+ 212 - 0
provider-demo/src/main/java/com/tsf/demo/provider/common/R.java

@@ -0,0 +1,212 @@
+package com.tsf.demo.provider.common;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.NoArgsConstructor;
+import lombok.*;
+import lombok.ToString;
+import org.springframework.lang.Nullable;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.Serializable;
+import java.util.Optional;
+
+/**
+ * 统一API响应结果封装
+ *
+ * @author huijun
+ */
+@Setter
+@Getter
+@ToString
+@ApiModel(description = "返回信息")
+@NoArgsConstructor
+@JsonInclude
+public class R<T> implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "状态码", required = true)
+    private int code;
+    @ApiModelProperty(value = "是否成功", required = true)
+    private boolean success;
+    @ApiModelProperty(value = "承载数据")
+    private T data;
+    @ApiModelProperty(value = "返回消息", required = true)
+    private String msg;
+
+    private R(IResultCode resultCode) {
+        this(resultCode, null, resultCode.getMessage());
+    }
+
+    private R(IResultCode resultCode, String msg) {
+        this(resultCode, null, msg);
+    }
+
+    private R(IResultCode resultCode, T data) {
+        this(resultCode, data, resultCode.getMessage());
+    }
+
+    private R(IResultCode resultCode, T data, String msg) {
+        this(resultCode.getCode(), data, msg);
+    }
+
+    private R(int code, T data, String msg) {
+        this.code = code;
+        this.data = data;
+        this.msg = msg;
+        this.success = ResultCode.SUCCESS.code == code;
+    }
+
+    /**
+     * 判断返回是否为成功
+     *
+     * @param result Result
+     * @return 是否成功
+     */
+    public static boolean isSuccess(@Nullable R<?> result) {
+        return Optional.ofNullable(result)
+                .map(x -> ObjectUtil.nullSafeEquals(ResultCode.SUCCESS.code, x.code))
+                .orElse(Boolean.FALSE);
+    }
+
+    /**
+     * 判断返回是否为成功
+     *
+     * @param result Result
+     * @return 是否成功
+     */
+    public static boolean isNotSuccess(@Nullable R<?> result) {
+        return !R.isSuccess(result);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param data 数据
+     * @param <T>  T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> data(T data) {
+        return data(data, BaseConstant.DEFAULT_SUCCESS_MESSAGE);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param data 数据
+     * @param msg  消息
+     * @param <T>  T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> data(T data, String msg) {
+        return data(HttpServletResponse.SC_OK, data, msg);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param code 状态码
+     * @param data 数据
+     * @param msg  消息
+     * @param <T>  T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> data(int code, T data, String msg) {
+        return new R<>(code, data, data == null ? BaseConstant.DEFAULT_NULL_MESSAGE : msg);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param msg 消息
+     * @param <T> T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> success(String msg) {
+        return new R<>(ResultCode.SUCCESS, msg);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param resultCode 业务代码
+     * @param <T>        T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> success(IResultCode resultCode) {
+        return new R<>(resultCode);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param resultCode 业务代码
+     * @param msg        消息
+     * @param <T>        T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> success(IResultCode resultCode, String msg) {
+        return new R<>(resultCode, msg);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param msg 消息
+     * @param <T> T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> fail(String msg) {
+        return new R<>(ResultCode.FAILURE, msg);
+    }
+
+
+    /**
+     * 返回R
+     *
+     * @param code 状态码
+     * @param msg  消息
+     * @param <T>  T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> fail(int code, String msg) {
+        return new R<>(code, null, msg);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param resultCode 业务代码
+     * @param <T>        T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> fail(IResultCode resultCode) {
+        return new R<>(resultCode);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param resultCode 业务代码
+     * @param msg        消息
+     * @param <T>        T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> fail(IResultCode resultCode, String msg) {
+        return new R<>(resultCode, msg);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param flag 成功状态
+     * @return R
+     */
+    public static <T> R<T> status(boolean flag) {
+        return flag ? success(BaseConstant.DEFAULT_SUCCESS_MESSAGE) : fail(BaseConstant.DEFAULT_FAILURE_MESSAGE);
+    }
+
+}
+

+ 113 - 0
provider-demo/src/main/java/com/tsf/demo/provider/common/ResultCode.java

@@ -0,0 +1,113 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.tsf.demo.provider.common;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 业务代码枚举
+ *
+ * @author huijun
+ */
+@Getter
+@AllArgsConstructor
+public enum ResultCode implements IResultCode {
+
+	/**
+	 * 操作成功
+	 */
+	SUCCESS(HttpServletResponse.SC_OK, "操作成功"),
+
+	/**
+	 * 业务异常
+	 */
+	FAILURE(HttpServletResponse.SC_BAD_REQUEST, "业务异常"),
+
+	/**
+	 * 请求未授权
+	 */
+	UN_AUTHORIZED(HttpServletResponse.SC_UNAUTHORIZED, "请求未授权"),
+
+	/**
+	 * 客户端请求未授权
+	 */
+	CLIENT_UN_AUTHORIZED(HttpServletResponse.SC_UNAUTHORIZED, "客户端请求未授权"),
+
+	/**
+	 * 404 没找到请求
+	 */
+	NOT_FOUND(HttpServletResponse.SC_NOT_FOUND, "404 没找到请求"),
+
+	/**
+	 * 消息不能读取
+	 */
+	MSG_NOT_READABLE(HttpServletResponse.SC_BAD_REQUEST, "消息不能读取"),
+
+	/**
+	 * 不支持当前请求方法
+	 */
+	METHOD_NOT_SUPPORTED(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "不支持当前请求方法"),
+
+	/**
+	 * 不支持当前媒体类型
+	 */
+	MEDIA_TYPE_NOT_SUPPORTED(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "不支持当前媒体类型"),
+
+	/**
+	 * 请求被拒绝
+	 */
+	REQ_REJECT(HttpServletResponse.SC_FORBIDDEN, "请求被拒绝"),
+
+	/**
+	 * 服务器异常
+	 */
+	INTERNAL_SERVER_ERROR(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "服务器异常"),
+
+	/**
+	 * 缺少必要的请求参数
+	 */
+	PARAM_MISS(HttpServletResponse.SC_BAD_REQUEST, "缺少必要的请求参数"),
+
+	/**
+	 * 请求参数类型错误
+	 */
+	PARAM_TYPE_ERROR(HttpServletResponse.SC_BAD_REQUEST, "请求参数类型错误"),
+
+	/**
+	 * 请求参数绑定错误
+	 */
+	PARAM_BIND_ERROR(HttpServletResponse.SC_BAD_REQUEST, "请求参数绑定错误"),
+
+	/**
+	 * 参数校验失败
+	 */
+	PARAM_VALID_ERROR(HttpServletResponse.SC_BAD_REQUEST, "参数校验失败"),
+	;
+
+	/**
+	 * code编码
+	 */
+	final int code;
+	/**
+	 * 中文信息描述
+	 */
+	final String message;
+
+}

+ 46 - 0
provider-demo/src/main/java/com/tsf/demo/provider/common/enumcommon/OccupationEnum.java

@@ -0,0 +1,46 @@
+package com.tsf.demo.provider.common.enumcommon;
+
+/**
+ * 职业列表
+ */
+public enum OccupationEnum {
+    GUO("10000", "国家机关、党群组织、企业、事业单位负责人"),
+    ZHUAN("20000", "专业技术人员"),
+    BANSHI("30000","办事人员和有关人员"),
+    SHEHUI("40000","社会生产服务和生活服务人员"),
+    NLMY("50000","农、林、牧、渔业生产及辅助人员"),
+    SHENGCHAN("60000","生产、运输设备操作人员及有关人员");
+    private String code;
+    private String name;
+
+    private OccupationEnum(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public static String getByCode(String code) {
+        String name = "";
+        for (OccupationEnum value : OccupationEnum.values()) {
+            if (code == value.getCode()) {
+                name = value.getName();
+                break;
+            }
+        }
+        return name;
+    }
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 51 - 0
provider-demo/src/main/java/com/tsf/demo/provider/common/enumcommon/SexEnum.java

@@ -0,0 +1,51 @@
+package com.tsf.demo.provider.common.enumcommon;
+
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public enum SexEnum {
+    M(1, "男"),
+    F(2, "女");
+
+    private int code;
+    private String name;
+
+    private SexEnum(int code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public static String getByCode(int code) {
+        String name = "";
+        for (SexEnum value : SexEnum.values()) {
+            if (code == value.getCode()) {
+                name = value.getName();
+                break;
+            }
+        }
+        return name;
+    }
+    public int getCode() {
+        return this.code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    private static final Map<Integer, SexEnum> codeToEnum = Stream.of(values()).collect(Collectors.toMap(e -> e.getCode(), e -> e));
+
+    public static Optional<SexEnum> fromCode(Integer code) {
+        return Optional.ofNullable(codeToEnum.get(code));
+    }
+}

+ 164 - 0
provider-demo/src/main/java/com/tsf/demo/provider/common/siyuan/BeanSortUtil.java

@@ -0,0 +1,164 @@
+package com.tsf.demo.provider.common.siyuan;
+
+import com.alibaba.fastjson.*;
+import org.apache.commons.lang.StringUtils;
+
+import java.util.*;
+
+public class BeanSortUtil {
+
+    /**
+     * 默认忽略的拼接key
+     */
+    public static final String DEFAULT_IGNORE = "sign";
+
+    /**
+     * Key value之间的连接符
+     */
+    public static final String KEY_VALUE_CONNECTOR = "=";
+
+    /**
+     * key的连接符
+     */
+    public static final String KEY_CONNECTOR = ".";
+
+    /**
+     * kvList的连接符
+     */
+    public static final String KVLIST_CONNECTOR = "&";
+
+    /**
+     * 转换对象按升序排序的字符串
+     * @param t
+     * @param <T>
+     * @return
+     */
+    public static <T> String json2SortString( T t,String... ignore){
+        List<String> kvList = new ArrayList<>();
+        flat2KvList(kvList,null, JSON.toJSON(t), ignore);
+        return kvList2SortString(kvList);
+    }
+
+    public static <T> String json2SortString(T t){
+
+        return json2SortString(t,DEFAULT_IGNORE);
+    }
+
+    /**
+     * 把JSON对象,转换为List<String>的集合
+     * @param key
+     * @param value
+     * @param <T>
+     * @return
+     */
+    private static <T> void flat2KvList( List<String> list, String key , T value, String... ignore){
+
+        if (value instanceof JSONObject){
+            flatObject2KvList(list,(JSONObject) value,key,ignore);
+        } else if (value instanceof JSONArray) {
+            flatArray2KvList(list,key, (JSONArray) value, ignore);
+        } else {
+            appendList(list,key, value, ignore);
+        }
+    }
+
+    private static <T> void appendList(List<String> list,String key, T value, String... ignore) {
+        if (value != null && !contains(key,ignore)) {
+            String appendValue = buildAppendValue(key,value.toString());
+            if (StringUtils.isNotBlank(appendValue)) {
+                list.add(appendValue);
+            }
+        }
+    }
+
+
+    /**
+     * 判断当前key,是否包含在忽略数组中
+     * @param key
+     * @param ignores
+     * @return
+     */
+    private static boolean contains(String key, String... ignores) {
+        if (key == null || ignores == null || ignores.length <=0 ){
+            return false;
+        }
+
+        for (String ignore : ignores) {
+            if (key.equals(ignore)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * 处理JSONArray
+     * @param key
+     * @param array
+     * @return
+     */
+    private static void flatArray2KvList(List<String> list,String key, JSONArray array, String... ignore){
+        for (Object object: array){
+            flat2KvList(list,key,object,ignore);
+        }
+    }
+
+    /**
+     * 处理 JSONObject
+     * @param jsonObject
+     * @param parentKey
+     * @return
+     */
+    private static void flatObject2KvList(List<String> list, JSONObject jsonObject, String parentKey, String... ignore){
+        Map<String , Object> map = jsonObject.getInnerMap();
+        for ( Map.Entry<String, Object>  entry : map.entrySet()){
+            String key = entry.getKey();
+            Object value = entry.getValue();
+            flat2KvList(list,buildAppendKey(parentKey,key),value,ignore);
+        }
+    }
+
+    private static String buildAppendValue(String key ,String value){
+        if (StringUtils.isBlank(key)) {
+            return value;
+        }
+
+        if (StringUtils.isBlank(value)){
+            return "";
+        }
+        return key + KEY_VALUE_CONNECTOR + value;
+    }
+
+    /**
+     * 根据父key 和 当前key 构建下一级的key
+     * @param parentKey
+     * @param key
+     * @return
+     */
+    private static String buildAppendKey ( String parentKey , String key){
+        if (StringUtils.isNotBlank(parentKey)) {
+            return parentKey + KEY_CONNECTOR + key;
+        }
+        return key;
+    }
+
+    /**
+     * key-value 的List转为排序好的字符串
+     * @param list
+     * @return
+     */
+    private static String kvList2SortString(List<String> list) {
+        if (list == null || list.size() <=0){
+            return "";
+        }
+        Collections.sort(list);
+        StringBuilder sb = new StringBuilder();
+        list.forEach(value -> {
+            if (StringUtils.isNotBlank(value)){
+                sb.append(value).append(KVLIST_CONNECTOR);
+            }
+        });
+        return sb.substring(0,sb.length()-1);
+    }
+}

+ 16 - 0
provider-demo/src/main/java/com/tsf/demo/provider/common/siyuan/CommonReq.java

@@ -0,0 +1,16 @@
+package com.tsf.demo.provider.common.siyuan;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CommonReq {
+    private String appId;
+
+    private Long timestamp;
+
+    private String data;
+
+    private String sign;
+}

+ 12 - 0
provider-demo/src/main/java/com/tsf/demo/provider/common/siyuan/Testa.java

@@ -0,0 +1,12 @@
+package com.tsf.demo.provider.common.siyuan;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class Testa {
+    private Integer cardTypeId;
+
+    private String appId;
+}

+ 20 - 0
provider-demo/src/main/java/com/tsf/demo/provider/config/ProviderNameConfig.java

@@ -0,0 +1,20 @@
+package com.tsf.demo.provider.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+
+@Component
+@RefreshScope
+@ConfigurationProperties(prefix = "provider.config")
+public class ProviderNameConfig {
+	private String name = "echo-provider-default-name";
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

+ 22 - 0
provider-demo/src/main/java/com/tsf/demo/provider/config/ProviderNameConfigChangeListener.java

@@ -0,0 +1,22 @@
+package com.tsf.demo.provider.config;
+
+import com.tencent.tsf.consul.config.watch.ConfigChangeCallback;
+import com.tencent.tsf.consul.config.watch.ConfigChangeListener;
+import com.tencent.tsf.consul.config.watch.ConfigProperty;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigChangeListener(prefix = "provider.config", value = { "name" })
+public class ProviderNameConfigChangeListener implements ConfigChangeCallback {
+
+    private static final Logger log = LoggerFactory.getLogger(ProviderNameConfigChangeListener.class);
+
+    @Override
+    public void callback(ConfigProperty lastConfigProperty, ConfigProperty newConfigProperty) {
+        log.info("[TSF SDK] Configuration Change Listener: key: {}, old value: {}, new value: {}",
+                lastConfigProperty.getKey(), lastConfigProperty.getValue(), newConfigProperty.getValue());
+    }
+
+}

+ 74 - 0
provider-demo/src/main/java/com/tsf/demo/provider/controller/CardController.java

@@ -0,0 +1,74 @@
+package com.tsf.demo.provider.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.*;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.LinkedHashMap;
+@RestController
+@CrossOrigin
+@Api(value = "卡中心", tags = "卡中心token")
+public class CardController {
+    @Value("${card.authen.tokenUrl}")
+    private String tokenUrl;
+    @Value("${card.authen.username}")
+    private String username;
+    @Value("${card.authen.password}")
+    private String password;
+
+    @ApiOperation(value = "获取卡中心token", notes = "获取卡中心token")
+    @GetMapping(value = "/card/fetchCardToken")
+    public String fetchCardToken() {
+        String httpUrl = tokenUrl;
+        RestTemplate client = new RestTemplate();
+        HttpHeaders headers = new HttpHeaders();
+        headers.setBasicAuth(username, password);
+        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
+        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity(headers);
+        ResponseEntity<Object> exchange = null;
+        exchange = client.exchange(httpUrl, HttpMethod.POST, requestEntity, Object.class);
+        System.out.println(JSON.toJSONString(exchange.getBody()));
+        LinkedHashMap linkedHashMap = (LinkedHashMap) exchange.getBody();
+        String accessToken = (String) ((LinkedHashMap) linkedHashMap.get("map")).get("Access-Token");
+        return accessToken;
+    }
+
+    public static void main(String[] args) {
+        String httpUrl = "http://61.48.80.80:8088/zuul/api/auth/client/login";
+        RestTemplate client = new RestTemplate();
+        HttpHeaders headers = new HttpHeaders();
+        headers.setBasicAuth("test_sy", "test_sy");
+        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
+        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity(headers);
+        ResponseEntity<Object> exchange = null;
+        exchange = client.exchange(httpUrl, HttpMethod.POST, requestEntity, Object.class);
+        System.out.println(JSON.toJSONString(exchange.getBody()));
+        LinkedHashMap linkedHashMap = (LinkedHashMap) exchange.getBody();
+        String accessToken = (String) ((LinkedHashMap) linkedHashMap.get("map")).get("Access-Token");
+        System.out.println(accessToken);
+
+        HttpHeaders headers1 = new HttpHeaders();
+        headers1.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        headers1.set("Access-Token", accessToken);
+        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
+        map.add("transCode", "P210009");
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("cardType", 1);
+        jsonObject.put("cardNo", "110114198808280013");
+        jsonObject.put("name", "储苑邦");
+        map.add("dataString", jsonObject.toJSONString());
+        String url = "http://61.48.80.80:8088/api/ywzt-proxy-service/proxy/KG1001";
+        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers1);
+        ResponseEntity<String> result = client.postForEntity(url, request, String.class);
+        System.out.println(JSON.toJSONString(result.getBody()));
+        //7c02f2af-6759-4ad3-9374-f8df2bd26ac2
+    }
+}
+

+ 24 - 0
provider-demo/src/main/java/com/tsf/demo/provider/controller/EnumController.java

@@ -0,0 +1,24 @@
+package com.tsf.demo.provider.controller;
+
+import com.tsf.demo.provider.common.enumcommon.OccupationEnum;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.List;
+
+@RestController
+@CrossOrigin
+@Api(value = "字典表", tags = "字典表接口")
+@RequestMapping("/enum")
+public class EnumController {
+    @ApiOperation(value = "", notes = "获取卡中心token")
+    @GetMapping(value = "/occupationList")
+    public List occupationList(){
+        return Arrays.asList(OccupationEnum.values());
+    }
+}

+ 54 - 0
provider-demo/src/main/java/com/tsf/demo/provider/controller/LogController.java

@@ -0,0 +1,54 @@
+package com.tsf.demo.provider.controller;
+
+import com.tsf.demo.provider.bean.po.MpMsCardApplicationLog;
+import com.tsf.demo.provider.bean.po.MpMsEcardApplicationLog;
+import com.tsf.demo.provider.bean.po.MpUserIdentification;
+import com.tsf.demo.provider.bean.po.MpUserIdentificationLog;
+import com.tsf.demo.provider.bean.vo.MpUserVO;
+import com.tsf.demo.provider.common.R;
+import com.tsf.demo.provider.service.MpLogService;
+import com.tsf.demo.provider.service.MpUserIdentificationService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@CrossOrigin
+@RequestMapping("/log")
+@Api(value = "日志", tags = "日志相关口")
+public class LogController {
+    @Autowired
+    private MpUserIdentificationService mpUserIdentificationService;
+    @Autowired
+    private MpLogService mpLogService;
+
+    /**
+     * 新增小程序端实体卡申请日志
+     */
+    @PostMapping("/add/mpMsCardApplicationLog")
+    @ApiOperation(value = "新增小程序端实体卡申请日志", notes = "新增小程序端实体卡申请日志")
+    public R add(MpMsCardApplicationLog mpMsCardApplicationLog) {
+        return mpLogService.add(mpMsCardApplicationLog);
+    }
+
+    /**
+     * 新增小程序端电子卡申请日志
+     */
+    @PostMapping("/add/mpEcardApplicationLog")
+    @ApiOperation(value = "新增小程序端电子卡申请日志", notes = "新增小程序端电子卡申请日志")
+    public R add(MpMsEcardApplicationLog mpMsEcardApplicationLog) {
+        return mpLogService.add(mpMsEcardApplicationLog);
+    }
+    /**
+     * 新增小程序端实名认证日志
+     */
+    @PostMapping("/add/mpUserIdentification")
+    @ApiOperation(value = "新增小程序端实名认证日志", notes = "新增小程序端实名认证日志")
+    public R add(MpUserIdentification mpUserIdentification) {
+        return mpUserIdentificationService.addMpUserIdentification(mpUserIdentification);
+    }
+}

+ 35 - 0
provider-demo/src/main/java/com/tsf/demo/provider/controller/MpUserController.java

@@ -0,0 +1,35 @@
+package com.tsf.demo.provider.controller;
+
+import com.tsf.demo.provider.bean.po.MpUser;
+import com.tsf.demo.provider.bean.vo.MpUserVO;
+import com.tsf.demo.provider.common.R;
+import com.tsf.demo.provider.service.MpUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@CrossOrigin
+@RequestMapping("/mpUser")
+@Api(value = "用户表", tags = "用户表接口")
+public class MpUserController {
+    @Autowired
+    private MpUserService mpUserService;
+    /**
+     * 增加用户
+     */
+    @PostMapping("/add")
+    @ApiOperation(value = "增加用户", notes = "传入")
+    public R add(MpUserVO mpUserVO) {
+        return mpUserService.addUser(mpUserVO);
+    }
+    /**
+     * 获取用户信息
+     */
+    @PostMapping("/info")
+    @ApiOperation(value = "查询用户详细信息", notes = "传入")
+    public R info(MpUserVO mpUserVO) {
+        return mpUserService.getMpUserByOpenId(mpUserVO);
+    }
+}

+ 14 - 0
provider-demo/src/main/java/com/tsf/demo/provider/controller/MpUserIdentificationController.java

@@ -0,0 +1,14 @@
+package com.tsf.demo.provider.controller;
+
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@CrossOrigin
+@RequestMapping("/mpUserIdentification")
+@Api(value = "用户实名认证", tags = "用户实名认证表接口")
+public class MpUserIdentificationController {
+
+}

+ 13 - 0
provider-demo/src/main/java/com/tsf/demo/provider/controller/MpUserTokenController.java

@@ -0,0 +1,13 @@
+package com.tsf.demo.provider.controller;
+
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@CrossOrigin
+@RequestMapping("/mpUserToken")
+@Api(value = "用户登录信息表", tags = "用户登录信息表接口")
+public class MpUserTokenController {
+}

+ 26 - 0
provider-demo/src/main/java/com/tsf/demo/provider/controller/NationController.java

@@ -0,0 +1,26 @@
+package com.tsf.demo.provider.controller;
+
+import com.tsf.demo.provider.bean.vo.MpUserVO;
+import com.tsf.demo.provider.common.R;
+import com.tsf.demo.provider.service.NationService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@CrossOrigin
+@RequestMapping("/mpNation")
+@Api(value = "民族表", tags = "民族列表接口")
+public class NationController {
+    @Autowired
+    private NationService nationService;
+    /**
+     * 民族列表
+     */
+    @GetMapping("/list")
+    @ApiOperation(value = "民族列表", notes = "传入")
+    public R list() {
+        return nationService.getAll();
+    }
+}

+ 122 - 0
provider-demo/src/main/java/com/tsf/demo/provider/controller/ProviderController.java

@@ -0,0 +1,122 @@
+package com.tsf.demo.provider.controller;
+
+import com.tsf.demo.provider.config.ProviderNameConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.tsf.core.util.TsfSpringContextAware;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.stream.Stream;
+
+@RestController
+public class ProviderController {
+    private static final Logger LOG = LoggerFactory.getLogger(ProviderController.class);
+
+    @Autowired
+    private ProviderNameConfig providerNameConfig;
+
+    @RequestMapping(value = "/echo/{param}", method = RequestMethod.GET)
+    public String echo(@PathVariable String param) {
+        LOG.info("provider-demo -- request param: [" + param + "]");
+        String result = "request param: " + param + ", response from " + providerNameConfig.getName();
+        LOG.info("provider-demo -- provider config name: [" + providerNameConfig.getName() + ']');
+        LOG.info("provider-demo -- response info: [" + result + "]");
+        return result;
+    }
+
+    @RequestMapping(value = "/config/{path}/value", method = RequestMethod.GET)
+    public String config(@PathVariable String path) {
+        return TsfSpringContextAware.getProperties(path);
+    }
+
+    @RequestMapping(value = "/echo/error/{param}", method = RequestMethod.GET)
+    public String echoError(@PathVariable String param) {
+        LOG.info("provider-demo -- Error request param: [" + param + "], throw exception");
+
+        throw new RuntimeException("mock-ex");
+    }
+
+    /**
+     * 延迟返回
+     * @param param 参数
+     * @param delay 延时时间,单位毫秒
+     * @throws InterruptedException
+     */
+    @RequestMapping(value = "/echo/slow/{param}", method = RequestMethod.GET)
+    public String echoSlow(@PathVariable String param, @RequestParam(required = false) Integer delay) throws InterruptedException {
+        int sleepTime = delay == null ? 1000 : delay;
+        LOG.info("provider-demo -- slow request param: [" + param + "], Start sleep: [" + sleepTime + "]ms");
+        Thread.sleep(sleepTime);
+        LOG.info("provider-demo -- slow request param: [" + param + "], End sleep: [" + sleepTime + "]ms");
+
+        String result = "request param: " + param
+                + ", slow response from " + providerNameConfig.getName()
+                + ", sleep: [" + sleepTime + "]ms";
+        return result;
+    }
+
+    /**
+     * 简单的鉴权接口。
+     * token = provider-demo 鉴权成功,其它失败。
+     * @param token 凭证
+     * @return 鉴权结果
+     */
+    @RequestMapping(value = "/checkToken", method = RequestMethod.GET)
+    public Map<String, Object> checkToken(@RequestParam String token) {
+        LOG.info("provider-demo -- request param: [" + token + "]");
+
+        Map<String, Object> resultMap = new HashMap<>();
+        resultMap.put("result", "provider-demo".equalsIgnoreCase(token));
+        resultMap.put("payload", "this is payload");
+
+        LOG.info("provider-demo -- response info: [" + resultMap + "]");
+        return resultMap;
+    }
+
+    /**
+     * 打印请求
+     * @param request 原始请求
+     * @return 请求内容
+     */
+    @RequestMapping(value = "/printRequest", method = RequestMethod.GET)
+    public Map<String, Object> printRequest(HttpServletRequest request) {
+        Map<String, Object> requestMap = new LinkedHashMap<>();
+        Map<String, String> headerMap = new LinkedHashMap<>();
+        Map<String, String> parameterMap = new LinkedHashMap<>();
+        Map<String, String> cookieMap = new LinkedHashMap<>();
+
+        Enumeration<String> headerNames = request.getHeaderNames();
+        while (headerNames.hasMoreElements()) {
+            String headerName = headerNames.nextElement();
+            headerMap.put(headerName, request.getHeader(headerName));
+        }
+
+        Enumeration<String> params = request.getParameterNames();
+        while (params.hasMoreElements()) {
+            String paramName = params.nextElement();
+            parameterMap.put(paramName, request.getParameter(paramName));
+        }
+
+        Cookie[] cookies = request.getCookies();
+        if (cookies != null && cookies.length > 0) {
+            Stream.of(cookies).forEach(e -> {
+                cookieMap.put(e.getName(), e.getValue());
+            });
+        }
+        requestMap.put("Protocol", request.getProtocol());
+        requestMap.put("Method", request.getMethod());
+        requestMap.put("URL", request.getRequestURL());
+        requestMap.put("Parameters", parameterMap);
+        requestMap.put("Headers", headerMap);
+        requestMap.put("Cookies", cookieMap);
+        requestMap.put("OriginalCookies", cookies);
+        return requestMap;
+    }
+}

+ 62 - 0
provider-demo/src/main/java/com/tsf/demo/provider/controller/SiYuanController.java

@@ -0,0 +1,62 @@
+package com.tsf.demo.provider.controller;
+
+import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.core.util.HexUtil;
+import cn.hutool.crypto.digest.DigestUtil;
+import com.tsf.demo.provider.common.siyuan.BeanSortUtil;
+import com.tsf.demo.provider.common.siyuan.CommonReq;
+import com.tsf.demo.provider.common.siyuan.Testa;
+import io.swagger.annotations.Api;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.springframework.http.*;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.alibaba.fastjson.*;
+import org.springframework.web.client.RestTemplate;
+
+@RestController
+@CrossOrigin
+@RequestMapping("/siYuanCard")
+@Api(value = "思源电子卡接口", tags = "思源电子卡接口")
+public class SiYuanController {
+    public static void main(String[] args) {
+        //获取思源卡中心sign
+        String url = "http://test-t600.systoon.com/platform-card/api/cardType/getCardTypeList";
+        String appSecret= "925f6792-cdde-49c1-93c1-e161459b93ee";
+        String appId = "1001153";
+        String signType = "MD5";
+        Long timestamp = System.currentTimeMillis();
+        String version = "1.0.0";
+        JSONObject jsonObjectParam = new JSONObject();
+        jsonObjectParam.put("appKey","\""+appId+"\"");
+        //jsonObjectParam.put("toonType","102");
+        String toSignStr = "appKey=\""+appId+"\"&"+
+                             "appSecret=\""+appSecret+"\"&"+
+                "data=\""+jsonObjectParam.toJSONString()+"\"&"+
+                "timestamp=\""+System.currentTimeMillis()+"\"&"+
+                "version=\""+version+"\"";
+        String sign = DigestUtils.md5Hex(toSignStr).toUpperCase();
+        //获取思源卡中心sign结束
+        //利用sign测试接口
+          //拼接请求体
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("appKey",appId);
+        jsonObject.put("timestamp",timestamp);
+        jsonObject.put("sign",sign);
+        jsonObject.put("version","1.0.0");
+        String httpUrl = "http://test-t600.systoon.com/platform-card/api/cardType/getCardTypeList";
+        RestTemplate client = new RestTemplate();
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("lpToken","obEOvw6wodEQV_W4pI4_-6sX1YOA");
+        headers.add("toonType","102");
+        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
+        HttpEntity<JSONObject> requestEntity = new HttpEntity(jsonObject,headers);
+        ResponseEntity<Object> exchange = null;
+        exchange = client.exchange(httpUrl, HttpMethod.POST, requestEntity, Object.class);
+        System.out.println(exchange.getBody());
+        //利用sign测试接口结束
+
+    }
+}

+ 200 - 0
provider-demo/src/main/java/com/tsf/demo/provider/controller/SiYuanUserController.java

@@ -0,0 +1,200 @@
+package com.tsf.demo.provider.controller;
+
+import cn.hutool.core.net.URLDecoder;
+import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.core.util.HexUtil;
+import cn.hutool.crypto.digest.DigestUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.parser.Feature;
+import com.tsf.demo.provider.common.siyuan.BeanSortUtil;
+import com.tsf.demo.provider.common.siyuan.CommonReq;
+import com.tsf.demo.provider.common.siyuan.Testa;
+import io.swagger.annotations.Api;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpException;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.*;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.*;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+@RestController
+@CrossOrigin
+@RequestMapping("/siYuanUser")
+@Api(value = "思源用户中心接口", tags = "思源用户中心接口")
+public class SiYuanUserController {
+    @Value("${ten.mp.urlPrefix}")
+    private String tenMpUrlPrefix;
+    public static void main(String[] args) throws Exception {
+
+        //openId = getUserInfo("0012Lmll2zmGF7409Pnl2wJspn42Lmlf");
+        String openId = "omsuv5YIgMYQNdpawZE2dAAGiZmw";
+        //获取思源用户中心sign
+        String appSecret= "623f2cc1cc663d3c9b7b1ac63becf234";
+        String appId = "20180117547016";
+        String signType = "MD5";
+        Long timestamp = System.currentTimeMillis();
+        String version = "1.0";
+        JSONObject jsonObjectParam = new JSONObject(true);
+        jsonObjectParam.put("uniqueId",openId);
+        jsonObjectParam.put("toonType","10200001");
+        String toSignStr = "appId="+appId+"&"+
+                "appSecret="+appSecret+"&"+
+                "bizParams="+jsonObjectParam.toJSONString()+"&"+
+                "signType="+signType+"&"+
+                "timestamp="+timestamp+"&"+
+                "version="+version;
+        String sign = DigestUtils.md5Hex(toSignStr).toUpperCase();
+
+        String toSignStr1 = "appId="+appId+"&"+
+                "appSecret="+appSecret+"&"+
+                "bizParams="+ URLEncoder.encode(jsonObjectParam.toJSONString())+"&"+
+                "signType="+signType+"&"+
+                "timestamp="+timestamp+"&"+
+                "version="+version;
+        //获取思源卡中心sign结束
+        //利用sign测试接口
+        //拼接请求体
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("appId",appId);
+        jsonObject.put("appSecret","623f2cc1cc663d3c9b7b1ac63becf234");
+        jsonObject.put("bizParams",jsonObjectParam);
+        jsonObject.put("sign",sign);
+        jsonObject.put("signType",signType);
+        jsonObject.put("timestamp",timestamp);
+        jsonObject.put("version","1.0");
+        String httpUrl = "http://test-t600.systoon.com/uias/api/np/getLpToken?";
+        RestTemplate client = new RestTemplate();
+        //HttpHeaders headers = new HttpHeaders();
+        //headers.add("lpToken",sign);
+        //headers.add("toonType","10200001");
+//        headers.setContentType(MediaType.);
+//        HttpEntity<JSONObject> requestEntity = new HttpEntity(jsonObject,headers);
+        JSONObject exchange = null;
+        exchange = client.getForObject(httpUrl+toSignStr1+"&sign="+sign, JSONObject.class,jsonObject);
+        System.out.println(exchange.get("code"));
+        //HttpGet httpGet = new HttpGet();
+
+// 设置参数
+
+//        try {
+//            CloseableHttpClient httpclient = HttpClients.createDefault();
+//            httpGet.setURI(new URI(httpUrl+toSignStr1+"&sign="+sign));
+//            HttpResponse httpResponse = httpclient.execute(httpGet);
+
+// 获取返回的数据
+
+//            org.apache.http.HttpEntity entity = httpResponse.getEntity();
+//            System.out.println(EntityUtils.toString(entity, "UTF-8"));
+//        } catch (URISyntaxException e) {
+//            throw new HttpException("请求url格式错误。"+e.getMessage());
+//        }
+
+
+       // String willSignStr =
+////        CommonReq req = new CommonReq();
+////        req.setAppId("20180117547016");
+////        Testa a = new Testa();
+////        a.setCardTypeId(11);
+////        a.setAppId("1001119");
+////        req.setData(JSON.toJSONString(a));
+////        req.setTimestamp(1628048715007L);
+////        String toSign = BeanSortUtil.json2SortString(req) + appSecret;
+////        String sign = HexUtil.encodeHexStr(DigestUtil.sha256(toSign, CharsetUtil.UTF_8));
+////        req.setSign(sign);
+//        //获取思源用户中心sign结束
+//        //利用sign测试接口
+//        String httpUrl = "http://test-t600.systoon.com/platform-card/card/getCardAppList";
+//        RestTemplate client = new RestTemplate();
+//        HttpHeaders headers = new HttpHeaders();
+//        headers.add("lpToken",sign);
+//        headers.add("toonType","10200001");
+//        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
+//        HttpEntity<Testa> requestEntity = new HttpEntity(a,headers);
+//        ResponseEntity<Object> exchange = null;
+//        exchange = client.exchange(httpUrl, HttpMethod.POST, requestEntity, Object.class);
+//        System.out.println(exchange.getBody());
+    }
+
+//    public String getUserInfo(@RequestParam(name = "code") String code) throws Exception {
+//        System.out.println("code" + code);
+//        String url = "https://api.weixin.qq.com/sns/jscode2session";
+//        url += "?appid=xxxxxxxxxxxxx";//自己的appid
+//        url += "&secret=xxxxxxxxxxxxxxxxxxx";//自己的appSecret
+//        url += "&js_code=" + code;
+//        url += "&grant_type=authorization_code";
+//        url += "&connect_redirect=1";
+//        String res = null;
+//        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+//        // DefaultHttpClient();
+//        HttpGet httpget = new HttpGet(url);    //GET方式
+//        CloseableHttpResponse response = null;
+//        // 配置信息
+//        RequestConfig requestConfig = RequestConfig.custom()          // 设置连接超时时间(单位毫秒)
+//                .setConnectTimeout(5000)                    // 设置请求超时时间(单位毫秒)
+//                .setConnectionRequestTimeout(5000)             // socket读写超时时间(单位毫秒)
+//                .setSocketTimeout(5000)                    // 设置是否允许重定向(默认为true)
+//                .setRedirectsEnabled(false).build();           // 将上面的配置信息 运用到这个Get请求里
+//        httpget.setConfig(requestConfig);                         // 由客户端执行(发送)Get请求
+//        response = httpClient.execute(httpget);                   // 从响应模型中获取响应实体
+//        HttpEntity responseEntity = (HttpEntity) response.getEntity();
+//        System.out.println("响应状态为:" + response.getStatusLine());
+//        if (responseEntity != null) {
+//            res = EntityUtils.toString(responseEntity);
+//            System.out.println("响应内容长度为:" + responseEntity.getContentLength());
+//            System.out.println("响应内容为:" + res);
+//        }
+//        // 释放资源
+//        if (httpClient != null) {
+//            httpClient.close();
+//        }
+//        if (response != null) {
+//            response.close();
+//        }
+//        JSONObject jo = JSON.parseObject(res);
+//        String openid = jo.getString("openid");
+//        System.out.println("openid" + openid);
+//        return openid;
+//    }
+    //获取用小程序用户的openId
+    public  static String getUserInfo(@RequestParam(name= "code")String code) throws Exception {
+        RestTemplate client = new RestTemplate();
+        String url = "http://gw-test.bjzhengxin.com.cn/api/mp/login";
+        HttpHeaders headers1 = new HttpHeaders();
+        headers1.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
+        map.add("appid", "wxa6edcc091ed14847");
+        map.add("paasid", "tyrz");
+        map.add("code", "061x8Z000NvOkM1BsP300iCAwh1x8Z0O");
+        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity(map,headers1);
+        ResponseEntity<String> result = client.postForEntity(url, request, String.class);
+        String body = new String(URLDecoder.decode(result.getBody().getBytes(StandardCharsets.UTF_8)));
+        System.out.println(body);
+        JSONObject jsonObject = JSONObject.parseObject(body.substring(0,body.length()-1));
+        System.out.println(jsonObject.get("errcode"));
+        return JSON.toJSONString(result.getBody());
+    }
+
+}

+ 104 - 0
provider-demo/src/main/java/com/tsf/demo/provider/controller/SpanController.java

@@ -0,0 +1,104 @@
+package com.tsf.demo.provider.controller;
+
+import brave.Span;
+import brave.Tracing;
+import brave.handler.MutableSpan;
+import brave.propagation.CurrentTraceContext;
+import brave.propagation.TraceContext;
+import com.tsf.demo.provider.config.ProviderNameConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+
+@RestController
+public class SpanController {
+    private static final Logger LOG = LoggerFactory.getLogger(ProviderController.class);
+    @Autowired
+    private ProviderNameConfig providerNameConfig;
+    @Autowired
+    private Tracing tracing;
+
+    //获取span信息时打开
+    @RequestMapping(value = "/getSpan/{param}", method = RequestMethod.GET)
+    public String getSpan(@PathVariable String param) throws Exception {
+        TraceContext traceContext = tracing.tracer().currentSpan().context();
+
+        //获取traceid,spanid
+        long traceId = traceContext.traceId();
+        long spanId = traceContext.spanId();
+        LOG.info("traceId:{},spanId:{}",traceId, spanId);
+
+        //获取tags
+        Span span = tracing.tracer().currentSpan();
+        Field state = span.getClass().getDeclaredField("state");
+        state.setAccessible(true);
+        MutableSpan mutableSpan = (MutableSpan)state.get(span);
+
+        Field tags = mutableSpan.getClass().getDeclaredField("tags");
+        tags.setAccessible(true);
+        ArrayList<String> list = (ArrayList<String>) tags.get(mutableSpan);
+        String key =null, value =null;
+        for (int i = 0, length = list.size(); i < length; i += 2) {
+            key =  list.get(i);
+            value = list.get(i + 1);
+
+            LOG.info("tags key: {}, value: {}", key, value);
+        }
+
+        String result = "request param: " + param + ", response from " + providerNameConfig.getName();
+
+        return result;
+    }
+
+    //设置span信息时打开
+    @RequestMapping(value = "/addSpan/{param}", method = RequestMethod.GET)
+    public void addSpan(@PathVariable String param) throws Exception{
+        TraceContext traceContext = tracing.tracer().currentSpan().context();
+
+        TraceContext context = traceContext.toBuilder().traceId(2035873338086630653L).spanId(-2035873338086630653L).build();
+
+        CurrentTraceContext currentTraceContext = tracing.currentTraceContext();
+        currentTraceContext.newScope(context);
+
+        Span spanCur = tracing.tracer().currentSpan();
+
+
+        long traceId1 = spanCur.context().traceId();
+        long spanId1 = spanCur.context().spanId();
+        LOG.info("traceId1:{},spanId1:{}",traceId1, spanId1);
+
+
+        //添加tag
+        spanCur.tag("qx-test1","value");
+        spanCur.tag("qx-test2","value");
+        spanCur.tag("qx-test1","value");
+
+        //获取tag
+        Field state1 = spanCur.getClass().getDeclaredField("state");
+        state1.setAccessible(true);
+        MutableSpan mutableSpan1 = (MutableSpan)state1.get(spanCur);
+        Field tags1 = mutableSpan1.getClass().getDeclaredField("tags");
+        tags1.setAccessible(true);
+        ArrayList<String> list1 = (ArrayList<String>) tags1.get(mutableSpan1);
+        String key1 =null, value1 =null;
+        for (int i = 0, length = list1.size(); i < length; i += 2) {
+            key1 =  list1.get(i);
+            value1 = list1.get(i + 1);
+
+            LOG.info("tags key1: {}, value1: {}", key1, value1);
+        }
+
+        //获取traceid, spanid
+        TraceContext traceContext1 = spanCur.context();
+        long traceId2 = traceContext1.traceId();
+        long spanId2 = traceContext1.spanId();
+        LOG.info("traceId1:{},spanId1:{}",traceId2, spanId2);
+    }
+}

+ 170 - 0
provider-demo/src/main/java/com/tsf/demo/provider/controller/TenController.java

@@ -0,0 +1,170 @@
+package com.tsf.demo.provider.controller;
+
+import com.tencentcloudapi.common.Credential;
+import com.tencentcloudapi.common.profile.ClientProfile;
+import com.tencentcloudapi.common.profile.HttpProfile;
+import com.tencentcloudapi.common.exception.TencentCloudSDKException;
+import com.tencentcloudapi.ocr.v20181119.OcrClient;
+import com.tencentcloudapi.ocr.v20181119.models.*;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import sun.misc.BASE64Encoder;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.InputStream;
+
+
+@RestController
+public class TenController {
+
+    @Value("${ten.authen.secretId}")
+    private String secretId;
+
+    @Value("${ten.authen.secretKey}")
+    private String secretKey;
+
+    public static void main(String[] args) {
+//        // 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
+//        // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
+//        Credential cred = new Credential("AKIDRhgQt76oFPIwJPEm33mEQLzLRGn44oHT", "wc190bw1qPimcKuyUmpc9buzsY0FG3bw");
+//        // 实例化一个http选项,可选的,没有特殊需求可以跳过
+//        HttpProfile httpProfile = new HttpProfile();
+//        httpProfile.setEndpoint("ocr.tencentcloudapi.com");
+//        // 实例化一个client选项,可选的,没有特殊需求可以跳过
+//        ClientProfile clientProfile = new ClientProfile();
+//        clientProfile.setHttpProfile(httpProfile);
+//        // 实例化要请求产品的client对象,clientProfile是可选的
+//        OcrClient client = new OcrClient(cred, "ap-beijing", clientProfile);
+//        // 实例化一个请求对象,每个接口都会对应一个request对象
+//        IDCardOCRRequest req = new IDCardOCRRequest();
+//        req.setImageUrl("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww.jcrb.com%2Fn1%2Fimages%2Fjcrb1534%2Fpic_95841.jpg");
+//        // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应
+//        IDCardOCRResponse resp = null;
+//        try {
+//            resp = client.IDCardOCR(req);
+//        } catch (TencentCloudSDKException e) {
+//            e.printStackTrace();
+//        }
+//        // 输出json格式的字符串回包
+//        System.out.println(IDCardOCRResponse.toJsonString(resp));
+
+        try{
+            // 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
+            // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
+            Credential cred = new Credential("AKIDRhgQt76oFPIwJPEm33mEQLzLRGn44oHT", "wc190bw1qPimcKuyUmpc9buzsY0FG3bw");
+            // 实例化一个http选项,可选的,没有特殊需求可以跳过
+            HttpProfile httpProfile = new HttpProfile();
+            httpProfile.setEndpoint("ocr.tencentcloudapi.com");
+            // 实例化一个client选项,可选的,没有特殊需求可以跳过
+            ClientProfile clientProfile = new ClientProfile();
+            clientProfile.setHttpProfile(httpProfile);
+            // 实例化要请求产品的client对象,clientProfile是可选的
+            OcrClient client = new OcrClient(cred, "ap-beijing", clientProfile);
+            // 实例化一个请求对象,每个接口都会对应一个request对象
+            ResidenceBookletOCRRequest req = new ResidenceBookletOCRRequest();
+            req.setImageUrl("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww.jcrb.com%2Fn1%2Fimages%2Fjcrb1534%2Fpic_95841.jpg");
+            // 返回的resp是一个ResidenceBookletOCRResponse的实例,与请求对象对应
+            ResidenceBookletOCRResponse resp = client.ResidenceBookletOCR(req);
+            // 输出json格式的字符串回包
+            System.out.println(ResidenceBookletOCRResponse.toJsonString(resp));
+        } catch (TencentCloudSDKException e) {
+            System.out.println(e.toString());
+        }
+    }
+    @ApiOperation(value = "身份证识别", notes = "传入")
+    @PostMapping(value = "/fileUpload/identityCard")
+    public String fileUploadIdCard(@RequestParam(value = "file") MultipartFile file, Model model, HttpServletRequest request) {
+        if (file.isEmpty()) {
+            System.out.println("文件为空空");
+        }
+
+        InputStream in = null;
+        byte[] data = null;
+        try {
+            in = file.getInputStream();
+            data = new byte[in.available()];
+            in.read(data);
+            in.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        BASE64Encoder encoder = new BASE64Encoder();
+         //encoder.encode(data);
+        // 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
+        // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
+        Credential cred = new Credential(secretId, secretKey);
+        // 实例化一个http选项,可选的,没有特殊需求可以跳过
+        HttpProfile httpProfile = new HttpProfile();
+        httpProfile.setEndpoint("ocr.tencentcloudapi.com");
+        // 实例化一个client选项,可选的,没有特殊需求可以跳过
+        ClientProfile clientProfile = new ClientProfile();
+        clientProfile.setHttpProfile(httpProfile);
+        // 实例化要请求产品的client对象,clientProfile是可选的
+        OcrClient client = new OcrClient(cred, "ap-beijing", clientProfile);
+        // 实例化一个请求对象,每个接口都会对应一个request对象
+        IDCardOCRRequest req = new IDCardOCRRequest();
+        req.setImageBase64(encoder.encode(data));
+        // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应
+        IDCardOCRResponse resp = null;
+        try {
+            resp = client.IDCardOCR(req);
+        } catch (TencentCloudSDKException e) {
+            e.printStackTrace();
+        }
+        // 输出json格式的字符串回包
+        System.out.println(IDCardOCRResponse.toJsonString(resp));
+        return IDCardOCRResponse.toJsonString(resp);
+    }
+
+    @ApiOperation(value = "户口本识别", notes = "传入")
+    @PostMapping(value = "/fileUpload/residenceBooklet")
+    public String fileUploadResidenceBooklet(@RequestParam(value = "file") MultipartFile file, Model model, HttpServletRequest request) {
+        if (file.isEmpty()) {
+            System.out.println("文件为空空");
+        }
+
+        InputStream in = null;
+        byte[] data = null;
+        try {
+            in = file.getInputStream();
+            data = new byte[in.available()];
+            in.read(data);
+            in.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        BASE64Encoder encoder = new BASE64Encoder();
+        //encoder.encode(data);
+        // 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
+        // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
+        Credential cred = new Credential(secretId, secretKey);
+        // 实例化一个http选项,可选的,没有特殊需求可以跳过
+        HttpProfile httpProfile = new HttpProfile();
+        httpProfile.setEndpoint("ocr.tencentcloudapi.com");
+        // 实例化一个client选项,可选的,没有特殊需求可以跳过
+        ClientProfile clientProfile = new ClientProfile();
+        clientProfile.setHttpProfile(httpProfile);
+        // 实例化要请求产品的client对象,clientProfile是可选的
+        OcrClient client = new OcrClient(cred, "ap-beijing", clientProfile);
+        // 实例化一个请求对象,每个接口都会对应一个request对象
+        ResidenceBookletOCRRequest req = new ResidenceBookletOCRRequest();
+        req.setImageBase64(encoder.encode(data));
+        // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应
+        ResidenceBookletOCRResponse resp = null;
+        try {
+            resp = client.ResidenceBookletOCR(req);
+        } catch (TencentCloudSDKException e) {
+            e.printStackTrace();
+        }
+        // 输出json格式的字符串回包
+        System.out.println(ResidenceBookletOCRResponse.toJsonString(resp));
+        return ResidenceBookletOCRResponse.toJsonString(resp);
+    }
+
+}

+ 7 - 0
provider-demo/src/main/java/com/tsf/demo/provider/dao/MpMsCardApplicationLogDao.java

@@ -0,0 +1,7 @@
+package com.tsf.demo.provider.dao;
+
+import com.tsf.demo.provider.bean.po.MpMsCardApplicationLog;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface MpMsCardApplicationLogDao extends JpaRepository<MpMsCardApplicationLog,Long> {
+}

+ 7 - 0
provider-demo/src/main/java/com/tsf/demo/provider/dao/MpMsEcardApplicationLogDao.java

@@ -0,0 +1,7 @@
+package com.tsf.demo.provider.dao;
+
+import com.tsf.demo.provider.bean.po.MpMsEcardApplicationLog;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface MpMsEcardApplicationLogDao extends JpaRepository<MpMsEcardApplicationLog,Long> {
+}

+ 7 - 0
provider-demo/src/main/java/com/tsf/demo/provider/dao/MpNationDao.java

@@ -0,0 +1,7 @@
+package com.tsf.demo.provider.dao;
+
+import com.tsf.demo.provider.bean.po.MpNation;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface MpNationDao extends JpaRepository<MpNation,Long> {
+}

+ 7 - 0
provider-demo/src/main/java/com/tsf/demo/provider/dao/MpUserDao.java

@@ -0,0 +1,7 @@
+package com.tsf.demo.provider.dao;
+
+import com.tsf.demo.provider.bean.po.MpUser;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface MpUserDao extends JpaRepository<MpUser,Long> {
+}

+ 0 - 0
provider-demo/src/main/java/com/tsf/demo/provider/dao/MpUserIdentificationDao.java


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.