From 354fdddbe38985cbfa0e6dfc7eae43bb7cc41cf6 Mon Sep 17 00:00:00 2001 From: xuebing feng 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 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 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.12.RELEASE + + + com.example + awaysuse + 0.0.1-SNAPSHOT + awaysuse + Demo project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + cn.hutool + hutool-all + 5.5.2 + + + com.alibaba + fastjson + 1.2.68 + compile + + + + uyun.whale + common-encryption + 2.0.4-SNAPSHOT + + + + com.squareup.okhttp + okhttp + 2.7.5 + + + + org.apache.commons + commons-lang3 + + + + + org.apache.poi + poi + 3.9 + + + org.apache.poi + poi-ooxml + 3.9 + + + org.apache.poi + poi-ooxml-schemas + 3.9 + + + + + org.elasticsearch + elasticsearch + 7.5.1 + + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + 7.5.1 + + + org.elasticsearch + elasticsearch + + + org.elasticsearch.client + elasticsearch-rest-client + + + + + + org.elasticsearch.client + elasticsearch-rest-client + 7.5.1 + + + + commons-lang + commons-lang + 2.6 + + + + + org.apache.commons + commons-collections4 + 4.1 + + + + + + net.sf.ezmorph + ezmorph + 1.0.6 + + + + org.springframework.retry + spring-retry + + + + + org.aspectj + aspectjrt + 1.9.1 + + + org.aspectj + aspectjweaver + 1.9.1 + + + + org.apache.commons + commons-lang3 + + + + com.cronutils + cron-utils + 8.0.0 + + + + com.google.guava + guava + 28.1-jre + + + + com.hankcs + hanlp + portable-1.7.8 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + 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 { + 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 { + + @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 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 errorHandler(HttpServletRequest request, NoHandlerFoundException exception, HttpServletResponse response) { + return ResponseResult.error(HttpStatus.NOT_FOUND.value(), exception.getMessage()); + } + + /** + * 405异常处理 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public ResponseResult errorHandler(HttpServletRequest request, HttpRequestMethodNotSupportedException exception, HttpServletResponse response) { + return ResponseResult.error(HttpStatus.METHOD_NOT_ALLOWED.value(), exception.getMessage()); + } + + /** + * 415异常处理 + */ + @ExceptionHandler(HttpMediaTypeNotSupportedException.class) + public ResponseResult errorHandler(HttpServletRequest request, HttpMediaTypeNotSupportedException exception, HttpServletResponse response) { + return ResponseResult.error(HttpStatus.UNSUPPORTED_MEDIA_TYPE.value(), exception.getMessage()); + } + + /** + * 500异常处理 + */ + @ExceptionHandler(HttpServerErrorException.class) + public ResponseResult errorHandler(HttpServletRequest request, HttpServerErrorException exception, HttpServletResponse response) { + return ResponseResult.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), exception.getMessage()); + } + + /** + * 参数校验错误处理 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseResult errorHandler(HttpServletRequest request, MethodArgumentNotValidException exception, HttpServletResponse response) { + List errors = exception.getBindingResult().getAllErrors().stream().map(error -> error.getDefaultMessage()).collect(Collectors.toList()); + return ResponseResult.error(0, String.join(",", errors)); + } + + /** + * 普通异常处理 + */ + @ExceptionHandler(Exception.class) + public ResponseResult 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 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 { + @Override + public boolean supports(MethodParameter methodParameter, Class> aClass) { + // response是ResultVo类型,或者注释了NotControllerResponseAdvice都不进行包装 + return !methodParameter.getParameterType().isAssignableFrom(ResultVo.class); + } + + @Override + public Object beforeBodyWrite(Object data, MethodParameter returnType, MediaType mediaType, Class> 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 map = new HashMap(); + map.put("qingfen", 16); + map.put("lantian", 17); + map.put("baiyun", 18); + CallResultMsg callResultMsg = new UniformReponseHandler().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().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 { + private static final long serialVersionUID = 4978196894185418504L; + + public Doc(){ + + } + + public Doc(Map map){ + this.putAll(map); + } + + public static Doc put(Map 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 { + /** + * 当前页面 + */ + 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; + +/** + *

+ * 开发人员配置信息 + *

+ * + * @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 { + + 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 ResponseResult success(){ + return new ResponseResult(); + } + + public static ResponseResult success(T data){ + return new ResponseResult(data); + } + + public static ResponseResult success(String message, T data){ + return new ResponseResult(message, data); + } + + public static ResponseResult error(int code, String message){ + return new ResponseResult(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 { + + /** + * 值不为空时执行消费操作 + * 值为空时执行其他的操作 + * + * @param action 值不为空时,执行的消费操作 + * @param emptyAction 值为空时,执行的操作 + * @return void + **/ + void presentOrElseHandle(Consumer 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 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 tasks; + //利用构造方法,给成员变量赋值 + + public MyWorker(String name, List 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 T convertTo(S source, Supplier targetSupplier) { + return convertTo(source, targetSupplier, null); + } + + /** + * 转换对象 + * + * @param source 源对象 + * @param targetSupplier 目标对象供应方 + * @param callBack 回调方法 + * @param 源对象类型 + * @param 目标对象类型 + * @return 目标对象 + */ + public static T convertTo(S source, Supplier targetSupplier, ConvertCallBack 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 List convertListTo(List sources, Supplier targetSupplier) { + return convertListTo(sources, targetSupplier, null); + } + + /** + * 转换对象 + * + * @param sources 源对象list + * @param targetSupplier 目标对象供应方 + * @param callBack 回调方法 + * @param 源对象类型 + * @param 目标对象类型 + * @return 目标对象list + */ + public static List convertListTo(List sources, Supplier targetSupplier, ConvertCallBack callBack) { + if (null == sources || null == targetSupplier) { + return null; + } + + List 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 源对象类型 + * @param 目标对象类型 + */ + @FunctionalInterface + public interface ConvertCallBack { + 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 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 map) { + return save(index, map, null); + } + + /** + * 新增(更新)文档:自定义文档id + * + * @param index 索引 + * @param docId 文档id + * @param map 保存的数据 + * @return string + */ + public String save(String index, Map 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> list) { + return bulkSave(index, list, null); + } + + /** + * 批量插入(更新)文档: 自定义id + * + * @param index 索引 + * @param list 保存的数据 + * @param idField map中作为文档id的字段名称 + * @return boolean + */ + public boolean bulkSave(String index, List> 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> list, String idField, String prefix) { + if (CollectionUtils.isEmpty(list)) { + return false; + } + try { + BulkRequest bulkRequest = new BulkRequest(); + for (Map 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> 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> 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> 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> 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> searchPageExecute(String index, QueryBuilder query, Integer pageNum, Integer pageSize, String sortField, Boolean desc) { + List 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 search(String index) { + return search(index, null); + } + + /** + * 查询 + * + * @param index 索引 + * @param query 查询条件 + * @return list + */ + public List search(String index, QueryBuilder query) { + return search(index, query, null, null); + } + + /** + * 查询 + * + * @param index 索引名称 + * @param sortField 排序字段 + * @param desc 是否倒序 + * @return list + */ + public List 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 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 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 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 searchExecute(String index, QueryBuilder query, String sortField, Boolean desc, Integer size) { + List 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 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 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 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 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 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> 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 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 + */ +public class ExcelUtils{ + + // 2007 版本以上 最大支持1048576行 + public final static String EXCEl_FILE_2007 = "2007"; + // 2003 版本 最大支持65536 行 + public final static String EXCEL_FILE_2003 = "2003"; + + /** + *

+ * 导出无头部标题行Excel
+ * 时间格式默认:yyyy-MM-dd hh:mm:ss
+ *

+ * + * @param title 表格标题 + * @param dataset 数据集合 + * @param version 2003 或者 2007,不传时默认生成2003版本 + */ + public void exportExcel(String title, String sheetName, Collection 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"); + } + } + + /** + *

+ * 导出带有头部标题行的Excel
+ * 时间格式默认:yyyy-MM-dd hh:mm:ss
+ *

+ * + * @param title 表格标题 + * @param headers 头部标题集合 + * @param dataset 数据集合 + * @param out 输出流 + * @param version 2003 或者 2007,不传时默认生成2003版本 + */ + public void exportExcel(String title, String sheetName,String[] headers, Collection 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"); + } + } + + /** + *

+ * 通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中
+ * 此版本生成2007以上版本的文件 (文件后缀:xlsx) + *

+ * + * @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 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 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; + } + + + + /** + *

+ * 通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中
+ * 此方法生成2003版本的excel,文件名后缀:xls
+ *

+ * + * @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 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 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 post(String uri, JSONObject header, JSONObject body, Integer timeout) { + Map 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 postLogin(String uri, JSONObject header, JSONObject body, Integer timeout) { + + Map 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 post(String uri, JSONObject header, String body, Integer timeout) { + Map 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 get(String uri, JSONObject header, JSONObject body) { + return get(uri, header, body, null); + } + + /** + * get请求 + * + * @param uri + * @param body + */ + public static Map get(String uri, JSONObject header, JSONObject body, Integer timeout) { + Map 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 httpPut(String uri, JSONObject header, String body, Integer timeout) { + Map 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 { + + private final Map map; + + public MapUtils(){ + this.map = new LinkedHashMap<>(); + } + + public MapUtils(Map map){ + this.map = map; + } + + public static MapUtils create(){ + return new MapUtils<>(new LinkedHashMap<>()); + } + + public MapUtils put(K key, V value){ + this.map.put(key, value); + return this; + } + + public Map build(){ + return map; + } + +// public static void main(String[] args) { +// //默认格式 +// Map map1 = MapUtils.create().put("name", "nicai").build(); +// //自定义格式 +// Map map2 = new MapUtils().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 boolean isNull(Collection collection){ + return collection == null || collection.isEmpty(); + } + + public static boolean isNotNull(Collection 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 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 stringObjectMapUtils = new MapUtils<>(); + MapUtils 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 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 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 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 list = new ArrayList(); + list.add(order1); + list.add(order2); + list.add(order3); + + Map> map = list.stream().collect(Collectors.groupingBy(ord -> ord.getOrderId())); + log.info("分组之后得到的结果是=={}", map); + + } + + // Map 转list + @Test + public void convertMapToList() { + Map map = new HashMap<>(); + map.put("1", "AAAA"); + map.put("2", "BBBB"); + map.put("3", "CCCC"); + map.put("4", "DDDD"); + map.put("5", "EEEE"); + List 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 list = Arrays.asList(str.split(",")); + List 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 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 collect = pr.stream() + .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getName() + f.getAge()))), ArrayList::new)); + // System.out.println(collect); + + Map 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 map = new HashMap<>(); + map.put(1, "美好的周一"); + map.put(2, "美好的周二"); + map.put(3, "美好的周三"); + + Set> 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 strings = new ArrayList<>(Arrays.asList(arr)); + arr[2] = "4"; + System.out.println(strings.toString()); + Iterator 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 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 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 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 minutes; + private List hours; + private List weekdays; + } + + // 获取cron未来10次 运行的时间 + @Test + public void getTimes() { + List 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 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 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 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 minutes, List hours, List 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 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 initArray(Integer num) { + List result = Lists.newArrayListWithCapacity(num); + for (int i = 0; i <= num; i++) { + result.add(i); + } + return result; + } + + private List getInitMinutes() { + return this.initArray(59); + } + + private List getInitHours() { + return this.initArray(23); + } + + private List getInitWeekdays() { + return this.initArray(7).subList(1, 8); + } + + @Data + public static class CustomCronField { + private List minutes; + private List hours; + private List 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 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 list = new ArrayList(); + 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 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 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{ + 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 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.11.RELEASE + + + com.xkcoding.component + springbootcomponent + 0.0.1-SNAPSHOT + springbootcomponent + Demo project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + 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 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.5.3 + + + com.example + disconf + 0.0.1-SNAPSHOT + disconf + Demo project for Spring Boot + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.baidu.disconf + disconf-client + 2.6.30 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + 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 @@ + + + + + + + + + + + + + + + + + classpath*:autoconfig.properties + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + \ 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 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 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 getAllMember() { + // 这里构造一些测试数据,具体业务场景可从数据库等其他地方获取 + List 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 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 { + + 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 typedAggregation = Aggregation.newAggregation(Zips.class, + groupOperation, matchOperation,sortOperation); + //调对应的api获取结果 + //执行聚合操作,如果不使用 Map,也可以使用自定义的实体类来接收数据 + AggregationResults aggregationResults = mongoTemplate + .aggregate(typedAggregation, Map.class); + // 取出最终结果 + List 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 typedAggregation = Aggregation.newAggregation(Zips.class, + groupOperation, groupOperation2,sortOperation); + + //执行聚合操作,如果不使用 Map,也可以使用自定义的实体类来接收数据 + AggregationResults aggregationResults = mongoTemplate + .aggregate(typedAggregation, Map.class); + // 取出最终结果 + List 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 typedAggregation = Aggregation.newAggregation(Zips.class, + groupOperation, sortOperation,groupOperation2,projectionOperation, + sortOperation2); + + //执行聚合操作,如果不使用 Map,也可以使用自定义的实体类来接收数据 + AggregationResults aggregationResults = mongoTemplate + .aggregate(typedAggregation, Map.class); + // 取出最终结果 + List 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 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 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 consumerRecords = consumer.poll(Duration.ofMillis(t2)); + if (consumerRecords.isEmpty()) { + lock.wait(); + continue; + } + boolean timed = false; + for (ConsumerRecord 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 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 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>() { + @Override + public void onFailure(Throwable ex) { + System.out.println("发送消息失败:" + ex.getMessage()); + } + + @Override + public void onSuccess(SendResult 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 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 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 kafkaTemplate; + private AdminClient adminClient; + + @PostConstruct + private void initAdminClient() { + Map props = new HashMap<>(1); + props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092"); + adminClient = KafkaAdminClient.create(props); + } + + + + /** + * 新增topic,支持批量 + */ + public CreateTopicsResult createTopic(Collection newTopics) { + return adminClient.createTopics(newTopics); + } + + /** + * 删除topic,支持批量 + */ + public void deleteTopic(Collection topics) { + adminClient.deleteTopics(topics); + } + + /** + * 获取指定topic的信息 + */ + public String getTopicInfo(Collection topics) { + AtomicReference 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 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>() { + @Override + public void onFailure(Throwable ex) { + System.out.println("发送消息失败:" + ex.getMessage()); + } + + @Override + public void onSuccess(SendResult 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 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.10.RELEASE + + + com.myself.demo + original + 0.0.1-SNAPSHOT + original + Demo project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + org.projectlombok + lombok + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + 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 paramList=new ArrayList<>(); + List 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 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.11 + + + com.example.export + demo + 0.0.1-SNAPSHOT + demo + Demo project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + com.deepoove + poi-tl + 1.8.2 + + + com.alibaba + fastjson + 1.2.56 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + 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 redisTemplate(RedisConnectionFactory factory) { + RedisTemplate template = new RedisTemplate<>(); + RedisSerializer 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 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 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.11 + + + com.example.toolclass + toolclass + 0.0.1-SNAPSHOT + toolclass + Demo project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + 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 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.5.0 + + + 4.0.0 + + spring-boot-springsecurity + + + 8 + 8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-security + + + + + 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 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.11 + + + com.uyun.anltic + anlticdubbo + 0.0.1-SNAPSHOT + anlticdubbo + Demo project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + 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 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; + +/** + *
+ *     基于concurrentHash的本地缓存工具类
+ *     缓存删除基于timer定时器
+ * 
+ * @author hejianfeng
+ * @date 2019/10/5
+ * @param
+ * @return
+ * 
+ * 修改记录
+ * 版本号      修订日期        修改人     bug编号       修改内容
+ * 1.0.0      2019/10/5      hejianfeng                      新建
+ * 
+ */ +@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 map; + + private static final Timer timer; + + static { + map = new ConcurrentHashMap<>(DEFAULT_CAPACITY); + timer = new Timer(); + } + + //私有化构造方法 + private CacheUtil() { + + } + + /** + *
+     *     缓存任务清除类
+     * 
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param
+     * @return
+     * 
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * 
+ */ + static class ClearTask extends TimerTask { + private String key; + + public ClearTask(String key) { + this.key = key; + } + + @Override + public void run() { + CacheUtil.remove(key); + } + + } + + //==================缓存的增删改查 + + /** + *
+     *     添加缓存
+     * 
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param
+     * @param
+     * @return void
+     * 
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * 
+ */ + 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 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; + } + + /** + *
+     *     添加缓存
+     * 
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param key
+     * @param object
+     * @param time_out  :缓存过期时间:单位秒
+     * @return void
+     * 
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * 
+ */ + 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; + } + + + /** + *
+     *     判断容量大小
+     * 
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param
+     * @return boolean
+     * 
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * 
+ */ + public static boolean checkCapacity() { + return map.size() < MAX_CAPACITY; + } + + /** + *
+     *     批量增加缓存
+     * 
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param m
+     * @param time_out
+     * @return void
+     * 
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * 
+ */ + public static boolean put(Map 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; + } + + /** + *
+     *     删除缓存
+     * 
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param key
+     * @return void
+     * 
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * 
+ */ + public static void remove(String key) { + map.remove(key); + } + + /** + *
+     *     清除所有缓存
+     * 
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param
+     * @return void
+     * 
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * 
+ */ + public void clearAll() { + if (map.size() > 0) { + map.clear(); + } + timer.cancel(); + } + + /** + *
+     *     获取缓存
+     * 
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param key
+     * @return java.lang.Object
+     * 
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * 
+ */ + public static Object get(String key) { + return map.get(key); + } + + /** + *
+     *     是否包含某个缓存
+     * 
+     * @author hejianfeng
+     * @date 2019/10/5
+     * @param key
+     * @return boolean
+     * 
+     * 修改记录
+     * 版本号      修订日期        修改人     bug编号       修改内容
+     * 1.0.0      2019/10/5      hejianfeng                      新建
+     * 
+ */ + public static boolean isContain(String key) { + return map.contains(key); + } + + + public static void main(String[] args) { + /* Map 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 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 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: + *