From 354fdddbe38985cbfa0e6dfc7eae43bb7cc41cf6 Mon Sep 17 00:00:00 2001
From: xuebing feng <fengxb@broada.com>
Date: Wed, 6 Sep 2023 22:22:55 +0800
Subject: [PATCH 1/3] =?UTF-8?q?=E8=87=AA=E5=B7=B1=E5=86=99=E7=9A=84?=
 =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/example/awaysuse/controller/GetInfoController.java   | 0
 .../src/main/java/com/example/awaysuse/util/CacheUtil.java        | 0
 .../src/main/java/com/example/awaysuse/util/TimeUtil.java         | 0
 spring-boot-demo-easypoi/pom.xml                                  | 0
 spring-boot-demo-fileupload/pom.xml                               | 0
 5 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/controller/GetInfoController.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/CacheUtil.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/TimeUtil.java
 create mode 100644 spring-boot-demo-easypoi/pom.xml
 create mode 100644 spring-boot-demo-fileupload/pom.xml

diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/controller/GetInfoController.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/controller/GetInfoController.java
new file mode 100644
index 000000000..e69de29bb
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/CacheUtil.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/CacheUtil.java
new file mode 100644
index 000000000..e69de29bb
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/TimeUtil.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/TimeUtil.java
new file mode 100644
index 000000000..e69de29bb
diff --git a/spring-boot-demo-easypoi/pom.xml b/spring-boot-demo-easypoi/pom.xml
new file mode 100644
index 000000000..e69de29bb
diff --git a/spring-boot-demo-fileupload/pom.xml b/spring-boot-demo-fileupload/pom.xml
new file mode 100644
index 000000000..e69de29bb

From 2974959493812c44b7529695e930fe6396721722 Mon Sep 17 00:00:00 2001
From: xuebing feng <fengxb@broada.com>
Date: Wed, 6 Sep 2023 22:32:41 +0800
Subject: [PATCH 2/3] =?UTF-8?q?=E8=87=AA=E5=B7=B1=E5=86=99=E7=9A=84?=
 =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 spring-boot-demo-alwaysuse/pom.xml            | 190 +++++
 .../example/awaysuse/AwaysuseApplication.java |  15 +
 .../awaysuse/callmsg/CallResultMsg.java       |  15 +
 .../example/awaysuse/callmsg/CodeAndMsg.java  |  24 +
 .../callmsg/UniformReponseHandler.java        |  47 ++
 .../callmsg/UserDefinedException.java         |  20 +
 .../com/example/awaysuse/config/ESConfig.java |  73 ++
 .../config/GlobalExceptionHandler.java        |  78 +++
 .../example/awaysuse/config/IndexConfig.java  |  16 +
 .../controller/ControllerResponseAdvice.java  |  38 +
 .../controller/TestCallMsgResult.java         |  45 ++
 .../controller/UserInfoController.java        |  34 +
 .../exception/MyNotFoundException.java        |  50 ++
 .../java/com/example/awaysuse/model/Doc.java  |  29 +
 .../java/com/example/awaysuse/model/Help.java |  27 +
 .../com/example/awaysuse/model/PageData.java  |  51 ++
 .../com/example/awaysuse/model/Person.java    |  56 ++
 .../example/awaysuse/model/ProductInfo.java   |   9 +
 .../awaysuse/model/ReportTimeLimit.java       |  29 +
 .../awaysuse/model/UserInfoEntity.java        |  28 +
 .../awaysuse/model/vo/ProductInfoVo.java      |  21 +
 .../myrequest/RequestDemoController1.java     |  62 ++
 .../myrequest/RequestDemoController2.java     |  13 +
 .../awaysuse/response/ResponseResult.java     |  51 ++
 .../example/awaysuse/result/ResultCode.java   |  25 +
 .../com/example/awaysuse/result/ResultVo.java |  45 ++
 .../example/awaysuse/result/StatusCode.java   |   9 +
 .../awaysuse/service/BranchHandle.java        |  11 +
 .../service/PresentOrElseHandler.java         |  17 +
 .../service/ThrowExceptionFunction.java       |   8 +
 .../com/example/awaysuse/thread/MyTask.java   |  30 +
 .../com/example/awaysuse/thread/MyTest.java   |  40 ++
 .../example/awaysuse/thread/MyThreadPool.java |  53 ++
 .../com/example/awaysuse/thread/MyWorker.java |  26 +
 .../awaysuse/util/BeanConvertUtils.java       |  79 +++
 .../awaysuse/util/BigDecimalUtils.java        |  80 +++
 .../example/awaysuse/util/CommonUtils.java    |  54 ++
 .../example/awaysuse/util/CompareTime.java    |  56 ++
 .../example/awaysuse/util/DataCalcUtils.java  | 115 +++
 .../awaysuse/util/DemoResourceSync.java       | 164 +++++
 .../com/example/awaysuse/util/ESUtils.java    | 662 ++++++++++++++++++
 .../com/example/awaysuse/util/ExcelUtils.java | 402 +++++++++++
 .../example/awaysuse/util/FutureReqUtil.java  |   0
 .../awaysuse/util/HttpClientUtils.java        | 447 ++++++++++++
 .../com/example/awaysuse/util/MapUtils.java   |  49 ++
 .../com/example/awaysuse/util/NullUtils.java  |  28 +
 .../com/example/awaysuse/util/OkhttpUtil.java | 129 ++++
 .../com/example/awaysuse/util/VUtils.java     |  47 ++
 .../awaysuse/util/ZonedDateTimeUtil.java      | 114 +++
 .../java/com/example/spring/Application.java  |  15 +
 .../controller/RetryableController.java       |  26 +
 .../spring/service/RetryableService.java      |  31 +
 .../src/main/resources/application.yml        |  19 +
 .../awaysuse/AwaysuseApplicationTests.java    | 638 +++++++++++++++++
 .../java/com/example/awaysuse/CronUtil.java   | 142 ++++
 .../com/example/awaysuse/HutoolDateUtil.java  |  24 +
 .../com/example/awaysuse/PatternTest.java     | 351 ++++++++++
 .../com/example/awaysuse/entity/Policy.java   |  12 +
 .../com/example/awaysuse/entity/User.java     |  41 ++
 .../com/example/awaysuse/test/SecondWord.java |  22 +
 .../com/xkcoding/async/task/ThreeDemo3.java   |  45 ++
 spring-boot-demo-component/pom.xml            |  53 ++
 .../SpringbootcomponentApplication.java       |  15 +
 .../component/config/WebMvcConfig.java        |  28 +
 .../controller/CommonFilterController.java    |  21 +
 .../controller/InterceptorController.java     |  24 +
 .../component/filters/AnoContextListener.java |  18 +
 .../filters/CommonFilterAnnotation.java       |  67 ++
 .../component/filters/MyInterceptor.java      |  37 +
 .../SpringbootcomponentApplicationTests.java  |  13 +
 spring-boot-demo-disconf/pom.xml              |  54 ++
 .../example/disconf/DisconfApplication.java   |  17 +
 .../com/example/disconf/conifg/DemoBean.java  |  23 +
 .../example/disconf/conifg/DisconfConfig.java |  20 +
 .../example/disconf/conifg/JedisConfig.java   |  32 +
 .../disconf/controller/DemoController.java    |  32 +
 .../disconf/controller/DisconfController.java |  19 +
 .../src/main/resources/autoconfig.properties  |   1 +
 .../src/main/resources/disconf.properties     |  28 +
 .../src/main/resources/disconf.xml            |  41 ++
 .../src/main/resources/log4j2.xml             |  17 +
 .../disconf/DisconfApplicationTests.java      |  13 +
 .../SpringBootEasyExcelApplication.java       |  14 +
 .../controller/ExportController.java          |  40 ++
 .../springboot/easyexcel/entity/Member.java   |  40 ++
 .../easyexcel/service/MemberService.java      |  17 +
 .../service/impl/MemberServiceImpl.java       |  46 ++
 .../util/CommonCellStyleStrategy.java         |  58 ++
 .../util/CustomCellWriteHandler.java          |  79 +++
 .../easyexcel/util/GenderConverter.java       |  54 ++
 .../xkcoding/elasticsearch/model/DemoDto.java |  15 +
 .../exception/handler/constant/ResTypes.java  |  38 +
 .../com/xkcoding/mongodb/model/Employee.java  |  26 +
 .../java/com/xkcoding/mongodb/model/Zips.java |  28 +
 .../mongodb/repository/MongoAggTest.java      | 139 ++++
 .../mq/kafka/consumer/DelayConsumer.java      | 108 +++
 .../mq/kafka/controller/SendMessage.java      |  58 ++
 .../mq/kafka/handler/DelayManager.java        | 112 +++
 .../xkcoding/mq/kafka/model/DelayMessage.java |  34 +
 .../xkcoding/mq/kafka/utils/KafkaManager.java | 102 +++
 spring-boot-demo-original/pom.xml             |  53 ++
 .../demo/original/OriginalApplication.java    |  13 +
 .../src/main/resources/application.yml        |   3 +
 .../original/OriginalApplicationTests.java    |  13 +
 .../deletefile/DeleteExpiredFile.java         |  51 ++
 .../BatchTaskDataSourceInitializer.java       |  40 ++
 .../mybatis/plus/task/PendingSchelude.java    |  33 +
 .../orm/mybatis/plus/task/ScheduleConfig.java |  19 +
 .../src/main/resources/db/people.sql          |   6 +
 .../mybatis/controller/UserController.java    |  32 +
 .../orm/mybatis/service/UserService.java      |   8 +
 .../mybatis/service/impl/UserServiceImpl.java |  45 ++
 spring-boot-demo-poitl/pom.xml                |  52 ++
 .../com/example/export/DemoApplication.java   |  13 +
 .../controller/ExportArrivedReport.java       |  10 +
 .../example/export/DemoApplicationTests.java  |  13 +
 .../redis/config/RedisBeanConfig.java         |  68 ++
 .../redis/controller/Test2Controller.java     |  25 +
 spring-boot-demo-toolclass/pom.xml            |  41 ++
 .../toolclass/ToolclassApplication.java       |  13 +
 .../toolclass/aesencoder/AESEncoder.java      | 152 ++++
 .../toolclass/ToolclassApplicationTests.java  |  13 +
 spring-boot-springsecurity/pom.xml            |  42 ++
 .../com/sangeng/SgSecurityApplication.java    |  14 +
 .../sangeng/controller/HelloController.java   |  16 +
 .../src/main/resources/application.yml        |   2 +
 spring-demo-anlticdubbo/pom.xml               |  41 ++
 .../anlticdubbo/AnlticdubboApplication.java   |  13 +
 .../AnlticdubboApplicationTests.java          |  13 +
 129 files changed, 7515 insertions(+)
 create mode 100644 spring-boot-demo-alwaysuse/pom.xml
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/AwaysuseApplication.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/CallResultMsg.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/CodeAndMsg.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/UniformReponseHandler.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/UserDefinedException.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/config/ESConfig.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/config/GlobalExceptionHandler.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/config/IndexConfig.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/controller/ControllerResponseAdvice.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/controller/TestCallMsgResult.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/controller/UserInfoController.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/exception/MyNotFoundException.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/Doc.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/Help.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/PageData.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/Person.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/ProductInfo.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/ReportTimeLimit.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/UserInfoEntity.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/vo/ProductInfoVo.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/myrequest/RequestDemoController1.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/myrequest/RequestDemoController2.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/response/ResponseResult.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/result/ResultCode.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/result/ResultVo.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/result/StatusCode.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/service/BranchHandle.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/service/PresentOrElseHandler.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/service/ThrowExceptionFunction.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyTask.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyTest.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyThreadPool.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyWorker.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/BeanConvertUtils.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/BigDecimalUtils.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/CommonUtils.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/CompareTime.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/DataCalcUtils.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/DemoResourceSync.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/ESUtils.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/ExcelUtils.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/FutureReqUtil.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/HttpClientUtils.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/MapUtils.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/NullUtils.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/OkhttpUtil.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/VUtils.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/ZonedDateTimeUtil.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/spring/Application.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/spring/controller/RetryableController.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/java/com/example/spring/service/RetryableService.java
 create mode 100644 spring-boot-demo-alwaysuse/src/main/resources/application.yml
 create mode 100644 spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/AwaysuseApplicationTests.java
 create mode 100644 spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/CronUtil.java
 create mode 100644 spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/HutoolDateUtil.java
 create mode 100644 spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/PatternTest.java
 create mode 100644 spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/entity/Policy.java
 create mode 100644 spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/entity/User.java
 create mode 100644 spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/test/SecondWord.java
 create mode 100644 spring-boot-demo-async/src/test/java/com/xkcoding/async/task/ThreeDemo3.java
 create mode 100644 spring-boot-demo-component/pom.xml
 create mode 100644 spring-boot-demo-component/src/main/java/com/xkcoding/component/SpringbootcomponentApplication.java
 create mode 100644 spring-boot-demo-component/src/main/java/com/xkcoding/component/config/WebMvcConfig.java
 create mode 100644 spring-boot-demo-component/src/main/java/com/xkcoding/component/controller/CommonFilterController.java
 create mode 100644 spring-boot-demo-component/src/main/java/com/xkcoding/component/controller/InterceptorController.java
 create mode 100644 spring-boot-demo-component/src/main/java/com/xkcoding/component/filters/AnoContextListener.java
 create mode 100644 spring-boot-demo-component/src/main/java/com/xkcoding/component/filters/CommonFilterAnnotation.java
 create mode 100644 spring-boot-demo-component/src/main/java/com/xkcoding/component/filters/MyInterceptor.java
 create mode 100644 spring-boot-demo-component/src/test/java/com/xkcoding/component/SpringbootcomponentApplicationTests.java
 create mode 100644 spring-boot-demo-disconf/pom.xml
 create mode 100644 spring-boot-demo-disconf/src/main/java/com/example/disconf/DisconfApplication.java
 create mode 100644 spring-boot-demo-disconf/src/main/java/com/example/disconf/conifg/DemoBean.java
 create mode 100644 spring-boot-demo-disconf/src/main/java/com/example/disconf/conifg/DisconfConfig.java
 create mode 100644 spring-boot-demo-disconf/src/main/java/com/example/disconf/conifg/JedisConfig.java
 create mode 100644 spring-boot-demo-disconf/src/main/java/com/example/disconf/controller/DemoController.java
 create mode 100644 spring-boot-demo-disconf/src/main/java/com/example/disconf/controller/DisconfController.java
 create mode 100644 spring-boot-demo-disconf/src/main/resources/autoconfig.properties
 create mode 100644 spring-boot-demo-disconf/src/main/resources/disconf.properties
 create mode 100644 spring-boot-demo-disconf/src/main/resources/disconf.xml
 create mode 100644 spring-boot-demo-disconf/src/main/resources/log4j2.xml
 create mode 100644 spring-boot-demo-disconf/src/test/java/com/example/disconf/DisconfApplicationTests.java
 create mode 100644 spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/SpringBootEasyExcelApplication.java
 create mode 100644 spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/controller/ExportController.java
 create mode 100644 spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/entity/Member.java
 create mode 100644 spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/service/MemberService.java
 create mode 100644 spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/service/impl/MemberServiceImpl.java
 create mode 100644 spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/util/CommonCellStyleStrategy.java
 create mode 100644 spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/util/CustomCellWriteHandler.java
 create mode 100644 spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/util/GenderConverter.java
 create mode 100644 spring-boot-demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/model/DemoDto.java
 create mode 100644 spring-boot-demo-exception-handler/src/main/java/com/xkcoding/exception/handler/constant/ResTypes.java
 create mode 100644 spring-boot-demo-mongodb/src/main/java/com/xkcoding/mongodb/model/Employee.java
 create mode 100644 spring-boot-demo-mongodb/src/main/java/com/xkcoding/mongodb/model/Zips.java
 create mode 100644 spring-boot-demo-mongodb/src/test/java/com/xkcoding/mongodb/repository/MongoAggTest.java
 create mode 100644 spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/consumer/DelayConsumer.java
 create mode 100644 spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/controller/SendMessage.java
 create mode 100644 spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/handler/DelayManager.java
 create mode 100644 spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/model/DelayMessage.java
 create mode 100644 spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/utils/KafkaManager.java
 create mode 100644 spring-boot-demo-original/pom.xml
 create mode 100644 spring-boot-demo-original/src/main/java/com/myself/demo/original/OriginalApplication.java
 create mode 100644 spring-boot-demo-original/src/main/resources/application.yml
 create mode 100644 spring-boot-demo-original/src/test/java/com/myself/demo/original/OriginalApplicationTests.java
 create mode 100644 spring-boot-demo-original/src/test/java/com/myself/demo/original/deletefile/DeleteExpiredFile.java
 create mode 100644 spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/config/BatchTaskDataSourceInitializer.java
 create mode 100644 spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/task/PendingSchelude.java
 create mode 100644 spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/task/ScheduleConfig.java
 create mode 100644 spring-boot-demo-orm-mybatis-plus/src/main/resources/db/people.sql
 create mode 100644 spring-boot-demo-orm-mybatis/src/main/java/com/xkcoding/orm/mybatis/controller/UserController.java
 create mode 100644 spring-boot-demo-orm-mybatis/src/main/java/com/xkcoding/orm/mybatis/service/UserService.java
 create mode 100644 spring-boot-demo-orm-mybatis/src/main/java/com/xkcoding/orm/mybatis/service/impl/UserServiceImpl.java
 create mode 100644 spring-boot-demo-poitl/pom.xml
 create mode 100644 spring-boot-demo-poitl/src/main/java/com/example/export/DemoApplication.java
 create mode 100644 spring-boot-demo-poitl/src/main/java/com/example/export/controller/ExportArrivedReport.java
 create mode 100644 spring-boot-demo-poitl/src/test/java/com/example/export/DemoApplicationTests.java
 create mode 100644 spring-boot-demo-ratelimit-redis/src/main/java/com/xkcoding/ratelimit/redis/config/RedisBeanConfig.java
 create mode 100644 spring-boot-demo-ratelimit-redis/src/main/java/com/xkcoding/ratelimit/redis/controller/Test2Controller.java
 create mode 100644 spring-boot-demo-toolclass/pom.xml
 create mode 100644 spring-boot-demo-toolclass/src/main/java/com/example/toolclass/ToolclassApplication.java
 create mode 100644 spring-boot-demo-toolclass/src/main/java/com/example/toolclass/aesencoder/AESEncoder.java
 create mode 100644 spring-boot-demo-toolclass/src/test/java/com/example/toolclass/ToolclassApplicationTests.java
 create mode 100644 spring-boot-springsecurity/pom.xml
 create mode 100644 spring-boot-springsecurity/src/main/java/com/sangeng/SgSecurityApplication.java
 create mode 100644 spring-boot-springsecurity/src/main/java/com/sangeng/controller/HelloController.java
 create mode 100644 spring-boot-springsecurity/src/main/resources/application.yml
 create mode 100644 spring-demo-anlticdubbo/pom.xml
 create mode 100644 spring-demo-anlticdubbo/src/main/java/com/uyun/anltic/anlticdubbo/AnlticdubboApplication.java
 create mode 100644 spring-demo-anlticdubbo/src/test/java/com/uyun/anltic/anlticdubbo/AnlticdubboApplicationTests.java

diff --git a/spring-boot-demo-alwaysuse/pom.xml b/spring-boot-demo-alwaysuse/pom.xml
new file mode 100644
index 000000000..193fb1aa2
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/pom.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-parent</artifactId>
+    <version>2.3.12.RELEASE</version>
+    <relativePath/> <!-- lookup parent from repository -->
+  </parent>
+  <groupId>com.example</groupId>
+  <artifactId>awaysuse</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <name>awaysuse</name>
+  <description>Demo project for Spring Boot</description>
+  <properties>
+    <java.version>1.8</java.version>
+  </properties>
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <!-- lombok -->
+    <dependency>
+      <groupId>org.projectlombok</groupId>
+      <artifactId>lombok</artifactId>
+      <optional>true</optional>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-configuration-processor</artifactId>
+      <optional>true</optional>
+    </dependency>
+
+    <dependency>
+      <groupId>cn.hutool</groupId>
+      <artifactId>hutool-all</artifactId>
+      <version>5.5.2</version>
+    </dependency>
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>fastjson</artifactId>
+      <version>1.2.68</version>
+      <scope>compile</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>uyun.whale</groupId>
+      <artifactId>common-encryption</artifactId>
+      <version>2.0.4-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.squareup.okhttp</groupId>
+      <artifactId>okhttp</artifactId>
+      <version>2.7.5</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
+
+    <!--poi依赖-->
+    <dependency>
+      <groupId>org.apache.poi</groupId>
+      <artifactId>poi</artifactId>
+      <version>3.9</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.poi</groupId>
+      <artifactId>poi-ooxml</artifactId>
+      <version>3.9</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.poi</groupId>
+      <artifactId>poi-ooxml-schemas</artifactId>
+      <version>3.9</version>
+    </dependency>
+
+    <!--elasticsearch-->
+    <dependency>
+      <groupId>org.elasticsearch</groupId>
+      <artifactId>elasticsearch</artifactId>
+      <version>7.5.1</version>
+    </dependency>
+    <!-- Java High Level REST Client -->
+    <dependency>
+      <groupId>org.elasticsearch.client</groupId>
+      <artifactId>elasticsearch-rest-high-level-client</artifactId>
+      <version>7.5.1</version>
+      <exclusions>
+        <exclusion>
+          <groupId>org.elasticsearch</groupId>
+          <artifactId>elasticsearch</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.elasticsearch.client</groupId>
+          <artifactId>elasticsearch-rest-client</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <!-- Java Low Level REST Client -->
+    <dependency>
+      <groupId>org.elasticsearch.client</groupId>
+      <artifactId>elasticsearch-rest-client</artifactId>
+      <version>7.5.1</version>
+    </dependency>
+
+    <dependency>
+      <groupId>commons-lang</groupId>
+      <artifactId>commons-lang</artifactId>
+      <version>2.6</version>
+    </dependency>
+
+    <!--map工具类-->
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-collections4</artifactId>
+      <version>4.1</version>
+    </dependency>
+
+
+
+    <dependency>
+      <groupId>net.sf.ezmorph</groupId>
+      <artifactId>ezmorph</artifactId>
+      <version>1.0.6</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.retry</groupId>
+      <artifactId>spring-retry</artifactId>
+    </dependency>
+
+    <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
+  <dependency>
+    <groupId>org.aspectj</groupId>
+    <artifactId>aspectjrt</artifactId>
+    <version>1.9.1</version>
+  </dependency>
+  <dependency>
+    <groupId>org.aspectj</groupId>
+    <artifactId>aspectjweaver</artifactId>
+    <version>1.9.1</version>
+  </dependency>
+
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.cronutils</groupId>
+      <artifactId>cron-utils</artifactId>
+      <version>8.0.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>28.1-jre</version>
+    </dependency>
+
+    <dependency>
+        <groupId>com.hankcs</groupId>
+        <artifactId>hanlp</artifactId>
+        <version>portable-1.7.8</version>
+    </dependency>
+
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/AwaysuseApplication.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/AwaysuseApplication.java
new file mode 100644
index 000000000..2850bf328
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/AwaysuseApplication.java
@@ -0,0 +1,15 @@
+package com.example.awaysuse;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication
+@EnableScheduling
+public class AwaysuseApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(AwaysuseApplication.class, args);
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/CallResultMsg.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/CallResultMsg.java
new file mode 100644
index 000000000..a1e863a83
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/CallResultMsg.java
@@ -0,0 +1,15 @@
+package com.example.awaysuse.callmsg;
+
+import com.example.awaysuse.result.ResultCode;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class CallResultMsg<T> {
+    private boolean result;
+    private int code;
+    private String message;
+    private T data;
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/CodeAndMsg.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/CodeAndMsg.java
new file mode 100644
index 000000000..1d96b4bd3
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/CodeAndMsg.java
@@ -0,0 +1,24 @@
+package com.example.awaysuse.callmsg;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+
+@Getter
+public enum CodeAndMsg{
+    SUCCESS(1000, "SUCCESS"),
+    METHODFAIL(2000, "ENCOUNTER AN ERROR WHEN EXECUTE METHOD"),
+    NOT_FOUND(404, "Not Found"),
+    UNKNOWEXCEPTION(3000, "THIS IS AN UNKNOW EXCEPTION"),
+    BAD_GATEWAY(502, "Bad Gateway");
+
+    private int code;
+    private String msg;
+
+    CodeAndMsg(int code, String msg){
+        this.code = code;
+        this.msg = msg;
+    }
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/UniformReponseHandler.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/UniformReponseHandler.java
new file mode 100644
index 000000000..bc0505e22
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/UniformReponseHandler.java
@@ -0,0 +1,47 @@
+package com.example.awaysuse.callmsg;
+
+import com.example.awaysuse.result.ResultCode;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice(annotations = RestController.class)
+public class UniformReponseHandler<T> {
+
+    @ResponseStatus(HttpStatus.OK)
+    public CallResultMsg sendSuccessResponse(){
+        return new CallResultMsg(true, CodeAndMsg.SUCCESS.getCode(), CodeAndMsg.SUCCESS.getMsg(), null);
+    }
+
+    @ResponseStatus(HttpStatus.OK)
+    public CallResultMsg sendSuccessResponse(T data) {
+        return new CallResultMsg(true, CodeAndMsg.SUCCESS.getCode(), CodeAndMsg.SUCCESS.getMsg(), data);
+    }
+
+    @ExceptionHandler(UserDefinedException.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+    public CallResultMsg sendErrorResponse_UserDefined(Exception exception){
+        // return new CallResultMsg(false, ((UserDefinedException)exception).getException().getCode(), ((UserDefinedException)exception).getException().getMsg(), null);
+        return new CallResultMsg(false, HttpStatus.INTERNAL_SERVER_ERROR.value(), HttpStatus.INTERNAL_SERVER_ERROR.toString(), null);
+
+    }
+
+
+    @ExceptionHandler(Exception.class)
+    @ResponseStatus(HttpStatus.BAD_GATEWAY)
+    public CallResultMsg badGatewayResponse(Exception exception){
+        if (exception instanceof UserDefinedException) {
+            return this.sendErrorResponse_UserDefined(exception);
+        }
+
+        return new CallResultMsg(false, CodeAndMsg.BAD_GATEWAY.getCode(),CodeAndMsg.BAD_GATEWAY.getMsg(),null);
+    }
+
+
+    @ResponseStatus(HttpStatus.NOT_FOUND)
+    public CallResultMsg  notFoundErrorResponse_System(){
+        return new CallResultMsg(false, CodeAndMsg.NOT_FOUND.getCode(),CodeAndMsg.NOT_FOUND.getMsg(),null);
+    }
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/UserDefinedException.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/UserDefinedException.java
new file mode 100644
index 000000000..16c8a8eb7
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/callmsg/UserDefinedException.java
@@ -0,0 +1,20 @@
+package com.example.awaysuse.callmsg;
+
+import com.example.awaysuse.result.ResultCode;
+
+
+public class UserDefinedException extends RuntimeException {
+    private CodeAndMsg exception;
+
+    public UserDefinedException(CodeAndMsg exception){
+        this.exception = exception;
+    }
+
+    public CodeAndMsg getException() {
+        return exception;
+    }
+
+    public void setException(CodeAndMsg exception) {
+        this.exception = exception;
+    }
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/config/ESConfig.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/config/ESConfig.java
new file mode 100644
index 000000000..250aea9e3
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/config/ESConfig.java
@@ -0,0 +1,73 @@
+package com.example.awaysuse.config;
+
+import org.apache.http.HttpHost;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.elasticsearch.client.RestClient;
+import org.elasticsearch.client.RestClientBuilder;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @auther: fengh
+ * @Date: 2020/7/2 17:04
+ * @Description:
+ */
+@Configuration
+public class ESConfig {
+
+    @Value("${elasticsearch.hosts}")
+    private String hosts;
+    @Value("${elasticsearch.username}")
+    private String username;
+    @Value("${elasticsearch.passowrd}")
+    private String password;
+    @Value("${elasticsearch.schema}")
+    private String schema;
+    @Value("${elasticsearch.connectTimeOut}")
+    private int connectTimeOut;
+    @Value("${elasticsearch.socketTimeOut}")
+    private int socketTimeOut;
+    @Value("${elasticsearch.connectionRequestTimeOut}")
+    private int connectionRequestTimeOut;
+    @Value("${elasticsearch.maxConnectNum}")
+    private int maxConnectNum;
+    @Value("${elasticsearch.maxConnectPerRoute}")
+    private int maxConnectPerRoute;
+
+    @Bean("restHighLevelClient")
+    public RestHighLevelClient client(){
+        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
+        List<HttpHost> hostList = new ArrayList<>();
+        String[] hostArray = hosts.split(",");
+        for (String host : hostArray) {
+            String[] ipPort = host.split(":");
+            hostList.add(new HttpHost(ipPort[0], Integer.parseInt(ipPort[1]), schema));
+        }
+        RestClientBuilder builder = RestClient.builder(hostList.toArray(new HttpHost[0]));
+        // 异步httpclient连接延时配置
+        builder.setRequestConfigCallback(requestConfigBuilder -> {
+            requestConfigBuilder.setConnectTimeout(connectTimeOut);
+            requestConfigBuilder.setSocketTimeout(socketTimeOut);
+            requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
+            return requestConfigBuilder;
+        });
+        // 异步httpclient连接数配置
+        builder.setHttpClientConfigCallback(httpClientBuilder -> {
+            httpClientBuilder.setMaxConnTotal(maxConnectNum);
+            httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
+            httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
+            return httpClientBuilder;
+        });
+        return new RestHighLevelClient(builder);
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/config/GlobalExceptionHandler.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/config/GlobalExceptionHandler.java
new file mode 100644
index 000000000..558afa63a
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/config/GlobalExceptionHandler.java
@@ -0,0 +1,78 @@
+package com.example.awaysuse.config;
+
+import com.example.awaysuse.response.ResponseResult;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.HttpMediaTypeNotSupportedException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.client.HttpServerErrorException;
+import org.springframework.web.servlet.NoHandlerFoundException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @Author fengh
+ * @Date 2020/9/14 15:51
+ * @Description 全局统一异常处理类
+ */
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+    /**
+     * 404异常处理
+     */
+    @ExceptionHandler(value = NoHandlerFoundException.class)
+    @ResponseStatus(HttpStatus.NOT_FOUND)
+    public ResponseResult<String> errorHandler(HttpServletRequest request, NoHandlerFoundException exception, HttpServletResponse response) {
+        return ResponseResult.error(HttpStatus.NOT_FOUND.value(), exception.getMessage());
+    }
+
+    /**
+     * 405异常处理
+     */
+    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+    public ResponseResult<String> errorHandler(HttpServletRequest request, HttpRequestMethodNotSupportedException exception, HttpServletResponse response) {
+        return ResponseResult.error(HttpStatus.METHOD_NOT_ALLOWED.value(), exception.getMessage());
+    }
+
+    /**
+     * 415异常处理
+     */
+    @ExceptionHandler(HttpMediaTypeNotSupportedException.class)
+    public ResponseResult<String> errorHandler(HttpServletRequest request, HttpMediaTypeNotSupportedException exception, HttpServletResponse response) {
+        return ResponseResult.error(HttpStatus.UNSUPPORTED_MEDIA_TYPE.value(), exception.getMessage());
+    }
+
+    /**
+     * 500异常处理
+     */
+    @ExceptionHandler(HttpServerErrorException.class)
+    public ResponseResult<String> errorHandler(HttpServletRequest request, HttpServerErrorException exception, HttpServletResponse response) {
+        return ResponseResult.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), exception.getMessage());
+    }
+
+    /**
+     * 参数校验错误处理
+     */
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public ResponseResult<String> errorHandler(HttpServletRequest request, MethodArgumentNotValidException exception, HttpServletResponse response) {
+        List<String> errors = exception.getBindingResult().getAllErrors().stream().map(error -> error.getDefaultMessage()).collect(Collectors.toList());
+        return ResponseResult.error(0, String.join(",", errors));
+    }
+
+    /**
+     * 普通异常处理
+     */
+    @ExceptionHandler(Exception.class)
+    public ResponseResult<String> errorHandler(HttpServletRequest request, Exception exception, HttpServletResponse response) {
+        return ResponseResult.error(0, exception.getMessage());
+    }
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/config/IndexConfig.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/config/IndexConfig.java
new file mode 100644
index 000000000..84aabc9d1
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/config/IndexConfig.java
@@ -0,0 +1,16 @@
+package com.example.awaysuse.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+@Component
+@Data
+@ConfigurationProperties(prefix="custom")
+public class IndexConfig {
+
+    private Map<String, String> index;
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/controller/ControllerResponseAdvice.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/controller/ControllerResponseAdvice.java
new file mode 100644
index 000000000..1299cdd6c
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/controller/ControllerResponseAdvice.java
@@ -0,0 +1,38 @@
+package com.example.awaysuse.controller;
+
+import com.example.awaysuse.result.ResultCode;
+import com.example.awaysuse.result.ResultVo;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.core.MethodParameter;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
+
+//@RestControllerAdvice(basePackages = {"com.bugpool.leilema"})
+public class ControllerResponseAdvice implements ResponseBodyAdvice<Object> {
+    @Override
+    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
+        // response是ResultVo类型,或者注释了NotControllerResponseAdvice都不进行包装
+        return !methodParameter.getParameterType().isAssignableFrom(ResultVo.class);
+    }
+
+    @Override
+    public Object beforeBodyWrite(Object data, MethodParameter returnType, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest request, ServerHttpResponse response) {
+        // String类型不能直接包装
+        if (returnType.getGenericParameterType().equals(String.class)) {
+            ObjectMapper objectMapper = new ObjectMapper();
+            try {
+                // 将数据包装在ResultVo里后转换为json串进行返回
+                return objectMapper.writeValueAsString(new ResultVo(data));
+            } catch (JsonProcessingException e) {
+               // throw new APIException(ResultCode.RESPONSE_PACK_ERROR, e.getMessage());
+            }
+        }
+        // 否则直接包装成ResultVo返回
+        return new ResultVo(data);
+    }
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/controller/TestCallMsgResult.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/controller/TestCallMsgResult.java
new file mode 100644
index 000000000..e9974093e
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/controller/TestCallMsgResult.java
@@ -0,0 +1,45 @@
+package com.example.awaysuse.controller;
+
+
+import com.example.awaysuse.callmsg.CallResultMsg;
+import com.example.awaysuse.callmsg.CodeAndMsg;
+import com.example.awaysuse.callmsg.UniformReponseHandler;
+import com.example.awaysuse.callmsg.UserDefinedException;
+import com.sun.org.apache.regexp.internal.RE;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+//  测试封装返回的结果集
+@RestController
+public class TestCallMsgResult {
+
+    @GetMapping("/doTestObject")
+    public CallResultMsg testObjectReturn() {
+        Map<String, Integer> map = new HashMap();
+        map.put("qingfen", 16);
+        map.put("lantian", 17);
+        map.put("baiyun", 18);
+        CallResultMsg callResultMsg = new UniformReponseHandler<Map>().sendSuccessResponse(map);
+        System.out.println(CodeAndMsg.SUCCESS);
+        return callResultMsg;
+    }
+
+
+    @GetMapping("/doTestException/{x}")
+    public int testExceptionResturn(@PathVariable int x) {
+        /*if (0 < x && x < 10) {
+            // throw new UserDefinedException(CodeAndMsg.METHODFAIL);
+            throw new UserDefinedException(CodeAndMsg.METHODFAIL);
+        } else {
+            return 1 / 0;
+        }*/
+        return  1/0;
+    }
+
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/controller/UserInfoController.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/controller/UserInfoController.java
new file mode 100644
index 000000000..e0a82451f
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/controller/UserInfoController.java
@@ -0,0 +1,34 @@
+package com.example.awaysuse.controller;
+
+import com.example.awaysuse.model.UserInfoEntity;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@RestController
+@RequiredArgsConstructor
+@Slf4j
+public class UserInfoController {
+
+    final UserInfoEntity userInfo;
+
+    @RequestMapping("getUser")
+    public String getUserInfo(){
+          log.info(userInfo.getName());
+          int i=2;
+          return userInfo.getName();
+    }
+
+    public static void main(String args[]) {
+        String str = "fengxb@163.com";
+        String pattern = "\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}";
+        Pattern r = Pattern.compile(pattern);
+        Matcher m = r.matcher(str);
+        System.out.println("正则"+m.matches());
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/exception/MyNotFoundException.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/exception/MyNotFoundException.java
new file mode 100644
index 000000000..7fd659b43
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/exception/MyNotFoundException.java
@@ -0,0 +1,50 @@
+package com.example.awaysuse.exception;
+
+import com.example.awaysuse.callmsg.CallResultMsg;
+import com.example.awaysuse.callmsg.UniformReponseHandler;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.catalina.util.RequestUtil;
+import org.apache.poi.ss.formula.functions.T;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.web.ErrorProperties;
+import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
+import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver;
+import org.springframework.boot.web.servlet.error.ErrorAttributes;
+import org.springframework.boot.web.servlet.error.ErrorController;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author:
+ * @Date: 2020/7/30 18:26
+ * @Description:
+ */
+
+@Controller
+public class MyNotFoundException implements ErrorController {
+
+    @Override
+    public String getErrorPath() {
+        return "/error";
+    }
+
+    @RequestMapping(value = "/error")
+    @ResponseBody
+    public CallResultMsg getError() {
+        return new UniformReponseHandler<Map>().notFoundErrorResponse_System();
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/Doc.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/Doc.java
new file mode 100644
index 000000000..7ddda124c
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/Doc.java
@@ -0,0 +1,29 @@
+package com.example.awaysuse.model;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * ES查询结果封装类
+ * @author
+ */
+public class Doc extends HashMap<Object, Object> {
+    private static final long serialVersionUID = 4978196894185418504L;
+
+    public Doc(){
+
+    }
+
+    public Doc(Map<String, Object> map){
+        this.putAll(map);
+    }
+
+    public static Doc put(Map<String, Object> map){
+        return new Doc(map);
+    }
+
+    public Doc build(){
+        return this;
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/Help.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/Help.java
new file mode 100644
index 000000000..8b58397c2
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/Help.java
@@ -0,0 +1,27 @@
+package com.example.awaysuse.model;
+
+import lombok.*;
+
+import java.io.Serializable;
+
+
+public class Help implements Serializable {
+
+   int userId;
+
+    public Help setUserId(int uid) {
+        this.userId = uid;
+        return this;
+    }
+
+    public int getUserId() {
+        return userId;
+    }
+
+    @Override
+    public String toString() {
+        return "Help{" +
+            "userId=" + userId +
+            '}';
+    }
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/PageData.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/PageData.java
new file mode 100644
index 000000000..441a841c8
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/PageData.java
@@ -0,0 +1,51 @@
+package com.example.awaysuse.model;
+
+import lombok.Data;
+
+/**
+ * @Author:
+ * @Date:
+ * @Description:
+ */
+@Data
+public class PageData<T> {
+    /**
+     * 当前页面
+     */
+    private int pageNum;
+
+    /**
+     * 每页数量
+     */
+    private int pageSize;
+
+    /**
+     * 记录总数
+     */
+    private long totalCount;
+
+    /**
+     * 页码总数
+     */
+    private int totalPages;
+
+    /**
+     * 分页数据
+     */
+    private T data;
+
+    public PageData() {
+    }
+
+    public PageData(T data) {
+        this.data = data;
+    }
+
+    public PageData(int pageNum, int pageSize, long totalCount, int totalPage, T data) {
+        this.pageNum = pageNum;
+        this.pageSize = pageSize;
+        this.totalCount = totalCount;
+        this.totalPages = totalPage;
+        this.data = data;
+    }
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/Person.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/Person.java
new file mode 100644
index 000000000..28c7b3d68
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/Person.java
@@ -0,0 +1,56 @@
+package com.example.awaysuse.model;
+
+import lombok.*;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Person
+ *
+ * @author fxbin
+ * @version v1.0
+ * @since 2019/9/15 23:04
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+@ToString
+public class Person implements Serializable {
+
+    private static final long serialVersionUID = 8510634155374943623L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 名字
+     */
+    private String name;
+
+    /**
+     * 国家
+     */
+    private String country;
+
+    /**
+     * 年龄
+     */
+    private Integer age;
+
+    /**
+     * 生日
+     */
+    private Date birthday;
+
+    /**
+     * 介绍
+     */
+    private String remark;
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/ProductInfo.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/ProductInfo.java
new file mode 100644
index 000000000..3c95d5645
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/ProductInfo.java
@@ -0,0 +1,9 @@
+package com.example.awaysuse.model;
+
+
+
+public class ProductInfo {
+
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/ReportTimeLimit.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/ReportTimeLimit.java
new file mode 100644
index 000000000..eed4fbaf0
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/ReportTimeLimit.java
@@ -0,0 +1,29 @@
+package com.example.awaysuse.model;
+
+public class ReportTimeLimit {
+
+    /**
+     * 当前时间上限
+     */
+    long currentUpper;
+    /**
+     * 当前时间下限
+     */
+    long currentLower;
+    /**
+     * 环比上限
+     */
+    long momUpper;
+    /**
+     * 环比下限
+     */
+    long momLower;
+    /**
+     * 同比上限
+     */
+    long yoyUpper;
+    /**
+     * 同比下限
+     */
+    long yoyLower;
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/UserInfoEntity.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/UserInfoEntity.java
new file mode 100644
index 000000000..8b24fab80
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/UserInfoEntity.java
@@ -0,0 +1,28 @@
+package com.example.awaysuse.model;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * <p>
+ * 开发人员配置信息
+ * </p>
+ *
+ * @package: com.xkcoding.properties.property
+ * @description: 开发人员配置信息
+ * @author: yangkai.shen
+ * @date: Created in 2018/9/29 10:51 AM
+ * @copyright: Copyright (c) 2018
+ * @version: V1.0
+ * @modified: yangkai.shen
+ */
+@Data
+@ConfigurationProperties(prefix = "userinfo")
+@Component
+public class UserInfoEntity {
+	private String name;
+	private String website;
+	private String qq;
+	private String phoneNumber;
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/vo/ProductInfoVo.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/vo/ProductInfoVo.java
new file mode 100644
index 000000000..cc609e113
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/model/vo/ProductInfoVo.java
@@ -0,0 +1,21 @@
+package com.example.awaysuse.model.vo;
+
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class ProductInfoVo {
+    // 商品名称
+    private String productName;
+
+    // 商品价格
+    private BigDecimal productPrice;
+
+    // 上架状态
+    private Integer productStatus;
+
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/myrequest/RequestDemoController1.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/myrequest/RequestDemoController1.java
new file mode 100644
index 000000000..9af3a8933
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/myrequest/RequestDemoController1.java
@@ -0,0 +1,62 @@
+package com.example.awaysuse.myrequest;
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Set;
+
+@RestController
+public class RequestDemoController1 {
+
+    // @Autowired
+    //private RestTemplate restTemplate;
+
+
+
+    @GetMapping("/getParams")
+    public String getParams(String a,int b) {
+        return "get success";
+    }
+
+
+    @PostMapping("/postTest")
+    public String postTest(HttpServletRequest request) {
+        String age1 = request.getParameter("age");
+        String name1 = request.getParameter("name");
+        System.out.println("age1=" + age1 + ",name1=" + name1);
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                String age2 = request.getParameter("age");
+                String name2 = request.getParameter("name");
+                System.out.println("age2=" + age2 + ",name2=" + name2);
+                //模拟业务请求
+                try {
+                    Thread.sleep(200);
+                } catch (InterruptedException e) {
+                    throw new RuntimeException(e);
+                }
+                age2 = request.getParameter("age");
+                name2 = request.getParameter("name");
+                System.out.println("age2=" + age2 + ",name2=" + name2);
+            }
+        }).start();
+        return "post success";
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/myrequest/RequestDemoController2.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/myrequest/RequestDemoController2.java
new file mode 100644
index 000000000..211989f3a
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/myrequest/RequestDemoController2.java
@@ -0,0 +1,13 @@
+package com.example.awaysuse.myrequest;
+
+
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+@RestController
+public class RequestDemoController2 {
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/response/ResponseResult.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/response/ResponseResult.java
new file mode 100644
index 000000000..090058b4a
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/response/ResponseResult.java
@@ -0,0 +1,51 @@
+package com.example.awaysuse.response;
+
+import lombok.Data;
+
+/**
+ * @Author feng
+ * @Date 2020/9/10 17:01
+ * @Description
+ */
+@Data
+public class ResponseResult<T> {
+
+    private Integer code = 200;
+    private String message = "success";
+    private T data;
+
+    public ResponseResult(){
+
+    }
+
+    public ResponseResult(T data){
+        this.data = data;
+    }
+
+    public ResponseResult(int code, String message){
+        this.code = code;
+        this.message = message;
+    }
+
+    public ResponseResult(String message, T data){
+        this.message = message;
+        this.data = data;
+    }
+
+    public static <T> ResponseResult<T> success(){
+        return new ResponseResult<T>();
+    }
+
+    public static <T> ResponseResult<T> success(T data){
+        return new ResponseResult<T>(data);
+    }
+
+    public static <T> ResponseResult<T> success(String message, T data){
+        return new ResponseResult<T>(message, data);
+    }
+
+    public static <T> ResponseResult<T> error(int code, String message){
+        return new ResponseResult<T>(code, message);
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/result/ResultCode.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/result/ResultCode.java
new file mode 100644
index 000000000..21a6a8d90
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/result/ResultCode.java
@@ -0,0 +1,25 @@
+package com.example.awaysuse.result;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@NoArgsConstructor
+public enum ResultCode implements StatusCode{
+
+    SUCCESS(1000, "请求成功"),
+    FAILED(1001, "请求失败"),
+    VALIDATE_ERROR(1002, "参数校验失败"),
+    RESPONSE_PACK_ERROR(1003, "response返回包装失败");
+
+
+    private int code;
+    private String msg;
+
+    ResultCode(int code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/result/ResultVo.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/result/ResultVo.java
new file mode 100644
index 000000000..c616e5176
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/result/ResultVo.java
@@ -0,0 +1,45 @@
+package com.example.awaysuse.result;
+
+import lombok.Data;
+
+
+@Data
+public class ResultVo {
+
+    // 状态码
+    private int code;
+
+    // 状态信息
+    private String msg;
+
+    // 返回对象
+    private Object data;
+
+    // 手动设置返回vo
+    public ResultVo(int code, Object data, String msg) {
+        this.code = code;
+        this.msg = msg;
+        this.data = data;
+    }
+
+    // 默认返回成功状态码,数据对象
+    public ResultVo(Object data) {
+        this.code = ResultCode.SUCCESS.getCode();
+        this.msg = ResultCode.SUCCESS.getMsg();
+        this.data = data;
+    }
+
+    // 返回指定状态码,数据对象
+    public ResultVo(StatusCode statusCode, Object data) {
+        this.code = statusCode.getCode();
+        this.msg = statusCode.getMsg();
+        this.data = data;
+    }
+
+    // 只返回状态码
+    public ResultVo(StatusCode statusCode) {
+        this.code = statusCode.getCode();
+        this.msg = statusCode.getMsg();
+        this.data = null;
+    }
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/result/StatusCode.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/result/StatusCode.java
new file mode 100644
index 000000000..23a13b72b
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/result/StatusCode.java
@@ -0,0 +1,9 @@
+package com.example.awaysuse.result;
+
+
+public interface StatusCode {
+
+    public int getCode();
+    public String getMsg();
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/service/BranchHandle.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/service/BranchHandle.java
new file mode 100644
index 000000000..aaef68083
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/service/BranchHandle.java
@@ -0,0 +1,11 @@
+package com.example.awaysuse.service;
+
+@FunctionalInterface
+public interface BranchHandle {
+
+    void trueOrFalseHandle(Runnable trueHandle, Runnable falseHandle);
+
+
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/service/PresentOrElseHandler.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/service/PresentOrElseHandler.java
new file mode 100644
index 000000000..fd9979c28
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/service/PresentOrElseHandler.java
@@ -0,0 +1,17 @@
+package com.example.awaysuse.service;
+
+import java.util.function.Consumer;
+
+public interface PresentOrElseHandler<T extends Object> {
+
+    /**
+     * 值不为空时执行消费操作
+     * 值为空时执行其他的操作
+     *
+     * @param action 值不为空时,执行的消费操作
+     * @param emptyAction 值为空时,执行的操作
+     * @return void
+     **/
+    void presentOrElseHandle(Consumer<? super T> action, Runnable emptyAction);
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/service/ThrowExceptionFunction.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/service/ThrowExceptionFunction.java
new file mode 100644
index 000000000..fb1ed57aa
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/service/ThrowExceptionFunction.java
@@ -0,0 +1,8 @@
+package com.example.awaysuse.service;
+
+@FunctionalInterface
+public interface ThrowExceptionFunction {
+
+    void throwMessage(String message);
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyTask.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyTask.java
new file mode 100644
index 000000000..dddc9b812
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyTask.java
@@ -0,0 +1,30 @@
+package com.example.awaysuse.thread;
+
+public class MyTask implements  Runnable{
+    private int id;
+    //由于run方法是重写接口中的方法,因此id这个属性初始化可以利用构造方法完成
+
+    public MyTask(int id) {
+        this.id = id;
+    }
+
+    @Override
+    public void run() {
+        String name = Thread.currentThread().getName();
+        System.out.println("线程:"+name+" 即将执行任务:"+id);
+        try {
+            Thread.sleep(200);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        System.out.println("线程:"+name+" 完成了任务:"+id);
+    }
+
+    @Override
+    public String toString() {
+        return "MyTask{" +
+            "id=" + id +
+            '}';
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyTest.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyTest.java
new file mode 100644
index 000000000..94bf1b39b
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyTest.java
@@ -0,0 +1,40 @@
+package com.example.awaysuse.thread;
+
+
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+public class MyTest {
+    public static void main(String[] args) {
+        //1:创建线程池类对象;
+      /*  MyThreadPool pool = new MyThreadPool(2, 4, 20);
+        //2: 提交多个任务
+        for (int i = 0; i < 30; i++) {
+            //3:创建任务对象,并提交给线程池
+            MyTask my = new MyTask(i);
+            pool.submit(my);
+        }*/
+
+        ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
+        /*executorService.scheduleAtFixedRate(()->{
+            try {
+                //加上这个,看看1没执行完,会不会马上执行2,意即会不会开个新线程去执行
+                Thread.sleep(1000);
+            }catch (Exception ex){
+
+            }
+            System.out.println(Thread.currentThread().getName()+" run : "+ System.currentTimeMillis());
+        }, 0, 100, TimeUnit.MILLISECONDS);*/
+        //0延时,每隔100毫秒执行一次
+        executorService.schedule(new Runnable() {
+            @Override
+            public void run() {
+                System.out.println("俩人相视一笑~ 嘿嘿嘿");
+            }
+        }, 10, TimeUnit.SECONDS);
+    }
+
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyThreadPool.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyThreadPool.java
new file mode 100644
index 000000000..50f822756
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyThreadPool.java
@@ -0,0 +1,53 @@
+package com.example.awaysuse.thread;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+public class MyThreadPool {
+
+        // 1:任务队列   集合  需要控制线程安全问题
+        private List<Runnable> tasks = Collections.synchronizedList(new LinkedList<>());
+        //2:当前线程数量
+        private int num;
+        //3:核心线程数量
+        private int corePoolSize;
+        //4:最大线程数量
+        private int maxSize;
+        //5:任务队列的长度
+        private int workSize;
+
+        public MyThreadPool(int corePoolSize, int maxSize, int workSize) {
+            this.corePoolSize = corePoolSize;
+            this.maxSize = maxSize;
+            this.workSize = workSize;
+        }
+
+        //1:提交任务;
+        public void submit(Runnable r){
+            //判断当前集合中任务的数量,是否超出了最大任务数量
+            if(tasks.size()>=workSize){
+                System.out.println("任务:"+r+"被丢弃了...");
+            }else {
+                tasks.add(r);
+                //执行任务
+                execTask(r);
+            }
+        }
+        //2:执行任务;
+        private void execTask(Runnable r) {
+            //判断当前线程池中的线程总数量,是否超出了核心数,
+            if(num < corePoolSize){
+                new MyWorker("核心线程:"+num,tasks).start();
+                num++;
+            }else if(num < maxSize){
+                new MyWorker("非核心线程:"+num,tasks).start();
+                num++;
+            }else {
+                System.out.println("任务:"+r+" 被缓存了...");
+            }
+        }
+
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyWorker.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyWorker.java
new file mode 100644
index 000000000..e2ba27467
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/thread/MyWorker.java
@@ -0,0 +1,26 @@
+package com.example.awaysuse.thread;
+
+import java.util.List;
+
+public class MyWorker extends  Thread{
+
+
+    private String name;//保存线程的名字
+    private List<Runnable> tasks;
+    //利用构造方法,给成员变量赋值
+
+    public MyWorker(String name, List<Runnable> tasks) {
+        super(name);
+        this.tasks = tasks;
+    }
+
+    @Override
+    public void run() {
+        //判断集合中是否有任务,只要有,就一直执行任务
+        while (tasks.size()>0){
+            Runnable r = tasks.remove(0);
+            r.run();
+        }
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/BeanConvertUtils.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/BeanConvertUtils.java
new file mode 100644
index 000000000..711be3a67
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/BeanConvertUtils.java
@@ -0,0 +1,79 @@
+package com.example.awaysuse.util;
+
+import org.springframework.beans.BeanUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Supplier;
+
+public class BeanConvertUtils extends BeanUtils {
+
+    public static <S, T> T convertTo(S source, Supplier<T> targetSupplier) {
+        return convertTo(source, targetSupplier, null);
+    }
+
+    /**
+     * 转换对象
+     *
+     * @param source         源对象
+     * @param targetSupplier 目标对象供应方
+     * @param callBack       回调方法
+     * @param <S>            源对象类型
+     * @param <T>            目标对象类型
+     * @return 目标对象
+     */
+    public static <S, T> T convertTo(S source, Supplier<T> targetSupplier, ConvertCallBack<S, T> callBack) {
+        if (null == source || null == targetSupplier) {
+            return null;
+        }
+
+        T target = targetSupplier.get();
+        copyProperties(source, target);
+        if (callBack != null) {
+            callBack.callBack(source, target);
+        }
+        return target;
+    }
+
+    public static <S, T> List<T> convertListTo(List<S> sources, Supplier<T> targetSupplier) {
+        return convertListTo(sources, targetSupplier, null);
+    }
+
+    /**
+     * 转换对象
+     *
+     * @param sources        源对象list
+     * @param targetSupplier 目标对象供应方
+     * @param callBack       回调方法
+     * @param <S>            源对象类型
+     * @param <T>            目标对象类型
+     * @return 目标对象list
+     */
+    public static <S, T> List<T> convertListTo(List<S> sources, Supplier<T> targetSupplier, ConvertCallBack<S, T> callBack) {
+        if (null == sources || null == targetSupplier) {
+            return null;
+        }
+
+        List<T> list = new ArrayList<>(sources.size());
+        for (S source : sources) {
+            T target = targetSupplier.get();
+            copyProperties(source, target);
+            if (callBack != null) {
+                callBack.callBack(source, target);
+            }
+            list.add(target);
+        }
+        return list;
+    }
+
+    /**
+     * 回调接口
+     *
+     * @param <S> 源对象类型
+     * @param <T> 目标对象类型
+     */
+    @FunctionalInterface
+    public interface ConvertCallBack<S, T> {
+        void callBack(S t, T s);
+    }
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/BigDecimalUtils.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/BigDecimalUtils.java
new file mode 100644
index 000000000..47fa7cb33
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/BigDecimalUtils.java
@@ -0,0 +1,80 @@
+package com.example.awaysuse.util;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author shuaige
+ * @Date 2022/4/17
+ * @Version 1.0
+ **/
+public class BigDecimalUtils {
+    //  加法
+    public static BigDecimal doubleAdd(double v1, double v2) {
+        BigDecimal b1 = new BigDecimal(Double.toString(v1));
+        BigDecimal b2 = new BigDecimal(Double.toString(v2));
+        return b1.add(b2);
+    }
+    public static BigDecimal floatAdd(float v1, float v2) {
+        BigDecimal b1 = new BigDecimal(Float.toString(v1));
+        BigDecimal b2 = new BigDecimal(Float.toString(v2));
+        return b1.add(b2);
+    }
+    //  减法
+    public static BigDecimal doubleSub(double v1, double v2) {
+        BigDecimal b1 = new BigDecimal(Double.toString(v1));
+        BigDecimal b2 = new BigDecimal(Double.toString(v2));
+        return b1.subtract(b2);
+    }
+    public static BigDecimal floatSub(float v1, float v2) {
+        BigDecimal b1 = new BigDecimal(Float.toString(v1));
+        BigDecimal b2 = new BigDecimal(Float.toString(v2));
+        return b1.subtract(b2);
+    }
+    //  乘法
+    public static BigDecimal doubleMul(double v1, double v2) {
+        BigDecimal b1 = new BigDecimal(Double.toString(v1));
+        BigDecimal b2 = new BigDecimal(Double.toString(v2));
+        return b1.multiply(b2);
+    }
+    public static BigDecimal floatMul(float v1, float v2) {
+        BigDecimal b1 = new BigDecimal(Float.toString(v1));
+        BigDecimal b2 = new BigDecimal(Float.toString(v2));
+        return b1.multiply(b2);
+    }
+    // 除法
+    public static BigDecimal doubleDiv(double v1, double v2) {
+        BigDecimal b1 = new BigDecimal(Double.toString(v1));
+        BigDecimal b2 = new BigDecimal(Double.toString(v2));
+        // 保留小数点后两位 ROUND_HALF_UP = 四舍五入
+        return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);
+    }
+    public static BigDecimal floatDiv(float v1, float v2) {
+        BigDecimal b1 = new BigDecimal(Float.toString(v1));
+        BigDecimal b2 = new BigDecimal(Float.toString(v2));
+        // 保留小数点后两位 ROUND_HALF_UP = 四舍五入
+        return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);
+    }
+    /**
+     * 比较v1 v2大小
+     * @param v1
+     * @param v2
+     * @return v1>v2 return 1  v1=v2 return 0 v1<v2 return -1
+     */
+    public static int doubleCompareTo(double v1, double v2) {
+        BigDecimal b1 = new BigDecimal(Double.toString(v1));
+        BigDecimal b2 = new BigDecimal(Double.toString(v2));
+        return  b1.compareTo(b2);
+    }
+    public static int floatCompareTo(float v1, float v2) {
+        BigDecimal b1 = new BigDecimal(Float.toString(v1));
+        BigDecimal b2 = new BigDecimal(Float.toString(v2));
+        return  b1.compareTo(b2);
+    }
+
+    // 保留两位小数
+    public  static  double  doubleSetscale2(double dle){
+        BigDecimal bg = new BigDecimal(Double.toString(dle));
+        double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+        return f1;
+    }
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/CommonUtils.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/CommonUtils.java
new file mode 100644
index 000000000..01cdd0611
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/CommonUtils.java
@@ -0,0 +1,54 @@
+package com.example.awaysuse.util;
+
+import java.math.BigDecimal;
+
+/**
+ * Created by clt on 2020/3/12.
+ * 数据的基本算法
+ */
+public class CommonUtils {
+    public static Boolean isNull(Object str) {
+        if(null==str||str.toString().trim().equals("")||str.toString().trim().equals("null")){
+            return  true;
+        }
+        return false;
+    }
+    public static Double calcRate(Integer coActualNum, Integer coTdNum) {
+        if (coActualNum != null && coTdNum != null && coTdNum != 0 ) {
+            return 1.0 * coActualNum / coTdNum;
+        } else if (coTdNum == null || coTdNum == 0) {
+            return 0.0;
+        } else {
+            return 0.0;
+        }
+    }
+
+    public static String isNullOrStr(Object c_siteopf_id) {
+        if (c_siteopf_id==null){
+            return "";
+        }
+        return c_siteopf_id.toString().trim();
+    }
+    public static Integer isNullOrInter(Object c_siteopf_id) {
+        if (c_siteopf_id==null){
+            return 0;
+        }
+        return Integer.valueOf(c_siteopf_id.toString().trim());
+    }
+
+    public static boolean isEquals(String c_snet_id,String s) {
+        if(c_snet_id==null){
+            return false;
+        }
+        if (c_snet_id.equals(s)){
+            return true;
+        }else {
+            return false;
+        }
+    }
+    public static double add(double v1, double v2) {
+        BigDecimal b1=new BigDecimal(Double.toString(v1));
+        BigDecimal b2 = new BigDecimal(Double.toString(v2));
+        return b1.add(b2).doubleValue();
+    }
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/CompareTime.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/CompareTime.java
new file mode 100644
index 000000000..bfe3a972e
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/CompareTime.java
@@ -0,0 +1,56 @@
+package com.example.awaysuse.util;
+
+import com.example.awaysuse.model.Person;
+import org.apache.commons.lang3.builder.ToStringExclude;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class CompareTime {
+    private static SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
+
+    /**
+     * 判断当前时间是否在某个时间段内
+     * begin 开始时间字符串  String begin="09:00:00";
+     * end  结束时间字符串    String end="12:00:00";
+     */
+    public static boolean compareTime(String begin, String end) {
+        boolean result = false;
+        //将时间字符串转化成时间
+
+        try {
+            //转换成时间格式
+            Date beginTime = df.parse(begin);
+            Date endTime = df.parse(end);
+            //取出当前时间的时分秒编码再解码
+            Date date = df.parse(df.format(new Date()));
+            //通过日历形式开始比较
+            Calendar b = Calendar.getInstance();
+            b.setTime(beginTime);
+            Calendar e = Calendar.getInstance();
+            e.setTime(endTime);
+            Calendar d = Calendar.getInstance();
+            d.setTime(date);
+            //当前时间晚于开始时间,早于结束时间则表明在指定的时间段内
+            if (d.after(b) && d.before(e)) {
+                result = true;
+            }
+        } catch (ParseException e1) {
+            e1.printStackTrace();
+
+        }
+        return result;
+    }
+
+    public static void main(String[] args) {
+       /* boolean b = compareTime("09:00:00", "18:00:00");
+        System.out.println(b);*/
+
+
+    }
+
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/DataCalcUtils.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/DataCalcUtils.java
new file mode 100644
index 000000000..e7f92ac63
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/DataCalcUtils.java
@@ -0,0 +1,115 @@
+package com.example.awaysuse.util;
+
+import java.math.BigDecimal;
+
+/**
+ * @Description  一些常用的数学计算
+ */
+public class DataCalcUtils {
+
+    /**
+     * 默认精确到2位小数
+     */
+    private static final int DEF_DIV_SCALE = 2;
+
+    private DataCalcUtils() {
+    }
+
+    /**
+     * 提供精确的加法运算。
+     *
+     * @param v1
+     *            被加数
+     * @param v2
+     *            加数
+     * @return 两个参数的和
+     */
+    public static double add(double v1, double v2) {
+        BigDecimal b1 = new BigDecimal(Double.toString(v1));
+        BigDecimal b2 = new BigDecimal(Double.toString(v2));
+        return b1.add(b2).doubleValue();
+    }
+
+    /**
+     * 提供精确的减法运算。
+     *
+     * @param v1
+     *            被减数
+     * @param v2
+     *            减数
+     * @return 两个参数的差
+     */
+    public static double sub(double v1, double v2) {
+        BigDecimal b1 = new BigDecimal(Double.toString(v1));
+        BigDecimal b2 = new BigDecimal(Double.toString(v2));
+        return b1.subtract(b2).doubleValue();
+    }
+
+    /**
+     * 提供精确的乘法运算。
+     *
+     * @param v1
+     *            被乘数
+     * @param v2
+     *            乘数
+     * @return 两个参数的积
+     */
+    public static double mul(double v1, double v2) {
+        BigDecimal b1 = new BigDecimal(Double.toString(v1));
+        BigDecimal b2 = new BigDecimal(Double.toString(v2));
+        return b1.multiply(b2).doubleValue();
+    }
+
+    /**
+     * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。
+     *
+     * @param v1
+     *            被除数
+     * @param v2
+     *            除数
+     * @return 两个参数的商
+     */
+    public static double div(double v1, double v2) {
+        return div(v1, v2, DEF_DIV_SCALE);
+    }
+
+    /**
+     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。
+     *
+     * @param v1
+     *            被除数
+     * @param v2
+     *            除数
+     * @param scale
+     *            表示表示需要精确到小数点以后几位。
+     * @return 两个参数的商
+     */
+    public static double div(double v1, double v2, int scale) {
+        if (scale < 0) {
+            throw new IllegalArgumentException(
+                    "The scale must be a positive integer or zero");
+        }
+        BigDecimal b1 = new BigDecimal(Double.toString(v1));
+        BigDecimal b2 = new BigDecimal(Double.toString(v2));
+        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+
+    /**
+     * 提供精确的小数位四舍五入处理。
+     *
+     * @param v
+     *            需要四舍五入的数字
+     * @param scale
+     *            小数点后保留几位
+     * @return 四舍五入后的结果
+     */
+    public static double round(double v, int scale) {
+        if (scale < 0) {
+            throw new IllegalArgumentException(
+                    "The scale must be a positive integer or zero");
+        }
+        BigDecimal b = new BigDecimal(Double.toString(v));
+        BigDecimal one = new BigDecimal("1");
+        return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/DemoResourceSync.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/DemoResourceSync.java
new file mode 100644
index 000000000..de8e21589
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/DemoResourceSync.java
@@ -0,0 +1,164 @@
+package com.example.awaysuse.util;
+
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class DemoResourceSync {
+
+    public static void main(String[] args) {
+        DemoResourceSync dr = new DemoResourceSync();
+        dr.run();
+    }
+
+    public void run() {
+        ResThread resThread = new ResThread();
+        for (int i = 0; i < 10; i++) { //10个线程去跑
+            new Thread(resThread, "线程" + i).start();
+        }
+
+        PerfThread perfThread = new PerfThread();
+        for (int i = 0; i < 20; i++) { //20个线程去跑
+            new Thread(perfThread, "线程" + i).start();
+        }
+
+        StateThread stateThread = new StateThread();
+        for (int i = 0; i < 20; i++) { //20个线程去跑
+            new Thread(stateThread, "线程" + i).start();
+        }
+    }
+
+    /**
+     * 同步资源
+     * @author Administrator
+     *
+     */
+    private class ResThread implements Runnable {
+
+        public ResThread() {
+        }
+
+        @Override
+        public void run() {
+            synchronized (this) {
+                SimpleDateFormat sdf = new SimpleDateFormat(
+                    "yyyy-MM-dd HH:mm:ss");
+                String datestr = sdf.format(new Date());
+                String str = "[";
+                for (int i = 0; i < 900; i++) {
+                    str += "{\"classCode\":\"Switch\",\"domainId\":\"rootDomain\",\"sourceId\":\"192.168."
+                        + Thread.currentThread().getId()
+                        + "."
+                        + i
+                        + "\",\"updateTime\":\""
+                        + datestr
+                        + "\",\"values\":{\"name\":\"交换机"
+                        + Thread.currentThread().getId()
+                        + i
+                        + "\",\"ipAddr\":\"192.168."
+                        + Thread.currentThread().getId()
+                        + "."
+                        + i
+                        + "\"}},";
+                }
+                str = str.substring(0, str.length() - 1) + "]";
+                System.out.println("resThread:"+str);
+                String url = "http://127.0.0.1:8890/api/v2/cmdb/cis/save-batch";
+                try {
+                    JSONObject jsonObject = HttpClientUtils.httpPost(url, str);
+                    String result = jsonObject.getString("result");
+                    System.out.println("resThreadResult"
+                        + Thread.currentThread().getId() + ":" + result);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 同步性能
+     * @author Administrator
+     *
+     */
+    private class PerfThread implements Runnable {
+
+        public PerfThread() {
+        }
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Calendar calendar = Calendar.getInstance();
+
+        @Override
+        public void run() {
+            synchronized (this) {
+                String str = "[";
+                for (int i = 500; i > 0; i--) {
+                    String datestr = sdf.format(new Date((calendar
+                        .getTimeInMillis() - (1000 * Thread.currentThread()
+                        .getId() * (i + 1)))));
+                    str += "{\"ciId\":\"3a98052b-794c-4531-9182-611625c102a4\",\"groupCode\":\"ram-use\","
+                        + "\"sampleTime\":\""
+                        + datestr
+                        + "\",\"indicators\":{\"mem_used\":500,\"mem_usage\":97}},";
+                }
+                str = str.substring(0, str.length() - 1) + "]";
+                System.out.println("perfThread:"+str);
+                String url = "http://127.0.0.1:8890/api/v2/pmdb/perf-groups/create";
+                try {
+                    JSONObject jsonObject = HttpClientUtils.httpPost(url, str);
+                    String result = jsonObject.getString("result");
+                    System.out.println("perfThreadResult"
+                        + Thread.currentThread().getId() + ":" + result);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 同步状态
+     * @author Administrator
+     *
+     */
+    private class StateThread implements Runnable {
+
+        public StateThread() {
+        }
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Calendar calendar = Calendar.getInstance();
+
+        @Override
+        public void run() {
+            synchronized (this) {
+                String str = "[";
+                for (int i = 500; i > 0; i--) {
+                    String datestr = sdf.format(new Date((calendar
+                        .getTimeInMillis() - (1000 * Thread.currentThread()
+                        .getId() * (i + 1)))));
+                    str += "{\"ciId\":\"3a98052b-794c-4531-9182-611625c102a4\",\"typeCode\":\"available_status\","
+                        + "\"sampleTime\":\""
+                        + datestr
+                        + "\",\"value\":\"1\",\"descr\":\"可用\"},";
+                }
+                str = str.substring(0, str.length() - 1) + "]";
+                System.out.println("stateThread:"+str);
+                String url = "http://127.0.0.1:8890/api/v2/pmdb/states/create";
+                try {
+                    JSONObject jsonObject = HttpClientUtils.httpPost(url, str);
+                    String result = jsonObject.getString("result");
+                    System.out.println("stateThreadResult"
+                        + Thread.currentThread().getId() + ":" + result);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+}
+
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/ESUtils.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/ESUtils.java
new file mode 100644
index 000000000..7155f45d8
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/ESUtils.java
@@ -0,0 +1,662 @@
+package com.example.awaysuse.util;
+
+
+import com.example.awaysuse.model.Doc;
+import com.example.awaysuse.model.PageData;
+import lombok.extern.slf4j.Slf4j;
+import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
+import org.elasticsearch.action.bulk.BulkRequest;
+import org.elasticsearch.action.bulk.BulkResponse;
+import org.elasticsearch.action.delete.DeleteRequest;
+import org.elasticsearch.action.delete.DeleteResponse;
+import org.elasticsearch.action.get.GetRequest;
+import org.elasticsearch.action.get.GetResponse;
+import org.elasticsearch.action.index.IndexRequest;
+import org.elasticsearch.action.index.IndexResponse;
+import org.elasticsearch.action.search.ClearScrollRequest;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.action.search.SearchScrollRequest;
+import org.elasticsearch.action.support.master.AcknowledgedResponse;
+import org.elasticsearch.action.update.UpdateRequest;
+import org.elasticsearch.action.update.UpdateResponse;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.client.core.CountRequest;
+import org.elasticsearch.client.core.CountResponse;
+import org.elasticsearch.client.indices.CreateIndexRequest;
+import org.elasticsearch.client.indices.CreateIndexResponse;
+import org.elasticsearch.client.indices.GetIndexRequest;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.common.unit.TimeValue;
+import org.elasticsearch.common.xcontent.XContentType;
+import org.elasticsearch.index.query.BoolQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilder;
+import org.elasticsearch.rest.RestStatus;
+import org.elasticsearch.search.Scroll;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.SearchHits;
+import org.elasticsearch.search.aggregations.AggregationBuilder;
+import org.elasticsearch.search.aggregations.AggregationBuilders;
+import org.elasticsearch.search.aggregations.bucket.terms.Terms;
+import org.elasticsearch.search.aggregations.metrics.Sum;
+import org.elasticsearch.search.aggregations.metrics.TopHits;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.elasticsearch.search.sort.SortOrder;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * @author fengh
+ * @Date: 2020/8/18 10:17
+ * @Description: elasticsearch工具类
+ */
+@Slf4j
+@Component
+public class ESUtils {
+
+    @Resource(name = "restHighLevelClient")
+    private RestHighLevelClient client;
+
+    /**
+     * 检查索引是否存在
+     *
+     * @param index 索引名称
+     * @return boolean
+     */
+    public boolean existIndex(String index) {
+        try {
+            GetIndexRequest request = new GetIndexRequest(index);
+            return client.indices().exists(request, RequestOptions.DEFAULT);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * 创建索引
+     *
+     * @param index  索引名称
+     * @return boolean
+     */
+    public boolean createIndex(String index) {
+        return createIndex(index, null);
+    }
+
+    /**
+     * 创建索引
+     *
+     * @param index  索引名称
+     * @param source 配置
+     * @return boolean
+     */
+    public boolean createIndex(String index, String source) {
+        try {
+            CreateIndexRequest createIndexRequest = new CreateIndexRequest(index);
+            //指定字段个数最大10000
+            createIndexRequest.settings(Settings.builder().put("index.mapping.total_fields.limit", 10000));
+            if (!StringUtils.isEmpty(source)) {
+                createIndexRequest.mapping(source, XContentType.JSON);
+            }
+            CreateIndexResponse response = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
+            return response.isAcknowledged();
+        } catch (Exception e) {
+            log.error("创建索引{}异常", index, e);
+        }
+        return false;
+    }
+
+    /**
+     * 删除索引
+     *
+     * @param index 索引名称
+     * @return boolean
+     */
+    public boolean deleteIndex(String index) {
+        try {
+            DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(index);
+            AcknowledgedResponse acknowledgedResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
+            return acknowledgedResponse.isAcknowledged();
+        } catch (Exception e) {
+            log.error("删除索引{}异常", index, e);
+        }
+        return false;
+    }
+
+    /**
+     * 新增(更新)文档:自动生成文档id
+     *
+     * @param index 索引
+     * @param map   保存的数据
+     * @return string
+     */
+    public String save(String index, Map<String, Object> map) {
+        return save(index, map, null);
+    }
+
+    /**
+     * 新增(更新)文档:自定义文档id
+     *
+     * @param index 索引
+     * @param docId 文档id
+     * @param map   保存的数据
+     * @return string
+     */
+    public String save(String index, Map<String, Object> map, String docId) {
+        try {
+            //文档id为空则新增
+            if(StringUtils.isEmpty(docId)){
+                IndexRequest indexRequest = new IndexRequest().index(index).source(map);
+                IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
+                return indexResponse.getId();
+            }
+            UpdateRequest updateRequest = new UpdateRequest().index(index).id(docId).doc(map).docAsUpsert(true);
+            UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
+            return updateResponse.getId();
+        } catch (Exception e) {
+            log.error("索引{}插入(更新)数据异常:{}", index, e);
+        }
+        return null;
+    }
+
+    /**
+     * 批量插入(更新)文档: 自动生成id
+     *
+     * @param index 索引
+     * @param list  保存的数据
+     * @return boolean
+     */
+    public boolean bulkSave(String index, List<Map<String, Object>> list) {
+        return bulkSave(index, list, null);
+    }
+
+    /**
+     * 批量插入(更新)文档: 自定义id
+     *
+     * @param index   索引
+     * @param list    保存的数据
+     * @param idField map中作为文档id的字段名称
+     * @return boolean
+     */
+    public boolean bulkSave(String index, List<Map<String, Object>> list, String idField) {
+        return bulkSave(index, list, idField, null);
+    }
+
+    /**
+     * 批量插入(更新)文档: 自定义id字段 自定义id前缀
+     *
+     * @param index   索引
+     * @param list    保存的数据
+     * @param idField map中作为文档id的字段名称
+     * @param prefix  id前缀
+     * @return boolean
+     */
+    public boolean bulkSave(String index, List<Map<String, Object>> list, String idField, String prefix) {
+        if (CollectionUtils.isEmpty(list)) {
+            return false;
+        }
+        try {
+            BulkRequest bulkRequest = new BulkRequest();
+            for (Map<String, Object> map : list) {
+                String docId = null;
+                if (!StringUtils.isEmpty(idField) && StringUtils.isEmpty(prefix)) {
+                    docId = String.valueOf(map.get(idField));
+                } else if (!StringUtils.isEmpty(idField) && !StringUtils.isEmpty(prefix)) {
+                    docId = prefix + map.get(idField);
+                }
+                //文档id为空则新增
+                if(StringUtils.isEmpty(docId)){
+                    IndexRequest indexRequest = new IndexRequest().index(index).source(map);
+                    bulkRequest.add(indexRequest);
+                } else {
+                    UpdateRequest updateRequest = new UpdateRequest().index(index).id(docId).doc(map).docAsUpsert(true);
+                    bulkRequest.add(updateRequest);
+                }
+            }
+            BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
+            if(bulkResponse.hasFailures()){
+                log.error("索引{}批量插入(更新)数据错误:{}", index, bulkResponse.buildFailureMessage());
+                return false;
+            }
+            return true;
+        } catch (Exception e) {
+            log.error("索引{}批量插入(更新)数据异常", index, e);
+        }
+        return false;
+    }
+
+    /**
+     * 根据文档id查询文档
+     *
+     * @param index 索引
+     * @param docId 文档id
+     * @return map
+     */
+    public Doc searchById(String index, String docId) {
+        try {
+            GetRequest getRequest = new GetRequest(index).id(docId);
+            GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
+            if (getResponse.isExists()) {
+                return Doc.put(getResponse.getSourceAsMap()).build();
+            }
+        } catch (Exception e) {
+            log.error("索引{}查询文档id={}异常", index, docId, e);
+        }
+        return null;
+    }
+
+    /**
+     * 根据文档id删除文档
+     *
+     * @param index 索引
+     * @param docId 文档id
+     * @return boolean
+     */
+    public boolean deleteById(String index, String docId) {
+        try {
+            DeleteRequest deleteRequest = new DeleteRequest(index).id(docId);
+            DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
+            return deleteResponse.status() == RestStatus.OK;
+        } catch (Exception e) {
+            log.error("删除索引{}中文档id={}异常", index, docId);
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * 分页查询
+     *
+     * @param index    索引
+     * @param pageNum  当前页码
+     * @param pageSize 每页条数
+     * @return pageData
+     */
+    public PageData<List<Doc>> searchPage(String index, Integer pageNum, Integer pageSize) {
+        return searchPage(index, null, pageNum, pageSize, null, null);
+    }
+
+    /**
+     * 分页查询: 按指定排序
+     *
+     * @param index    索引
+     * @param pageNum  当前页码
+     * @param pageSize 每页条数
+     * @return pageData
+     */
+    public PageData<List<Doc>> searchPage(String index, Integer pageNum, Integer pageSize, String sortField, Boolean desc) {
+        return searchPage(index, null, pageNum, pageSize, sortField, desc);
+    }
+
+    /**
+     * 分页查询: 带查询条件
+     *
+     * @param index    索引
+     * @param query    查询条件
+     * @param pageNum  当前页码
+     * @param pageSize 每页条数
+     * @return pageData
+     */
+    public PageData<List<Doc>> searchPage(String index, QueryBuilder query, Integer pageNum, Integer pageSize) {
+        return searchPage(index, query, pageNum, pageSize, null, null);
+    }
+
+    /**
+     * 分页查询: 带查询条件 指定字段排序
+     *
+     * @param index     索引
+     * @param query     查询条件
+     * @param pageNum   当前页码
+     * @param pageSize  每页条数
+     * @param sortField 排序字段
+     * @param desc      是否倒序
+     * @return pageData
+     */
+    public PageData<List<Doc>> searchPage(String index, QueryBuilder query, Integer pageNum, Integer pageSize, String sortField, Boolean desc) {
+        return searchPageExecute(index, query, pageNum, pageSize, sortField, desc);
+    }
+
+    /**
+     * 执行分页查询
+     *
+     * @param index     索引
+     * @param query     查询条件
+     * @param pageNum   当前页码
+     * @param pageSize  每页条数
+     * @param sortField 排序字段
+     * @param desc      是否倒序
+     * @return pageData
+     */
+    private PageData<List<Doc>> searchPageExecute(String index, QueryBuilder query, Integer pageNum, Integer pageSize, String sortField, Boolean desc) {
+        List<Doc> searchResult = new ArrayList<>();
+        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(query);
+        try {
+            if (pageNum == null || pageNum <= 0) {
+                pageNum = 1;
+            }
+            if (pageSize == null || pageSize <= 0) {
+                pageSize = 10;
+            }
+            int from = (pageNum - 1) * pageSize;//计算起始下标
+            sourceBuilder.from(from);//起始下标,从0开始
+            sourceBuilder.size(pageSize);//每页记录数
+
+            setSortQuery(sourceBuilder, sortField, desc);//设置排序信息
+
+            SearchRequest searchRequest = new SearchRequest(index).source(sourceBuilder);
+            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
+            SearchHits hits = searchResponse.getHits();
+            long totalCount = hits.getTotalHits().value;
+            if (totalCount == 0) {
+                return new PageData<>();
+            }
+            int totalPage = Math.toIntExact(hits.getTotalHits().value / pageSize);
+            if(totalCount % 10 != 0){
+                totalPage ++;
+            }
+            SearchHit[] searchHits = hits.getHits();
+            Arrays.stream(searchHits).forEach(doc -> searchResult.add(Doc.put(doc.getSourceAsMap()).build()));
+            return new PageData<>(pageNum, pageSize, totalCount, totalPage, searchResult);
+        } catch (Exception e) {
+            log.error("索引{}查询分页数据失败, 查询条件{}", index, sourceBuilder.toString(), e);
+        }
+        return new PageData<>();
+    }
+
+    /**
+     * 查询
+     *
+     * @param index 索引
+     * @return list
+     */
+    public List<Doc> search(String index) {
+        return search(index, null);
+    }
+
+    /**
+     * 查询
+     *
+     * @param index 索引
+     * @param query 查询条件
+     * @return list
+     */
+    public List<Doc> search(String index, QueryBuilder query) {
+        return search(index, query, null, null);
+    }
+
+    /**
+     * 查询
+     *
+     * @param index     索引名称
+     * @param sortField 排序字段
+     * @param desc      是否倒序
+     * @return list
+     */
+    public List<Doc> search(String index, String sortField, Boolean desc) {
+        return search(index, null, sortField, desc);
+    }
+
+    /**
+     * 查询
+     *
+     * @param index     索引名称
+     * @param query     查询条件
+     * @param sortField 排序字段
+     * @param desc      是否倒序
+     * @return list
+     */
+    public List<Doc> search(String index, QueryBuilder query, String sortField, Boolean desc) {
+        return search(index, query, sortField, desc, null);
+    }
+
+    /**
+     * 查询
+     *
+     * @param index     索引名称
+     * @param sortField 排序字段
+     * @param desc      是否倒序
+     * @param size      查询条数 null 或 小于0表示查询所有
+     * @return list
+     */
+    public List<Doc> search(String index, String sortField, Boolean desc, Integer size) {
+        return search(index, null, sortField, desc, size);
+    }
+
+    /**
+     * 查询
+     *
+     * @param index     索引名称
+     * @param query     查询条件
+     * @param sortField 排序字段
+     * @param desc      是否倒序
+     * @param size      查询条数 null 或 小于0表示查询所有
+     * @return list
+     */
+    public List<Doc> search(String index, QueryBuilder query, String sortField, Boolean desc, Integer size) {
+        return searchExecute(index, query, sortField, desc, size);
+    }
+
+    /**
+     * 执行查询: 游标查询,每次查询一万条,查询所有数据
+     *
+     * @param index     索引
+     * @param query     查询条件
+     * @param sortField 排序字段
+     * @param desc      是否倒序
+     * @param size      查询条数 null 或 小于0表示查询所有
+     * @return list
+     */
+    private List<Doc> searchExecute(String index, QueryBuilder query, String sortField, Boolean desc, Integer size) {
+        List<Doc> searchResult = new ArrayList<>();
+        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(query);
+        try {
+            setSortQuery(sourceBuilder, sortField, desc);//设置排序信息
+             /*
+              * 当size不为空且大于0时,限制查询条数为size
+              */
+            if(size != null && size > 0){
+                sourceBuilder.size(size);
+                SearchRequest searchRequest = new SearchRequest(index).source(sourceBuilder);
+                SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
+                SearchHits hits = searchResponse.getHits();
+                int totalCount = hits.getHits().length;
+                if (totalCount == 0) {
+                    return searchResult;
+                }
+                SearchHit[] searchHits = hits.getHits();
+                Arrays.stream(searchHits).forEach(doc -> searchResult.add(Doc.put(doc.getSourceAsMap()).build()));
+                return searchResult;
+            }
+
+            /*
+             * 否则查询所有,设置游标size为10000,每次查询10000条,查询全部数据
+             */
+            sourceBuilder.size(10000);
+            Scroll scroll = new Scroll(TimeValue.timeValueSeconds(30));
+            SearchRequest searchRequest = new SearchRequest(index).source(sourceBuilder).scroll(scroll);
+            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
+            SearchHits hits = searchResponse.getHits();
+            if (hits.getHits().length == 0) {
+                return searchResult;
+            }
+            SearchHit[] searchHits = hits.getHits();
+            Arrays.stream(searchHits).forEach(doc -> searchResult.add(Doc.put(doc.getSourceAsMap()).build()));
+            String scrollId = searchResponse.getScrollId();
+            while (true) {
+                SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId).scroll(scroll);
+                searchResponse = client.scroll(searchScrollRequest, RequestOptions.DEFAULT);
+                searchHits = searchResponse.getHits().getHits();
+                if (searchHits == null || searchHits.length == 0) {
+                    break;
+                }
+                Arrays.stream(searchHits).forEach(doc -> searchResult.add(Doc.put(doc.getSourceAsMap()).build()));
+                scrollId = searchResponse.getScrollId();
+            }
+            //清除滚屏
+            ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
+            clearScrollRequest.addScrollId(scrollId);
+            client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
+            return searchResult;
+        } catch (Exception e) {
+            log.error("索引{}查询数据失败, 查询条件{}", index, sourceBuilder.toString(), e);
+        }
+        return searchResult;
+    }
+
+    /**
+     * 单个字段聚合统计count
+     *
+     * @param index 索引
+     * @param field 聚合字段
+     * @param size  条数: 空默认10条
+     * @return map
+     */
+    public Map<String, Long> searchAggCount(String index, String field, Integer size) {
+        return searchAggCount(index, null, field, size);
+    }
+
+    /**
+     * 单个字段聚合统计count: 带查询条件
+     *
+     * @param index 索引
+     * @param field 聚合字段
+     * @param size  条数: 空默认10条
+     * @return map
+     */
+    public Map<String, Long> searchAggCount(String index, BoolQueryBuilder query, String field, Integer size) {
+        try {
+            AggregationBuilder aggregationBuilder = AggregationBuilders.terms("aggCount").field(field).size(size == null || size < 0 ? 10 : size);
+            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(query).aggregation(aggregationBuilder);
+            SearchRequest searchRequest = new SearchRequest(index).source(sourceBuilder);
+            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
+            Terms terms = searchResponse.getAggregations().get("aggCount");
+            Map<String, Long> map = new LinkedHashMap<>();
+            for (Terms.Bucket entry : terms.getBuckets()) {
+                String key = (String) entry.getKey();
+                long total = entry.getDocCount();
+                map.put(key, total);
+            }
+            return map;
+        } catch (Exception e) {
+            log.error("统计字段{} count异常", field, e);
+        }
+        return null;
+    }
+
+    /**
+     * 单个字段聚合统计sum
+     *
+     * @param index 索引
+     * @param field 聚合字段
+     * @return map
+     */
+    public Map<String, Double> searchAggSum(String index, String field) {
+        try {
+            AggregationBuilder aggregationBuilder = AggregationBuilders.sum("aggSum").field(field);
+            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().aggregation(aggregationBuilder);
+            SearchRequest searchRequest = new SearchRequest(index).source(sourceBuilder);
+            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
+            Sum sum = searchResponse.getAggregations().get("aggSum");
+            Map<String, Double> map = new HashMap<>();
+            map.put(field, sum.getValue());
+            return map;
+        } catch (Exception e) {
+            log.error("统计字段{} sum异常", field, e);
+        }
+        return null;
+    }
+
+    /**
+     * 单个字段聚合(去重)查询数据
+     *
+     * @param index    索引
+     * @param query    查询条件
+     * @param field    统计字段
+     * @param pageNum  页数
+     * @param pageSize 每页条数
+     * @return pageData
+     */
+    public PageData<List<Doc>> searchAggDocs(String index, QueryBuilder query, String field, Integer pageNum, Integer pageSize, String sortField, Boolean desc) {
+        try {
+            AggregationBuilder aggregationBuilder = AggregationBuilders
+                    .terms("agg").field(field).size(100000)
+                    .subAggregation(AggregationBuilders.topHits("dataHits")
+                            .size(1));//聚合后只需要重复中的一条
+
+            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(query).aggregation(aggregationBuilder);
+            setSortQuery(sourceBuilder, sortField, desc);//设置排序信息
+            SearchRequest searchRequest = new SearchRequest(index).source(sourceBuilder);
+            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
+            Terms terms = searchResponse.getAggregations().get("agg");
+            List<Doc> searchList = new ArrayList<>();
+            for (Terms.Bucket entry : terms.getBuckets()) {
+                TopHits top = entry.getAggregations().get("dataHits");
+                for (SearchHit hit : top.getHits()) {
+                    searchList.add(Doc.put(hit.getSourceAsMap()).build());
+                }
+            }
+            if (pageNum == null || pageNum <= 0) {
+                pageNum = 1;
+            }
+            if (pageSize == null || pageSize <= 0) {
+                pageSize = 10;
+            }
+            int from = (pageNum - 1) * pageSize;//起始下标
+            int totalCount = searchList.size();//全部条数
+            int totalPage = searchList.size() / pageSize + 1;//全部页数
+
+            if (from >= searchList.size()) {
+                return new PageData<>();
+            }
+            if (from + pageSize >= searchList.size()) {
+                return new PageData<>(pageNum, pageSize, totalCount, totalPage, searchList.subList(from, searchList.size()));
+            }
+            return new PageData<>(pageNum, pageSize, totalCount, totalPage, searchList.subList(from, from + pageSize));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return new PageData<>();
+    }
+
+    /**
+     * 查询count
+     *
+     * @param index 索引
+     * @param query 查询条件
+     * @return long
+     */
+    public long count(String index, QueryBuilder query) {
+        try {
+            CountRequest countRequest = new CountRequest().indices(index).query(query);
+            CountResponse countResponse= client.count(countRequest, RequestOptions.DEFAULT);
+            return countResponse.getCount();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+
+    /**
+     * 设置排序信息
+     *
+     * @param sourceBuilder
+     * @param sortField
+     * @param desc
+     */
+    private void setSortQuery(SearchSourceBuilder sourceBuilder, String sortField, Boolean desc) {
+        if (!StringUtils.isEmpty(sortField) && desc != null) {
+            if (desc) {
+                sourceBuilder.sort(sortField, SortOrder.DESC);
+            } else {
+                sourceBuilder.sort(sortField, SortOrder.ASC);
+            }
+        }
+    }
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/ExcelUtils.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/ExcelUtils.java
new file mode 100644
index 000000000..5a41dae07
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/ExcelUtils.java
@@ -0,0 +1,402 @@
+package com.example.awaysuse.util;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.hssf.util.HSSFColor;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.*;
+
+import java.io.OutputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+
+/**
+ * 导出Excel
+ * @author liuyazhuang
+ *
+ * @param <T>
+ */
+public class ExcelUtils<T>{
+
+    // 2007 版本以上 最大支持1048576行
+    public  final static String  EXCEl_FILE_2007 = "2007";
+    // 2003 版本 最大支持65536 行
+    public  final static String  EXCEL_FILE_2003 = "2003";
+
+    /**
+     * <p>
+     * 导出无头部标题行Excel <br>
+     * 时间格式默认:yyyy-MM-dd hh:mm:ss <br>
+     * </p>
+     *
+     * @param title 表格标题
+     * @param dataset 数据集合
+     * @param version 2003 或者 2007,不传时默认生成2003版本
+     */
+    public void exportExcel(String title, String sheetName, Collection<T> dataset, String version) {
+        if(StringUtils.isEmpty(version) || EXCEL_FILE_2003.equals(version.trim())){
+            exportExcel2003(title, sheetName, null, dataset, "yyyy-MM-dd HH:mm:ss");
+        }else{
+            exportExcel2007(title, sheetName, null, dataset, "yyyy-MM-dd HH:mm:ss");
+        }
+    }
+
+    /**
+     * <p>
+     * 导出带有头部标题行的Excel <br>
+     * 时间格式默认:yyyy-MM-dd hh:mm:ss <br>
+     * </p>
+     *
+     * @param title 表格标题
+     * @param headers 头部标题集合
+     * @param dataset 数据集合
+     * @param out 输出流
+     * @param version 2003 或者 2007,不传时默认生成2003版本
+     */
+    public void exportExcel(String title, String sheetName,String[] headers, Collection<T> dataset, OutputStream out,String version) {
+        if(StringUtils.isBlank(version) || EXCEL_FILE_2003.equals(version.trim())){
+            exportExcel2003(title, sheetName, headers, dataset, "yyyy-MM-dd HH:mm:ss");
+        }else{
+            exportExcel2007(title, sheetName, headers, dataset, "yyyy-MM-dd HH:mm:ss");
+        }
+    }
+
+    /**
+     * <p>
+     * 通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中 <br>
+     * 此版本生成2007以上版本的文件 (文件后缀:xlsx)
+     * </p>
+     *
+     * @param title
+     *            表格标题名
+     * @param headers
+     *            表格头部标题集合
+     * @param dataset
+     *            需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的
+     *            JavaBean属性的数据类型有基本数据类型及String,Date
+     * @param pattern
+     *            如果有时间数据,设定输出格式。默认为"yyyy-MM-dd hh:mm:ss"
+     */
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    public XSSFWorkbook exportExcel2007(String title, String sheetName, String[] headers, Collection<T> dataset, String pattern) {
+        // 声明一个工作薄
+        XSSFWorkbook workbook = new XSSFWorkbook();
+        // 生成一个表格
+        XSSFSheet sheet = workbook.createSheet(sheetName);
+        // 设置表格默认列宽度为15个字节
+        sheet.setDefaultColumnWidth(20);
+        // 生成一个样式
+        XSSFCellStyle style = workbook.createCellStyle();
+        // 设置这些样式
+        style.setFillForegroundColor(new XSSFColor(java.awt.Color.gray));
+        style.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
+        style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
+        style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
+        style.setBorderRight(XSSFCellStyle.BORDER_THIN);
+        style.setBorderTop(XSSFCellStyle.BORDER_THIN);
+        style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
+        // 生成一个字体
+        XSSFFont font = workbook.createFont();
+        font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
+        font.setFontName("宋体");
+        font.setColor(new XSSFColor(java.awt.Color.BLACK));
+        font.setFontHeightInPoints((short) 11);
+        // 把字体应用到当前的样式
+        style.setFont(font);
+        // 生成并设置另一个样式
+        XSSFCellStyle style2 = workbook.createCellStyle();
+        style2.setFillForegroundColor(new XSSFColor(java.awt.Color.WHITE));
+        style2.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
+        style2.setBorderBottom(XSSFCellStyle.BORDER_THIN);
+        style2.setBorderLeft(XSSFCellStyle.BORDER_THIN);
+        style2.setBorderRight(XSSFCellStyle.BORDER_THIN);
+        style2.setBorderTop(XSSFCellStyle.BORDER_THIN);
+        style2.setAlignment(XSSFCellStyle.ALIGN_CENTER);
+        style2.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
+        // 生成另一个字体
+        XSSFFont font2 = workbook.createFont();
+        font2.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);
+        // 把字体应用到当前的样式
+        style2.setFont(font2);
+
+        // 产生表格标题行
+        XSSFRow row = sheet.createRow(0);
+        XSSFCell cellHeader;
+        for (int i = 0; i < headers.length; i++) {
+            cellHeader = row.createCell(i);
+            cellHeader.setCellStyle(style);
+            cellHeader.setCellValue(new XSSFRichTextString(headers[i]));
+        }
+
+        // 遍历集合数据,产生数据行
+        Iterator<T> it = dataset.iterator();
+        int index = 0;
+        T t;
+        Field[] fields;
+        Field field;
+        XSSFRichTextString richString;
+        Pattern p = Pattern.compile("^//d+(//.//d+)?$");
+        Matcher matcher;
+        String fieldName;
+        String getMethodName;
+        XSSFCell cell;
+        Class tCls;
+        Method getMethod;
+        Object value;
+        String textValue;
+        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+        while (it.hasNext()) {
+            index++;
+            row = sheet.createRow(index);
+            t = (T) it.next();
+            // 利用反射,根据JavaBean属性的先后顺序,动态调用getXxx()方法得到属性值
+            fields = t.getClass().getDeclaredFields();
+            for (int i = 0; i < fields.length; i++) {
+                cell = row.createCell(i);
+                cell.setCellStyle(style2);
+                field = fields[i];
+                fieldName = field.getName();
+                getMethodName = "get" + fieldName.substring(0, 1).toUpperCase()
+                        + fieldName.substring(1);
+                try {
+                    tCls = t.getClass();
+                    getMethod = tCls.getMethod(getMethodName, new Class[] {});
+                    value = getMethod.invoke(t, new Object[] {});
+                    // 判断值的类型后进行强制类型转换
+                    textValue = null;
+                    if (value instanceof Integer) {
+                        cell.setCellValue((Integer) value);
+                    } else if (value instanceof Float) {
+                        textValue = String.valueOf((Float) value);
+                        cell.setCellValue(textValue);
+                    } else if (value instanceof Double) {
+                        textValue = String.valueOf((Double) value);
+                        cell.setCellValue(textValue);
+                    } else if (value instanceof Long) {
+                        cell.setCellValue((Long) value);
+                    }
+                    if (value instanceof Boolean) {
+                        textValue = "是";
+                        if (!(Boolean) value) {
+                            textValue = "否";
+                        }
+                    } else if (value instanceof Date) {
+                        textValue = sdf.format((Date) value);
+                    } else {
+                        // 其它数据类型都当作字符串简单处理
+                        if (value != null) {
+                            textValue = value.toString();
+                        }
+                    }
+                    if (textValue != null) {
+                        matcher = p.matcher(textValue);
+                        if (matcher.matches()) {
+                            // 是数字当作double处理
+                            cell.setCellValue(Double.parseDouble(textValue));
+                        } else {
+                            richString = new XSSFRichTextString(textValue);
+                            cell.setCellValue(richString);
+                        }
+                    }
+                } catch (SecurityException e) {
+                    e.printStackTrace();
+                } catch (NoSuchMethodException e) {
+                    e.printStackTrace();
+                } catch (IllegalArgumentException e) {
+                    e.printStackTrace();
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                } catch (InvocationTargetException e) {
+                    e.printStackTrace();
+                } finally {
+                    // 清理资源
+                }
+            }
+        }
+        return workbook;
+    }
+
+
+
+    /**
+     * <p>
+     * 通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中 <br>
+     * 此方法生成2003版本的excel,文件名后缀:xls <br>
+     * </p>
+     *
+     * @param sheetName
+     *            表格sheet名
+     * @param headers
+     *            表格头部标题集合
+     * @param dataset
+     *            需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的
+     *            JavaBean属性的数据类型有基本数据类型及String,Date
+     * @param pattern
+     *            如果有时间数据,设定输出格式。默认为"yyyy-MM-dd hh:mm:ss"
+     */
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    public HSSFWorkbook exportExcel2003(String title, String sheetName, String[] headers, Collection<T> dataset, String pattern) {
+        // 声明一个工作薄
+        HSSFWorkbook workbook = new HSSFWorkbook();
+        // 生成一个表格
+        HSSFSheet sheet = workbook.createSheet(sheetName);
+        // 设置表格默认列宽度为15个字节
+        sheet.setDefaultColumnWidth(20);
+        // 生成一个样式
+        HSSFCellStyle style = workbook.createCellStyle();
+        // 设置这些样式
+        style.setFillForegroundColor(HSSFColor.GREY_50_PERCENT.index);
+        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
+        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
+        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
+        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
+        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
+        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
+        // 生成一个字体
+        HSSFFont font = workbook.createFont();
+        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
+        font.setFontName("宋体");
+        font.setColor(HSSFColor.WHITE.index);
+        font.setFontHeightInPoints((short) 11);
+        // 把字体应用到当前的样式
+        style.setFont(font);
+        // 生成并设置另一个样式
+        HSSFCellStyle style2 = workbook.createCellStyle();
+        style2.setFillForegroundColor(HSSFColor.WHITE.index);
+        style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
+        style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
+        style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
+        style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
+        style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
+        style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
+        style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
+        // 生成另一个字体
+        HSSFFont font2 = workbook.createFont();
+        font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
+        // 把字体应用到当前的样式
+        style2.setFont(font2);
+
+        //=======================创建标题
+        CellRangeAddress region = new CellRangeAddress(0, 0, 0, headers.length-1);
+        sheet.addMergedRegion(region);
+        // 生成一个样式
+        HSSFCellStyle headerStyle = workbook.createCellStyle();
+        headerStyle.setFillForegroundColor(HSSFColor.WHITE.index);
+        headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
+        headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
+        headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
+        headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
+        headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
+        headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
+        headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
+        // 生成一个字体
+        HSSFFont headerFont = workbook.createFont();
+        headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
+        headerFont.setFontName("宋体");
+        headerFont.setColor(HSSFColor.BLACK.index);
+        headerFont.setFontHeightInPoints((short) 15);
+        // 把字体应用到当前的样式
+        headerStyle.setFont(headerFont);
+        HSSFRow headerRow = sheet.createRow(0);
+        HSSFCell headerCell = headerRow.createCell(0);;
+        headerCell.setCellStyle(headerStyle);
+        headerCell.setCellValue(title);
+
+        // 产生表格标题行
+        HSSFRow row = sheet.createRow(1);
+        HSSFCell cellHeader;
+        for (int i = 0; i < headers.length; i++) {
+            cellHeader = row.createCell(i);
+            cellHeader.setCellStyle(style);
+            cellHeader.setCellValue(new HSSFRichTextString(headers[i]));
+        }
+
+        // 遍历集合数据,产生数据行
+        Iterator<T> it = dataset.iterator();
+        int index = 1;
+        T t;
+        Field[] fields;
+        Field field;
+        HSSFRichTextString richString;
+        Pattern p = Pattern.compile("^//d+(//.//d+)?$");
+        Matcher matcher;
+        String fieldName;
+        String getMethodName;
+        HSSFCell cell;
+        Class tCls;
+        Method getMethod;
+        Object value;
+        String textValue;
+        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+        while (it.hasNext()) {
+            index++;
+            row = sheet.createRow(index);
+            t = (T) it.next();
+            // 利用反射,根据JavaBean属性的先后顺序,动态调用getXxx()方法得到属性值
+            fields = t.getClass().getDeclaredFields();
+            for (int i = 0; i < fields.length; i++) {
+                cell = row.createCell(i);
+                cell.setCellStyle(style2);
+                field = fields[i];
+                fieldName = field.getName();
+                getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
+                try {
+                    tCls = t.getClass();
+                    getMethod = tCls.getMethod(getMethodName, new Class[] {});
+                    value = getMethod.invoke(t, new Object[] {});
+                    // 判断值的类型后进行强制类型转换
+                    textValue = null;
+                    if (value instanceof Integer) {
+                        cell.setCellValue((Integer) value);
+                    } else if (value instanceof Float) {
+                        textValue = String.valueOf((Float) value);
+                        cell.setCellValue(textValue);
+                    } else if (value instanceof Double) {
+                        textValue = String.valueOf((Double) value);
+                        cell.setCellValue(textValue);
+                    } else if (value instanceof Long) {
+                        cell.setCellValue((Long) value);
+                    }
+                    if (value instanceof Boolean) {
+                        textValue = "是";
+                        if (!(Boolean) value) {
+                            textValue = "否";
+                        }
+                    } else if (value instanceof Date) {
+                        textValue = sdf.format((Date) value);
+                    } else {
+                        // 其它数据类型都当作字符串简单处理
+                        if (value != null) {
+                            textValue = value.toString();
+                        }
+                    }
+                    if (textValue != null) {
+                        matcher = p.matcher(textValue);
+                        if (matcher.matches()) {
+                            // 是数字当作double处理
+                            cell.setCellValue(Double.parseDouble(textValue));
+                        } else {
+                            richString = new HSSFRichTextString(textValue);
+                            cell.setCellValue(richString);
+                        }
+                    }
+                } catch (SecurityException | NoSuchMethodException | IllegalArgumentException | IllegalAccessException | InvocationTargetException e) {
+                    e.printStackTrace();
+                } finally {
+                    // 清理资源
+                }
+            }
+        }
+        return workbook;
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/FutureReqUtil.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/FutureReqUtil.java
new file mode 100644
index 000000000..e69de29bb
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/HttpClientUtils.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/HttpClientUtils.java
new file mode 100644
index 000000000..576a9c54d
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/HttpClientUtils.java
@@ -0,0 +1,447 @@
+package com.example.awaysuse.util;
+
+import com.alibaba.fastjson.JSONObject;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+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.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.protocol.HTTP;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class HttpClientUtils {
+
+    private static final Log LOG = LogFactory.getLog(HttpClientUtils.class);
+
+    private static RequestConfig requestConfig = null;
+
+    static {
+        // 设置请求和传输超时时间
+        requestConfig = RequestConfig.custom().setSocketTimeout(1000 * 60 * 60).setConnectTimeout(1000 * 60 * 60).build();
+    }
+
+    /**
+     * post请求
+     * 解决没有响应信息(是因为之前没有释放连接,导致获取不到响应)
+     *
+     * @param uri
+     * @param body
+     */
+    public static Map<String, String> post(String uri, JSONObject header, JSONObject body, Integer timeout) {
+        Map<String, String> retMap = new HashMap<>();
+        // 创建请求对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        HttpPost httpPost = new HttpPost(uri);
+        httpPost.setConfig(requestConfig);
+        try {
+            // 设置请求头信息
+            httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json;charset=utf-8");
+            if (header != null) {
+                for (String key : header.keySet()) {
+                    Object value = header.get(key);
+                    if (value != null && StringUtils.isNotBlank(value.toString())) {
+                        httpPost.addHeader(key, (value == null) ? null : String.valueOf(value));
+                    }
+                }
+            }
+            LOG.info("请求头" + httpPost);
+            // 设置请求体信息
+            String jsonstr = com.alibaba.fastjson.JSON.toJSONString(body);
+            StringEntity entity = new StringEntity(jsonstr, "utf-8");
+            entity.setContentEncoding("UTF-8");
+            entity.setContentType("application/json;charset=utf-8");
+            httpPost.setEntity(entity);
+
+            // 发出post请求
+            CloseableHttpResponse response = httpClient.execute(httpPost);
+            //解析响应结果
+            retMap.put("status", "success");
+            int statusCode = response.getStatusLine().getStatusCode();
+            retMap.put("statusCode", statusCode + "");
+            if (statusCode == 200) {
+                String result = EntityUtils.toString(response.getEntity(), "utf-8");
+                String loginToken = response.getFirstHeader("X-Auth-Token").getValue();
+                LOG.info("返回的token" + loginToken);
+                retMap.put("result", result);
+                if (loginToken != null) {
+                    retMap.put("loginToken", loginToken);
+                }
+                retMap.put("loginToken", loginToken);
+            } else if (statusCode == 201) {
+                String result = EntityUtils.toString(response.getEntity(), "utf-8");
+                String loginToken = response.getFirstHeader("X-Auth-Token").getValue();
+                LOG.info("返回的token" + loginToken);
+                retMap.put("result", result);
+                if (loginToken != null) {
+                    retMap.put("loginToken", loginToken);
+                }
+
+            } else {
+                retMap.put("result", EntityUtils.toString(response.getEntity(), "utf-8"));
+            }
+
+        } catch (Exception e) {
+            LOG.error(ExceptionUtils.getFullStackTrace(e));
+            retMap.put("status", "failed");
+            retMap.put("exMsg", e.getLocalizedMessage());
+        } finally {
+            httpPost.releaseConnection();
+        }
+        return retMap;
+    }
+
+
+    public static Map<String, String> postLogin(String uri, JSONObject header, JSONObject body, Integer timeout) {
+
+        Map<String, String> retMap = new HashMap<>();
+        // 创建请求对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        HttpPost httpPost = new HttpPost(uri);
+        httpPost.setConfig(requestConfig);
+        try {
+            // 设置请求头信息
+            httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json");
+            if (header != null) {
+                for (String key : header.keySet()) {
+                    Object value = header.get(key);
+                    if (value != null && StringUtils.isNotBlank(value.toString())) {
+                        httpPost.addHeader(key, (value == null) ? null : String.valueOf(value));
+                    }
+                }
+            }
+            LOG.info("请求头" + httpPost);
+            // 设置请求体信息
+            String jsonstr = com.alibaba.fastjson.JSON.toJSONString(body);
+            StringEntity entity = new StringEntity(jsonstr, "utf-8");
+            entity.setContentEncoding("UTF-8");
+            entity.setContentType("application/json;charset=utf-8");
+            httpPost.setEntity(entity);
+
+            // 发出post请求
+            CloseableHttpResponse response = httpClient.execute(httpPost);
+            //解析响应结果
+            retMap.put("status", "success");
+            int statusCode = response.getStatusLine().getStatusCode();
+            retMap.put("statusCode", statusCode + "");
+            LOG.info("返回的状态码是: " + statusCode);
+            if (statusCode == 201) {
+                String result = EntityUtils.toString(response.getEntity(), "utf-8");
+                String loginToken = response.getFirstHeader("X-Auth-Token").getValue();
+                LOG.info("返回的token" + loginToken);
+                retMap.put("result", result);
+                if (loginToken != null) {
+                    retMap.put("loginToken", loginToken);
+                }
+
+            } else {
+                retMap.put("result", EntityUtils.toString(response.getEntity(), "utf-8"));
+            }
+
+        } catch (Exception e) {
+            LOG.error(ExceptionUtils.getFullStackTrace(e));
+            retMap.put("status", "failed");
+            retMap.put("exMsg", e.getLocalizedMessage());
+        } finally {
+            httpPost.releaseConnection();
+        }
+        return retMap;
+    }
+
+
+    public static Map<String, String> post(String uri, JSONObject header, String body, Integer timeout) {
+        Map<String, String> retMap = new HashMap<>();
+        // 创建请求对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        HttpPost httpPost = new HttpPost(uri);
+        httpPost.setConfig(requestConfig);
+        try {
+
+            // 设置请求头信息
+            httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json;charset=utf-8");
+            if (header != null) {
+                for (String key : header.keySet()) {
+                    Object value = header.get(key);
+                    if (value != null && StringUtils.isNotBlank(value.toString())) {
+                        httpPost.addHeader(key, (value == null) ? null : String.valueOf(value));
+                    }
+                }
+            }
+            // 设置请求体信息
+            StringEntity entity = new StringEntity(body, "utf-8");
+            //entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
+            entity.setContentEncoding("UTF-8");
+            entity.setContentType("application/json");
+            httpPost.setEntity(entity);
+
+            // 设置超时时间
+/*            if (timeout != null) {
+                httpPost.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout);
+            }*/
+            // 发出post请求
+            CloseableHttpResponse response = httpClient.execute(httpPost);
+            //解析响应结果
+            retMap.put("status", "success");
+            int statusCode = response.getStatusLine().getStatusCode();
+            retMap.put("statusCode", statusCode + "");
+            if (statusCode == 200) {
+                String result = EntityUtils.toString(response.getEntity(), "utf-8");
+                retMap.put("result", result);
+            } else {
+                retMap.put("result", EntityUtils.toString(response.getEntity(), "utf-8"));
+            }
+
+        } catch (Exception e) {
+            LOG.error(ExceptionUtils.getFullStackTrace(e));
+            retMap.put("status", "failed");
+            retMap.put("exMsg", e.getLocalizedMessage());
+        } finally {
+            httpPost.releaseConnection();
+        }
+        return retMap;
+    }
+
+
+    /**
+     * get请求
+     *
+     * @param uri
+     * @param body
+     */
+    public static Map<String, String> get(String uri, JSONObject header, JSONObject body) {
+        return get(uri, header, body, null);
+    }
+
+    /**
+     * get请求
+     *
+     * @param uri
+     * @param body
+     */
+    public static Map<String, String> get(String uri, JSONObject header, JSONObject body, Integer timeout) {
+        Map<String, String> retMap = new HashMap<>();
+        HttpGet request = new HttpGet(uri);
+        try {
+            HttpClient client = HttpClients.createDefault();//创建HttpClient对象
+
+            if (header != null) {
+                for (String key : header.keySet()) {
+                    Object value = header.get(key);
+                    if (value != null && StringUtils.isNotBlank(value.toString())) {
+                        request.addHeader(key, (value == null) ? null : String.valueOf(value));
+                    }
+                }
+            }
+            HttpResponse response = client.execute(request);//发送get请求
+            int statusCode = response.getStatusLine().getStatusCode();
+
+            retMap.put("status", "success");
+            retMap.put("statusCode", statusCode + "");
+
+            /**请求发送成功,并得到响应**/
+            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+                /**读取服务器返回过来的json字符串数据**/
+                String strResult = EntityUtils.toString(response.getEntity(), "UTF-8");
+                retMap.put("result", strResult);
+            } else {
+                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_NO_CONTENT) {
+                    retMap.put("result", "");
+                } else {
+                    retMap.put("result", EntityUtils.toString(response.getEntity()));
+                }
+            }
+        } catch (IOException e) {
+
+            LOG.info(ExceptionUtils.getFullStackTrace(e));
+            retMap.put("status", "failed");
+            retMap.put("exMsg", e.getLocalizedMessage());
+            e.printStackTrace();
+        } finally {
+            request.releaseConnection();
+        }
+        return retMap;
+    }
+
+    public static JSONObject httpPost(String url, JSONObject jsonParam) {
+        // post请求返回结果
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        JSONObject jsonResult = null;
+        HttpPost httpPost = new HttpPost(url);
+        // 设置请求和传输超时时间
+        httpPost.setConfig(requestConfig);
+        try {
+            if (null != jsonParam) {
+                // 解决中文乱码问题
+                StringEntity entity = new StringEntity(jsonParam.toString(), "utf-8");
+                entity.setContentEncoding("UTF-8");
+                entity.setContentType("application/json");
+                httpPost.setEntity(entity);
+            }
+            CloseableHttpResponse result = httpClient.execute(httpPost);
+            // 请求发送成功,并得到响应
+            if (result.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+                String str = "";
+                try {
+                    // 读取服务器返回过来的json字符串数据
+                    str = EntityUtils.toString(result.getEntity(), "utf-8");
+                    // 把json字符串转换成json对象
+                    jsonResult = JSONObject.parseObject(str);
+                } catch (Exception e) {
+                    LOG.error("post请求提交失败:" + url, e);
+                }
+            }
+        } catch (IOException e) {
+            LOG.error("post请求提交失败:" + url, e);
+        } finally {
+            httpPost.releaseConnection();
+        }
+        return jsonResult;
+    }
+
+    /**
+     * post请求传输String参数 例如:name=Jack&sex=1&type=2
+     * Content-type:application/x-www-form-urlencoded
+     *
+     * @param url      url地址
+     * @param strParam 参数
+     * @return
+     */
+    public static JSONObject httpPost(String url, String strParam) {
+        // post请求返回结果
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        JSONObject jsonResult = null;
+        HttpPost httpPost = new HttpPost(url);
+        httpPost.setConfig(requestConfig);
+        try {
+            if (null != strParam) {
+                // 解决中文乱码问题
+                StringEntity entity = new StringEntity(strParam, "utf-8");
+                entity.setContentEncoding("utf-8");
+                entity.setContentType("application/x-www-form-urlencoded");
+                httpPost.setEntity(entity);
+            }
+            CloseableHttpResponse result = httpClient.execute(httpPost);
+            // 请求发送成功,并得到响应
+            if (result.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+                String str = "";
+                try {
+                    // 读取服务器返回过来的json字符串数据
+                    str = EntityUtils.toString(result.getEntity(), "utf-8");
+                    // 把json字符串转换成json对象
+                    jsonResult = JSONObject.parseObject(str);
+                } catch (Exception e) {
+                    LOG.error("post请求提交失败:" + url, e);
+                }
+            }
+        } catch (IOException e) {
+            LOG.error("post请求提交失败:" + url, e);
+        } finally {
+            httpPost.releaseConnection();
+        }
+        return jsonResult;
+    }
+
+    /**
+     * 发送get请求
+     *
+     * @param url 路径
+     * @return
+     */
+    public static JSONObject httpGet(String url) {
+        // get请求返回结果
+        JSONObject jsonResult = null;
+        CloseableHttpClient client = HttpClients.createDefault();
+        // 发送get请求
+        HttpGet request = new HttpGet(url);
+        request.setConfig(requestConfig);
+        try {
+            CloseableHttpResponse response = client.execute(request);
+
+            // 请求发送成功,并得到响应
+            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+                // 读取服务器返回过来的json字符串数据
+                HttpEntity entity = response.getEntity();
+                String strResult = EntityUtils.toString(entity, "utf-8");
+                // 把json字符串转换成json对象
+                jsonResult = JSONObject.parseObject(strResult);
+            } else {
+                LOG.error("get请求提交失败:" + url);
+            }
+        } catch (IOException e) {
+            LOG.error("get请求提交失败:" + url, e);
+        } finally {
+            request.releaseConnection();
+        }
+        return jsonResult;
+    }
+
+
+    //httpput请求
+    public static Map<String, String> httpPut(String uri, JSONObject header, String body, Integer timeout) {
+        Map<String, String> retMap = new HashMap<>();
+        // 创建请求对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        HttpPut httpput = new HttpPut(uri);
+        httpput.setConfig(requestConfig);
+        try {
+
+            // 设置请求头信息
+            httpput.addHeader(HTTP.CONTENT_TYPE, "application/json;charset=utf-8");
+            if (header != null) {
+                for (String key : header.keySet()) {
+                    Object value = header.get(key);
+                    if (value != null && StringUtils.isNotBlank(value.toString())) {
+                        httpput.addHeader(key, (value == null) ? null : String.valueOf(value));
+                    }
+                }
+            }
+            // 设置请求体信息
+            StringEntity entity = new StringEntity(body, "utf-8");
+            //entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
+            entity.setContentEncoding("UTF-8");
+            entity.setContentType("application/json");
+            httpput.setEntity(entity);
+
+            // 设置超时时间
+/*            if (timeout != null) {
+                httpPost.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout);
+            }*/
+            // 发出post请求
+            CloseableHttpResponse response = httpClient.execute(httpput);
+            //解析响应结果
+            retMap.put("status", "success");
+            int statusCode = response.getStatusLine().getStatusCode();
+            retMap.put("statusCode", statusCode + "");
+            if (statusCode == 200) {
+                String result = EntityUtils.toString(response.getEntity(), "utf-8");
+                retMap.put("result", result);
+            } else {
+                retMap.put("result", EntityUtils.toString(response.getEntity(), "utf-8"));
+            }
+
+        } catch (Exception e) {
+            LOG.error(ExceptionUtils.getFullStackTrace(e));
+            retMap.put("status", "failed");
+            retMap.put("exMsg", e.getLocalizedMessage());
+        } finally {
+            httpput.releaseConnection();
+        }
+        return retMap;
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/MapUtils.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/MapUtils.java
new file mode 100644
index 000000000..0b2bdaae4
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/MapUtils.java
@@ -0,0 +1,49 @@
+package com.example.awaysuse.util;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @Author: fengh
+ * @Date: 2020/7/17 14:34
+ * @Description: map工具类
+ */
+@Slf4j
+@Component
+public class MapUtils<K, V> {
+
+    private final Map<K, V> map;
+
+    public MapUtils(){
+        this.map = new LinkedHashMap<>();
+    }
+
+    public MapUtils(Map<K, V> map){
+        this.map = map;
+    }
+
+    public static <K, V> MapUtils<K, V> create(){
+        return new MapUtils<>(new LinkedHashMap<>());
+    }
+
+    public MapUtils<K, V> put(K key, V value){
+        this.map.put(key, value);
+        return this;
+    }
+
+    public Map<K, V> build(){
+        return map;
+    }
+
+//    public static void main(String[] args) {
+//        //默认格式<Object, Object>
+//        Map<Object, Object> map1 = MapUtils.create().put("name", "nicai").build();
+//        //自定义格式
+//        Map<Integer, Integer> map2 = new MapUtils<Integer, Integer>().put(1, 2).put(2, 3).build();
+//        System.out.println(String.format("%s\n%s", map1, map2));
+//    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/NullUtils.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/NullUtils.java
new file mode 100644
index 000000000..2fdee0beb
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/NullUtils.java
@@ -0,0 +1,28 @@
+package com.example.awaysuse.util;
+
+import java.util.Collection;
+
+/**
+ * @Author
+ * @Date 2020/10/27 12:10
+ * @Description   判断是否为空
+ */
+public class NullUtils {
+
+    public static <T> boolean isNull(Collection<T> collection){
+        return collection == null || collection.isEmpty();
+    }
+
+    public static <T> boolean isNotNull(Collection<T> collection){
+        return collection != null && !collection.isEmpty();
+    }
+
+    public static boolean isNull(String string){
+        return string == null || "".equals(string);
+    }
+
+    public static boolean isNotNull(String string){
+        return string != null && !"".equals(string);
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/OkhttpUtil.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/OkhttpUtil.java
new file mode 100644
index 000000000..2776c6904
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/OkhttpUtil.java
@@ -0,0 +1,129 @@
+package com.example.awaysuse.util;
+
+
+import com.squareup.okhttp.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by er on 2018/11/16.
+ */
+@Component
+public class OkhttpUtil {
+    private static final Logger logger = LoggerFactory.getLogger(OkhttpUtil.class);
+    public static String post(String json, String url){
+        logger.info("查询的json为:{},url为:{}",json,url);
+        String courses=null;
+        //创建一个OkHttpClient对象
+        OkHttpClient okHttpClient = new OkHttpClient();
+        okHttpClient.setConnectTimeout(20, TimeUnit.SECONDS);
+
+        okHttpClient.setWriteTimeout(20, TimeUnit.SECONDS);
+
+        okHttpClient.setReadTimeout(30, TimeUnit.SECONDS);
+        MediaType mediaType= MediaType.parse("application/json; charset=utf-8");
+        RequestBody requestBody = RequestBody.create(mediaType, json);
+
+        //创建一个请求对象
+
+        Request request = new Request
+                .Builder()
+                .url(url)
+                .post(requestBody)
+                .build();
+        //发送请求获取响应
+        try {
+            Response response=okHttpClient.newCall(request).execute();
+            //判断请求是否成功
+            if(response.isSuccessful()){
+
+                courses=response.body().string();
+                System.out.println("请求成功");
+            }else{
+                System.out.println("錯誤"+"-----"+response.code()+response.body().string());
+
+            }
+        }catch(IOException e) {
+            e.printStackTrace();
+        }
+
+        return courses;
+    }
+
+
+
+        public static String get(String url){
+            String courses=null;
+            //创建一个OkHttpClient对象
+            OkHttpClient okHttpClient = new OkHttpClient();
+            okHttpClient.setConnectTimeout(20, TimeUnit.SECONDS);
+
+            okHttpClient.setWriteTimeout(20, TimeUnit.SECONDS);
+
+            okHttpClient.setReadTimeout(30, TimeUnit.SECONDS);
+            //创建一个请求对象
+            Request request = new Request
+                    .Builder()
+                    .url(url)
+                    .build();
+            //发送请求获取响应
+            try {
+                Response response=okHttpClient.newCall(request).execute();
+                //判断请求是否成功
+                if(response.isSuccessful()){
+
+                    courses=response.body().string();
+                    System.out.println("请求成功");
+                }else{
+                    System.out.println("錯誤"+"-----"+response.code()+response.body().string());
+
+                }
+            }catch(IOException e) {
+                e.printStackTrace();
+            }
+
+            return courses;
+        }
+
+    public static String postWithHead(String alretUrl,String paramBody, String cookie) {
+        logger.info("查询的json为:{},url为:{},param:{},cookie:{}",alretUrl,paramBody,cookie);
+        String courses="";
+        //创建一个OkHttpClient对象
+        OkHttpClient okHttpClient = new OkHttpClient();
+        okHttpClient.setConnectTimeout(20, TimeUnit.SECONDS);
+
+        okHttpClient.setWriteTimeout(20, TimeUnit.SECONDS);
+
+        okHttpClient.setReadTimeout(30, TimeUnit.SECONDS);
+        MediaType mediaType= MediaType.parse("application/json; charset=utf-8");
+        RequestBody requestBody = RequestBody.create(mediaType, paramBody);
+
+        //创建一个请求对象
+
+        Request request = new Request
+                .Builder()
+                .url(alretUrl)
+                .post(requestBody).addHeader("Cookie",cookie)
+                .build();
+        //发送请求获取响应
+        try {
+            Response response=okHttpClient.newCall(request).execute();
+            //判断请求是否成功
+            if(response.isSuccessful()){
+
+                courses=response.body().string();
+                logger.info("请求成功");
+            }else{
+                logger.error("錯誤"+"-----"+response.code()+response.body().string());
+
+            }
+        }catch(IOException e) {
+            e.printStackTrace();
+        }
+        return courses;
+    }
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/VUtils.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/VUtils.java
new file mode 100644
index 000000000..f41491bb1
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/VUtils.java
@@ -0,0 +1,47 @@
+package com.example.awaysuse.util;
+
+
+import com.example.awaysuse.service.BranchHandle;
+import com.example.awaysuse.service.PresentOrElseHandler;
+import com.example.awaysuse.service.ThrowExceptionFunction;
+
+public class VUtils {
+
+
+    public static ThrowExceptionFunction isTure(boolean b) {
+
+        return (errorMessage) -> {
+            if (b) {
+                throw new RuntimeException(errorMessage);
+            }
+        };
+
+    }
+
+    public static BranchHandle isTureOrFalse(boolean b){
+
+        return (trueHandle, falseHandle) -> {
+            if (b){
+                trueHandle.run();
+            } else {
+                falseHandle.run();
+            }
+        };
+    }
+
+
+    public static PresentOrElseHandler<?> isBlankOrNoBlank(String str){
+
+        return (consumer, runnable) -> {
+            if (str == null || str.length() == 0){
+                runnable.run();
+            } else {
+                consumer.accept(str);
+            }
+        };
+    }
+
+
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/ZonedDateTimeUtil.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/ZonedDateTimeUtil.java
new file mode 100644
index 000000000..1b6440e2a
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/ZonedDateTimeUtil.java
@@ -0,0 +1,114 @@
+package com.example.awaysuse.util;
+
+import com.alibaba.fastjson.JSON;
+import org.apache.commons.lang.StringUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.Date;
+import java.util.List;
+import java.util.TimeZone;
+
+public class ZonedDateTimeUtil {
+
+    SimpleDateFormat FORMAT_YMD = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+
+    public Date zonedDateTimeToDate(ZonedDateTime zonedDateTime){
+        //格式转换
+        String computeTime = zonedDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
+        //将ZonedDateTime类型转成Date
+        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("GMT-0"));
+        Date nowDt = Date.from(now.toInstant());
+        return nowDt;
+    }
+
+   //  当前时间 ZoneDateTime格式
+  public ZonedDateTime  stringToZone(){
+
+      ZonedDateTime zdt = null;
+      try {
+          String Str = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("GMT+8"))
+          .format(Instant.now().minus(1, ChronoUnit.DAYS));
+          //将String类型的时间转成Date类型
+          Date yestoday = FORMAT_YMD.parse(Str);
+          //将date类型转成 ZonedDateTime类型 使用了一个工具类
+          zdt = toZonedDateTime(yestoday.getTime());
+          System.out.println("现在时间" + zdt);
+
+          //使用ZoneDateTime获取一天的开始时间
+
+          ZonedDateTime zdt2 = zdt.toLocalDate().atStartOfDay(zdt.getZone());
+
+          System.out.println("开始时间" + zdt2);
+
+          //使用ZoneDateTime获取一天中的结束时间
+
+          ZonedDateTime zonedDateTime1 = endOfDay(zdt2);
+
+          System.out.println("结束时间" + zonedDateTime1);
+          return zdt;
+      } catch (ParseException e) {
+          e.printStackTrace();
+      }
+        return  null;
+  }
+
+    //获取一天的结束时间的工具类
+
+    public static ZonedDateTime endOfDay(ZonedDateTime curDate) {
+
+        ZonedDateTime startOfTomorrow = curDate
+            .toLocalDate()
+            .plusDays(1)
+            .atStartOfDay()
+            .atZone(curDate.getZone())
+            .withEarlierOffsetAtOverlap();
+        return startOfTomorrow.minusSeconds(1);
+
+    }
+
+
+
+//将Date转成ZoneDateTime类型
+
+    public static ZonedDateTime toZonedDateTime(Long time){
+        String LONG_DATE = "yyyy-MM-dd HH:mm:ss";
+        SimpleDateFormat sdf = new SimpleDateFormat(LONG_DATE);
+        Date createDate = new Date(time);
+        sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
+        String format = sdf.format(createDate);
+        DateTimeFormatter beijingFormatter = DateTimeFormatter.ofPattern(LONG_DATE).withZone(ZoneId.of("GMT+8"));
+        if(StringUtils.isBlank(format)){
+            return null;
+        }
+        ZonedDateTime beijingDateTime = ZonedDateTime.parse(format, beijingFormatter);
+        ZonedDateTime utc = beijingDateTime.withZoneSameInstant(ZoneId.of("UTC"));
+        return beijingDateTime;
+    }
+
+
+    public  ZonedDateTime  longToZone(){
+        //Long类型转成指定时区的ZoneDateTime类型
+        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("GMT+8"));
+        Date date = Date.from(now.toInstant());
+        long diff = date.getTime() - Long.parseLong(String.valueOf(10*1000*60));
+        String LONG_DATE = "yyyy-MM-dd HH:mm:ss";
+        SimpleDateFormat sdf = new SimpleDateFormat(LONG_DATE);
+        Date createDate = new Date(diff);
+        //将时区转换到指定时区
+        sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
+        String format1 = sdf.format(createDate);
+        DateTimeFormatter beijingFormatter=DateTimeFormatter.ofPattern(LONG_DATE).withZone(ZoneId.of("GMT+8"));
+        ZonedDateTime beijingDateTime = ZonedDateTime.parse(format1, beijingFormatter);
+        return beijingDateTime;
+
+    }
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/spring/Application.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/spring/Application.java
new file mode 100644
index 000000000..edf8ec775
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/spring/Application.java
@@ -0,0 +1,15 @@
+package com.example.spring;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.retry.annotation.EnableRetry;
+
+@EnableRetry
+@SpringBootApplication
+public class Application {
+
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/spring/controller/RetryableController.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/spring/controller/RetryableController.java
new file mode 100644
index 000000000..13c905ef6
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/spring/controller/RetryableController.java
@@ -0,0 +1,26 @@
+package com.example.spring.controller;
+
+
+import com.example.spring.service.RetryableService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class RetryableController {
+
+    @Autowired
+    private RetryableService retryableService;
+
+    @RequestMapping("retry")
+    public String retry(Integer code){
+        int test = 0;
+        try {
+            test = retryableService.test(code);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+       return  String.valueOf(test);
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/spring/service/RetryableService.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/spring/service/RetryableService.java
new file mode 100644
index 000000000..a727e3fdb
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/spring/service/RetryableService.java
@@ -0,0 +1,31 @@
+package com.example.spring.service;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import org.springframework.stereotype.Service;
+
+
+import org.springframework.retry.annotation.Backoff;
+import org.springframework.retry.annotation.Retryable;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalTime;
+
+@Service
+public class RetryableService {
+
+
+    @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 500, multiplier = 1.5))
+    public int test(int code) throws Exception {
+        System.out.println("test被调用,时间:" + LocalTime.now());
+        HttpResponse execute = HttpRequest.post("https://www.baidu.com/").execute();
+        int status = execute.getStatus();
+        if (status != 200) {
+           throw new Exception("测试失败");
+          // return  500;
+        }
+        System.out.println("test被调用,情况对头了!");
+
+        return 200;
+    }
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/resources/application.yml b/spring-boot-demo-alwaysuse/src/main/resources/application.yml
new file mode 100644
index 000000000..ba3eff2b6
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/main/resources/application.yml
@@ -0,0 +1,19 @@
+userinfo:
+  name: fengxb
+  qq: 12520623333
+  phoneNumber: 18501966666
+server:
+  port: 30001
+
+#es配置 rest-client
+elasticsearch:
+  hosts: 10.225.6.205:9200,10.225.6.206:9200,10.225.6.207:9200,10.225.6.208:9200
+  username: admin
+  passowrd: Admin@123
+  schema: http
+  connectTimeOut: 1000
+  socketTimeOut: 30000
+  connectionRequestTimeOut: 500
+  maxConnectNum: 100
+  maxConnectPerRoute: 100
+
diff --git a/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/AwaysuseApplicationTests.java b/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/AwaysuseApplicationTests.java
new file mode 100644
index 000000000..aa6ea46e9
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/AwaysuseApplicationTests.java
@@ -0,0 +1,638 @@
+package com.example.awaysuse;
+
+import cn.hutool.http.HttpRequest;
+import com.cronutils.model.Cron;
+import com.cronutils.model.CronType;
+import com.cronutils.model.definition.CronDefinitionBuilder;
+import com.cronutils.model.time.ExecutionTime;
+import com.cronutils.parser.CronParser;
+import com.example.awaysuse.model.Help;
+import com.example.awaysuse.model.Person;
+import com.example.awaysuse.util.VUtils;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateUtils;
+import org.junit.jupiter.api.Test;
+import org.springframework.scheduling.support.CronSequenceGenerator;
+import org.springframework.util.Assert;
+import org.springframework.util.ObjectUtils;
+
+import java.math.BigDecimal;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Slf4j
+//@SpringBootTest
+public class AwaysuseApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+    /*
+       Assert断言工具类,通常用于数据合法性检查
+     */
+    @Test
+    public void testAssert() {
+        Object object = "null";
+        //  要求参数 object 必须为非空(Not Null),否则抛出异常,不予放行
+        Assert.notNull(object, "传递的参数不能是空");
+        // 要求参数必须空(Null),否则抛出异常,不予『放行』。
+        // 和 notNull() 方法断言规则相反
+        Assert.isNull(null, "传递的参数必须是空");
+        // 要求参数必须为真(True),否则抛出异常,不予『放行』。
+        boolean expression = true;
+        Assert.isTrue(expression, "要求参数必须为真");
+        // 要求参数(List/Set)必须非空(Not Empty),否则抛出异常,不予放行
+        List<String> collection = null;
+        // Assert.notEmpty(collection,"要求参数List必须非空");
+        // 要求参数(String)必须有长度(即,Not Empty),否则抛出异常,不予放行
+        String text = "哈哈";
+        Assert.hasLength(text, "要求字符串必须有长度");
+        // 要求参数(String)必须有内容(即,Not Blank),否则抛出异常,不予放行
+        String msg = "非空字符串";
+        Assert.hasText(msg, "要求参数必有内容");
+        // 要求参数是指定类型的实例,否则抛出异常,不予放行
+        Object obj = "字符串";
+        Person p = new Person();
+        p.setAge(11);
+        Assert.isInstanceOf(Person.class, p, "要求参数是指定类型的实例");
+        // 要求参数 `subType` 必须是参数 superType 的子类或实现类,否则抛出异常,不予放行
+        //void isAssignable(Class superType, Class subType, String message)
+
+    }
+
+    //# 对象、数组、集合
+    @Test
+    public void testObjectUtils() {
+        Person p = new Person();
+        //获取对象的类名。参数为 null 时,返回字符串:"null"
+        String s = ObjectUtils.nullSafeClassName(null);
+        System.out.println(s);
+        // 参数为 null 时,返回 0
+        System.out.println(ObjectUtils.nullSafeHashCode("哈哈"));
+        // 参数为 null 时,返回字符串:"null"
+        // String nullSafeToString(boolean[] array);
+        // 获取对象 HashCode(十六进制形式字符串)。参数为 null 时,返回 0
+        //String getIdentityHexString(Object obj);
+        // 获取对象的类名和 HashCode。参数为 null 时,返回字符串:""
+        //String identityToString(Object obj);
+        // 相当于 toString()方法,但参数为 null 时,返回字符串:""
+        //String getDisplayString(Object obj);
+
+    }
+
+    @Test
+    public void getMapUtil() {
+       /* MapUtils<String, Object> stringObjectMapUtils = new MapUtils<>();
+        MapUtils<String, Object> put = stringObjectMapUtils.put("1", 1);
+        System.out.println(put);*/
+
+        //Integer integer = MapUtils.getInteger(map, "1");
+        // System.out.println(map);
+    }
+
+
+    // 两个集合合并 java8
+    @Test
+    public void getListAll() {
+        List<Help> list1 = new LinkedList<>();
+        list1.add(new Help().setUserId(1));
+        list1.add(new Help().setUserId(20));
+        list1.add(new Help().setUserId(4));
+        list1.add(new Help().setUserId(15));
+        List<Help> list2 = new LinkedList<>();
+        list2.add(new Help().setUserId(3));
+        list2.add(new Help().setUserId(7));
+        list2.add(new Help().setUserId(30));
+        list2.add(new Help().setUserId(10));
+        List<Help> list = new LinkedList<>();
+        Stream.of(list1, list2).forEach(list::addAll);
+        list.sort(Comparator.comparing(Help::getUserId));
+        System.out.println(list);
+
+    }
+
+    //  java 8  分组
+    @Test
+    public void groupBy() {
+        Order order1 = new Order();
+        order1.setOrderId("123");
+        order1.setGoodsId("S1");
+
+        Order order2 = new Order();
+        order2.setOrderId("123");
+        order2.setGoodsId("S2");
+
+        Order order3 = new Order();
+        order3.setOrderId("1234");
+        order3.setGoodsId("S3");
+
+        List<Order> list = new ArrayList();
+        list.add(order1);
+        list.add(order2);
+        list.add(order3);
+
+        Map<String, List<Order>> map = list.stream().collect(Collectors.groupingBy(ord -> ord.getOrderId()));
+        log.info("分组之后得到的结果是=={}", map);
+
+    }
+
+    //  Map 转list
+    @Test
+    public void convertMapToList() {
+        Map<String, String> map = new HashMap<>();
+        map.put("1", "AAAA");
+        map.put("2", "BBBB");
+        map.put("3", "CCCC");
+        map.put("4", "DDDD");
+        map.put("5", "EEEE");
+        List<Object> list = map.entrySet().stream().map(et -> et.getKey() + "_" + et.getValue()).collect(Collectors.toList());
+        list.forEach(obj -> System.out.println(obj));
+    }
+
+    @Test
+    public void getZoneTime() {
+        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("GMT+8"));
+        String dateTime = now.format(DateTimeFormatter.ofPattern("HH:mm").withZone(ZoneId.of("GMT+8")));
+        System.out.println(dateTime);
+
+        String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm"));
+        System.out.println(time);
+    }
+
+}
+
+class Order {
+    String orderId;
+    String goodsId;
+
+    public String getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(String orderId) {
+        this.orderId = orderId;
+    }
+
+    public String getGoodsId() {
+        return goodsId;
+    }
+
+    public void setGoodsId(String goodsId) {
+        this.goodsId = goodsId;
+    }
+
+    @Override
+    public String toString() {
+        return "Order{" +
+            "orderId='" + orderId + '\'' +
+            ", goodsId='" + goodsId + '\'' +
+            '}';
+    }
+
+
+    @Test
+    public void functionTest() {
+        VUtils.isTure(true).throwMessage("需要抛出异常");
+    }
+
+    @Test
+    public void isTrueOrFalse() {
+        VUtils.isTureOrFalse(true).trueOrFalseHandle(
+            () -> {
+                System.out.println("条件为真时输出");
+            },
+            () -> {
+                System.out.println("条件为假时处理异常");
+            }
+        );
+    }
+
+    @Test
+    void isBlankOrNoBlank() {
+        /*VUtils.isBlankOrNoBlank("hello")
+            .presentOrElseHandle(System.out::println,()->{
+                System.out.println("这是空字符串");
+            });*/
+        String s = "63.9G";
+        String g = s.split("G")[0];
+        System.out.println(g);
+
+    }
+
+
+    @Test
+    public void givenUsingTimer_whenSchedulingTaskOnce_thenCorrect() {
+        TimerTask task = new TimerTask() {
+            public void run() {
+                System.out.println("Task performed on: " + new Date() + "n" +
+                    "Thread's name: " + Thread.currentThread().getName());
+            }
+        };
+        Timer timer = new Timer("Timer");
+
+        long delay = 1000L;
+        timer.schedule(task, delay);
+    }
+
+
+    @Test
+    public void getMuly() {
+       /* BigDecimal b1 = new BigDecimal(50);
+        BigDecimal b2 = new BigDecimal(219);
+        // if (!Objects.equals(b2, BigDecimal.ZERO)) {
+            // 不能整除,数学上是无穷小数,抛出ArithmeticException异常
+            //BigDecimal b3 = b1.divide(b2);
+            // 指定计算结果的精度,保留到小数点后几位,以及舍入模式
+            BigDecimal b3 = b2.divide(b1, 4, BigDecimal.ROUND_HALF_UP);
+            System.out.println(b3);
+       // }*/
+        /*String percentFormat = getPercentFormat(2.0, 2, 2);
+        System.out.println(percentFormat);*/
+        String s = replaceBlank("jj\nkk");
+        System.out.println(s);
+
+    }
+
+    // double保留两位小数
+    public static String getPercentFormat(double date, int IntegerDigits, int FractionDigits) {
+        NumberFormat nf = java.text.NumberFormat.getPercentInstance();
+        nf.setMaximumIntegerDigits(IntegerDigits);//小数点前保留几位
+        nf.setMinimumFractionDigits(FractionDigits);// 小数点后保留几位
+        String str = nf.format(date);
+        return str;
+    }
+
+    public static String replaceBlank(String content) {
+        String dest = "";
+        if (content != null) {
+            //  过滤请求报文中的制表符及换行符等无关元素
+//			Pattern p = Pattern.compile("\\s*|\t|\r|\n");
+            Pattern p = Pattern.compile("\t|\r|\n");
+            Matcher m = p.matcher(content);
+            dest = m.replaceAll("");
+        }
+        BigDecimal decimal = new BigDecimal(1);
+        BigDecimal decima2 = new BigDecimal(3);
+        BigDecimal divide = decimal.divide(decima2, 4, BigDecimal.ROUND_HALF_UP);
+
+        String s1 = "2003-12-12 00:00:00";
+        String s2 = "2004-04-01 00:00:00";
+        int res = s1.compareTo(s2);
+
+
+        return dest;
+    }
+
+
+    @Test
+    public void splitTest() {
+        String str = "17DAAFD5F99C4DE39AD487993F6098EF,54501,斋堂,1154130E,395827N,null,null,,null,null,null,否,是,是,null";
+        String str1 = "4B8DA84E16A0441AB1824017FCED50BF,54421,上甸子,1170642E,403932N,null,null,,null,null,null,否,是,是,null";
+        List<String> list = Arrays.asList(str.split(","));
+        List<String> list1 = Arrays.asList(str1.split(","));
+        System.out.println(list);
+        System.out.println(list1);
+
+        String s = "20220602";
+        String substring = s.substring(0, 4);
+        System.out.println(substring);
+
+    }
+
+    //获取当前天气信息
+    @Test
+    public void getWeather() {
+        String httpRequest = HttpRequest.get("http://wthrcdn.etouch.cn/weather_mini?city=%E5%8C%97%E4%BA%AC").execute().body();
+        System.out.println(httpRequest);
+
+    }
+
+    // java8  根据某个字段属性进行去重
+    @Test
+    public void personDistinct() {
+       /* boolean b = compareTime("09:00:00", "18:00:00");
+        System.out.println(b);*/
+        List<Person> pr = new ArrayList<>();
+        Person p1 = new Person();
+        Person p2 = new Person();
+        Person p3 = new Person();
+        Person p4 = new Person();
+        p1.setName("李二").setAge(15).setId(1L);
+        p2.setName("张三").setAge(16).setId(2L);
+        p3.setName("赵四").setAge(17).setId(3L);
+        p4.setName("王五").setAge(18).setId(4L);
+        pr.add(p1);
+        pr.add(p2);
+        pr.add(p3);
+        pr.add(p4);
+
+        //  根据name和age 进行去重
+        ArrayList<Person> collect = pr.stream()
+            .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getName() + f.getAge()))), ArrayList::new));
+        // System.out.println(collect);
+
+        Map<Integer, Integer> map = new HashMap<>();
+        for (int i = 0; i < pr.size(); i++) {
+            int sum = pr.stream().limit(i + 1).mapToInt(Person::getAge).sum();
+            map.put(i, sum);
+
+        }
+        System.out.println(map);
+
+    }
+
+    @Test
+    public void randomTest() {
+        //打印 70到80之间的随机数
+        int min = 70;
+        int max = 90;
+        Random random = new Random();
+        // random.nextInt(10) 返回0 - 10 之间的伪随机数 [0 - 10 ),包括0  不包括10
+        // 最小值:(80 - 70) + 70 = 0 + 70 = 70
+        // 最大值:(80 - 70) + 70 = 9 + 70 = 79
+        System.out.println(random.nextInt(max - min) + min + Math.random());
+        double v = random.nextInt(max - min) + min + Math.random();
+        String format = String.format("%.2f", v);
+        System.out.println(format);
+    }
+
+
+    @Test
+    public void itor() {
+        Map<Integer, String> map = new HashMap<>();
+        map.put(1, "美好的周一");
+        map.put(2, "美好的周二");
+        map.put(3, "美好的周三");
+
+        Set<Map.Entry<Integer, String>> entries = map.entrySet();
+        for (Map.Entry entry : entries) {
+            System.out.println("key:" + entry.getKey() + " "
+                + "value:" + entry.getValue());
+        }
+
+    }
+
+    static int j;
+
+    public static class Mythread2 extends Thread {
+
+
+        public Mythread2(int i) {
+            j = i;
+        }
+
+        @Override
+        public void run() {
+            for (int i = 0; i < 100; i++) {
+                j++;
+            }
+            System.out.println(j);
+        }
+    }
+
+    public static void main(String[] args) {
+        int i = 0;
+        Mythread2 mythread2 = new Mythread2(i);
+        Mythread2 mythread3 = new Mythread2(i);
+        mythread2.start();
+        mythread3.start();
+    }
+
+    // ArrayList使用中出现的坑
+    @Test
+    private static void asListAdd() {
+        String[] arr = {"1", "2", "3"};
+        List<String> strings = new ArrayList<>(Arrays.asList(arr));
+        arr[2] = "4";
+        System.out.println(strings.toString());
+        Iterator<String> iterator = strings.iterator();
+        while (iterator.hasNext()) {
+            if ("4".equals(iterator.next())) {
+                iterator.remove();
+            }
+        }
+        strings.forEach(val -> {
+            strings.remove("4");
+            strings.add("3");
+        });
+        System.out.println(Arrays.asList(arr).toString());
+    }
+
+    //
+
+    /**
+     * 字符串转换成时区化的时间对象
+     *
+     * @return
+     */
+
+    @Test
+    public void parseZonedDateStr() {
+        ZonedDateTime zonedDateTime = parseZonedDate("2022-02-10 00:10:00");
+        System.out.println(zonedDateTime);
+    }
+
+    public static ZonedDateTime parseZonedDate(String dateTimeStr) {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
+        if (dateTimeStr.length() == 10) {
+            dateTimeStr += " 00:00:00.0";
+        } else if (dateTimeStr.length() == 19) {
+            dateTimeStr += ".0";
+        }
+        ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateTimeStr, formatter.withZone(ZoneId.systemDefault()));
+
+        return zonedDateTime;
+
+    }
+
+
+    public static List<String> getExecutionTimeByNum(String cronStr, Integer num) {
+        CronParser parser = new CronParser(CronDefinitionBuilder.instanceDefinitionFor(CronType.SPRING));
+        Cron cron = parser.parse(cronStr);
+        ExecutionTime time = ExecutionTime.forCron(cron);
+        ZonedDateTime now = ZonedDateTime.now();
+        ZonedDateTime next = getNext(time, now);
+        List<ZonedDateTime> timeList = new ArrayList<>(num);
+        timeList.add(next);
+        for (int i = 1; i < num; i++) {
+            next = getNext(time, next);
+            timeList.add(next);
+        }
+        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        List<String> resultList = new ArrayList<>(num);
+        for (ZonedDateTime item : timeList) {
+            String result = item.format(format);
+            resultList.add(result);
+        }
+        return resultList;
+    }
+
+    private static ZonedDateTime getNext(ExecutionTime time, ZonedDateTime current) {
+        return time.nextExecution(current).get();
+    }
+
+    @Data
+    public static class CustomCronField {
+        private List<Integer> minutes;
+        private List<Integer> hours;
+        private List<Integer> weekdays;
+    }
+
+    //  获取cron未来10次  运行的时间
+    @Test
+    public void getTimes() {
+        List<String> executionTimeByNum = getExecutionTimeByNum("0 0/1 * * * ?", 10);
+        System.out.println(executionTimeByNum);
+    }
+
+    //  Java解析Cron表达式
+    @Test
+    public void getExecuteTime() {
+        String cron = "";
+        int size = 10;
+        // 每月1号执行
+        cron = "0 0 5,9,11,14,17,20,23 * * ?";
+        CronSequenceGenerator g = new CronSequenceGenerator(cron);
+        Date d = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        List<String> res = new ArrayList<>(size);
+        for (int i = 0; i < size; i++) {
+            d = g.next(d);
+            res.add(sdf.format(d));
+        }
+        res.forEach(System.out::println);
+        String ss = "2023-01-06 10:00";
+        String s = ss.substring(0, 10) + " 00:00";
+        System.out.println(ZonedDateTime.from(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
+            .withZone(ZoneId.of("GMT+8")).parse(s)));
+    }
+
+    @Test
+    public void checkTime() {
+        String dataTimeStr = "2023-01-07 10:00:00";
+        String dataTime = "2023-01-07 10:30:00";
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        String befDateTime = ""; //TimeUtil.computeDateTime(dataTimeStr,-1);
+        String endDateTime = ""; //TimeUtil.computeDateTime(dataTimeStr,1);
+
+        LocalDateTime startLocalDateTime = LocalDateTime.parse(befDateTime, df);
+        LocalDateTime endLocalDateTime = LocalDateTime.parse(endDateTime, df);
+        LocalDateTime localdataTime = LocalDateTime.parse(dataTime, df);
+        if (startLocalDateTime.isBefore(localdataTime) && endLocalDateTime.isAfter(localdataTime)) {
+            System.out.println("在时间范围内");
+        }
+        System.out.println("不在时间范围内");
+    }
+
+    @Test
+    public void subStr() {
+        String dataTimeStr = "2023-01-07 10:00:00";
+        String substring = dataTimeStr.substring(14, 19);
+        String currentDate = dataTimeStr.substring(0, 10);
+        String currentDate1 = dataTimeStr.substring(11,19);
+        String currentDate2 = dataTimeStr.substring(0,19);
+        System.out.println(substring);
+    }
+
+    /**
+     * 获取下一个分钟值以0或者5结尾的时间点(单位:毫秒)
+     *
+     * @return
+     */
+    @Test
+    public void getNextMillisEndWithMinute0or5() {
+
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date());
+        int minute = 58;
+        if (minute < 55) {
+            //  如果是获取下一个整5分钟  add的值这样计算
+            int add = minute % 10 < 5 ? 5 - minute % 10 : 10 - minute % 10;
+            //int add = minute % 10 <= 5 ? minute % 10:  minute % 10-5;
+            calendar.add(Calendar.MINUTE, -add);
+            calendar.set(Calendar.SECOND, 0);
+            calendar.set(Calendar.MILLISECOND, 0);
+            System.out.println(calendar.getTime());
+        }
+        // 当前时间+1小时
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        Date endTime = DateUtils.addHours(calendar.getTime(), 1);
+        System.out.println(endTime);
+
+    }
+
+    /**
+     * 获取下一个分钟值以0或者5结尾的时间点(单位:毫秒)
+     *
+     * @return
+     */
+    @Test
+    public void getLastMillisEndWithMinute0or5() {
+
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date());
+        int minute = calendar.get(Calendar.MINUTE);
+        //  如果是获取下一个整5分钟  add的值这样计算
+        int add = minute % 10 <= 5 ? minute % 10:  minute % 10-5;
+        calendar.add(Calendar.MINUTE, -add);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        System.out.println(calendar.getTime());
+
+
+    }
+
+    @Test
+    public void  sortMap(){
+
+            Map<String, Integer> unsortMap = new HashMap<>();
+
+            unsortMap.put("02:00", 10);
+            unsortMap.put("06:00", 5);
+            unsortMap.put("01:00", 6);
+            unsortMap.put("02:00", 20);
+
+
+        Map result = unsortMap.entrySet().stream()
+            .sorted(Map.Entry.comparingByKey())
+            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
+                (oldValue, newValue) -> oldValue, LinkedHashMap::new));
+        System.out.println(result.toString());
+
+    }
+
+
+    @Test
+    public void testStr(){
+        Map<Object, Object> objectObjectMap = Collections.synchronizedMap(new HashMap());
+        String  s="1";
+        s+=s;
+        System.out.println(s);
+    }
+
+    @Test
+    public void testBigdecimal(){
+        BigDecimal b1 = new BigDecimal("0.1");
+        BigDecimal b2 = BigDecimal.valueOf(0.1);
+        System.out.println(b1);// 打印:0.1
+        System.out.println(b2);// 打印:0.1000000000000000055511151231257827021181583404541015625
+        System.out.println(b1.compareTo(b2));// -1,说明b1小于b2
+
+    }
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/CronUtil.java b/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/CronUtil.java
new file mode 100644
index 000000000..cd511da5f
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/CronUtil.java
@@ -0,0 +1,142 @@
+package com.example.awaysuse;
+
+import com.cronutils.model.CronType;
+import com.cronutils.model.definition.CronDefinition;
+import com.cronutils.model.definition.CronDefinitionBuilder;
+import com.cronutils.parser.CronParser;
+import com.google.common.collect.Lists;
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+public class CronUtil {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(CronUtil.class);
+
+    private static final String QUESTION = "?";
+
+    private static final String ASTERISK = "*";
+
+    private static final String COMMA = ",";
+
+    /**
+     * 替换 分钟、小时、日期、星期
+     */
+    private static final String ORIGINAL_CRON = "0 %s %s %s * %s";
+
+    /**
+     * 检查cron表达式的合法性
+     *
+     * @param cron cron exp
+     * @return true if valid
+     */
+    public boolean checkValid(String cron) {
+        try {
+            // SPRING应该是使用最广泛的类型,但假若任务调度依赖于xxl-job平台,则需要调整为CronType.QUARTZ
+            CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(CronType.SPRING);
+            CronParser parser = new CronParser(cronDefinition);
+            parser.parse(cron);
+        } catch (IllegalArgumentException e) {
+            LOGGER.error(String.format("cron=%s not valid", cron));
+            return false;
+        }
+        return true;
+    }
+
+    public String buildCron(List<Integer> minutes, List<Integer> hours, List<Integer> weekdays) {
+        String minute;
+        if (minutes.equals(this.getInitMinutes())) {
+            minute = ASTERISK;
+        } else {
+            minute = StringUtils.join(minutes, COMMA);
+        }
+        String hour;
+        if (hours.equals(this.getInitHours())) {
+            hour = ASTERISK;
+        } else {
+            hour = StringUtils.join(hours, COMMA);
+        }
+        String weekday;
+        if (weekdays.equals(this.getInitWeekdays())) {
+            weekday = QUESTION;
+        } else {
+            weekday = StringUtils.join(weekdays, COMMA);
+        }
+        // 重点:星期和日字段冲突,判断周日的前端输入
+        if (weekday.equals(QUESTION)) {
+            return String.format(ORIGINAL_CRON, minute, hour, ASTERISK, weekday);
+        } else {
+            return String.format(ORIGINAL_CRON, minute, hour, QUESTION, weekday);
+        }
+    }
+
+    /**
+     * 解析db cron expression展示到前端
+     *
+     * @param cron cron
+     * @return minutes/hours/weekdays
+     */
+    public CustomCronField parseCon(String cron) {
+        if (!this.checkValid(cron)) {
+            return null;
+        }
+        List<String> result = Arrays.asList(cron.trim().split(" "));
+        CustomCronField field = new CustomCronField();
+        if (result.get(1).contains(COMMA)) {
+            field.setMinutes(Arrays.stream(result.get(1).split(COMMA)).map(Integer::parseInt).collect(Collectors.toList()));
+        } else if (result.get(1).equals(ASTERISK)) {
+            field.setMinutes(this.getInitMinutes());
+        } else {
+            field.setMinutes(Lists.newArrayList(Integer.parseInt(result.get(1))));
+        }
+        if (result.get(2).contains(COMMA)) {
+            field.setHours(Arrays.stream(result.get(2).split(COMMA)).map(Integer::parseInt).collect(Collectors.toList()));
+        } else if (result.get(2).equals(ASTERISK)) {
+            field.setHours(this.getInitHours());
+        } else {
+            field.setHours(Lists.newArrayList(Integer.parseInt(result.get(2))));
+        }
+        if (result.get(5).contains(COMMA)) {
+            field.setWeekdays(Arrays.stream(result.get(5).split(COMMA)).map(Integer::parseInt).collect(Collectors.toList()));
+        } else if (result.get(5).equals(QUESTION)) {
+            field.setWeekdays(this.getInitWeekdays());
+        } else {
+            field.setWeekdays(Lists.newArrayList(Integer.parseInt(result.get(5))));
+        }
+        return field;
+    }
+
+    private List<Integer> initArray(Integer num) {
+        List<Integer> result = Lists.newArrayListWithCapacity(num);
+        for (int i = 0; i <= num; i++) {
+            result.add(i);
+        }
+        return result;
+    }
+
+    private List<Integer> getInitMinutes() {
+        return this.initArray(59);
+    }
+
+    private List<Integer> getInitHours() {
+        return this.initArray(23);
+    }
+
+    private List<Integer> getInitWeekdays() {
+        return this.initArray(7).subList(1, 8);
+    }
+
+    @Data
+    public static class CustomCronField {
+        private List<Integer> minutes;
+        private List<Integer> hours;
+        private List<Integer> weekdays;
+    }
+}
diff --git a/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/HutoolDateUtil.java b/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/HutoolDateUtil.java
new file mode 100644
index 000000000..db37c4ac1
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/HutoolDateUtil.java
@@ -0,0 +1,24 @@
+package com.example.awaysuse;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class HutoolDateUtil {
+
+    @Test
+    public void getCurrentTime() {
+        DateTime date = DateUtil.date();
+        Assert.assertNotNull("当前时间:" + date);
+        String dateStr = date.toString();
+        Assert.assertNotNull("当前时间格式化:" + date);
+
+
+    }
+}
diff --git a/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/PatternTest.java b/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/PatternTest.java
new file mode 100644
index 000000000..007904eb0
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/PatternTest.java
@@ -0,0 +1,351 @@
+package com.example.awaysuse;
+
+import com.example.awaysuse.model.ReportTimeLimit;
+import org.apache.commons.lang3.time.DateUtils;
+import org.junit.jupiter.api.Test;
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.file.attribute.AclEntry;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+
+public class PatternTest {
+    public static void main(String[] args) throws Exception {
+        // 在本地创建一个.txt文件
+      /*  File file = new File("D://rz.txt");
+        // 链接到需要提取内容的网页
+        URL url = new URL("http://tieba.baidu.com");
+        // 打开连接
+        URLConnection conn = url.openConnection();
+        // 设置连接网络超时时间
+        conn.setConnectTimeout(1000 * 10);
+        // 读取指定网络地址中的文件 (输入缓冲流)
+        BufferedReader bufr = new BufferedReader(new InputStreamReader(conn.getInputStream()));
+        // 将内容保存到text.txt文件中(输出缓冲流)
+        Writer wt = new FileWriter(file, true);
+        // 将字符流包装成缓冲流
+        PrintWriter pw = new PrintWriter(wt, true);
+
+        String line = null;
+        // 匹配email的正则
+        String regex = "\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}";
+        Pattern p = Pattern.compile(regex);
+        while ((line = bufr.readLine()) != null) {
+            Matcher m = p.matcher(line);
+            while (m.find()) {
+                // 写入到文件
+                pw.write(m.group());
+                // 获得匹配的email
+                System.out.println(m.group());
+            }
+        }
+        // 刷新输出流
+        pw.flush();
+        // 先关闭输出流
+        pw.close();
+        // 关闭输入流
+        bufr.close();
+
+    }*/
+
+        LinkedHashMap map = new LinkedHashMap();
+        map.put("1", 12);
+        map.put("2", 3);
+        map.put(435, 14);
+        map.put("4", 12);
+        map.entrySet().stream().forEach(m -> {
+            System.out.println(m);
+        });
+
+
+        String content = "";
+        try {
+            URL url = new URL("https://tieba.baidu.com/p/4529628420?red_tag=0588423095");
+            //打开连接
+            URLConnection conn = url.openConnection();
+            //打开输入流
+            InputStream is = conn.getInputStream();
+            ByteArrayOutputStream outStream = new ByteArrayOutputStream();//用于保存读取的数据
+            //创建字节流--用于一次读取的长度
+            byte[] bs = new byte[1024];
+            int len;//读取长度
+            //写数据
+            while ((len = is.read(bs)) != -1) {
+                outStream.write(bs, 0, len);//将数据写入到数据流缓存outStream中
+            }
+            byte[] bb = outStream.toByteArray();//获取写入的流数据--字节流
+            content = new String(bb);//将字节流数据转化为字符串数据
+            // 匹配email的正则
+            String regex = "\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}";
+            BufferedReader bufr = new BufferedReader(new InputStreamReader(conn.getInputStream()));
+            Pattern p = Pattern.compile(regex);
+            // 将内容保存到text.txt文件中(输出缓冲流)
+            File file = new File("D://rz.txt");
+            Writer wt = new FileWriter(file, true);
+            // 将字符流包装成缓冲流
+            PrintWriter pw = new PrintWriter(wt, true);
+            String line = null;
+
+            Matcher m = p.matcher(content);
+            while (m.find()) {
+                // 写入到文件
+                pw.write(m.group());
+                // 获得匹配的email
+                System.out.println(m.group());
+            }
+
+            System.out.println(content);
+            is.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //java8 获取当天的开始时间和结束时间
+    @Test
+    public void getLocalTime() {
+        //当天开始时间结束时间
+        LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
+        String todayStartStr = todayStart.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        System.out.println(todayStartStr);
+        LocalDateTime todayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
+        String todayEndStr = todayEnd.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        System.out.println(todayEndStr);
+        LocalDateTime now = LocalDateTime.now();
+        LocalDate nowDate = LocalDate.now();
+        String nowStr = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        System.out.println(nowStr);
+        LocalDateTime plusHours = now.plusHours(-1);
+        String plusHoursStr = plusHours.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        System.out.println(plusHoursStr);
+
+        String ss = "张三";
+        String[] split = ss.split(",");
+        Arrays.stream(split).forEach(
+            a -> {
+                System.out.println(a);
+            }
+        );
+    }
+
+
+    @Test
+    public void getTest() {
+
+        ReportTimeLimit res = new ReportTimeLimit();
+        long l = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
+        // res.currentLower = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).atStartOfDay().toEpochSecond(ZoneOffset.of("+8"));
+
+        // res.yoyUpper = LocalDateTime.now().minusYears(1L).toEpochSecond(ZoneOffset.of("+8"));
+        //res.yoyLower = LocalDate.now().minusYears(1L).with(TemporalAdjusters.firstDayOfMonth()).atStartOfDay().toEpochSecond(ZoneOffset.of("+8"));
+
+        //res.momUpper = LocalDateTime.now().minusMonths(1L).toEpochSecond(ZoneOffset.of("+8"));
+        //res.momLower = LocalDate.now().minusMonths(1L).with(TemporalAdjusters.firstDayOfMonth()).atStartOfDay().toEpochSecond(ZoneOffset.of("+8"));
+        System.out.println(l);
+
+    }
+
+    // 去当天的小时 分割时间
+    @Test
+    public void xDataLine() {
+        long interval = 1l;
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH");
+        LocalTime max = LocalTime.now();
+        long between = ChronoUnit.HOURS.between(LocalTime.MIN, LocalTime.now());
+        long divide = between / interval;
+        List<LocalTime> list = Stream.iterate(LocalTime.MIN, seed -> seed.plusHours(interval))
+            .limit(divide + 1).collect(Collectors.toList());
+        for (int i = 0; i < list.size(); i++) {
+            String format = dtf.format(list.get(i));
+        }
+        System.out.println(list.stream().sorted().collect(Collectors.toList()));
+    }
+
+    @Test
+    public void getRanddouble() {
+        //产生随机数
+        double d = 70 + Math.random() * 100 % (100 - 70 + 1);
+        StringBuilder sb = new StringBuilder();
+        sb.append(d);
+        sb.substring(0, 4);
+        String div = sb.substring(0, 5);
+
+    }
+
+    @Test
+    public void zhengze() {
+        String content = "00时";
+        //正则表达式,用于匹配非数字串,+号用于匹配出多个非数字串
+        String regEx = "[^0-9]+";
+        Pattern pattern = Pattern.compile(regEx);
+        //用定义好的正则表达式拆分字符串,把字符串中的数字留出来
+        String[] cs = pattern.split(content);
+        System.out.println(Arrays.toString(cs));
+    }
+
+    //
+    @Test
+    public void UTCToCST() {
+
+        try {
+            UTCToCST("2022-07-01T18:06:48Z", "yyyy-MM-dd'T'HH:mm:ss'Z'");
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+            Date date = localToUTC("2022-08-26 15:30:00");
+            String format = sdf.format(date);
+            System.out.println(format);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void UTCToCST(String UTCStr, String format) throws ParseException {
+        Date date = null;
+        SimpleDateFormat sdf = new SimpleDateFormat(format);
+        date = sdf.parse(UTCStr);
+        System.out.println("UTC时间: " + date);
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.set(Calendar.HOUR, calendar.get(Calendar.HOUR) + 8);
+        //calendar.getTime() 返回的是Date类型,也可以使用calendar.getTimeInMillis()获取时间戳
+        System.out.println("北京时间: " + calendar.getTime());
+    }
+
+
+    //  北京时间转UTC
+    public static Date localToUTC(String localTime) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date localDate = null;
+        try {
+            localDate = sdf.parse(localTime);
+
+        } catch (ParseException e) {
+            e.printStackTrace();
+
+        }
+        long localTimeInMillis = localDate.getTime();
+           /** long时间转换成Calendar */
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeInMillis(localTimeInMillis);
+        /** 取得时间偏移量 */
+        int zoneOffset = calendar.get(java.util.Calendar.ZONE_OFFSET);
+        /** 取得夏令时差 */
+        int dstOffset = calendar.get(java.util.Calendar.DST_OFFSET);
+        /** 从本地时间里扣除这些差量,即可以取得UTC时间*/
+        calendar.add(java.util.Calendar.MILLISECOND, -(zoneOffset + dstOffset));
+        /** 取得的时间就是UTC标准时间 */
+        Date utcDate = new Date(calendar.getTimeInMillis());
+        return utcDate;
+    }
+
+
+    @Test
+    public void getBetweenList(){
+        String  startTime="2022-12-20 00:00:00";
+        String  endTime="2022-12-23 10:00:00";
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        // 声明保存日期集合
+        List<String> list = new ArrayList<String>();
+        try {
+            // 转化成日期类型
+            Date startDate = sdf.parse(startTime);
+            Date endDate = sdf.parse(endTime);
+
+            //用Calendar 进行日期比较判断
+            Calendar calendar = Calendar.getInstance();
+            while (startDate.getTime() <= endDate.getTime()) {
+                // 把日期添加到集合
+                list.add(sdf.format(startDate));
+                // 设置日期
+                calendar.setTime(startDate);
+                //把日期增加一天
+                calendar.add(Calendar.DATE, 1);
+                // 获取增加后的日期
+                startDate = calendar.getTime();
+            }
+            list.forEach(System.out::println);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+
+
+    /***
+     * @decription
+
+     * 输入时间格式为:yyyy-MM-dd hh:mm:ss
+
+     * @param time1 报警开始时间
+
+     * @param time2 报警结束时间
+
+     * @return  时间差(秒)
+
+     */
+
+    @Test
+    public void diffTime(){
+        String time1="2022-12-23 13:39:18 10";
+        String time2="2022-12-23 13:39:18 999";
+        Date date1 = StrToDate(time1);
+        Date date2 = StrToDate(time2);
+        Duration between = Duration.between(date1.toInstant(), date2.toInstant());
+        System.out.println(between.toMillis() );
+
+    }
+
+    @Test
+    public void testChengfa(){
+        Integer a=1000;
+        System.out.println(3*0.1);
+        System.out.println(1*0.3);
+    }
+
+    /**
+
+     * 字符串转换成日期
+
+     * @param str
+
+     * @return date
+
+     */
+
+    public static Date StrToDate(String str) {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
+        Date date = null;
+        try {
+            date = format.parse(str);
+
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return date;
+    }
+
+
+    public static long diffTime(String time1,String time2){
+        Date date1 = StrToDate(time1);
+        Date date2 = StrToDate(time2);
+        Duration between = Duration.between(date1.toInstant(), date2.toInstant());
+        return (between.toMillis());
+    }
+
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/entity/Policy.java b/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/entity/Policy.java
new file mode 100644
index 000000000..403dd00e3
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/entity/Policy.java
@@ -0,0 +1,12 @@
+package com.example.awaysuse.entity;
+
+import lombok.Data;
+
+@Data
+public class Policy {
+    private Integer id;
+    private String name;
+    private String describe;
+    private double matchdgree;
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/entity/User.java b/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/entity/User.java
new file mode 100644
index 000000000..31f1c9902
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/entity/User.java
@@ -0,0 +1,41 @@
+package com.example.awaysuse.entity;
+
+import java.util.HashSet;
+import java.util.Objects;
+
+public class User {
+
+    private String name;
+    private Integer age;
+
+    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;
+    }
+
+    //  重写hashcode和equals方法
+    @Override
+    public boolean equals(Object obj) {
+        User user = (User) obj;
+        return user.getName().equals(this.name);
+    }
+
+    @Override
+    public int hashCode() {
+        return name.hashCode();
+    }
+
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/test/SecondWord.java b/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/test/SecondWord.java
new file mode 100644
index 000000000..48eaa6285
--- /dev/null
+++ b/spring-boot-demo-alwaysuse/src/test/java/com/example/awaysuse/test/SecondWord.java
@@ -0,0 +1,22 @@
+package com.example.awaysuse.test;
+import com.hankcs.hanlp.HanLP;
+import org.junit.Test;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SecondWord {
+
+    @Test
+    public  void  segment() {
+        String text="电网公平开放监管办法";
+        List<String> collect = HanLP.segment(text)
+            .stream()
+            .map(term -> term.word)
+            .collect(Collectors.toList());
+
+        collect.stream().forEach(System.out::println);
+    }
+
+
+ }
diff --git a/spring-boot-demo-async/src/test/java/com/xkcoding/async/task/ThreeDemo3.java b/spring-boot-demo-async/src/test/java/com/xkcoding/async/task/ThreeDemo3.java
new file mode 100644
index 000000000..bae6a7c9b
--- /dev/null
+++ b/spring-boot-demo-async/src/test/java/com/xkcoding/async/task/ThreeDemo3.java
@@ -0,0 +1,45 @@
+package com.xkcoding.async.task;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.FutureTask;
+
+public class ThreeDemo3 {
+
+    public static void main(String[] args) {
+        // 创建任务对象
+        Callable   callable=new MyCallAble(10);
+        // 把任务对象交给线程对象处理
+        FutureTask<String> futureTask=new FutureTask<>(callable);
+        Thread t1 = new Thread(futureTask);
+        t1.start();
+
+        try {
+            String s = futureTask.get();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        } catch (ExecutionException e) {
+            e.printStackTrace();
+        }
+
+
+    }
+}
+
+
+class MyCallAble implements Callable<String>{
+    private int n;
+
+    public MyCallAble(int n) {
+        this.n = n;
+    }
+
+    @Override
+    public String call() throws Exception {
+        int sum=0;
+        for (int i = 0; i < n; i++) {
+            sum+=i;
+        }
+        return "累加之后的值是"+sum;
+    }
+}
diff --git a/spring-boot-demo-component/pom.xml b/spring-boot-demo-component/pom.xml
new file mode 100644
index 000000000..f94242e0a
--- /dev/null
+++ b/spring-boot-demo-component/pom.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-parent</artifactId>
+    <version>2.3.11.RELEASE</version>
+    <relativePath/> <!-- lookup parent from repository -->
+  </parent>
+  <groupId>com.xkcoding.component</groupId>
+  <artifactId>springbootcomponent</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <name>springbootcomponent</name>
+  <description>Demo project for Spring Boot</description>
+  <properties>
+    <java.version>1.8</java.version>
+  </properties>
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+      <exclusions>
+        <exclusion>
+          <groupId>org.junit.vintage</groupId>
+          <artifactId>junit-vintage-engine</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/spring-boot-demo-component/src/main/java/com/xkcoding/component/SpringbootcomponentApplication.java b/spring-boot-demo-component/src/main/java/com/xkcoding/component/SpringbootcomponentApplication.java
new file mode 100644
index 000000000..397bc519c
--- /dev/null
+++ b/spring-boot-demo-component/src/main/java/com/xkcoding/component/SpringbootcomponentApplication.java
@@ -0,0 +1,15 @@
+package com.xkcoding.component;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletComponentScan;
+
+@SpringBootApplication
+@ServletComponentScan("com.xkcoding.component.filters")
+public class SpringbootcomponentApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SpringbootcomponentApplication.class, args);
+    }
+
+}
diff --git a/spring-boot-demo-component/src/main/java/com/xkcoding/component/config/WebMvcConfig.java b/spring-boot-demo-component/src/main/java/com/xkcoding/component/config/WebMvcConfig.java
new file mode 100644
index 000000000..47fe1afdf
--- /dev/null
+++ b/spring-boot-demo-component/src/main/java/com/xkcoding/component/config/WebMvcConfig.java
@@ -0,0 +1,28 @@
+package com.xkcoding.component.config;
+
+
+import com.xkcoding.component.filters.MyInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+        @Override
+        public void addInterceptors(InterceptorRegistry registry) {
+            registry.addInterceptor(myInterceptor()) //指定拦截器类
+                .addPathPatterns("/**") // /** 代表拦截所有请求
+                .excludePathPatterns("/login"); // 添加不拦截的请求
+        }
+        //配置bean
+        @Bean
+        MyInterceptor myInterceptor() {
+            return new MyInterceptor();
+        }
+
+
+
+}
diff --git a/spring-boot-demo-component/src/main/java/com/xkcoding/component/controller/CommonFilterController.java b/spring-boot-demo-component/src/main/java/com/xkcoding/component/controller/CommonFilterController.java
new file mode 100644
index 000000000..6db8e9677
--- /dev/null
+++ b/spring-boot-demo-component/src/main/java/com/xkcoding/component/controller/CommonFilterController.java
@@ -0,0 +1,21 @@
+package com.xkcoding.component.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/staff/info/")
+public class CommonFilterController {
+
+    @RequestMapping("getTest")
+    public String getTest(){
+        return  "过滤";
+    }
+
+    @RequestMapping("/fq")
+    public String fq(){
+        return  "放行";
+    }
+
+}
diff --git a/spring-boot-demo-component/src/main/java/com/xkcoding/component/controller/InterceptorController.java b/spring-boot-demo-component/src/main/java/com/xkcoding/component/controller/InterceptorController.java
new file mode 100644
index 000000000..65112f97d
--- /dev/null
+++ b/spring-boot-demo-component/src/main/java/com/xkcoding/component/controller/InterceptorController.java
@@ -0,0 +1,24 @@
+package com.xkcoding.component.controller;
+
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class InterceptorController {
+
+        //该方法会被拦截
+        @GetMapping("/get")
+        public String get() {
+            System.out.println("进入get方法");
+            return "hello Spinrg Boot==>get";
+        }
+        //该方法会被放行
+        @GetMapping("/login")
+        public String login() {
+            System.out.println("进入login方法");
+            return "hello Spinrg Boot==>login";
+        }
+
+
+}
diff --git a/spring-boot-demo-component/src/main/java/com/xkcoding/component/filters/AnoContextListener.java b/spring-boot-demo-component/src/main/java/com/xkcoding/component/filters/AnoContextListener.java
new file mode 100644
index 000000000..4409dfdf4
--- /dev/null
+++ b/spring-boot-demo-component/src/main/java/com/xkcoding/component/filters/AnoContextListener.java
@@ -0,0 +1,18 @@
+package com.xkcoding.component.filters;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.annotation.WebListener;
+
+@WebListener
+public class AnoContextListener implements ServletContextListener {
+    @Override
+    public void contextInitialized(ServletContextEvent sce) {
+        System.out.println("@WebListener context 初始化");
+    }
+
+    @Override
+    public void contextDestroyed(ServletContextEvent sce) {
+        System.out.println("@WebListener context 销毁");
+    }
+}
diff --git a/spring-boot-demo-component/src/main/java/com/xkcoding/component/filters/CommonFilterAnnotation.java b/spring-boot-demo-component/src/main/java/com/xkcoding/component/filters/CommonFilterAnnotation.java
new file mode 100644
index 000000000..cda035af4
--- /dev/null
+++ b/spring-boot-demo-component/src/main/java/com/xkcoding/component/filters/CommonFilterAnnotation.java
@@ -0,0 +1,67 @@
+package com.xkcoding.component.filters;
+
+import javax.servlet.*;
+import javax.servlet.annotation.WebFilter;
+import java.io.IOException;
+
+import javax.servlet.*;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+// 过滤器  定义filterName和过滤的url
+@WebFilter(filterName = "myFilter" ,urlPatterns = "/staff/info/*")
+public class CommonFilterAnnotation implements Filter {
+    /**
+     * filter对象只会创建一次,init方法也只会执行一次。
+     * @param filterConfig
+     * @throws ServletException
+     */
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+        System.out.println("CommonFilterAnnotation初始化完成....");
+    }
+    /**
+     * 主要的业务代码编写方法
+     * @param servletRequest
+     * @param servletResponse
+     * @param filterChain
+     * @throws IOException
+     * @throws ServletException
+     */
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+        throws IOException, ServletException {
+        System.out.println("啦啦啦");
+        //获取session中保存的对象
+        HttpServletRequest req = (HttpServletRequest) request;
+        HttpServletResponse resp = (HttpServletResponse) response;
+
+        //获取请求路径
+        String servletPath = req.getServletPath();
+        System.out.println( "servletPath = " + servletPath );
+
+        if (servletPath.equals( "/staff/info/upload" )){
+            String path = "/staff/info/fq";
+            //改变前端请求的后端路径为path
+            req.getRequestDispatcher(path).forward(req,resp);
+            //放行
+           // chain.doFilter(req,resp);
+           // return;
+
+        }
+        //放行请求
+        else {
+            chain.doFilter(request,response);
+        }
+
+    }
+    /**
+     * 在销毁Filter时自动调用。
+     */
+    @Override
+    public void destroy() {
+        Filter.super.destroy();
+    }
+}
diff --git a/spring-boot-demo-component/src/main/java/com/xkcoding/component/filters/MyInterceptor.java b/spring-boot-demo-component/src/main/java/com/xkcoding/component/filters/MyInterceptor.java
new file mode 100644
index 000000000..eafbdb5e3
--- /dev/null
+++ b/spring-boot-demo-component/src/main/java/com/xkcoding/component/filters/MyInterceptor.java
@@ -0,0 +1,37 @@
+package com.xkcoding.component.filters;
+
+import java.lang.reflect.Method;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+public class MyInterceptor implements HandlerInterceptor{
+
+    /**
+     * 目标方法执行前
+     */
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        HandlerMethod handlerMethod = (HandlerMethod) handler;
+        Method method = handlerMethod.getMethod();
+        String methodName = method.getName();
+        System.out.println("====拦截到了方法:" + methodName + ",在该方法执行之前执行====");
+        // 返回 true 才会继续执行,返回 false 则取消当前请求
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+        System.out.println("执行完方法之后进执行(Controller方法调用之后),但是此时还没进行视图渲染");
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+        System.out.println("整个请求都处理完咯");
+    }
+
+}
diff --git a/spring-boot-demo-component/src/test/java/com/xkcoding/component/SpringbootcomponentApplicationTests.java b/spring-boot-demo-component/src/test/java/com/xkcoding/component/SpringbootcomponentApplicationTests.java
new file mode 100644
index 000000000..46fdcb7a1
--- /dev/null
+++ b/spring-boot-demo-component/src/test/java/com/xkcoding/component/SpringbootcomponentApplicationTests.java
@@ -0,0 +1,13 @@
+package com.xkcoding.component;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class SpringbootcomponentApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}
diff --git a/spring-boot-demo-disconf/pom.xml b/spring-boot-demo-disconf/pom.xml
new file mode 100644
index 000000000..183888f4e
--- /dev/null
+++ b/spring-boot-demo-disconf/pom.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-parent</artifactId>
+    <version>2.5.3</version>
+    <relativePath/> <!-- lookup parent from repository -->
+  </parent>
+  <groupId>com.example</groupId>
+  <artifactId>disconf</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <name>disconf</name>
+  <description>Demo project for Spring Boot</description>
+  <properties>
+    <java.version>1.8</java.version>
+  </properties>
+  <dependencies>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>com.baidu.disconf</groupId>
+      <artifactId>disconf-client</artifactId>
+      <version> 2.6.30</version>
+    </dependency>
+
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/spring-boot-demo-disconf/src/main/java/com/example/disconf/DisconfApplication.java b/spring-boot-demo-disconf/src/main/java/com/example/disconf/DisconfApplication.java
new file mode 100644
index 000000000..f1f1be38e
--- /dev/null
+++ b/spring-boot-demo-disconf/src/main/java/com/example/disconf/DisconfApplication.java
@@ -0,0 +1,17 @@
+package com.example.disconf;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.ImportResource;
+
+@SpringBootApplication
+@ImportResource({"classpath:disconf.xml"})
+@EnableConfigurationProperties
+public class DisconfApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(DisconfApplication.class, args);
+    }
+
+}
diff --git a/spring-boot-demo-disconf/src/main/java/com/example/disconf/conifg/DemoBean.java b/spring-boot-demo-disconf/src/main/java/com/example/disconf/conifg/DemoBean.java
new file mode 100644
index 000000000..24fcbc719
--- /dev/null
+++ b/spring-boot-demo-disconf/src/main/java/com/example/disconf/conifg/DemoBean.java
@@ -0,0 +1,23 @@
+package com.example.disconf.conifg;
+
+import com.baidu.disconf.client.common.annotations.DisconfFile;
+import com.baidu.disconf.client.common.annotations.DisconfFileItem;
+import org.springframework.stereotype.Service;
+
+@Service
+@DisconfFile(filename = "common.properties")
+public class DemoBean {
+
+    private String base_url;
+    private String tenantId;
+
+    @DisconfFileItem(name="uyun.baseurl",associateField = "base_url")
+    public String getBase_url() {
+        return base_url;
+    }
+    @DisconfFileItem(name="default.tenant.id",associateField = "tenantId")
+    public String   getTenantId() {
+        return tenantId;
+    }
+
+}
diff --git a/spring-boot-demo-disconf/src/main/java/com/example/disconf/conifg/DisconfConfig.java b/spring-boot-demo-disconf/src/main/java/com/example/disconf/conifg/DisconfConfig.java
new file mode 100644
index 000000000..b2f62aa13
--- /dev/null
+++ b/spring-boot-demo-disconf/src/main/java/com/example/disconf/conifg/DisconfConfig.java
@@ -0,0 +1,20 @@
+package com.example.disconf.conifg;
+
+import com.baidu.disconf.client.common.annotations.DisconfFile;
+import com.baidu.disconf.client.common.annotations.DisconfFileItem;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Service;
+
+@Service
+@Scope("singleton")
+@DisconfFile(filename = "common.properties")
+public class DisconfConfig {
+
+       private String  baseUrl;
+
+       @DisconfFileItem(name ="config.service.url",associateField ="baseUrl")
+       public String  getBaseUrl(){
+          return   baseUrl;
+        }
+
+}
diff --git a/spring-boot-demo-disconf/src/main/java/com/example/disconf/conifg/JedisConfig.java b/spring-boot-demo-disconf/src/main/java/com/example/disconf/conifg/JedisConfig.java
new file mode 100644
index 000000000..72e87f4b2
--- /dev/null
+++ b/spring-boot-demo-disconf/src/main/java/com/example/disconf/conifg/JedisConfig.java
@@ -0,0 +1,32 @@
+package com.example.disconf.conifg;
+
+import com.baidu.disconf.client.common.annotations.DisconfFile;
+import com.baidu.disconf.client.common.annotations.DisconfFileItem;
+import org.springframework.stereotype.Service;
+
+@Service
+@DisconfFile(filename = "redis.properties")
+public class JedisConfig {
+
+    private String host;
+
+    private int port;
+
+    @DisconfFileItem(name = "redis.host",associateField = "host")
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    @DisconfFileItem(name = "redis.port",associateField = "port")
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+}
diff --git a/spring-boot-demo-disconf/src/main/java/com/example/disconf/controller/DemoController.java b/spring-boot-demo-disconf/src/main/java/com/example/disconf/controller/DemoController.java
new file mode 100644
index 000000000..a5a910687
--- /dev/null
+++ b/spring-boot-demo-disconf/src/main/java/com/example/disconf/controller/DemoController.java
@@ -0,0 +1,32 @@
+package com.example.disconf.controller;
+
+import com.example.disconf.conifg.DemoBean;
+import com.example.disconf.conifg.JedisConfig;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+    @Autowired
+    private JedisConfig jedisConfig;
+
+    @Autowired
+    private DemoBean demoBean;
+
+    @RequestMapping("/")
+    public String demo(){
+        String base_url = demoBean.getBase_url();
+        String tenantId = demoBean.getTenantId();
+        return   base_url+"  "+tenantId;
+    }
+
+
+    @RequestMapping("getName")
+    public String getName(){
+        return jedisConfig.getHost();
+    }
+}
diff --git a/spring-boot-demo-disconf/src/main/java/com/example/disconf/controller/DisconfController.java b/spring-boot-demo-disconf/src/main/java/com/example/disconf/controller/DisconfController.java
new file mode 100644
index 000000000..c1f89ddbb
--- /dev/null
+++ b/spring-boot-demo-disconf/src/main/java/com/example/disconf/controller/DisconfController.java
@@ -0,0 +1,19 @@
+package com.example.disconf.controller;
+
+import com.example.disconf.conifg.DisconfConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.stereotype.Repository;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class DisconfController {
+     @Autowired
+     private DisconfConfig  disconfConfig;
+
+    @RequestMapping("getConfig")
+    public String  getConfig(){
+              return  disconfConfig.getBaseUrl();
+    }
+}
diff --git a/spring-boot-demo-disconf/src/main/resources/autoconfig.properties b/spring-boot-demo-disconf/src/main/resources/autoconfig.properties
new file mode 100644
index 000000000..ac4812ff8
--- /dev/null
+++ b/spring-boot-demo-disconf/src/main/resources/autoconfig.properties
@@ -0,0 +1 @@
+auto=zidong
\ No newline at end of file
diff --git a/spring-boot-demo-disconf/src/main/resources/disconf.properties b/spring-boot-demo-disconf/src/main/resources/disconf.properties
new file mode 100644
index 000000000..00146cb00
--- /dev/null
+++ b/spring-boot-demo-disconf/src/main/resources/disconf.properties
@@ -0,0 +1,28 @@
+# \u662F\u5426\u4F7F\u7528\u8FDC\u7A0B\u914D\u7F6E\u6587\u4EF6
+# true(\u9ED8\u8BA4)\u4F1A\u4ECE\u8FDC\u7A0B\u83B7\u53D6\u914D\u7F6E false\u5219\u76F4\u63A5\u83B7\u53D6\u672C\u5730\u914D\u7F6E
+disconf.enable.remote.conf=true
+
+#
+# \u914D\u7F6E\u670D\u52A1\u5668\u7684 HOST,\u7528\u9017\u53F7\u5206\u9694  127.0.0.1:8000,127.0.0.1:8000
+#
+disconf.conf_server_host=http://10.1.200.204/disconf
+
+# \u7248\u672C, \u8BF7\u91C7\u7528 X_X_X_X \u683C\u5F0F
+disconf.version=2_0_0
+
+# APP \u8BF7\u91C7\u7528 \u4EA7\u54C1\u7EBF_\u670D\u52A1\u540D \u683C\u5F0F
+disconf.app=uyun
+
+# \u73AF\u5883
+disconf.env=local
+
+# \u5FFD\u7565\u54EA\u4E9B\u5206\u5E03\u5F0F\u914D\u7F6E\uFF0C\u7528\u9017\u53F7\u5206\u9694
+disconf.ignore=
+
+# \u83B7\u53D6\u8FDC\u7A0B\u914D\u7F6E \u91CD\u8BD5\u6B21\u6570\uFF0C\u9ED8\u8BA4\u662F3\u6B21
+disconf.conf_server_url_retry_times=1
+# \u83B7\u53D6\u8FDC\u7A0B\u914D\u7F6E \u91CD\u8BD5\u65F6\u4F11\u7720\u65F6\u95F4\uFF0C\u9ED8\u8BA4\u662F5\u79D2
+disconf.conf_server_url_retry_sleep_seconds=1
+
+# \u81EA\u5B9A\u4E49\u7684\u4E0B\u8F7D\u8DEF\u5F84
+disconf.user_define_download_dir=./config
\ No newline at end of file
diff --git a/spring-boot-demo-disconf/src/main/resources/disconf.xml b/spring-boot-demo-disconf/src/main/resources/disconf.xml
new file mode 100644
index 000000000..8ffc2de28
--- /dev/null
+++ b/spring-boot-demo-disconf/src/main/resources/disconf.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
+        http://www.springframework.org/schema/aop
+        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
+
+    <aop:aspectj-autoproxy proxy-target-class="true"/>
+
+    <!-- 使用disconf必须添加以下配置 -->
+    <bean id="disconfMgrBean" class="com.baidu.disconf.client.DisconfMgrBean"
+          destroy-method="destroy">
+        <property name="scanPackage" value="com.example.disconf"/>
+    </bean>
+    <bean id="disconfMgrBean2" class="com.baidu.disconf.client.DisconfMgrBeanSecond"
+          init-method="init" destroy-method="destroy">
+    </bean>
+
+    <!-- 使用托管方式的disconf配置(无代码侵入, 配置更改会自动reload)-->
+    <bean id="configproperties_disconf"
+          class="com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean">
+        <property name="locations">
+            <list>
+                <value>classpath*:autoconfig.properties</value>
+            </list>
+        </property>
+    </bean>
+
+    <bean id="propertyConfigurer"
+          class="com.baidu.disconf.client.addons.properties.ReloadingPropertyPlaceholderConfigurer">
+        <property name="ignoreResourceNotFound" value="true"/>
+        <property name="ignoreUnresolvablePlaceholders" value="true"/>
+        <property name="propertiesArray">
+            <list>
+                <ref bean="configproperties_disconf"/>
+            </list>
+        </property>
+    </bean>
+
+</beans>
diff --git a/spring-boot-demo-disconf/src/main/resources/log4j2.xml b/spring-boot-demo-disconf/src/main/resources/log4j2.xml
new file mode 100644
index 000000000..8afd16bb1
--- /dev/null
+++ b/spring-boot-demo-disconf/src/main/resources/log4j2.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="debug">
+    <Appenders>
+        <Console name="console" target="SYSTEM_OUT">
+            <PatternLayout patter="%d [%t] %-5p [%c] - %m%n  "/>
+        </Console>
+    </Appenders>
+
+    <Loggers>
+        <logger name="com.shiny.disconf" level="debug">
+            <AppenderRef ref="console" />
+        </logger>
+        <Root level="debug">
+            <AppenderRef ref="console"/>
+        </Root>
+    </Loggers>
+</Configuration>
\ No newline at end of file
diff --git a/spring-boot-demo-disconf/src/test/java/com/example/disconf/DisconfApplicationTests.java b/spring-boot-demo-disconf/src/test/java/com/example/disconf/DisconfApplicationTests.java
new file mode 100644
index 000000000..7af06c1c3
--- /dev/null
+++ b/spring-boot-demo-disconf/src/test/java/com/example/disconf/DisconfApplicationTests.java
@@ -0,0 +1,13 @@
+package com.example.disconf;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class DisconfApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}
diff --git a/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/SpringBootEasyExcelApplication.java b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/SpringBootEasyExcelApplication.java
new file mode 100644
index 000000000..db94cf18a
--- /dev/null
+++ b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/SpringBootEasyExcelApplication.java
@@ -0,0 +1,14 @@
+package com.example.springboot.easyexcel;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+/**
+ * @author zzs
+ */
+@SpringBootApplication
+public class SpringBootEasyExcelApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SpringBootEasyExcelApplication.class, args);
+    }
+
+}
diff --git a/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/controller/ExportController.java b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/controller/ExportController.java
new file mode 100644
index 000000000..1221c7ed5
--- /dev/null
+++ b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/controller/ExportController.java
@@ -0,0 +1,40 @@
+package com.example.springboot.easyexcel.controller;
+
+
+
+import com.alibaba.excel.EasyExcel;
+import com.example.springboot.easyexcel.entity.Member;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.example.springboot.easyexcel.service.MemberService;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+
+public class ExportController {
+
+    @Autowired
+    private MemberService memberService;
+
+    /**
+     * 普通导出方式
+     */
+    @RequestMapping("/export1")
+    public void exportMembers1(HttpServletResponse response) throws IOException {
+        List<Member> members = memberService.getAllMember();
+
+        // 设置文本内省
+        response.setContentType("application/vnd.ms-excel");
+        // 设置字符编码
+        response.setCharacterEncoding("utf-8");
+        // 设置响应头
+        response.setHeader("Content-disposition", "attachment;filename=demo.xlsx");
+        EasyExcel.write(response.getOutputStream(), Member.class).sheet("成员列表").doWrite(members);
+    }
+
+}
+
diff --git a/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/entity/Member.java b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/entity/Member.java
new file mode 100644
index 000000000..cb7cccf2f
--- /dev/null
+++ b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/entity/Member.java
@@ -0,0 +1,40 @@
+package com.example.springboot.easyexcel.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.format.DateTimeFormat;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Data;
+import com.example.springboot.easyexcel.util.GenderConverter;
+
+import java.util.Date;
+
+@Data
+public class Member {
+
+    /**
+     * EasyExcel使用:导出时忽略该字段
+     */
+    @ExcelIgnore
+    private Integer id;
+
+    @ExcelProperty("用户名")
+    @ColumnWidth(20)
+    private String username;
+
+    /**
+     * EasyExcel使用:日期的格式化
+     */
+    @ColumnWidth(20)
+    @ExcelProperty("出生日期")
+    @DateTimeFormat("yyyy-MM-dd")
+    private Date birthday;
+
+    /**
+     * EasyExcel使用:自定义转换器
+     */
+    @ColumnWidth(10)
+    @ExcelProperty(value = "性别", converter = GenderConverter.class)
+    private Integer gender;
+
+}
diff --git a/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/service/MemberService.java b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/service/MemberService.java
new file mode 100644
index 000000000..d31db118e
--- /dev/null
+++ b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/service/MemberService.java
@@ -0,0 +1,17 @@
+package com.example.springboot.easyexcel.service;
+
+import com.example.springboot.easyexcel.entity.Member;
+
+import java.util.List;
+
+public interface MemberService {
+
+
+
+    /**
+     * 获取所有的成员信息
+     * @return 成员信息列表
+     */
+    List<Member> getAllMember();
+
+}
diff --git a/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/service/impl/MemberServiceImpl.java b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/service/impl/MemberServiceImpl.java
new file mode 100644
index 000000000..f4c304e5b
--- /dev/null
+++ b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/service/impl/MemberServiceImpl.java
@@ -0,0 +1,46 @@
+package com.example.springboot.easyexcel.service.impl;
+
+import com.example.springboot.easyexcel.entity.Member;
+import org.springframework.stereotype.Service;
+import com.example.springboot.easyexcel.service.MemberService;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+@Service("memberService")
+public class MemberServiceImpl implements MemberService {
+
+
+    @Override
+    public List<Member> getAllMember() {
+        // 这里构造一些测试数据,具体业务场景可从数据库等其他地方获取
+        List<Member> list = new ArrayList<>();
+        Member member = new Member();
+        member.setUsername("张三");
+        member.setBirthday(getDate(1990, 10, 11));
+        member.setGender(0);
+        list.add(member);
+
+        Member member1 = new Member();
+        member1.setUsername("王红");
+        member1.setBirthday(getDate(1999, 3, 29));
+        member1.setGender(1);
+        list.add(member1);
+
+        Member member2 = new Member();
+        member2.setUsername("李四");
+        member2.setBirthday(getDate(2000, 2, 9));
+        member2.setGender(0);
+        list.add(member2);
+
+        return list;
+    }
+
+    private Date getDate(int year, int month, int day) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(year, month, day);
+        return calendar.getTime();
+    }
+}
diff --git a/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/util/CommonCellStyleStrategy.java b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/util/CommonCellStyleStrategy.java
new file mode 100644
index 000000000..f04f0c202
--- /dev/null
+++ b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/util/CommonCellStyleStrategy.java
@@ -0,0 +1,58 @@
+package com.example.springboot.easyexcel.util;
+
+import com.alibaba.excel.write.metadata.style.WriteCellStyle;
+import com.alibaba.excel.write.metadata.style.WriteFont;
+import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
+import org.apache.poi.ss.usermodel.BorderStyle;
+import org.apache.poi.ss.usermodel.FillPatternType;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.IndexedColors;
+public class CommonCellStyleStrategy {
+
+    /**
+     * 设置单元格样式(仅用于示例)
+     *
+     * @return 样式策略
+     */
+    public static HorizontalCellStyleStrategy getHorizontalCellStyleStrategy() {
+        // 表头策略
+        WriteCellStyle headerCellStyle = new WriteCellStyle();
+        // 表头水平对齐居中
+        headerCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
+        // 背景色
+        headerCellStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex());
+        WriteFont headerFont = new WriteFont();
+        headerFont.setFontHeightInPoints((short) 15);
+        headerCellStyle.setWriteFont(headerFont);
+        // 自动换行
+        headerCellStyle.setWrapped(Boolean.FALSE);
+
+        // 内容策略
+        WriteCellStyle contentCellStyle = new WriteCellStyle();
+        // 设置数据允许的数据格式,这里49代表所有可以都允许设置
+        contentCellStyle.setDataFormat((short) 49);
+        // 设置背景色: 需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
+        contentCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
+        contentCellStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());
+        // 设置内容靠左对齐
+        contentCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
+        // 设置字体
+        WriteFont contentFont = new WriteFont();
+        contentFont.setFontHeightInPoints((short) 12);
+        contentCellStyle.setWriteFont(contentFont);
+        // 设置自动换行
+        contentCellStyle.setWrapped(Boolean.FALSE);
+        // 设置边框样式和颜色
+        contentCellStyle.setBorderLeft(BorderStyle.MEDIUM);
+        contentCellStyle.setBorderTop(BorderStyle.MEDIUM);
+        contentCellStyle.setBorderRight(BorderStyle.MEDIUM);
+        contentCellStyle.setBorderBottom(BorderStyle.MEDIUM);
+        contentCellStyle.setTopBorderColor(IndexedColors.RED.getIndex());
+        contentCellStyle.setBottomBorderColor(IndexedColors.GREEN.getIndex());
+        contentCellStyle.setLeftBorderColor(IndexedColors.YELLOW.getIndex());
+        contentCellStyle.setRightBorderColor(IndexedColors.ORANGE.getIndex());
+
+        // 将格式加入单元格样式策略
+        return new HorizontalCellStyleStrategy(headerCellStyle, contentCellStyle);
+    }
+}
diff --git a/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/util/CustomCellWriteHandler.java b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/util/CustomCellWriteHandler.java
new file mode 100644
index 000000000..f22b663b8
--- /dev/null
+++ b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/util/CustomCellWriteHandler.java
@@ -0,0 +1,79 @@
+package com.example.springboot.easyexcel.util;
+
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.Head;
+import com.alibaba.excel.write.handler.CellWriteHandler;
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
+import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
+import org.apache.poi.common.usermodel.HyperlinkType;
+import org.apache.poi.ss.usermodel.*;
+
+import java.util.List;
+
+/**
+ * 实现CellWriteHandler接口, 实现对单元格样式的精确控制
+ *
+ * @author sec
+ * @version 1.0
+ * @date 2022/7/31
+ **/
+public class CustomCellWriteHandler implements CellWriteHandler {
+
+    /**
+     * 创建单元格之前的操作
+     */
+    @Override
+    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
+                                 Head head, Integer integer, Integer integer1, Boolean aBoolean) {
+
+    }
+
+    /**
+     * 创建单元格之后的操作
+     */
+    @Override
+    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,
+                                Head head, Integer integer, Boolean aBoolean) {
+
+    }
+
+    /**
+     * 单元格内容转换之后的操作
+     */
+    @Override
+    public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
+                                       CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {
+
+    }
+
+    /**
+     * 单元格处理后(已写入值)的操作
+     */
+    @Override
+    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
+                                 List<CellData> list, Cell cell, Head head, Integer integer, Boolean isHead) {
+
+        // 设置超链接
+        if (isHead && cell.getRowIndex() == 0 && cell.getColumnIndex() == 0) {
+            CreationHelper helper = writeSheetHolder.getSheet().getWorkbook().getCreationHelper();
+            Hyperlink hyperlink = helper.createHyperlink(HyperlinkType.URL);
+            hyperlink.setAddress("https://github.com/alibaba/easyexcel");
+            cell.setHyperlink(hyperlink);
+        }
+
+        // 精确设置单元格格式
+        boolean bool = isHead && cell.getRowIndex() == 1;
+        if (bool) {
+            // 获取工作簿
+            Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
+            CellStyle cellStyle = workbook.createCellStyle();
+
+            Font cellFont = workbook.createFont();
+            cellFont.setBold(Boolean.TRUE);
+            cellFont.setFontHeightInPoints((short) 14);
+            cellFont.setColor(IndexedColors.SEA_GREEN.getIndex());
+            cellStyle.setFont(cellFont);
+            cell.setCellStyle(cellStyle);
+        }
+    }
+}
diff --git a/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/util/GenderConverter.java b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/util/GenderConverter.java
new file mode 100644
index 000000000..69169b6ca
--- /dev/null
+++ b/spring-boot-demo-easypoi/src/main/java/com/example/springboot/easyexcel/util/GenderConverter.java
@@ -0,0 +1,54 @@
+package com.example.springboot.easyexcel.util;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+
+public class GenderConverter implements Converter<Integer> {
+
+    private static final String MAN = "男";
+    private static final String WOMAN = "女";
+
+
+    @Override
+    public Class<?> supportJavaTypeKey() {
+        // 实体类中对象属性类型
+        return Integer.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        // Excel中对应的CellData属性类型
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public Integer convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty,
+                                     GlobalConfiguration globalConfiguration) {
+        // 从Cell中读取数据
+        String gender = cellData.getStringValue();
+        // 判断Excel中的值,将其转换为预期的数值
+        if (MAN.equals(gender)) {
+            return 0;
+        } else if (WOMAN.equals(gender)) {
+            return 1;
+        }
+        return null;
+    }
+
+    @Override
+    public CellData<?> convertToExcelData(Integer integer, ExcelContentProperty excelContentProperty,
+                                          GlobalConfiguration globalConfiguration) {
+        // 判断实体类中获取的值,转换为Excel预期的值,并封装为CellData对象
+        if (integer == null) {
+            return new CellData<>("");
+        } else if (integer == 0) {
+            return new CellData<>(MAN);
+        } else if (integer == 1) {
+            return new CellData<>(WOMAN);
+        }
+        return new CellData<>("");
+    }
+}
diff --git a/spring-boot-demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/model/DemoDto.java b/spring-boot-demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/model/DemoDto.java
new file mode 100644
index 000000000..bc0457e22
--- /dev/null
+++ b/spring-boot-demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/model/DemoDto.java
@@ -0,0 +1,15 @@
+package com.xkcoding.elasticsearch.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+public class DemoDto {
+    private  long  id;
+    private  String  tag;
+    private  String  title;
+    private  Date  publishTime;
+}
diff --git a/spring-boot-demo-exception-handler/src/main/java/com/xkcoding/exception/handler/constant/ResTypes.java b/spring-boot-demo-exception-handler/src/main/java/com/xkcoding/exception/handler/constant/ResTypes.java
new file mode 100644
index 000000000..3fcb4461a
--- /dev/null
+++ b/spring-boot-demo-exception-handler/src/main/java/com/xkcoding/exception/handler/constant/ResTypes.java
@@ -0,0 +1,38 @@
+package com.xkcoding.exception.handler.constant;
+
+public enum ResTypes {
+
+       System("biz","分组");
+       String  code;
+       String desc;
+
+       ResTypes(String code,String desc){
+              this.code=code;
+              this.desc=desc;
+       };
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    public  static  ResTypes  getResTypeByCode(String code){
+        for (ResTypes value : ResTypes.values()) {
+              if (value.getCode().equals(code)){
+                   return  value;
+              }
+        }
+         throw new IllegalArgumentException("未知的编码"+code);
+    }
+}
diff --git a/spring-boot-demo-mongodb/src/main/java/com/xkcoding/mongodb/model/Employee.java b/spring-boot-demo-mongodb/src/main/java/com/xkcoding/mongodb/model/Employee.java
new file mode 100644
index 000000000..0ab5d77d7
--- /dev/null
+++ b/spring-boot-demo-mongodb/src/main/java/com/xkcoding/mongodb/model/Employee.java
@@ -0,0 +1,26 @@
+package com.xkcoding.mongodb.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+import java.util.Date;
+
+@Document("emp") //对应emp集合中的一个文档
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Employee {
+    @Id //映射文档中的_id
+    private Integer id;
+    @Field("username")
+    private String name;
+    @Field
+    private int age;
+    @Field
+    private Double salary;
+    @Field
+    private Date birthday;
+}
diff --git a/spring-boot-demo-mongodb/src/main/java/com/xkcoding/mongodb/model/Zips.java b/spring-boot-demo-mongodb/src/main/java/com/xkcoding/mongodb/model/Zips.java
new file mode 100644
index 000000000..794a4039a
--- /dev/null
+++ b/spring-boot-demo-mongodb/src/main/java/com/xkcoding/mongodb/model/Zips.java
@@ -0,0 +1,28 @@
+package com.xkcoding.mongodb.model;
+
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Document("zips")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Zips {
+
+    @Id   //映射文档中的_id
+    private String id;
+    @Field
+    private String city;
+    @Field
+    private Double[] loc;
+    @Field
+    private Integer pop;
+    @Field
+    private String state;
+}
diff --git a/spring-boot-demo-mongodb/src/test/java/com/xkcoding/mongodb/repository/MongoAggTest.java b/spring-boot-demo-mongodb/src/test/java/com/xkcoding/mongodb/repository/MongoAggTest.java
new file mode 100644
index 000000000..dffd7c0d2
--- /dev/null
+++ b/spring-boot-demo-mongodb/src/test/java/com/xkcoding/mongodb/repository/MongoAggTest.java
@@ -0,0 +1,139 @@
+package com.xkcoding.mongodb.repository;
+
+import com.xkcoding.mongodb.SpringBootDemoMongodbApplicationTests;
+import com.xkcoding.mongodb.model.Zips;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.aggregation.Aggregation;
+import org.springframework.data.mongodb.core.aggregation.AggregationResults;
+import org.springframework.data.mongodb.core.aggregation.BucketOperation;
+import org.springframework.data.mongodb.core.aggregation.GroupOperation;
+import org.springframework.data.mongodb.core.aggregation.MatchOperation;
+import org.springframework.data.mongodb.core.aggregation.ProjectionOperation;
+import org.springframework.data.mongodb.core.aggregation.SortOperation;
+import org.springframework.data.mongodb.core.aggregation.TypedAggregation;
+import org.springframework.data.mongodb.core.aggregation.UnwindOperation;
+import org.springframework.data.mongodb.core.query.Criteria;
+
+
+
+@Slf4j
+public class MongoAggTest extends SpringBootDemoMongodbApplicationTests {
+
+
+    @Autowired
+    MongoTemplate mongoTemplate;
+
+    @Test
+    public void test(){
+
+        //$group
+        GroupOperation groupOperation = Aggregation.group("state")
+            .sum("pop").as("totalPop");
+        //$match
+        MatchOperation matchOperation = Aggregation
+            .match(Criteria.where("totalPop").gt(10*1000*1000));
+        //$sort
+        SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC,"totalPop");
+        // 按顺序组合每一个聚合步骤
+        TypedAggregation<Zips> typedAggregation = Aggregation.newAggregation(Zips.class,
+            groupOperation, matchOperation,sortOperation);
+        //调对应的api获取结果
+        //执行聚合操作,如果不使用 Map,也可以使用自定义的实体类来接收数据
+        AggregationResults<Map> aggregationResults = mongoTemplate
+            .aggregate(typedAggregation, Map.class);
+        // 取出最终结果
+        List<Map> mappedResults = aggregationResults.getMappedResults();
+        for(Map map:mappedResults){
+            System.out.println(map);
+        }
+
+    }
+
+    @Test
+    public void test2(){
+
+        //$group
+        GroupOperation groupOperation = Aggregation.group("state","city")
+            .sum("pop").as("cityPop");
+        //$group
+        GroupOperation groupOperation2 = Aggregation.group("_id.state")
+            .avg("cityPop").as("avgCityPop");
+        //$sort
+        SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC,"avgCityPop");
+
+        // 按顺序组合每一个聚合步骤
+        TypedAggregation<Zips> typedAggregation = Aggregation.newAggregation(Zips.class,
+            groupOperation, groupOperation2,sortOperation);
+
+        //执行聚合操作,如果不使用 Map,也可以使用自定义的实体类来接收数据
+        AggregationResults<Map> aggregationResults = mongoTemplate
+            .aggregate(typedAggregation, Map.class);
+        // 取出最终结果
+        List<Map> mappedResults = aggregationResults.getMappedResults();
+        for(Map map:mappedResults){
+            System.out.println(map);
+        }
+
+
+    }
+
+    @Test
+    public void test3(){
+
+        //$group
+        GroupOperation groupOperation = Aggregation.group("state","city")
+            .sum("pop").as("pop");
+
+        //$sort
+        SortOperation sortOperation = Aggregation.sort(Sort.Direction.ASC,"pop");
+
+        //$group
+        GroupOperation groupOperation2 = Aggregation.group("_id.state")
+            .last("_id.city").as("biggestCity")
+            .last("pop").as("biggestPop")
+            .first("_id.city").as("smallestCity")
+            .first("pop").as("smallestPop");
+
+        //$project
+        ProjectionOperation projectionOperation = Aggregation
+            .project("biggestCity","smallestCity","state")
+            .andExclude("_id")
+            .andExpression(" { name: \"$biggestCity\",  pop: \"$biggestPop\" }")
+            .as("biggestCity")
+            .andExpression("{ name: \"$smallestCity\", pop: \"$smallestPop\" }")
+            .as("smallestCity")
+            .and("_id").as("state");
+
+
+        //$sort
+        SortOperation sortOperation2 = Aggregation.sort(Sort.Direction.ASC,"state");
+
+
+
+        // 按顺序组合每一个聚合步骤
+        TypedAggregation<Zips> typedAggregation = Aggregation.newAggregation(Zips.class,
+            groupOperation, sortOperation,groupOperation2,projectionOperation,
+            sortOperation2);
+
+        //执行聚合操作,如果不使用 Map,也可以使用自定义的实体类来接收数据
+        AggregationResults<Map> aggregationResults = mongoTemplate
+            .aggregate(typedAggregation, Map.class);
+        // 取出最终结果
+        List<Map> mappedResults = aggregationResults.getMappedResults();
+        for(Map map:mappedResults){
+            System.out.println(map);
+        }
+
+
+    }
+
+
+}
diff --git a/spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/consumer/DelayConsumer.java b/spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/consumer/DelayConsumer.java
new file mode 100644
index 000000000..fbd904683
--- /dev/null
+++ b/spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/consumer/DelayConsumer.java
@@ -0,0 +1,108 @@
+package com.xkcoding.mq.kafka.consumer;
+
+import com.alibaba.fastjson.JSON;
+import com.xkcoding.mq.kafka.handler.DelayManager;
+import com.xkcoding.mq.kafka.model.DelayMessage;
+import org.apache.kafka.clients.consumer.*;
+import org.apache.kafka.common.TopicPartition;
+import org.apache.kafka.common.serialization.StringDeserializer;
+
+import java.time.Duration;
+import java.util.*;
+
+public class DelayConsumer {
+    private KafkaConsumer<String, String> consumer;
+    private final DelayManager delayManager;
+    private final int idx;
+    private final int t;
+    private final int t2;
+    private int interval;
+    private final String servers;
+    private final Object lock = new Object();
+    private final String topic;
+    private Thread thread;
+
+    public DelayConsumer(int idx, int t, String topic, String servers,
+                         DelayManager dm) {
+        this.idx = idx;
+        this.topic = topic;
+        this.t = t;
+        this.interval = t<=5?500:1000;
+        this.servers = servers;
+        this.t2 = 200;
+        this.delayManager = dm;
+    }
+
+    public void initTimer() {
+        List<String> topics = Collections.singletonList(topic);
+        consumer.subscribe(topics);
+        Timer timer = new Timer();
+        timer.schedule(new TimerTask() {
+            @Override
+            public void run() {
+                synchronized (lock) {
+                    if(DelayManager.exit)return;
+                    consumer.resume(consumer.paused());
+                    lock.notify();
+                }
+            }
+        }, 0, interval);
+
+        thread = new Thread(this::loop);
+        thread.start();
+    }
+
+    private void loop() {
+        do {
+            synchronized (lock) {
+                try {
+                    ConsumerRecords<String, String> consumerRecords = consumer.poll(Duration.ofMillis(t2));
+                    if (consumerRecords.isEmpty()) {
+                        lock.wait();
+                        continue;
+                    }
+                    boolean timed = false;
+                    for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
+                        // long timestamp = consumerRecord.timestamp();
+                        TopicPartition topicPartition = new TopicPartition(consumerRecord.topic(), consumerRecord.partition());
+                        String value = consumerRecord.value();
+                        System.out.println("消费的数据的时间是"+new Date()+"  数据是"+value);
+                        DelayMessage dm = null;
+                        try {
+                            dm = JSON.parseObject(value, DelayMessage.class);
+                        } catch (Exception ex) {
+                            ex.printStackTrace();
+                        }
+                        if (delayManager.sendAndWait(dm)) {
+                            consumer.pause(Collections.singletonList(topicPartition));
+                            consumer.seek(topicPartition, consumerRecord.offset());
+                            timed = true;
+                            break;
+                        } else {
+                            OffsetAndMetadata offsetAndMetadata = new OffsetAndMetadata(consumerRecord.offset() + 1);
+                            HashMap<TopicPartition, OffsetAndMetadata> metadataHashMap = new HashMap<>();
+                            metadataHashMap.put(topicPartition, offsetAndMetadata);
+                            consumer.commitSync(metadataHashMap);
+                        }
+                    }
+                    if (timed) {
+                        lock.wait();
+                    }
+                } catch (InterruptedException ex) {
+                    ex.printStackTrace();
+                }
+            }
+        } while (!DelayManager.exit);
+    }
+
+   public void initConsumer() {
+        Properties props = new Properties();
+        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, servers);
+        props.put(ConsumerConfig.GROUP_ID_CONFIG, "d");
+        props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false");
+        props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
+        props.put(ConsumerConfig.ISOLATION_LEVEL_CONFIG, "read_committed");
+        props.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, "5000");
+        consumer = new KafkaConsumer<>(props, new StringDeserializer(), new StringDeserializer());
+    }
+}
diff --git a/spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/controller/SendMessage.java b/spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/controller/SendMessage.java
new file mode 100644
index 000000000..134720973
--- /dev/null
+++ b/spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/controller/SendMessage.java
@@ -0,0 +1,58 @@
+package com.xkcoding.mq.kafka.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.xkcoding.mq.kafka.constants.KafkaConsts;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.kafka.support.SendResult;
+import org.springframework.util.concurrent.ListenableFutureCallback;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+public class SendMessage {
+
+    @Autowired
+    private KafkaTemplate<String, String> kafkaTemplate;
+
+    /**
+     * 测试发送消息
+     */
+   @RequestMapping("/send")
+    public void testSend() {
+        System.out.println("发送消息");
+
+
+       for (int i = 0; i <100000 ; i++) {
+           JSONObject order=new JSONObject();
+           order.put("userId", 123321999+i);
+           order.put("amount", 10000.0+i);
+           order.put("statement", "pay"+i);
+           kafkaTemplate.send(KafkaConsts.TOPIC_TEST, order.toJSONString()).addCallback(new ListenableFutureCallback<SendResult<String, String>>() {
+               @Override
+               public void onFailure(Throwable ex) {
+                   System.out.println("发送消息失败:" + ex.getMessage());
+               }
+
+               @Override
+               public void onSuccess(SendResult<String, String> result) {
+                   String content = String.format("发送消息成功:%s-%s-%s",
+
+                       result.getRecordMetadata().topic(),
+
+                       result.getRecordMetadata().partition(),
+
+                       result.getRecordMetadata().offset());
+
+                   System.out.println(content);
+               }
+
+           });
+       }
+
+
+
+    }
+
+}
diff --git a/spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/handler/DelayManager.java b/spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/handler/DelayManager.java
new file mode 100644
index 000000000..d51cf6a78
--- /dev/null
+++ b/spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/handler/DelayManager.java
@@ -0,0 +1,112 @@
+package com.xkcoding.mq.kafka.handler;
+
+import com.alibaba.fastjson.JSON;
+import com.xkcoding.mq.kafka.consumer.DelayConsumer;
+import com.xkcoding.mq.kafka.model.DelayMessage;
+import com.xkcoding.mq.kafka.utils.KafkaManager;
+import org.apache.kafka.clients.admin.NewTopic;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@Component
+public class DelayManager /*implements CommandLineRunner */{
+    private final boolean redirect = true;
+
+    final List<DelayConsumer> consumers = new ArrayList<>();
+
+    @Autowired
+    private KafkaManager kafkaManager;
+
+    @Value("${spring.kafka.bootstrap-servers}")
+    private String servers;
+
+    private final int[] delayTimes = new int[]{1, 5, 10, 30, 60, 120, 180, 240, 300, 360
+        , 420, 480, 540, 600, 1200, 1800, 3600, 7200};
+
+    public static boolean exit=false;
+
+
+    public void run(String... args) {
+        List<NewTopic> list = new ArrayList<>();
+        int n = delayTimes.length;
+        for (int i = 0; i < n; i++) {
+            list.add(new NewTopic(topicName(i), 1, (short) 1));
+        }
+        kafkaManager.createTopic(list);
+        for (int i = 0; i < n; i++) {
+            DelayConsumer dc = new DelayConsumer(i, delayTimes[i], topicName(i), servers, this);
+            dc.initConsumer();
+            dc.initTimer();
+            consumers.add(dc);
+            System.out.println("add consumer:" + i);
+        }
+
+    }
+
+    private String topicName(int idx) {
+        return "delay-" + idx;
+    }
+
+    public void sendDelay(String topic, String key, String data, int delay) {
+        int next = Arrays.binarySearch(delayTimes, delay);
+        if (next < 0) {
+            next = -next - 2;
+        }
+        long now = System.currentTimeMillis();
+        long expire = now + delayTimes[next] * 1000;
+        long expire2 = now + delay * 1000;
+        DelayMessage dm = new DelayMessage(topic, key, data, expire, expire2);
+        sendDelayMessage(dm, next);
+    }
+
+    private void sendDelayMessage(DelayMessage dm, int idx) {
+        kafkaManager.sendMessage(topicName(idx), null, JSON.toJSONString(dm));
+        // System.out.println("send to delay-"+idx);
+    }
+
+    public boolean sendAndWait(DelayMessage dm) {
+        if (dm == null) return false;
+        long now = System.currentTimeMillis();
+        if (now < dm.getExpire()) {
+            return true;
+        }
+        long delay = dm.getExpire2() - now;
+        if (delay < 1000 || !redirect) {
+            //send to target topic
+            kafkaManager.sendMessage(dm.getTopic(), dm.getKey(), dm.getData());
+        } else {
+            //redirect to next
+            int next = Arrays.binarySearch(delayTimes, (int) (delay / 1000));
+            if (next < 0) {
+                next = -next - 2;
+            }
+            dm.setExpire(now + delayTimes[next] * 1000);
+            sendDelayMessage(dm, next);
+        }
+        return false;
+    }
+
+    public void sendDelayOnLevel(String topic, String key, String data, int level) {
+        long now = System.currentTimeMillis();
+        int next = level - 1;
+        long expire = now + delayTimes[next];
+        DelayMessage dm = new DelayMessage(topic, key, data,
+            expire, expire);
+        sendDelayMessage(dm, next);
+    }
+
+    public void shutdown(){
+        exit=true;
+    }
+
+    public void on(){
+        exit=false;
+    }
+
+}
diff --git a/spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/model/DelayMessage.java b/spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/model/DelayMessage.java
new file mode 100644
index 000000000..b7e32797d
--- /dev/null
+++ b/spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/model/DelayMessage.java
@@ -0,0 +1,34 @@
+package com.xkcoding.mq.kafka.model;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class DelayMessage {
+
+
+    private String topic;
+    private String key;
+    private String data;
+    private long expire;
+    private long expire2;
+
+    public DelayMessage(String topic, String key, String data, long expire, long expire2) {
+        this.topic = topic;
+        this.key = key;
+        this.data = data;
+        this.expire = expire;
+        this.expire2 = expire2;
+    }
+
+    public long getExpire2() {
+        return expire2;
+    }
+
+    public void setExpire2(long expire2) {
+        this.expire2 = expire2;
+    }
+
+
+}
diff --git a/spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/utils/KafkaManager.java b/spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/utils/KafkaManager.java
new file mode 100644
index 000000000..1c079ffb7
--- /dev/null
+++ b/spring-boot-demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/utils/KafkaManager.java
@@ -0,0 +1,102 @@
+package com.xkcoding.mq.kafka.utils;
+
+import org.apache.kafka.clients.admin.*;
+import org.apache.kafka.common.TopicPartitionInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.kafka.support.SendResult;
+import org.springframework.stereotype.Component;
+import org.springframework.util.concurrent.ListenableFutureCallback;
+
+import javax.annotation.PostConstruct;
+import java.util.*;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
+@Component
+public class KafkaManager {
+
+    @Autowired
+    private KafkaTemplate<String, String> kafkaTemplate;
+    private AdminClient adminClient;
+
+    @PostConstruct
+    private void initAdminClient() {
+        Map<String, Object> props = new HashMap<>(1);
+        props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
+        adminClient = KafkaAdminClient.create(props);
+    }
+
+
+
+    /**
+     * 新增topic,支持批量
+     */
+    public CreateTopicsResult createTopic(Collection<NewTopic> newTopics) {
+        return adminClient.createTopics(newTopics);
+    }
+
+    /**
+     * 删除topic,支持批量
+     */
+    public void deleteTopic(Collection<String> topics) {
+        adminClient.deleteTopics(topics);
+    }
+
+    /**
+     * 获取指定topic的信息
+     */
+    public String getTopicInfo(Collection<String> topics) {
+        AtomicReference<String> info = new AtomicReference<>("");
+        try {
+            adminClient.describeTopics(topics).all().get().forEach((topic, description) -> {
+                for (TopicPartitionInfo partition : description.partitions()) {
+                    info.set(info + partition.toString() + "\n");
+                }
+            });
+        } catch (InterruptedException | ExecutionException e) {
+            e.printStackTrace();
+        }
+        return info.get();
+    }
+
+    /**
+     * 获取全部topic
+     */
+    public List<String> getAllTopic() {
+        try {
+            return adminClient.listTopics().listings().get().stream().map(TopicListing::name).collect(Collectors.toList());
+        } catch (InterruptedException | ExecutionException e) {
+            e.printStackTrace();
+        }
+        return new ArrayList<>();
+    }
+
+    /**
+     * 往topic中发送消息
+     */
+    public void sendMessage(String topic, String key, String message) {
+        kafkaTemplate.send(topic, key, message).addCallback(new ListenableFutureCallback<SendResult<String, String>>() {
+            @Override
+            public void onFailure(Throwable ex) {
+                System.out.println("发送消息失败:" + ex.getMessage());
+            }
+
+            @Override
+            public void onSuccess(SendResult<String, String> result) {
+                String content = String.format("发送消息成功:%s-%s-%s",
+
+                    result.getRecordMetadata().topic(),
+
+                    result.getRecordMetadata().partition(),
+
+                    result.getRecordMetadata().offset());
+
+                System.out.println(content);
+            }
+
+        });
+    }
+
+}
diff --git a/spring-boot-demo-original/pom.xml b/spring-boot-demo-original/pom.xml
new file mode 100644
index 000000000..2166a26de
--- /dev/null
+++ b/spring-boot-demo-original/pom.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-parent</artifactId>
+    <version>2.3.10.RELEASE</version>
+    <relativePath/> <!-- lookup parent from repository -->
+  </parent>
+  <groupId>com.myself.demo</groupId>
+  <artifactId>original</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <name>original</name>
+  <description>Demo project for Spring Boot</description>
+  <properties>
+    <java.version>1.8</java.version>
+  </properties>
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+      <exclusions>
+        <exclusion>
+          <groupId>org.junit.vintage</groupId>
+          <artifactId>junit-vintage-engine</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>org.projectlombok</groupId>
+      <artifactId>lombok</artifactId>
+    </dependency>
+
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/spring-boot-demo-original/src/main/java/com/myself/demo/original/OriginalApplication.java b/spring-boot-demo-original/src/main/java/com/myself/demo/original/OriginalApplication.java
new file mode 100644
index 000000000..198c5b1e4
--- /dev/null
+++ b/spring-boot-demo-original/src/main/java/com/myself/demo/original/OriginalApplication.java
@@ -0,0 +1,13 @@
+package com.myself.demo.original;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class OriginalApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(OriginalApplication.class, args);
+    }
+
+}
diff --git a/spring-boot-demo-original/src/main/resources/application.yml b/spring-boot-demo-original/src/main/resources/application.yml
new file mode 100644
index 000000000..142dbfa6c
--- /dev/null
+++ b/spring-boot-demo-original/src/main/resources/application.yml
@@ -0,0 +1,3 @@
+logging:
+  file:
+    path: /logDemo/a.log
diff --git a/spring-boot-demo-original/src/test/java/com/myself/demo/original/OriginalApplicationTests.java b/spring-boot-demo-original/src/test/java/com/myself/demo/original/OriginalApplicationTests.java
new file mode 100644
index 000000000..bd9a67742
--- /dev/null
+++ b/spring-boot-demo-original/src/test/java/com/myself/demo/original/OriginalApplicationTests.java
@@ -0,0 +1,13 @@
+package com.myself.demo.original;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class OriginalApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}
diff --git a/spring-boot-demo-original/src/test/java/com/myself/demo/original/deletefile/DeleteExpiredFile.java b/spring-boot-demo-original/src/test/java/com/myself/demo/original/deletefile/DeleteExpiredFile.java
new file mode 100644
index 000000000..5e098dfa5
--- /dev/null
+++ b/spring-boot-demo-original/src/test/java/com/myself/demo/original/deletefile/DeleteExpiredFile.java
@@ -0,0 +1,51 @@
+package com.myself.demo.original.deletefile;
+
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.util.Date;
+
+public class DeleteExpiredFile {
+    private static final Logger logger  = LoggerFactory.getLogger(DeleteExpiredFile.class);
+    private static final String ROOT_DIR_HISTORY_PATH = System.getProperty("work.dir");
+
+    public void deleteExpiredFileTask() {
+        File file = new File(ROOT_DIR_HISTORY_PATH+"logs/spring-boot-demo-logback");
+        deleteExpiredFile(file);
+    }
+
+    private void deleteExpiredFile(File file) {
+        if (!file.exists()) return;
+        if (!file.isDirectory()) {
+            determineExpiredFile(file);
+        } else {
+            for (File f : file.listFiles()) {
+                deleteExpiredFile(f);
+            }
+        }
+    }
+
+    @Test
+    private void determineExpiredFile(File file) {
+        long lastModifiedTime = file.lastModified();
+        long currentTime = new Date().getTime();
+        long timeInterval =1 * 60 * 1000;
+        if (currentTime - lastModifiedTime > timeInterval) {
+            file.delete();
+        }
+    }
+
+    @Test
+    public   void  getLogsDel(){
+        for (int i = 0; i <100 ; i++) {
+            logger.info("我叫广汽本田");
+        }
+
+    }
+
+
+}
+
diff --git a/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/config/BatchTaskDataSourceInitializer.java b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/config/BatchTaskDataSourceInitializer.java
new file mode 100644
index 000000000..947132acc
--- /dev/null
+++ b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/config/BatchTaskDataSourceInitializer.java
@@ -0,0 +1,40 @@
+package com.xkcoding.orm.mybatis.plus.config;
+
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.Resource;
+import org.springframework.jdbc.datasource.init.DataSourceInitializer;
+import org.springframework.jdbc.datasource.init.DatabasePopulator;
+import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
+import javax.sql.DataSource;
+@Configuration
+public class BatchTaskDataSourceInitializer {
+    /**
+     * 构建Resource对象
+     */
+    @Value("classpath:db/people.sql")
+    private Resource businessScript;
+
+    /**
+     * 自定义Bean实现业务的特殊需求
+     * @param dataSource
+     * @return
+     */
+    @Bean
+    @Qualifier("dataSource")
+    public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {
+        final DataSourceInitializer initializer = new DataSourceInitializer();
+        // 设置数据源
+        initializer.setDataSource(dataSource);
+        initializer.setDatabasePopulator(databasePopulator());
+        return initializer;
+    }
+
+    private DatabasePopulator databasePopulator() {
+        final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
+        populator.addScripts(businessScript);
+        return populator;
+    }
+}
diff --git a/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/task/PendingSchelude.java b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/task/PendingSchelude.java
new file mode 100644
index 000000000..948821d45
--- /dev/null
+++ b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/task/PendingSchelude.java
@@ -0,0 +1,33 @@
+package com.xkcoding.orm.mybatis.plus.task;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class PendingSchelude {
+
+        @Scheduled(cron = "0 0/1 * * * ?")
+        public void run1() {
+            log.info("RunJob is running");
+            for (int i = 0; i < 100; i++) {
+                    i++;
+            }
+            log.info("RunJob is end");
+        }
+
+    @Scheduled(cron = "0 0/1 * * * ?")
+    public void run2() {
+        log.info("PendingJob is running");
+        long start = System.currentTimeMillis() + (2 * 60 * 1000);
+        while (true) {
+            long end = System.currentTimeMillis();
+            if(end >= start) {
+                break;
+            }
+        }
+        log.info("PendingJob is end");
+    }
+
+}
diff --git a/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/task/ScheduleConfig.java b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/task/ScheduleConfig.java
new file mode 100644
index 000000000..8e868ebff
--- /dev/null
+++ b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/task/ScheduleConfig.java
@@ -0,0 +1,19 @@
+package com.xkcoding.orm.mybatis.plus.task;
+
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.config.ScheduledTaskRegistrar;
+
+import java.util.concurrent.Executors;
+
+@Configuration
+public class ScheduleConfig implements SchedulingConfigurer {
+
+        @Override
+        public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
+              scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
+        }
+}
+
+
diff --git a/spring-boot-demo-orm-mybatis-plus/src/main/resources/db/people.sql b/spring-boot-demo-orm-mybatis-plus/src/main/resources/db/people.sql
new file mode 100644
index 000000000..712f593e8
--- /dev/null
+++ b/spring-boot-demo-orm-mybatis-plus/src/main/resources/db/people.sql
@@ -0,0 +1,6 @@
+CREATE TABLE IF NOT EXISTS people(
+                                     persion_id BIGINT NOT NULL AUTO_INCREMENT,
+                                     first_name VARCHAR(20),
+                                     last_name VARCHAR(20),
+                                     PRIMARY KEY (persion_id)
+);
diff --git a/spring-boot-demo-orm-mybatis/src/main/java/com/xkcoding/orm/mybatis/controller/UserController.java b/spring-boot-demo-orm-mybatis/src/main/java/com/xkcoding/orm/mybatis/controller/UserController.java
new file mode 100644
index 000000000..f904a0901
--- /dev/null
+++ b/spring-boot-demo-orm-mybatis/src/main/java/com/xkcoding/orm/mybatis/controller/UserController.java
@@ -0,0 +1,32 @@
+package com.xkcoding.orm.mybatis.controller;
+
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.crypto.SecureUtil;
+import com.xkcoding.orm.mybatis.entity.User;
+import com.xkcoding.orm.mybatis.mapper.UserMapper;
+import com.xkcoding.orm.mybatis.service.UserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+
+@RestController
+@Slf4j
+public class UserController {
+
+    @Autowired
+    private UserService userService;
+
+    @RequestMapping("saveUser")
+    public  String   saveUser(@RequestBody User user){
+           log.info("user=={}",user.getName(),user.getEmail());
+           userService.saveUser(user);
+        return "success";
+    }
+
+}
diff --git a/spring-boot-demo-orm-mybatis/src/main/java/com/xkcoding/orm/mybatis/service/UserService.java b/spring-boot-demo-orm-mybatis/src/main/java/com/xkcoding/orm/mybatis/service/UserService.java
new file mode 100644
index 000000000..fb726f367
--- /dev/null
+++ b/spring-boot-demo-orm-mybatis/src/main/java/com/xkcoding/orm/mybatis/service/UserService.java
@@ -0,0 +1,8 @@
+package com.xkcoding.orm.mybatis.service;
+
+import com.xkcoding.orm.mybatis.entity.User;
+
+public interface UserService {
+
+    void saveUser(User user);
+}
diff --git a/spring-boot-demo-orm-mybatis/src/main/java/com/xkcoding/orm/mybatis/service/impl/UserServiceImpl.java b/spring-boot-demo-orm-mybatis/src/main/java/com/xkcoding/orm/mybatis/service/impl/UserServiceImpl.java
new file mode 100644
index 000000000..438c16823
--- /dev/null
+++ b/spring-boot-demo-orm-mybatis/src/main/java/com/xkcoding/orm/mybatis/service/impl/UserServiceImpl.java
@@ -0,0 +1,45 @@
+package com.xkcoding.orm.mybatis.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.crypto.SecureUtil;
+import com.xkcoding.orm.mybatis.entity.User;
+import com.xkcoding.orm.mybatis.mapper.UserMapper;
+import com.xkcoding.orm.mybatis.service.UserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.*;
+
+@Service
+@Slf4j
+public class UserServiceImpl  implements UserService {
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Override
+    public void saveUser(User user) {
+        String names = user.getName();
+        List<User> paramList=new ArrayList<>();
+        List<String> nameList = Arrays.asList(StringUtils.split(names, ","));
+        nameList.forEach( name->{
+            User   u=new User();
+            u.setName(name);
+            Random random = new Random();
+            int ends = random.nextInt(99);
+            u.setEmail("185019666"+ends+"@163.com");
+            u.setPassword(SecureUtil.md5("123456" +  IdUtil.fastSimpleUUID()));
+            u.setSalt( IdUtil.fastSimpleUUID());
+            u.setPhoneNumber("18501966"+ends);
+            u.setStatus(1);
+            u.setCreateTime(new Date());
+            u.setLastUpdateTime(new Date());
+            paramList.add(u);
+        });
+        int i = userMapper.saveBatchUser(paramList);
+        log.info("'结果是",i);
+
+    }
+}
diff --git a/spring-boot-demo-poitl/pom.xml b/spring-boot-demo-poitl/pom.xml
new file mode 100644
index 000000000..ee06fd108
--- /dev/null
+++ b/spring-boot-demo-poitl/pom.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-parent</artifactId>
+    <version>2.4.11</version>
+    <relativePath/> <!-- lookup parent from repository -->
+  </parent>
+  <groupId>com.example.export</groupId>
+  <artifactId>demo</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <name>demo</name>
+  <description>Demo project for Spring Boot</description>
+  <properties>
+    <java.version>1.8</java.version>
+  </properties>
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.deepoove</groupId>
+      <artifactId>poi-tl</artifactId>
+      <version>1.8.2</version>
+    </dependency>
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>fastjson</artifactId>
+      <version>1.2.56</version>
+    </dependency>
+
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/spring-boot-demo-poitl/src/main/java/com/example/export/DemoApplication.java b/spring-boot-demo-poitl/src/main/java/com/example/export/DemoApplication.java
new file mode 100644
index 000000000..b44f43413
--- /dev/null
+++ b/spring-boot-demo-poitl/src/main/java/com/example/export/DemoApplication.java
@@ -0,0 +1,13 @@
+package com.example.export;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(DemoApplication.class, args);
+    }
+
+}
diff --git a/spring-boot-demo-poitl/src/main/java/com/example/export/controller/ExportArrivedReport.java b/spring-boot-demo-poitl/src/main/java/com/example/export/controller/ExportArrivedReport.java
new file mode 100644
index 000000000..248ea4f0f
--- /dev/null
+++ b/spring-boot-demo-poitl/src/main/java/com/example/export/controller/ExportArrivedReport.java
@@ -0,0 +1,10 @@
+package com.example.export.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class ExportArrivedReport {
+
+
+}
diff --git a/spring-boot-demo-poitl/src/test/java/com/example/export/DemoApplicationTests.java b/spring-boot-demo-poitl/src/test/java/com/example/export/DemoApplicationTests.java
new file mode 100644
index 000000000..25effceea
--- /dev/null
+++ b/spring-boot-demo-poitl/src/test/java/com/example/export/DemoApplicationTests.java
@@ -0,0 +1,13 @@
+package com.example.export;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class DemoApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}
diff --git a/spring-boot-demo-ratelimit-redis/src/main/java/com/xkcoding/ratelimit/redis/config/RedisBeanConfig.java b/spring-boot-demo-ratelimit-redis/src/main/java/com/xkcoding/ratelimit/redis/config/RedisBeanConfig.java
new file mode 100644
index 000000000..efd931e17
--- /dev/null
+++ b/spring-boot-demo-ratelimit-redis/src/main/java/com/xkcoding/ratelimit/redis/config/RedisBeanConfig.java
@@ -0,0 +1,68 @@
+package com.xkcoding.ratelimit.redis.config;
+
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializationContext;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import java.time.Duration;
+
+@EnableCaching
+@Configuration
+public class RedisBeanConfig {
+
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
+        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
+        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+        ObjectMapper om = new ObjectMapper();
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        jackson2JsonRedisSerializer.setObjectMapper(om);
+        template.setConnectionFactory(factory);
+        //key序列化方式
+        template.setKeySerializer(redisSerializer);
+        //value序列化
+        template.setValueSerializer(jackson2JsonRedisSerializer);
+        //value hashmap序列化
+        template.setHashValueSerializer(jackson2JsonRedisSerializer);
+        return template;
+    }
+
+    @Bean
+    public CacheManager cacheManager(RedisConnectionFactory factory) {
+        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
+        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+        //解决查询缓存转换异常的问题
+        ObjectMapper om = new ObjectMapper();
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        jackson2JsonRedisSerializer.setObjectMapper(om);
+        // 配置序列化(解决乱码的问题),过期时间600秒
+        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
+            .entryTtl(Duration.ofSeconds(600))
+            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
+            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
+            .disableCachingNullValues();
+            RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
+            .cacheDefaults(config)
+            .build();
+        return cacheManager;
+    }
+}
+
+
+
diff --git a/spring-boot-demo-ratelimit-redis/src/main/java/com/xkcoding/ratelimit/redis/controller/Test2Controller.java b/spring-boot-demo-ratelimit-redis/src/main/java/com/xkcoding/ratelimit/redis/controller/Test2Controller.java
new file mode 100644
index 000000000..589b7c981
--- /dev/null
+++ b/spring-boot-demo-ratelimit-redis/src/main/java/com/xkcoding/ratelimit/redis/controller/Test2Controller.java
@@ -0,0 +1,25 @@
+package com.xkcoding.ratelimit.redis.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("redisTest")
+public class Test2Controller {
+
+   @Autowired
+   private RedisTemplate redisTemplate;
+
+   @RequestMapping("testRedis")
+   public void  testRedis(){
+       redisTemplate.opsForValue().set("name","lucy");
+       String name = (String) redisTemplate.opsForValue().get("name");
+       System.out.println(name);
+
+   }
+
+
+}
diff --git a/spring-boot-demo-toolclass/pom.xml b/spring-boot-demo-toolclass/pom.xml
new file mode 100644
index 000000000..e911513fe
--- /dev/null
+++ b/spring-boot-demo-toolclass/pom.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-parent</artifactId>
+    <version>2.4.11</version>
+    <relativePath/> <!-- lookup parent from repository -->
+  </parent>
+  <groupId>com.example.toolclass</groupId>
+  <artifactId>toolclass</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <name>toolclass</name>
+  <description>Demo project for Spring Boot</description>
+  <properties>
+    <java.version>1.8</java.version>
+  </properties>
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/spring-boot-demo-toolclass/src/main/java/com/example/toolclass/ToolclassApplication.java b/spring-boot-demo-toolclass/src/main/java/com/example/toolclass/ToolclassApplication.java
new file mode 100644
index 000000000..090a95158
--- /dev/null
+++ b/spring-boot-demo-toolclass/src/main/java/com/example/toolclass/ToolclassApplication.java
@@ -0,0 +1,13 @@
+package com.example.toolclass;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ToolclassApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(ToolclassApplication.class, args);
+    }
+
+}
diff --git a/spring-boot-demo-toolclass/src/main/java/com/example/toolclass/aesencoder/AESEncoder.java b/spring-boot-demo-toolclass/src/main/java/com/example/toolclass/aesencoder/AESEncoder.java
new file mode 100644
index 000000000..22976d401
--- /dev/null
+++ b/spring-boot-demo-toolclass/src/main/java/com/example/toolclass/aesencoder/AESEncoder.java
@@ -0,0 +1,152 @@
+package com.example.toolclass.aesencoder;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.KeyGenerator;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+/*
+ * AES对称加密和解密
+ */
+
+public class AESEncoder {
+    /*
+     * 加密
+     * 1.构造密钥生成器
+     * 2.根据ecnodeRules规则初始化密钥生成器
+     * 3.产生密钥
+     * 4.创建和初始化密码器
+     * 5.内容加密
+     * 6.返回字符串
+     */
+    public static String AESEncode(String content){
+        try {
+            String encodeRules="123456789";
+            //1.构造密钥生成器,指定为AES算法,不区分大小写
+            KeyGenerator keygen=KeyGenerator.getInstance("AES");
+            //2.根据ecnodeRules规则初始化密钥生成器
+            //生成一个128位的随机源,根据传入的字节数组
+            keygen.init(128, new SecureRandom(encodeRules.getBytes()));
+            //3.产生原始对称密钥
+            SecretKey original_key=keygen.generateKey();
+            //4.获得原始对称密钥的字节数组
+            byte [] raw=original_key.getEncoded();
+            //5.根据字节数组生成AES密钥
+            SecretKey key=new SecretKeySpec(raw, "AES");
+            //6.根据指定算法AES自成密码器
+            Cipher cipher=Cipher.getInstance("AES");
+            //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
+            cipher.init(Cipher.ENCRYPT_MODE, key);
+            //8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
+            byte [] byte_encode=content.getBytes("utf-8");
+            //9.根据密码器的初始化方式--加密:将数据加密
+            byte [] byte_AES=cipher.doFinal(byte_encode);
+            //10.将加密后的数据转换为字符串
+            //这里用Base64Encoder中会找不到包
+            //解决办法:
+            //在项目的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。
+            String AES_encode=new String(new BASE64Encoder().encode(byte_AES));
+            //11.将字符串返回
+            return AES_encode;
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (NoSuchPaddingException e) {
+            e.printStackTrace();
+        } catch (InvalidKeyException e) {
+            e.printStackTrace();
+        } catch (IllegalBlockSizeException e) {
+            e.printStackTrace();
+        } catch (BadPaddingException e) {
+            e.printStackTrace();
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        //如果有错就返加nulll
+        return null;
+    }
+    /*
+     * 解密
+     * 解密过程:
+     * 1.同加密1-4步
+     * 2.将加密后的字符串反纺成byte[]数组
+     * 3.将加密内容解密
+     */
+
+    public static String AESDncode(String content){
+        try {
+            String encodeRules="123456789";
+            //1.构造密钥生成器,指定为AES算法,不区分大小写
+            KeyGenerator keygen=KeyGenerator.getInstance("AES");
+            //2.根据ecnodeRules规则初始化密钥生成器
+            //生成一个128位的随机源,根据传入的字节数组
+            keygen.init(128, new SecureRandom(encodeRules.getBytes()));
+            //3.产生原始对称密钥
+            SecretKey original_key=keygen.generateKey();
+            //4.获得原始对称密钥的字节数组
+            byte [] raw=original_key.getEncoded();
+            //5.根据字节数组生成AES密钥
+            SecretKey key=new SecretKeySpec(raw, "AES");
+            //6.根据指定算法AES自成密码器
+            Cipher cipher=Cipher.getInstance("AES");
+            //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY
+            cipher.init(Cipher.DECRYPT_MODE, key);
+            //8.将加密并编码后的内容解码成字节数组
+            byte [] byte_content= new BASE64Decoder().decodeBuffer(content);
+            /*
+             * 解密
+             */
+            byte [] byte_decode=cipher.doFinal(byte_content);
+            String AES_decode=new String(byte_decode,"utf-8");
+            return AES_decode;
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (NoSuchPaddingException e) {
+            e.printStackTrace();
+        } catch (InvalidKeyException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (IllegalBlockSizeException e) {
+            e.printStackTrace();
+        } catch (BadPaddingException e) {
+            e.printStackTrace();
+        }
+
+        //如果有错就返加nulll
+        return null;
+    }
+
+    public static void main(String[] args) {
+        AESEncoder se=new AESEncoder();
+        /*
+         * 加密
+         */
+        System.out.println("使用AES对称加密,请输入加密的规则");
+        String encodeRules="123456789";
+        System.out.println("请输入要加密的内容:");
+
+        System.out.println("根据输入的规则"+encodeRules+"加密后的密文是:"+se.AESEncode("我叫MG"));
+
+        /*
+         * 解密
+         */
+        System.out.println("使用AES对称解密,请输入加密的规则:(须与加密相同)");
+
+        System.out.println("请输入要解密的内容(密文):");
+
+        System.out.println("根据输入的规则"+encodeRules+"解密后的明文是:"+se.AESDncode(se.AESEncode("我叫MG")));
+    }
+
+}
diff --git a/spring-boot-demo-toolclass/src/test/java/com/example/toolclass/ToolclassApplicationTests.java b/spring-boot-demo-toolclass/src/test/java/com/example/toolclass/ToolclassApplicationTests.java
new file mode 100644
index 000000000..73921a7d8
--- /dev/null
+++ b/spring-boot-demo-toolclass/src/test/java/com/example/toolclass/ToolclassApplicationTests.java
@@ -0,0 +1,13 @@
+package com.example.toolclass;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class ToolclassApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}
diff --git a/spring-boot-springsecurity/pom.xml b/spring-boot-springsecurity/pom.xml
new file mode 100644
index 000000000..66f5eb1ea
--- /dev/null
+++ b/spring-boot-springsecurity/pom.xml
@@ -0,0 +1,42 @@
+<?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>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-parent</artifactId>
+    <version>2.5.0</version>
+    <relativePath/>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>spring-boot-springsecurity</artifactId>
+
+  <properties>
+    <maven.compiler.source>8</maven.compiler.source>
+    <maven.compiler.target>8</maven.compiler.target>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.projectlombok</groupId>
+      <artifactId>lombok</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-security</artifactId>
+    </dependency>
+
+  </dependencies>
+
+</project>
diff --git a/spring-boot-springsecurity/src/main/java/com/sangeng/SgSecurityApplication.java b/spring-boot-springsecurity/src/main/java/com/sangeng/SgSecurityApplication.java
new file mode 100644
index 000000000..345669f11
--- /dev/null
+++ b/spring-boot-springsecurity/src/main/java/com/sangeng/SgSecurityApplication.java
@@ -0,0 +1,14 @@
+package com.sangeng;
+
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SgSecurityApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SgSecurityApplication.class,args);
+    }
+
+}
diff --git a/spring-boot-springsecurity/src/main/java/com/sangeng/controller/HelloController.java b/spring-boot-springsecurity/src/main/java/com/sangeng/controller/HelloController.java
new file mode 100644
index 000000000..9983c287d
--- /dev/null
+++ b/spring-boot-springsecurity/src/main/java/com/sangeng/controller/HelloController.java
@@ -0,0 +1,16 @@
+package com.sangeng.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class HelloController {
+
+    @RequestMapping("hello")
+    public String  hiSecurity(){
+        return  "hello";
+    }
+
+
+}
diff --git a/spring-boot-springsecurity/src/main/resources/application.yml b/spring-boot-springsecurity/src/main/resources/application.yml
new file mode 100644
index 000000000..b3461fead
--- /dev/null
+++ b/spring-boot-springsecurity/src/main/resources/application.yml
@@ -0,0 +1,2 @@
+server:
+  port: 10001
diff --git a/spring-demo-anlticdubbo/pom.xml b/spring-demo-anlticdubbo/pom.xml
new file mode 100644
index 000000000..e8b481741
--- /dev/null
+++ b/spring-demo-anlticdubbo/pom.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-parent</artifactId>
+    <version>2.6.11</version>
+    <relativePath/> <!-- lookup parent from repository -->
+  </parent>
+  <groupId>com.uyun.anltic</groupId>
+  <artifactId>anlticdubbo</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <name>anlticdubbo</name>
+  <description>Demo project for Spring Boot</description>
+  <properties>
+    <java.version>1.8</java.version>
+  </properties>
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/spring-demo-anlticdubbo/src/main/java/com/uyun/anltic/anlticdubbo/AnlticdubboApplication.java b/spring-demo-anlticdubbo/src/main/java/com/uyun/anltic/anlticdubbo/AnlticdubboApplication.java
new file mode 100644
index 000000000..352103f79
--- /dev/null
+++ b/spring-demo-anlticdubbo/src/main/java/com/uyun/anltic/anlticdubbo/AnlticdubboApplication.java
@@ -0,0 +1,13 @@
+package com.uyun.anltic.anlticdubbo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class AnlticdubboApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(AnlticdubboApplication.class, args);
+    }
+
+}
diff --git a/spring-demo-anlticdubbo/src/test/java/com/uyun/anltic/anlticdubbo/AnlticdubboApplicationTests.java b/spring-demo-anlticdubbo/src/test/java/com/uyun/anltic/anlticdubbo/AnlticdubboApplicationTests.java
new file mode 100644
index 000000000..f1a5d02e3
--- /dev/null
+++ b/spring-demo-anlticdubbo/src/test/java/com/uyun/anltic/anlticdubbo/AnlticdubboApplicationTests.java
@@ -0,0 +1,13 @@
+package com.uyun.anltic.anlticdubbo;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class AnlticdubboApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}

From fa2657bc9eebd754bbdfc01863dd5054971161de Mon Sep 17 00:00:00 2001
From: xuebing feng <fengxb@broada.com>
Date: Thu, 7 Sep 2023 23:35:13 +0800
Subject: [PATCH 3/3] =?UTF-8?q?=E8=87=AA=E5=B7=B1=E5=86=99=E7=9A=84?=
 =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/example/awaysuse/util/CacheUtil.java  | 293 ++++++++++++++++++
 .../example/awaysuse/util/FutureReqUtil.java  |  72 +++++
 .../com/example/awaysuse/util/TimeUtil.java   | 253 +++++++++++++++
 spring-boot-demo-easypoi/pom.xml              |  71 +++++
 spring-boot-demo-fileupload/pom.xml           |  70 +++++
 5 files changed, 759 insertions(+)

diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/CacheUtil.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/CacheUtil.java
index e69de29bb..e0f4c6b83 100644
--- a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/CacheUtil.java
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/CacheUtil.java
@@ -0,0 +1,293 @@
+package com.example.awaysuse.util;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import uyun.whale.common.encryption.support.HttpUtils;
+
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * <pre>
+ *     基于concurrentHash的本地缓存工具类
+ *     缓存删除基于timer定时器
+ * <pre>
+ * @author hejianfeng
+ * @date 2019/10/5
+ * @param
+ * @return
+ * <pre>
+ * 修改记录
+ * 版本号      修订日期        修改人     bug编号       修改内容
+ * 1.0.0      2019/10/5      hejianfeng                      新建
+ * </pre>
+ */
+@Component
+public class CacheUtil {
+
+    //默认大小
+    private static final int DEFAULT_CAPACITY = 1024;
+
+    // 最大缓存大小
+    private static final int MAX_CAPACITY = 10000;
+
+    //默认缓存过期时间
+    private static final long DEFAULT_TIMEOUT = 3600;
+
+    //1000毫秒
+    private static final long SECOND_TIME = 1000;
+
+    //存储缓存的Map
+    private static final ConcurrentHashMap<String, Object> map;
+
+    private static final Timer timer;
+
+    static {
+        map = new ConcurrentHashMap<>(DEFAULT_CAPACITY);
+        timer = new Timer();
+    }
+
+    //私有化构造方法
+    private CacheUtil() {
+
+    }
+
+    /**
+     * <pre>
+     *     缓存任务清除类
+     * <pre>
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param
+     * @return
+     * <pre>
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * </pre>
+     */
+    static class ClearTask extends TimerTask {
+        private String key;
+
+        public ClearTask(String key) {
+            this.key = key;
+        }
+
+        @Override
+        public void run() {
+            CacheUtil.remove(key);
+        }
+
+    }
+
+    //==================缓存的增删改查
+
+    /**
+     * <pre>
+     *     添加缓存
+     * <pre>
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param
+     * @param
+     * @return void
+     * <pre>
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * </pre>
+     */
+    public   boolean put(String key,Object object) {
+        if (checkCapacity()) {
+          /*  String res = HttpUtils.doGet(uyun_alert_url, null);
+            JSONObject jsonObject=JSONObject.parseObject(res);
+            JSONArray recordsArray = jsonObject.getJSONArray("records");
+            Map<String,Object>  alertMap=recordsArray.stream().collect(Collectors.toMap(item ->((JSONObject)item).getString("name"), Function.identity(), (item, item1) -> item));
+*/
+
+            //默认缓存时间
+            timer.schedule(new ClearTask(key), DEFAULT_TIMEOUT);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * <pre>
+     *     添加缓存
+     * <pre>
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param key
+     * @param object
+     * @param time_out  :缓存过期时间:单位秒
+     * @return void
+     * <pre>
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * </pre>
+     */
+    public static boolean put(String key, Object object, int time_out) {
+        if (checkCapacity()) {
+            map.put(key, object);
+            //默认缓存时间
+            timer.schedule(new ClearTask(key), time_out * SECOND_TIME);
+        }
+        return false;
+    }
+
+
+    /**
+     * <pre>
+     *     判断容量大小
+     * <pre>
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param
+     * @return boolean
+     * <pre>
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * </pre>
+     */
+    public static boolean checkCapacity() {
+        return map.size() < MAX_CAPACITY;
+    }
+
+    /**
+     * <pre>
+     *     批量增加缓存
+     * <pre>
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param m
+     * @param time_out
+     * @return void
+     * <pre>
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * </pre>
+     */
+    public static boolean put(Map<String, Object> m, int time_out) {
+        if (map.size() + m.size() <= MAX_CAPACITY) {
+            map.putAll(map);
+            for (String key : m.keySet()) {
+                timer.schedule(new ClearTask(key), time_out * SECOND_TIME);
+            }
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * <pre>
+     *     删除缓存
+     * <pre>
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param key
+     * @return void
+     * <pre>
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * </pre>
+     */
+    public static void remove(String key) {
+        map.remove(key);
+    }
+
+    /**
+     * <pre>
+     *     清除所有缓存
+     * <pre>
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param
+     * @return void
+     * <pre>
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * </pre>
+     */
+    public void clearAll() {
+        if (map.size() > 0) {
+            map.clear();
+        }
+        timer.cancel();
+    }
+
+    /**
+     * <pre>
+     *     获取缓存
+     * <pre>
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param key
+     * @return java.lang.Object
+     * <pre>
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * </pre>
+     */
+    public static Object get(String key) {
+        return map.get(key);
+    }
+
+    /**
+     * <pre>
+     *     是否包含某个缓存
+     * <pre>
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param key
+     * @return boolean
+     * <pre>
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * </pre>
+     */
+    public static boolean isContain(String key) {
+        return map.contains(key);
+    }
+
+
+    public static void main(String[] args) {
+        /* Map<String,Object>  mp=new HashMap<>();
+        mp.put("应用",0);
+        mp.put("中间件",0);
+        mp.put("数据库",0);
+        mp.put("服务器",0);
+        mp.put("网络设备",0);
+        mp.put("全流程",0);
+        mp.put("云管",0);
+        mp.put("alertTotal",0);
+        mp.put("安全事件",0);
+        map.put("alertInfo", mp);
+        CacheUtil.put("alertInfo",mp,20);*/
+
+
+
+         Object alertInfo = CacheUtil.get("alertInfo");
+         System.out.println(alertInfo);
+
+    }
+
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/FutureReqUtil.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/FutureReqUtil.java
index e69de29bb..3712e2e2a 100644
--- a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/FutureReqUtil.java
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/FutureReqUtil.java
@@ -0,0 +1,72 @@
+package com.example.awaysuse.util;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import uyun.whale.common.encryption.support.HttpUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+//异步调用接口请求数据
+@Slf4j
+public class FutureReqUtil {
+
+   public void getFuture(){
+
+       JSONArray allJsonArray = new JSONArray();
+       ExecutorService executorService = Executors.newFixedThreadPool(10);
+       try {
+           // 通过异步的方式调用接口获取数据
+           List<Future> allTask = new ArrayList<>();
+           for (int i = 1; i <=Integer.MIN_VALUE; i++) {
+               allTask.add(this.queryDetailAsync(executorService));
+           }
+           for (Future task : allTask) {
+               Optional.ofNullable(task.get()).ifPresent(r -> allJsonArray.addAll((JSONArray) r));
+           }
+           allTask.clear();
+           for (int i = 0; i < allJsonArray.size(); i++) {
+               JSONObject ticketObj = allJsonArray.getJSONObject(i);
+               allTask.add(executorService.submit(() -> {
+                   String ticketId = ticketObj.getString("ticketId");
+                   JSONObject defaultValue = ticketObj.getJSONObject("defaultValue");
+                   String classfy = "meiyou";
+                   if (defaultValue.getString("classify") != null) {
+                       classfy = defaultValue.getString("classify");
+                   }
+               }));
+           }
+           for (Future task : allTask) {
+               task.get();
+           }
+           allTask.clear();
+           log.info("结束数据详细信息");
+       } catch (Exception e) {
+           e.printStackTrace();
+       } finally {
+           executorService.shutdown();
+       }
+   }
+
+
+    private Future<JSONArray> queryDetailAsync(ExecutorService executorService){
+        return executorService.submit(() -> {
+            String result1 = HttpUtils.doGet("请求的url", null);
+            JSONObject jsonObject = JSONObject.parseObject(result1);
+            String ticketDetail_list = jsonObject.get("ticketDetail_list").toString();
+            JSONArray jsonArray = JSONArray.parseArray(ticketDetail_list);
+            if (jsonArray.size() <= 0){
+                return null;
+            }
+            System.out.println(Thread.currentThread().getName() + " finished");
+            return jsonArray;
+        });
+    }
+
+
+}
diff --git a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/TimeUtil.java b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/TimeUtil.java
index e69de29bb..a81c050b3 100644
--- a/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/TimeUtil.java
+++ b/spring-boot-demo-alwaysuse/src/main/java/com/example/awaysuse/util/TimeUtil.java
@@ -0,0 +1,253 @@
+/**
+ * Copyright (C), 2018-2018, jk有限公司
+ * FileName: TimeUtil
+ * Author:  常路通
+ * Date:     2018/11/16 18:38
+ * Description:
+ * /**
+ * Copyright (C), 2015-2018, XXX有限公司
+ * FileName: TimeUtil
+ * Author:   chang
+ * Date:     2018/11/16 18:38
+ * Description:
+ * History:
+ * <author>          <time>          <version>          <desc>
+ * 作者姓名           修改时间           版本号              描述
+ */
+package com.example.awaysuse.util;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.SimpleTimeZone;
+import java.util.TimeZone;
+
+/**
+ * 时间获取和处理
+ * 〈〉
+ *
+ * @author chang
+ * @create 2018/11/16
+ * @since 1.0.0
+ */
+public class TimeUtil {
+    public static Long getFormatedDateString(float timeZoneOffset) throws ParseException {
+        if (timeZoneOffset > 13 || timeZoneOffset < -12) {
+            timeZoneOffset = 0;
+        }
+        int newTime = (int) (timeZoneOffset * 60 * 60 * 1000);
+        TimeZone timeZone;
+        String[] ids = TimeZone.getAvailableIDs(newTime);
+        if (ids.length == 0) {
+            timeZone = TimeZone.getDefault();
+        } else {
+            timeZone = new SimpleTimeZone(newTime, ids[0]);
+        }
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        sdf.setTimeZone(timeZone);
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        return simpleDateFormat.parse(sdf.format(new Date())).getTime();
+    }
+
+    // 获取上个月
+    public static String getLastMonth() {
+        Calendar c = Calendar.getInstance();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+        c.setTime(new Date());
+        c.add(Calendar.MONTH, -1);
+        Date m = c.getTime();
+        String mon = sdf.format(m);
+       // System.out.println("过去一个月:" + mon);
+        return mon.replace("-", "");
+    }
+
+    // 获取当前月份信息
+    public static String getNowMonth() {
+        Calendar c = Calendar.getInstance();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+        c.setTime(new Date());
+        // c.add(Calendar.MONTH, -1);
+        Date m = c.getTime();
+        String mon = sdf.format(m);
+      //  System.out.println("现在月:" + mon);
+        return mon.replace("-", "");
+    }
+
+    //获取前一天的时间
+    public static String getLastDay(Integer i) {
+        Calendar c = Calendar.getInstance();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        c.setTime(new Date());
+        c.add(Calendar.DATE, i);
+        Date m = c.getTime();
+        String mon = sdf.format(m);
+       // System.out.println("现在月:" + mon);
+        return mon.replace("-", "");
+        //return "20190423";
+    }
+
+
+    public static String getDay(Date parse, int i,String format) {
+        Calendar c = Calendar.getInstance();
+        SimpleDateFormat sdf = new SimpleDateFormat(format);
+        c.setTime(parse);
+        c.add(Calendar.DATE, i);
+        Date m = c.getTime();
+        String mon = sdf.format(m);
+       // System.out.println("过去一个月:" + mon);
+        return mon;
+    }
+    public static Long getDayTime(Date parse, int i,String format) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(parse);
+        c.add(Calendar.DATE, i);
+        Date m = c.getTime();
+        return m.getTime();
+    }
+
+    public static long getHourTime(Date parse, int i, String format) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(parse);
+        c.add(Calendar.HOUR, i);
+        Date m = c.getTime();
+        return m.getTime();
+    }
+    // Date转String
+    public static String DateToStr(String format) {
+        SimpleDateFormat sdf = new SimpleDateFormat(format);
+        return sdf.format(new Date());
+    }
+
+    // 获取几天之前的数据
+    public static String getLastDay(String time, int i) {
+        Calendar c = Calendar.getInstance();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Date parse = null;
+        try {
+            parse = sdf.parse(time);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        c.setTime(parse);
+        c.add(Calendar.DATE, i);
+        Date time1 = c.getTime();
+        return sdf.format(time1).replace("-","");
+    }
+
+    public static void main(String[] args) {
+        System.out.println(getFormatedDate(8));
+    }
+
+    //获得哪个时区的时间
+    public static String getFormatedDate(float timeZoneOffset){
+        if (timeZoneOffset > 13 || timeZoneOffset < -12) {
+            timeZoneOffset = 0;
+        }
+
+        int newTime=(int)(timeZoneOffset * 60 * 60 * 1000);
+        TimeZone timeZone;
+        String[] ids = TimeZone.getAvailableIDs(newTime);
+        if (ids.length == 0) {
+            timeZone = TimeZone.getDefault();
+        } else {
+            timeZone = new SimpleTimeZone(newTime, ids[0]);
+        }
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        sdf.setTimeZone(timeZone);
+        return sdf.format(new Date());
+    }
+
+    // 获取几小时之前的数据
+    public static String getLastHourTime(int date,int n){
+        Calendar ca = Calendar.getInstance();
+        ca.set(Calendar.MINUTE, 0);
+        ca.set(Calendar.SECOND, 0);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH");
+        ca.set(Calendar.HOUR_OF_DAY, ca.get(Calendar.HOUR_OF_DAY)-n);
+        ca.set(Calendar.DATE, ca.get(Calendar.DATE)-date);
+        return sdf.format(ca.getTime());
+    }
+
+    // 获取几小时之前的数据 字符串类型
+    public static String getLastHourStr(Date date,int n,String format){
+        Calendar ca = Calendar.getInstance();
+        ca.set(Calendar.MINUTE, 0);
+        ca.set(Calendar.SECOND, 0);
+        SimpleDateFormat sdf = new SimpleDateFormat(format);
+        ca.set(Calendar.HOUR_OF_DAY, ca.get(Calendar.HOUR_OF_DAY)-n);
+        return sdf.format(ca.getTime());
+    }
+
+    public static String getNowDay(int i) {
+        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("GMT+8"));
+        ZonedDateTime yesterday = now.minusDays(-i);
+        String nowStr = yesterday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        return nowStr;
+    }
+    public static String[] getPerfectDays(String time) {
+        ZonedDateTime now = ZonedDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(ZoneId.of("GMT-0")));
+        ZonedDateTime yesterday = now.minusDays(1);
+        ZonedDateTime tomorrow = now.plusDays(1);
+        String nowStr = now.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        String yesterdayStr = yesterday.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        String tomorrowStr = tomorrow.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        return new String[]{nowStr,yesterdayStr,tomorrowStr};
+    }
+    public static String getPerfectDay(String time,int i) {
+        ZonedDateTime now = ZonedDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(ZoneId.of("GMT-0")));
+        ZonedDateTime yesterday = now.minusDays(-i);
+        String yesterdayStr = yesterday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        return yesterdayStr;
+    }
+
+    public static  String getTimeStr(String time){
+        String[] times = time.split(" ");
+        return times[1] + "时";
+    }
+
+    // Java8 获取最近几小时的时间
+    public static   String  getNearTimes(int time){
+        LocalDateTime dateTime=LocalDateTime.now();
+        DateTimeFormatter  dateTimeFormatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalDateTime dateBefore = dateTime.minusHours(time);
+        String format = dateBefore.format(dateTimeFormatter);
+        return  format;
+    }
+
+    // 获取当前时间
+    public static   String  getNowTime(){
+        LocalDateTime dateTime=LocalDateTime.now();
+        DateTimeFormatter  dateTimeFormatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        String format = dateTime.format(dateTimeFormatter);
+        return  format;
+    }
+
+    public static String computeDateTime(String dateTime, Integer hours) {
+        String forecastTime = new String();
+        if (StringUtils.isNotEmpty(dateTime)) {
+            Calendar calendar = Calendar.getInstance();
+            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            Date date = null;
+            try {
+                date = simpleDateFormat.parse(dateTime);
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+            calendar.setTime(date);
+            calendar.add(Calendar.HOUR_OF_DAY,hours);
+            forecastTime = simpleDateFormat.format(calendar.getTime());
+        }
+        return forecastTime;
+    }
+
+
+}
diff --git a/spring-boot-demo-easypoi/pom.xml b/spring-boot-demo-easypoi/pom.xml
index e69de29bb..919700e04 100644
--- a/spring-boot-demo-easypoi/pom.xml
+++ b/spring-boot-demo-easypoi/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>
+
+  <artifactId>spring-boot-demo-upload</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>spring-boot-demo-easypoi</name>
+  <description>Demo project for Spring Boot</description>
+
+  <parent>
+    <groupId>com.xkcoding</groupId>
+    <artifactId>spring-boot-demo</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <java.version>1.8</java.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.projectlombok</groupId>
+      <artifactId>lombok</artifactId>
+      <optional>true</optional>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-thymeleaf</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>cn.hutool</groupId>
+      <artifactId>hutool-all</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>easyexcel</artifactId>
+      <version>2.2.11</version>
+    </dependency>
+
+  </dependencies>
+
+  <build>
+    <finalName>spring-boot-demo-upload</finalName>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/spring-boot-demo-fileupload/pom.xml b/spring-boot-demo-fileupload/pom.xml
index e69de29bb..a2514fc4f 100644
--- a/spring-boot-demo-fileupload/pom.xml
+++ b/spring-boot-demo-fileupload/pom.xml
@@ -0,0 +1,70 @@
+<?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>
+
+  <artifactId>spring-boot-demo-upload</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>spring-boot-demo-upload</name>
+  <description>Demo project for Spring Boot</description>
+
+  <parent>
+    <groupId>com.xkcoding</groupId>
+    <artifactId>spring-boot-demo</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <java.version>1.8</java.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.projectlombok</groupId>
+      <artifactId>lombok</artifactId>
+      <optional>true</optional>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-thymeleaf</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>cn.hutool</groupId>
+      <artifactId>hutool-all</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.qiniu</groupId>
+      <artifactId>qiniu-java-sdk</artifactId>
+      <version>[7.2.0, 7.2.99]</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <finalName>spring-boot-demo-upload</finalName>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>