From c33644a788d68444a2f8e9ec829c9faa8b813d8b Mon Sep 17 00:00:00 2001 From: test Date: Wed, 1 May 2024 14:32:28 +0800 Subject: [PATCH] Default Changelist --- .idea/.gitignore | 8 + .idea/compiler.xml | 21 + .idea/encodings.xml | 9 + .idea/inspectionProfiles/Project_Default.xml | 82 ++ .idea/jarRepositories.xml | 20 + .idea/misc.xml | 14 + .idea/uiDesigner.xml | 124 +++ .idea/vcs.xml | 6 + bwie-54.iml | 2 + common/pom.xml | 63 ++ common/src/main/java/com/bwie/Student.java | 23 + .../src/main/java/com/bwie/pojo/BillDao.java | 23 + .../src/main/java/com/bwie/pojo/Details.java | 28 + common/src/main/java/com/bwie/pojo/Main.java | 32 + common/src/main/java/com/bwie/pojo/Stort.java | 32 + common/src/main/java/com/bwie/pojo/User.java | 32 + .../java/com/bwie/pojo/requery/Voednit.java | 36 + .../src/main/java/com/bwie/pojo/util/R.java | 28 + .../classes/META-INF/common.kotlin_module | Bin 0 -> 16 bytes common/target/classes/com/bwie/Student.class | Bin 0 -> 2339 bytes .../classes/com/bwie/pojo/BillDao.class | Bin 0 -> 2640 bytes .../classes/com/bwie/pojo/Details.class | Bin 0 -> 3244 bytes .../target/classes/com/bwie/pojo/Main.class | Bin 0 -> 3594 bytes .../target/classes/com/bwie/pojo/Stort.class | Bin 0 -> 3640 bytes .../target/classes/com/bwie/pojo/User.class | Bin 0 -> 3197 bytes .../com/bwie/pojo/requery/Voednit.class | Bin 0 -> 4088 bytes .../target/classes/com/bwie/pojo/util/R.class | Bin 0 -> 2904 bytes modules/pom.xml | 197 +++++ modules/src/main/java/com/bw/MapperApp.java | 13 + modules/src/main/java/com/bw/Tese.java | 166 ++++ .../java/com/bw/config/BloomFilterUtil.java | 72 ++ .../main/java/com/bw/config/FastConfig.java | 20 + .../src/main/java/com/bw/config/FastUtil.java | 56 ++ .../com/bw/config/Knife4jConfiguration.java | 45 + .../main/java/com/bw/config/QuartzConfig.java | 38 + .../java/com/bw/config/QuartzConfig2.java | 38 + .../main/java/com/bw/config/RedisConfig.java | 43 + .../java/com/bw/config/RedissonConfig.java | 33 + .../main/java/com/bw/config/WebMvcConfig.java | 67 ++ .../com/bw/controller/GetailsController.java | 21 + .../com/bw/controller/StortController.java | 20 + .../com/bw/controller/StudentController.java | 31 + .../com/bw/controller/UserController.java | 27 + .../src/main/java/com/bw/dao/GetailsDao.java | 11 + .../src/main/java/com/bw/dao/StortDao.java | 10 + .../src/main/java/com/bw/dao/StudentDao.java | 14 + modules/src/main/java/com/bw/dao/UserDao.java | 13 + .../java/com/bw/service/GetailsService.java | 9 + .../java/com/bw/service/StortService.java | 9 + .../java/com/bw/service/StudentService.java | 12 + .../main/java/com/bw/service/UserService.java | 12 + .../bw/service/impl/GetailsServiceImpl.java | 22 + .../com/bw/service/impl/StortServiceImpl.java | 23 + .../bw/service/impl/StudentServiceImpl.java | 36 + .../com/bw/service/impl/UserServiceImpl.java | 35 + .../java/com/bw/util/AliyunOssConfig.java | 32 + .../src/main/java/com/bw/util/HttpPost.java | 74 ++ .../src/main/java/com/bw/util/HttpUtils.java | 311 +++++++ .../com/bw/util/ImageVerificationCode.java | 137 +++ .../main/java/com/bw/util/JwtConstants.java | 34 + .../src/main/java/com/bw/util/JwtUtils.java | 108 +++ .../src/main/java/com/bw/util/Md5Utils.java | 55 ++ .../src/main/java/com/bw/util/MsgUtil.java | 40 + .../java/com/bw/util/core/date/DateUtils.java | 137 +++ .../bw/util/core/reflect/ReflectUtils.java | 386 +++++++++ .../com/bw/util/core/spring/SpringUtils.java | 106 +++ .../com/bw/util/core/text/CharsetKit.java | 78 ++ .../java/com/bw/util/core/text/Convert.java | 818 ++++++++++++++++++ .../main/java/com/bw/util/poi/ExcelUtil.java | 787 +++++++++++++++++ .../com/bw/util/poi/annotation/Excel.java | 122 +++ .../com/bw/util/poi/annotation/Excels.java | 18 + .../bw/util/poi/exception/PoiException.java | 27 + modules/src/main/resources/application.yml | 102 +++ .../src/main/resources/mapper/GomMapper.xml | 14 + .../src/main/resources/mapper/SpanMapper.xml | 14 + .../main/resources/mapper/StudentMapper.xml | 20 + .../src/main/resources/mapper/XXXMapper.xml | 19 + .../classes/META-INF/modules.kotlin_module | Bin 0 -> 16 bytes modules/target/classes/application.yml | 102 +++ modules/target/classes/com/bw/MapperApp.class | Bin 0 -> 798 bytes modules/target/classes/com/bw/Tese.class | Bin 0 -> 3659 bytes .../config/BloomFilterUtil$SimpleHash.class | Bin 0 -> 893 bytes .../com/bw/config/BloomFilterUtil.class | Bin 0 -> 1648 bytes .../classes/com/bw/config/FastConfig.class | Bin 0 -> 540 bytes .../classes/com/bw/config/FastUtil.class | Bin 0 -> 2581 bytes .../com/bw/config/Knife4jConfiguration.class | Bin 0 -> 2585 bytes .../classes/com/bw/config/RedisConfig.class | Bin 0 -> 3141 bytes .../com/bw/config/RedissonConfig.class | Bin 0 -> 1274 bytes .../com/bw/controller/GetailsController.class | Bin 0 -> 884 bytes .../com/bw/controller/StortController.class | Bin 0 -> 866 bytes .../com/bw/controller/StudentController.class | Bin 0 -> 1505 bytes .../com/bw/controller/UserController.class | Bin 0 -> 1194 bytes .../classes/com/bw/dao/GetailsDao.class | Bin 0 -> 221 bytes .../target/classes/com/bw/dao/StortDao.class | Bin 0 -> 213 bytes .../classes/com/bw/dao/StudentDao.class | Bin 0 -> 352 bytes .../target/classes/com/bw/dao/UserDao.class | Bin 0 -> 307 bytes .../com/bw/service/GetailsService.class | Bin 0 -> 173 bytes .../classes/com/bw/service/StortService.class | Bin 0 -> 167 bytes .../com/bw/service/StudentService.class | Bin 0 -> 351 bytes .../classes/com/bw/service/UserService.class | Bin 0 -> 264 bytes .../bw/service/impl/GetailsServiceImpl.class | Bin 0 -> 1053 bytes .../bw/service/impl/StortServiceImpl.class | Bin 0 -> 1035 bytes .../bw/service/impl/StudentServiceImpl.class | Bin 0 -> 2071 bytes .../com/bw/service/impl/UserServiceImpl.class | Bin 0 -> 1530 bytes .../classes/com/bw/util/AliyunOssConfig.class | Bin 0 -> 1081 bytes .../target/classes/com/bw/util/HttpPost.class | Bin 0 -> 3029 bytes .../classes/com/bw/util/HttpUtils$1.class | Bin 0 -> 962 bytes .../classes/com/bw/util/HttpUtils.class | Bin 0 -> 10204 bytes .../com/bw/util/ImageVerificationCode.class | Bin 0 -> 3452 bytes .../classes/com/bw/util/JwtConstants.class | Bin 0 -> 610 bytes .../target/classes/com/bw/util/JwtUtils.class | Bin 0 -> 2841 bytes .../target/classes/com/bw/util/Md5Utils.class | Bin 0 -> 1936 bytes .../target/classes/com/bw/util/MsgUtil.class | Bin 0 -> 1977 bytes .../com/bw/util/core/date/DateUtils.class | Bin 0 -> 3920 bytes .../bw/util/core/reflect/ReflectUtils.class | Bin 0 -> 10821 bytes .../com/bw/util/core/spring/SpringUtils.class | Bin 0 -> 2476 bytes .../com/bw/util/core/text/CharsetKit.class | Bin 0 -> 1889 bytes .../com/bw/util/core/text/Convert.class | Bin 0 -> 14220 bytes .../classes/com/bw/util/poi/ExcelUtil.class | Bin 0 -> 26443 bytes .../poi/annotation/Excel$ColumnType.class | Bin 0 -> 1390 bytes .../bw/util/poi/annotation/Excel$Type.class | Bin 0 -> 1394 bytes .../com/bw/util/poi/annotation/Excel.class | Bin 0 -> 1387 bytes .../com/bw/util/poi/annotation/Excels.class | Bin 0 -> 439 bytes .../bw/util/poi/exception/PoiException.class | Bin 0 -> 804 bytes modules/target/classes/mapper/GomMapper.xml | 14 + modules/target/classes/mapper/SpanMapper.xml | 14 + .../target/classes/mapper/StudentMapper.xml | 20 + modules/target/classes/mapper/XXXMapper.xml | 19 + pom.xml | 33 + 129 files changed, 5317 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 bwie-54.iml create mode 100644 common/pom.xml create mode 100644 common/src/main/java/com/bwie/Student.java create mode 100644 common/src/main/java/com/bwie/pojo/BillDao.java create mode 100644 common/src/main/java/com/bwie/pojo/Details.java create mode 100644 common/src/main/java/com/bwie/pojo/Main.java create mode 100644 common/src/main/java/com/bwie/pojo/Stort.java create mode 100644 common/src/main/java/com/bwie/pojo/User.java create mode 100644 common/src/main/java/com/bwie/pojo/requery/Voednit.java create mode 100644 common/src/main/java/com/bwie/pojo/util/R.java create mode 100644 common/target/classes/META-INF/common.kotlin_module create mode 100644 common/target/classes/com/bwie/Student.class create mode 100644 common/target/classes/com/bwie/pojo/BillDao.class create mode 100644 common/target/classes/com/bwie/pojo/Details.class create mode 100644 common/target/classes/com/bwie/pojo/Main.class create mode 100644 common/target/classes/com/bwie/pojo/Stort.class create mode 100644 common/target/classes/com/bwie/pojo/User.class create mode 100644 common/target/classes/com/bwie/pojo/requery/Voednit.class create mode 100644 common/target/classes/com/bwie/pojo/util/R.class create mode 100644 modules/pom.xml create mode 100644 modules/src/main/java/com/bw/MapperApp.java create mode 100644 modules/src/main/java/com/bw/Tese.java create mode 100644 modules/src/main/java/com/bw/config/BloomFilterUtil.java create mode 100644 modules/src/main/java/com/bw/config/FastConfig.java create mode 100644 modules/src/main/java/com/bw/config/FastUtil.java create mode 100644 modules/src/main/java/com/bw/config/Knife4jConfiguration.java create mode 100644 modules/src/main/java/com/bw/config/QuartzConfig.java create mode 100644 modules/src/main/java/com/bw/config/QuartzConfig2.java create mode 100644 modules/src/main/java/com/bw/config/RedisConfig.java create mode 100644 modules/src/main/java/com/bw/config/RedissonConfig.java create mode 100644 modules/src/main/java/com/bw/config/WebMvcConfig.java create mode 100644 modules/src/main/java/com/bw/controller/GetailsController.java create mode 100644 modules/src/main/java/com/bw/controller/StortController.java create mode 100644 modules/src/main/java/com/bw/controller/StudentController.java create mode 100644 modules/src/main/java/com/bw/controller/UserController.java create mode 100644 modules/src/main/java/com/bw/dao/GetailsDao.java create mode 100644 modules/src/main/java/com/bw/dao/StortDao.java create mode 100644 modules/src/main/java/com/bw/dao/StudentDao.java create mode 100644 modules/src/main/java/com/bw/dao/UserDao.java create mode 100644 modules/src/main/java/com/bw/service/GetailsService.java create mode 100644 modules/src/main/java/com/bw/service/StortService.java create mode 100644 modules/src/main/java/com/bw/service/StudentService.java create mode 100644 modules/src/main/java/com/bw/service/UserService.java create mode 100644 modules/src/main/java/com/bw/service/impl/GetailsServiceImpl.java create mode 100644 modules/src/main/java/com/bw/service/impl/StortServiceImpl.java create mode 100644 modules/src/main/java/com/bw/service/impl/StudentServiceImpl.java create mode 100644 modules/src/main/java/com/bw/service/impl/UserServiceImpl.java create mode 100644 modules/src/main/java/com/bw/util/AliyunOssConfig.java create mode 100644 modules/src/main/java/com/bw/util/HttpPost.java create mode 100644 modules/src/main/java/com/bw/util/HttpUtils.java create mode 100644 modules/src/main/java/com/bw/util/ImageVerificationCode.java create mode 100644 modules/src/main/java/com/bw/util/JwtConstants.java create mode 100644 modules/src/main/java/com/bw/util/JwtUtils.java create mode 100644 modules/src/main/java/com/bw/util/Md5Utils.java create mode 100644 modules/src/main/java/com/bw/util/MsgUtil.java create mode 100644 modules/src/main/java/com/bw/util/core/date/DateUtils.java create mode 100644 modules/src/main/java/com/bw/util/core/reflect/ReflectUtils.java create mode 100644 modules/src/main/java/com/bw/util/core/spring/SpringUtils.java create mode 100644 modules/src/main/java/com/bw/util/core/text/CharsetKit.java create mode 100644 modules/src/main/java/com/bw/util/core/text/Convert.java create mode 100644 modules/src/main/java/com/bw/util/poi/ExcelUtil.java create mode 100644 modules/src/main/java/com/bw/util/poi/annotation/Excel.java create mode 100644 modules/src/main/java/com/bw/util/poi/annotation/Excels.java create mode 100644 modules/src/main/java/com/bw/util/poi/exception/PoiException.java create mode 100644 modules/src/main/resources/application.yml create mode 100644 modules/src/main/resources/mapper/GomMapper.xml create mode 100644 modules/src/main/resources/mapper/SpanMapper.xml create mode 100644 modules/src/main/resources/mapper/StudentMapper.xml create mode 100644 modules/src/main/resources/mapper/XXXMapper.xml create mode 100644 modules/target/classes/META-INF/modules.kotlin_module create mode 100644 modules/target/classes/application.yml create mode 100644 modules/target/classes/com/bw/MapperApp.class create mode 100644 modules/target/classes/com/bw/Tese.class create mode 100644 modules/target/classes/com/bw/config/BloomFilterUtil$SimpleHash.class create mode 100644 modules/target/classes/com/bw/config/BloomFilterUtil.class create mode 100644 modules/target/classes/com/bw/config/FastConfig.class create mode 100644 modules/target/classes/com/bw/config/FastUtil.class create mode 100644 modules/target/classes/com/bw/config/Knife4jConfiguration.class create mode 100644 modules/target/classes/com/bw/config/RedisConfig.class create mode 100644 modules/target/classes/com/bw/config/RedissonConfig.class create mode 100644 modules/target/classes/com/bw/controller/GetailsController.class create mode 100644 modules/target/classes/com/bw/controller/StortController.class create mode 100644 modules/target/classes/com/bw/controller/StudentController.class create mode 100644 modules/target/classes/com/bw/controller/UserController.class create mode 100644 modules/target/classes/com/bw/dao/GetailsDao.class create mode 100644 modules/target/classes/com/bw/dao/StortDao.class create mode 100644 modules/target/classes/com/bw/dao/StudentDao.class create mode 100644 modules/target/classes/com/bw/dao/UserDao.class create mode 100644 modules/target/classes/com/bw/service/GetailsService.class create mode 100644 modules/target/classes/com/bw/service/StortService.class create mode 100644 modules/target/classes/com/bw/service/StudentService.class create mode 100644 modules/target/classes/com/bw/service/UserService.class create mode 100644 modules/target/classes/com/bw/service/impl/GetailsServiceImpl.class create mode 100644 modules/target/classes/com/bw/service/impl/StortServiceImpl.class create mode 100644 modules/target/classes/com/bw/service/impl/StudentServiceImpl.class create mode 100644 modules/target/classes/com/bw/service/impl/UserServiceImpl.class create mode 100644 modules/target/classes/com/bw/util/AliyunOssConfig.class create mode 100644 modules/target/classes/com/bw/util/HttpPost.class create mode 100644 modules/target/classes/com/bw/util/HttpUtils$1.class create mode 100644 modules/target/classes/com/bw/util/HttpUtils.class create mode 100644 modules/target/classes/com/bw/util/ImageVerificationCode.class create mode 100644 modules/target/classes/com/bw/util/JwtConstants.class create mode 100644 modules/target/classes/com/bw/util/JwtUtils.class create mode 100644 modules/target/classes/com/bw/util/Md5Utils.class create mode 100644 modules/target/classes/com/bw/util/MsgUtil.class create mode 100644 modules/target/classes/com/bw/util/core/date/DateUtils.class create mode 100644 modules/target/classes/com/bw/util/core/reflect/ReflectUtils.class create mode 100644 modules/target/classes/com/bw/util/core/spring/SpringUtils.class create mode 100644 modules/target/classes/com/bw/util/core/text/CharsetKit.class create mode 100644 modules/target/classes/com/bw/util/core/text/Convert.class create mode 100644 modules/target/classes/com/bw/util/poi/ExcelUtil.class create mode 100644 modules/target/classes/com/bw/util/poi/annotation/Excel$ColumnType.class create mode 100644 modules/target/classes/com/bw/util/poi/annotation/Excel$Type.class create mode 100644 modules/target/classes/com/bw/util/poi/annotation/Excel.class create mode 100644 modules/target/classes/com/bw/util/poi/annotation/Excels.class create mode 100644 modules/target/classes/com/bw/util/poi/exception/PoiException.class create mode 100644 modules/target/classes/mapper/GomMapper.xml create mode 100644 modules/target/classes/mapper/SpanMapper.xml create mode 100644 modules/target/classes/mapper/StudentMapper.xml create mode 100644 modules/target/classes/mapper/XXXMapper.xml create mode 100644 pom.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..73f69e0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b5f4730 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..14f8dbd --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..5c39b13 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,82 @@ + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..5a2f139 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..c41fdfb --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/bwie-54.iml b/bwie-54.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/bwie-54.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 0000000..b21337e --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,63 @@ + + + + bwie-54 + org.example + 1.0-SNAPSHOT + + 4.0.0 + + common + + + + + com.alibaba + fastjson + 1.2.79 + + + org.projectlombok + lombok + + + + org.apache.httpcomponents + httpcore + 4.4.12 + + + org.apache.httpcomponents + httpclient + 4.5.13 + + + + + com.alibaba + druid-spring-boot-starter + 1.1.10 + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.3.1 + + + commons-lang + commons-lang + 2.6 + + + com.fasterxml.jackson.core + jackson-annotations + + + + + + + + \ No newline at end of file diff --git a/common/src/main/java/com/bwie/Student.java b/common/src/main/java/com/bwie/Student.java new file mode 100644 index 0000000..59283d6 --- /dev/null +++ b/common/src/main/java/com/bwie/Student.java @@ -0,0 +1,23 @@ +package com.bwie; + +import lombok.Data; + +@Data +public class Student { + /** + * 编号 + */ + private Integer id; + /** + * 姓名 + */ + private String name; + /** + * 年龄 + */ + private Integer age; + + + + +} diff --git a/common/src/main/java/com/bwie/pojo/BillDao.java b/common/src/main/java/com/bwie/pojo/BillDao.java new file mode 100644 index 0000000..ccbfa36 --- /dev/null +++ b/common/src/main/java/com/bwie/pojo/BillDao.java @@ -0,0 +1,23 @@ +package com.bwie.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BillDao { + /** + * 账单编号 + */ + private Integer billid; + /** + * 账单时间 + */ + private String billDate; + /** + * 账单金额 + */ + private String billMonery; +} diff --git a/common/src/main/java/com/bwie/pojo/Details.java b/common/src/main/java/com/bwie/pojo/Details.java new file mode 100644 index 0000000..092a3fb --- /dev/null +++ b/common/src/main/java/com/bwie/pojo/Details.java @@ -0,0 +1,28 @@ +package com.bwie.pojo; + +import lombok.Data; + +@Data +public class Details { + /** + * 门店详情编号 + */ + private Integer ids; + /** + * 门店详情名称 + */ + private String names; + /** + * 门店详情特色 + */ + private String feature; + /** + * 门店详情手机号 + */ + private String phone; + /** + * 门店详情时间 + */ + private String tiemes; + +} diff --git a/common/src/main/java/com/bwie/pojo/Main.java b/common/src/main/java/com/bwie/pojo/Main.java new file mode 100644 index 0000000..3d8d16c --- /dev/null +++ b/common/src/main/java/com/bwie/pojo/Main.java @@ -0,0 +1,32 @@ +package com.bwie.pojo; + +import lombok.Data; +import org.springframework.jdbc.CannotGetJdbcConnectionException; +@Data +public class Main { + /** + * 用户编号 + */ + private Integer id; + /** + * 用户名称 + */ + private String name; + /** + * 用户价格 + */ + private Integer age; + /** + * 用户地方名 + */ + private String city; + + /** + * 用户地方区 + */ + private String state; + /** + * 用户的Ip + */ + private String zip; +} diff --git a/common/src/main/java/com/bwie/pojo/Stort.java b/common/src/main/java/com/bwie/pojo/Stort.java new file mode 100644 index 0000000..e314761 --- /dev/null +++ b/common/src/main/java/com/bwie/pojo/Stort.java @@ -0,0 +1,32 @@ +package com.bwie.pojo; + +import lombok.Data; + +@Data +public class Stort { + /** + * 门店编号 + */ + private Integer id; + /** + * 门店名称 + */ + private String name; + /** + * 门店地址 + */ + private String address; + /** + * 门店电话 + */ + private String phone; + /** + * 门店商品价格 + */ + private Integer price; + /** + * 门店营业时间 + */ + private String time; + +} diff --git a/common/src/main/java/com/bwie/pojo/User.java b/common/src/main/java/com/bwie/pojo/User.java new file mode 100644 index 0000000..9448a96 --- /dev/null +++ b/common/src/main/java/com/bwie/pojo/User.java @@ -0,0 +1,32 @@ +package com.bwie.pojo; + +import lombok.Data; + +import javax.annotation.PostConstruct; +@Data +public class User { + /** + * 用户编号 + */ + private Integer uid; + /** + * 用户名称 + */ + private String userName; + /** + * 密码 + */ + private String pwd; + /** + * 用户年龄 + */ + private Integer sex; + /** + * 用户生日 + */ + private String time; + + + + +} diff --git a/common/src/main/java/com/bwie/pojo/requery/Voednit.java b/common/src/main/java/com/bwie/pojo/requery/Voednit.java new file mode 100644 index 0000000..af580da --- /dev/null +++ b/common/src/main/java/com/bwie/pojo/requery/Voednit.java @@ -0,0 +1,36 @@ +package com.bwie.pojo.requery; + +import lombok.Data; + +@Data +public class Voednit { + /** + * 商品编号 + */ + private Integer id; + /** + * 商品名称 + */ + private String name; + /** + * 商品品牌 + */ + private String pname; + /** + * 商品介绍 + */ + private String mname; + /** + * 商品价格 + */ + private Integer price; + /** + * 商品数量 + */ + private Integer pwd; + /** + * 商品支付金额 + */ + private Integer prices; + +} diff --git a/common/src/main/java/com/bwie/pojo/util/R.java b/common/src/main/java/com/bwie/pojo/util/R.java new file mode 100644 index 0000000..ad49b94 --- /dev/null +++ b/common/src/main/java/com/bwie/pojo/util/R.java @@ -0,0 +1,28 @@ +package com.bwie.pojo.util; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class R { + private Integer code; + private Object data; + private String msg; + + + + public R(Integer code, String msg) { + this.code = code; + this.msg = msg; + } + + public R(Integer code, Object data) { + this.code = code; + this.data = data; + } +} diff --git a/common/target/classes/META-INF/common.kotlin_module b/common/target/classes/META-INF/common.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..a49347afef10a9b5f95305e1058ba36adec7d6dd GIT binary patch literal 16 RcmZQzU|?ooU|@t|0RRA102TlM literal 0 HcmV?d00001 diff --git a/common/target/classes/com/bwie/Student.class b/common/target/classes/com/bwie/Student.class new file mode 100644 index 0000000000000000000000000000000000000000..712c716c97382231471f3eeca7e1ee00b11448c3 GIT binary patch literal 2339 zcma)7ZBrXn6n-|@w}geJX#=F9qEZC{O29g+OI+MBg+;g9E?sK1W_U5mDe)$c+3?3wr!Eyoy zK9pfahL0@VN^)M6VNC$*V%?TuLzW*~*i6E~vW+d7@5pf1#8DlE99n{p#H6*ucje5~r@};OwRIUrsI}TpLh=V~4IT%LP!8r_3 z+wRgjn8gJLuj35|(_+0T))>w^n8Un=p_4vTXWnS|m6FKR7o9flm*yROj{7ovLHVXe zg(hRosZsK#p-njW0Oxu9Nj4=rLGJ#(SEbm~y(-(*A|1!GBRlY|`u;B-ukl07@bir$ zCZf=ai7w$xX*l;m6U{ij%vGMV#@U#B0`12T_6kQ+Iq@oOC$dMG9JDDS$IjrN5c{Dk zIN39plJ^LXcLxvj3}(@K1nb?w>7K!FVVqhB?E>c*XLB<5Gh)3jJ*W^+mli=pO$`%_ zGc+zzTudU@D`oseQ%YfuQx1nIr+Ty0Uo@rE_&DXcFeUq4vDB_`PVfScbCci0(2sI| z!1xYE{3!Q3jJ2uBCd_b2!&;x>P|&CUL|;~aiqnU1rn7nzb_Fz6{$NE2Jr(WdEGWZsk*oZNHygn|| z7iSrYc$=1vWi0WJ>!SQO;eEVA%S46fcWGIuv+v)dW#bCZ%)znjzcFCp>N5;lDDY=% z&oHdaM7!B4d!B;o@{~knze+~ZNrosX7m5AnBC3&$B3SZ=L|=kI#odF6)JTr1Bt1AonLPb)ZbeZdQSg(0!}sHI}?~UCxox2-fSH3Ww%vt$XE_ z`*pv((Yo6zOOOj*i}44dkUGWTT|qlZW+G50&&_V0qho#29A8q%R{dbTwYuQ7y?cJ( zx0%L3WT%6T^jb!-#4r<~;%Jut?UvV|`7VQND|h``Fg<=-LA7?18(k@wtzg}6Gp?|3 zQka%PxuLdm%ycewT7%tdtr+S6;*7FgNUX{%243x(s<#mm&lU@t!>M`Ai;_JXVcpwY z*R@NIjn6T;h3j+Gi_D&~)%G{H8i9h{Nh=jfI)i~wjzc*?OS470v-M^@m{p)lGFRzk zG;W!m@*NAa?v9;B%`IqX_Om5U6lhV^JMsdi+VdPyLL7s)^+f6RcV8X>qIO?J( z(rY;3;-oAUu+bG5-#|3tD6mm@0X~xAezLez-3pjC1w8F*=8$_Qp zA3UpZ7w2$-E!T~pdw>ji8ykL;RWJ2&6L;G_CZd#>?Jj)WY|q8xIH$)5$4wFmVT)2i z2n%;|#@&SyZn(b8Q<=NsZWexp`ZJ0j2~ep9~J+E zQJpC4zzmNRtg91TDn{vV4CIX`IPef|DR1n+juB49B*dv$c~daf6XYHulQ;8L4=7c! z2})I*ye%Ln0@-;d1{sf-P;wvt%R12x{|`{YB)@C~-?QzG^FvOej<={wqJSFSrexqU zF5wg<6IFbOcPLqC5Isf7Mw_ksE+q%=F=i32?fi>D8}C2GsEyP7IqE46YcbU;#$_*& zP(vm}RQ5B>NIJiw|L!c98yB^iIW)i@XutI8q#am8zKG73&fjIe9a@I@+J=SsgHR;ZrkbNGmo8IpM))-x&$lBpC4gi_B4@17H)7=alBVvMm{ z6~U|?SQoihOEA;q(A3=F4pUX+Zt8ao+c+)ufIkB literal 0 HcmV?d00001 diff --git a/common/target/classes/com/bwie/pojo/Details.class b/common/target/classes/com/bwie/pojo/Details.class new file mode 100644 index 0000000000000000000000000000000000000000..0adf895ca13ab22a8b8fd98e273bb9abd3d2c784 GIT binary patch literal 3244 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 literal 0 HcmV?d00001 diff --git a/common/target/classes/com/bwie/pojo/requery/Voednit.class b/common/target/classes/com/bwie/pojo/requery/Voednit.class new file mode 100644 index 0000000000000000000000000000000000000000..660868d595fde980c193ea62772f82f6cb4a3eb8 GIT binary patch literal 4088 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 W7lYl?Z(qXKOq`j*$F!cp<$nQb3(h_O literal 0 HcmV?d00001 diff --git a/modules/pom.xml b/modules/pom.xml new file mode 100644 index 0000000..0005065 --- /dev/null +++ b/modules/pom.xml @@ -0,0 +1,197 @@ + + + + bwie-54 + org.example + 1.0-SNAPSHOT + + 4.0.0 + + modules + + + + + org.example + common + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-data-redis + + + io.lettuce + lettuce-core + + + + + redis.clients + jedis + + + org.redisson + redisson + 3.16.0 + + + + org.apache.httpcomponents + httpcore + 4.4.12 + + + org.apache.httpcomponents + httpclient + 4.5.13 + + + + + org.apache.poi + poi + 3.17 + + + + org.apache.poi + poi-ooxml + 3.17 + + + org.apache.poi + poi-ooxml-schemas + 3.17 + + + org.apache.commons + commons-lang3 + 3.12.0 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + com.alibaba + druid-spring-boot-starter + 1.2.8 + + + + + + + + + javax.servlet + javax.servlet-api + provided + + + + mysql + mysql-connector-java + 8.0.11 + runtime + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.2.2 + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.4.1 + + + + commons-lang + commons-lang + 2.6 + + + + com.alibaba + fastjson + 1.2.79 + + + + org.springframework.boot + spring-boot-starter-mail + + + + + com.aliyun.oss + aliyun-sdk-oss + 3.10.2 + + + + com.github.xiaoymin + knife4j-spring-boot-starter + 2.0.9 + + + + io.jsonwebtoken + jjwt + 0.6.0 + + + + + org.springframework.boot + spring-boot-starter-quartz + + + + + + com.github.tobato + fastdfs-client + 1.26.5 + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + com.google.guava + guava + 27.0.1-jre + + + + + + + \ No newline at end of file diff --git a/modules/src/main/java/com/bw/MapperApp.java b/modules/src/main/java/com/bw/MapperApp.java new file mode 100644 index 0000000..14cfe61 --- /dev/null +++ b/modules/src/main/java/com/bw/MapperApp.java @@ -0,0 +1,13 @@ +package com.bw; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@MapperScan("com.bw.dao") +public class MapperApp { + public static void main(String[] args) { + SpringApplication.run(MapperApp.class); + } +} diff --git a/modules/src/main/java/com/bw/Tese.java b/modules/src/main/java/com/bw/Tese.java new file mode 100644 index 0000000..1ea556f --- /dev/null +++ b/modules/src/main/java/com/bw/Tese.java @@ -0,0 +1,166 @@ +package com.bw; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.bwie.pojo.BillDao; +import com.bwie.pojo.Main; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.JsonObject; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Tese { + public static void main(String[] args) throws JsonProcessingException { + //创建map对象 + Map personMap= new HashMap<>(); + personMap.put("name","张三"); + personMap.put("age",25); + //完成输出对象操作 + System.out.println(personMap); + //创建map对象并且提供数据 + Map addressMap= new HashMap<>(); + addressMap.put("city","上海"); + addressMap.put("state","奉贤"); + addressMap.put("zip","10001"); + System.out.println(addressMap); + //创建李四用户信息 + Map filetMap= new HashMap<>(); + filetMap.put("name","李四"); + filetMap.put("age",27); + System.out.println(filetMap); + //地址信息 + MapendMap= new HashMap<>(); + endMap.put("city","上海"); + endMap.put("state","虹桥"); + endMap.put("zip","10002"); + System.out.println(endMap); + //创建王五用户信息 + MaphasMap= new HashMap<>(); + hasMap.put("name","王五"); + hasMap.put("age",24); + //输出 + System.out.println(hasMap); + //所在的地址信息 + MapsentMap= new HashMap<>(); + sentMap.put("city","杭州"); + sentMap.put("state","西湖"); + sentMap.put("zip","20001"); + //创建信息 + System.out.println(sentMap); + //创建ArrayList对象 + List> fiendsList= new ArrayList<>(); + //查找friends对象 + personMap.put("friends",fiendsList); + //创建ObjectMapper对象 + String jsonStringFromMap= new ObjectMapper().writeValueAsString(personMap); + //创建完成并且生成数据 + System.out.println(jsonStringFromMap); + //创建张三的JSON对象信息 + JSONObject personJSON= new JSONObject(); + personJSON.put("name","张三"); + personJSON.put("age",25); + System.out.println(personJSON); + JSONObject addressJSON= new JSONObject(); + addressJSON.put("city","上海"); + addressJSON.put("zip","10001"); + addressJSON.put("state","奉贤"); + personJSON.put("address",addressJSON); + //创建李四的JSON对象的信息参数 + JSONObject fileJSON= new JSONObject(); + fileJSON.put("name","李四"); + fileJSON.put("age","27"); + System.out.println(fileJSON); + JSONObject endJSON= new JSONObject(); + endJSON.put("city","上海"); + endJSON.put("state","虹桥"); + endJSON.put("zip","10002"); + System.out.println(endJSON); + //创建王五的对象信息参数 + JSONObject hasJSON= new JSONObject(); + hasJSON.put("name","王五"); + hasJSON.put("age",24); + System.out.println(hasJSON); + JSONObject sentJSON= new JSONObject(); + sentJSON.put("city","杭州"); + sentJSON.put("state","西湖"); + sentJSON.put("zip","20001"); + System.out.println(sentJSON); + //调用张三对象的信息以及它的参数信息 + JSONArray friendsArray = new JSONArray(); + personJSON.put("friends", friendsArray); + System.out.println(personJSON.toString()); + //调用李四的对象的信息参数以及他的地址信息 + JSONArray friendArray = new JSONArray(); + fileJSON.put("friends",friendArray); + System.out.println(fileJSON.toString()); + //调用王五的参数信息对象以及他的地址信息 + JSONArray frientArray = new JSONArray(); + hasJSON.put("friends",frientArray); + System.out.println(hasJSON.toString()); + + //创建用户张三对象信息 + Main main = new Main(); + main.setId(1); + main.setName("张三"); + main.setAge(25); + main.setCity("上海"); + main.setState("奉贤"); + main.setZip("10001"); + System.out.println(main); + //创建用户李四的对象信息 + Main main1 = new Main(); + main1.setId(2); + main1.setName("李四"); + main1.setAge(27); + main1.setCity("上海"); + main1.setState("虹桥"); + main1.setZip("10002"); + System.out.println(main1); + //创建用户王五的对象信息 + Main main2 = new Main(); + main2.setId(3); + main2.setName("王五"); + main2.setAge(24); + main2.setCity("杭州"); + main2.setState("西湖"); + main2.setZip("20001"); + System.out.println(main2); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } +} diff --git a/modules/src/main/java/com/bw/config/BloomFilterUtil.java b/modules/src/main/java/com/bw/config/BloomFilterUtil.java new file mode 100644 index 0000000..147fdf5 --- /dev/null +++ b/modules/src/main/java/com/bw/config/BloomFilterUtil.java @@ -0,0 +1,72 @@ +package com.bw.config; + + +import org.springframework.stereotype.Component; + +import java.util.BitSet; + +/** + * @BelongsProject: month-10a + * @BelongsPackage: com.bw.config + * @Author: zhupengfei + * @CreateTime: 2023-03-09 14:44 + */ +@Component +public class BloomFilterUtil { + private static final int DEFAULT_SIZE = 2 << 24; // 布隆过滤器的比特长度 + private static final int[] seeds = new int[] {7, 11, 13, 31,37, 61}; // 这里要选取质数,能很好的降低错误率 + + private BitSet bits = new BitSet(DEFAULT_SIZE); + private SimpleHash[] func = new SimpleHash[seeds.length]; + +// public static void main(String[] args) { +// String value = "crankzcool@gmail.com"; +// BloomFilterUtil filter = new BloomFilterUtil(); +// System.out.println(filter.contains(value)); +// filter.add(value); +// System.out.println(filter.contains(value)); +// } + + public BloomFilterUtil() { + for (int i = 0; i < seeds.length; i++) { + func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]); + } + } + + public void add(String value) { + for (SimpleHash f: func) { + bits.set(f.hash(value), true); + } + } + + public boolean contains(String value) { + if (value == null) { + return false; + } + boolean ret = true; + for (SimpleHash f : func) { + ret = ret && bits.get(f.hash(value)); + } + return ret; + } + public static class SimpleHash { + private int cap; + private int seed; + + public SimpleHash(int cap, int seed) { + this.cap = cap; + this.seed = seed; + } + + public int hash(String value) { + int result = 0; + int len = value.length(); + for (int i = 0; i < len; i++) { + result = seed * result + value.charAt(i); + } + return (cap - 1) & result; + } + } + + +} diff --git a/modules/src/main/java/com/bw/config/FastConfig.java b/modules/src/main/java/com/bw/config/FastConfig.java new file mode 100644 index 0000000..34cfd90 --- /dev/null +++ b/modules/src/main/java/com/bw/config/FastConfig.java @@ -0,0 +1,20 @@ +package com.bw.config; + +import com.github.tobato.fastdfs.FdfsClientConfig; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableMBeanExport; +import org.springframework.context.annotation.Import; +import org.springframework.jmx.support.RegistrationPolicy; + +/** + * @BelongsProject: demo02 + * @BelongsPackage: com.bw.config + * @Author: zhupengfei + * @CreateTime: 2022-12-16 14:37 + */ +@Configuration +// 解决 jmx 重复注册 bean 的问题 +@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING) +public class FastConfig { + +} diff --git a/modules/src/main/java/com/bw/config/FastUtil.java b/modules/src/main/java/com/bw/config/FastUtil.java new file mode 100644 index 0000000..8a09d65 --- /dev/null +++ b/modules/src/main/java/com/bw/config/FastUtil.java @@ -0,0 +1,56 @@ +package com.bw.config; + +import org.springframework.stereotype.Component; +import com.github.tobato.fastdfs.domain.fdfs.StorePath; +import com.github.tobato.fastdfs.service.FastFileStorageClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; + +/** + * @BelongsProject: 0107day02 + * @BelongsPackage: com.bw.config + * @Author: zhupengfei + * @CreateTime: 2023-02-01 08:52 + */ +@Component +public class FastUtil { + private static final Logger log = LoggerFactory.getLogger(FastUtil.class); + + @Resource + private FastFileStorageClient storageClient ; + + /** + * 上传文件 + */ + public String upload(MultipartFile multipartFile) throws Exception{ + String originalFilename = multipartFile.getOriginalFilename(). + substring(multipartFile.getOriginalFilename(). + lastIndexOf(".") + 1); + StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage( + multipartFile.getInputStream(), + multipartFile.getSize(),originalFilename , null); + return storePath.getFullPath() ; + } + /** + * 删除文件 + */ + public String deleteFile(String fileUrl) { + if (StringUtils.isEmpty(fileUrl)) { + log.info("fileUrl == >>文件路径为空..."); + return "文件路径不能为空"; + } + try { + StorePath storePath = StorePath.parseFromUrl(fileUrl); + storageClient.deleteFile(storePath.getGroup(), storePath.getPath()); + } catch (Exception e) { + log.error(e.getMessage()); + } + return "删除成功"; + } + +} diff --git a/modules/src/main/java/com/bw/config/Knife4jConfiguration.java b/modules/src/main/java/com/bw/config/Knife4jConfiguration.java new file mode 100644 index 0000000..e3c7da5 --- /dev/null +++ b/modules/src/main/java/com/bw/config/Knife4jConfiguration.java @@ -0,0 +1,45 @@ +package com.bw.config; + + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; + +/** + * @BelongsProject: demo02 + * @BelongsPackage: com.bw.handler + * @Author: zhupengfei + * @CreateTime: 2022-12-11 14:17 + */ +@Configuration +@EnableSwagger2WebMvc +public class Knife4jConfiguration { + + @Bean(value = "defaultApi2") + public Docket defaultApi2() { + Docket docket = new Docket(DocumentationType.SWAGGER_2) + .apiInfo(new ApiInfoBuilder() + .title("测试==demo") + .description("# swagger-bootstrap-ui-demo RESTful APIs") + .termsOfServiceUrl("http://www.xx.com/") + .contact(new Contact("玉面小白龙", "", "123@qq.com")) + .version("1.0") + .build()) + //分组名称 + .groupName("2.X版本") + .select() + //这里指定文档Controller层扫描包路径 + .apis(RequestHandlerSelectors.basePackage("com.bw.controller")) + .paths(PathSelectors.any()) + .build(); + return docket; + + } +} diff --git a/modules/src/main/java/com/bw/config/QuartzConfig.java b/modules/src/main/java/com/bw/config/QuartzConfig.java new file mode 100644 index 0000000..4aa520c --- /dev/null +++ b/modules/src/main/java/com/bw/config/QuartzConfig.java @@ -0,0 +1,38 @@ +//package com.bw.config; +// +//import com.bw.job.MyJob; +//import com.bw.job.MyJob2; +//import org.quartz.*; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +// +///** +// * @BelongsProject: demo02 +// * @BelongsPackage: com.bw.config +// * @Author: zhupengfei +// * @CreateTime: 2022-12-22 14:59 +// */ +////把当前类定义为 一个配置文件类 +//@Configuration +//public class QuartzConfig { +// @Bean +// public JobDetail downloadDetail() { +// return JobBuilder.newJob(MyJob.class) //具体任务类 +// .withIdentity("downloadJobDetail") +// .usingJobData("job_download","download movie") +// .storeDurably() +// .build(); +// } +// //构建 Trigger 及 Scheduler +// @Bean +// public Trigger downloadTrigger() { +// return TriggerBuilder.newTrigger() +// .forJob(downloadDetail()) //关联上面的 jobDetail +// .withIdentity("downloadTrigger") +// .usingJobData("trigger_download","download") +// //cron 表达式设置每隔 15 秒执行一次 +// .withSchedule(CronScheduleBuilder.cronSchedule("*/15 * * * * ?")) +// .build(); +// } +// +//} diff --git a/modules/src/main/java/com/bw/config/QuartzConfig2.java b/modules/src/main/java/com/bw/config/QuartzConfig2.java new file mode 100644 index 0000000..4b8741a --- /dev/null +++ b/modules/src/main/java/com/bw/config/QuartzConfig2.java @@ -0,0 +1,38 @@ +//package com.bw.config; +// +//import com.bw.job.MyJob; +//import com.bw.job.MyJob2; +//import org.quartz.*; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +// +///** +// * @BelongsProject: demo02 +// * @BelongsPackage: com.bw.config +// * @Author: zhupengfei +// * @CreateTime: 2022-12-22 14:59 +// */ +////把当前类定义为 一个配置文件类 +//@Configuration +//public class QuartzConfig2 { +// @Bean +// public JobDetail downloadDetail2() { +// return JobBuilder.newJob(MyJob2.class) //具体任务类 +// .withIdentity("downloadJobDetail2") +// .usingJobData("job_download","download movie") +// .storeDurably() +// .build(); +// } +// //构建 Trigger 及 Scheduler +// @Bean +// public Trigger downloadTrigger2() { +// return TriggerBuilder.newTrigger() +// .forJob(downloadDetail2()) //关联上面的 jobDetail +// .withIdentity("downloadTrigger2") +// .usingJobData("trigger_download","download") +// //cron 表达式设置每隔 5 秒执行一次 +// .withSchedule(CronScheduleBuilder.cronSchedule("*/30 * * * * ?")) +// .build(); +// } +// +//} diff --git a/modules/src/main/java/com/bw/config/RedisConfig.java b/modules/src/main/java/com/bw/config/RedisConfig.java new file mode 100644 index 0000000..851b886 --- /dev/null +++ b/modules/src/main/java/com/bw/config/RedisConfig.java @@ -0,0 +1,43 @@ +package com.bw.config; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +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.StringRedisSerializer; + +@Configuration +public class RedisConfig { + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + + + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(factory); + 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); + + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + // key采用String的序列化方式 + template.setKeySerializer(stringRedisSerializer); + // hash的key也采用String的序列化方式 + template.setHashKeySerializer(stringRedisSerializer); + // value序列化方式采用jackson + template.setValueSerializer(jackson2JsonRedisSerializer); + // hash的value序列化方式采用jackson + template.setHashValueSerializer(jackson2JsonRedisSerializer); + template.afterPropertiesSet(); + + return template; + } +} diff --git a/modules/src/main/java/com/bw/config/RedissonConfig.java b/modules/src/main/java/com/bw/config/RedissonConfig.java new file mode 100644 index 0000000..a9264ba --- /dev/null +++ b/modules/src/main/java/com/bw/config/RedissonConfig.java @@ -0,0 +1,33 @@ +package com.bw.config; + +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.io.IOException; + +/** + * @BelongsProject: demo02 + * @BelongsPackage: com.bw.config + * @Author: zhupengfei + * @CreateTime: 2022-12-24 09:26 + */ + +@Configuration +public class RedissonConfig { + + @Bean(destroyMethod="shutdown") // 服务停止后调用 shutdown 方法。 + public RedissonClient redisson() throws IOException { + System.out.println("配置类初始加载......"); + // 1.创建配置 + Config config = new Config(); + // 集群模式 + // config.useClusterServers().addNodeAddress("127.0.0.1:6379", "127.0.0.1:6378"); + // 2.根据 Config 创建出 RedissonClient 实例。 + config.useSingleServer().setAddress("redis://127.0.0.1:6379"); + return Redisson.create(config); + } + +} diff --git a/modules/src/main/java/com/bw/config/WebMvcConfig.java b/modules/src/main/java/com/bw/config/WebMvcConfig.java new file mode 100644 index 0000000..8f8f598 --- /dev/null +++ b/modules/src/main/java/com/bw/config/WebMvcConfig.java @@ -0,0 +1,67 @@ +//package com.bw.config; +// +//import com.bw.interceptor.MyInterceptor; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.web.cors.CorsConfiguration; +//import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +//import org.springframework.web.filter.CorsFilter; +//import org.springframework.web.servlet.config.annotation.CorsRegistry; +//import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +//import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +// +///** +// * @BelongsProject: 0107day02 +// * @BelongsPackage: com.bw.config +// * @Author: zhupengfei +// * @CreateTime: 2023-02-01 08:51 +// */ +//@Configuration +//public class WebMvcConfig implements WebMvcConfigurer { +// +// @Autowired +// private MyInterceptor myIntercepter; +// //全局路由 +// @Override +// public void addCorsMappings(CorsRegistry registry) { +// registry.addMapping("/**") +// //.allowedOrigins("*") //注意这个变动项,这个是旧版 +// .allowedOriginPatterns("*")//这个才是新版的要求 +// .allowedMethods("GET","HEAD","POST","PUT","DELETE","OPTIONS") +// .allowCredentials(true) +// .maxAge(3600) +// .allowedHeaders("*"); +// } +// +// +// /** +// * 静态资源 +// * @author: zhupengfei +// * @param: [registry] +// * @return: void +// **/ +// @Override +// public void addResourceHandlers(ResourceHandlerRegistry registry) { +// registry +// .addResourceHandler("/static/**") +// .addResourceLocations("classpath:/static/"); +// } +// +// /** +// * 拦截器 +// * @author: zhupengfei +// * @param: [registry] +// * @return: void +// **/ +// +// @Override +// public void addInterceptors(InterceptorRegistry registry) { +// registry.addInterceptor(myIntercepter) +// .addPathPatterns("/**") +// .excludePathPatterns("/admin/*","/admin/*/*" +// ,"/doc.html","/swagger-resources" +// ); +// } +//} diff --git a/modules/src/main/java/com/bw/controller/GetailsController.java b/modules/src/main/java/com/bw/controller/GetailsController.java new file mode 100644 index 0000000..678abcc --- /dev/null +++ b/modules/src/main/java/com/bw/controller/GetailsController.java @@ -0,0 +1,21 @@ +package com.bw.controller; + +import com.bw.service.GetailsService; +import com.bwie.pojo.util.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/getails") +public class GetailsController { + @Autowired + private GetailsService getailsService; + + + @PostMapping("/GetailsList") + public R GetailsList(){ + return getailsService.GetailsList(); + } +} diff --git a/modules/src/main/java/com/bw/controller/StortController.java b/modules/src/main/java/com/bw/controller/StortController.java new file mode 100644 index 0000000..406233f --- /dev/null +++ b/modules/src/main/java/com/bw/controller/StortController.java @@ -0,0 +1,20 @@ +package com.bw.controller; + +import com.bw.service.StortService; +import com.bwie.pojo.util.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/stort") +public class StortController { + @Autowired + private StortService stortService; + + @PostMapping("/StortList") + public R StortList(){ + return stortService.StortList(); + } +} diff --git a/modules/src/main/java/com/bw/controller/StudentController.java b/modules/src/main/java/com/bw/controller/StudentController.java new file mode 100644 index 0000000..dd74e41 --- /dev/null +++ b/modules/src/main/java/com/bw/controller/StudentController.java @@ -0,0 +1,31 @@ +package com.bw.controller; + +import com.bw.service.StudentService; +import com.bwie.Student; +import com.bwie.pojo.util.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/student") +public class StudentController { + @Autowired + private StudentService studentService; + //查询 + @PostMapping("/StudentList") + public R StudentList(){ + return studentService.StudentList(); + } + //添加 + @PostMapping("/add") + public R add(@RequestBody Student student){ + return studentService.add(student); + } + //删除 + @PostMapping("/delect") + public R select(@PathVariable Integer id){ + return studentService.delect(id); + } + + +} diff --git a/modules/src/main/java/com/bw/controller/UserController.java b/modules/src/main/java/com/bw/controller/UserController.java new file mode 100644 index 0000000..52ee74e --- /dev/null +++ b/modules/src/main/java/com/bw/controller/UserController.java @@ -0,0 +1,27 @@ +package com.bw.controller; + +import com.bw.service.UserService; +import com.bwie.pojo.User; +import com.bwie.pojo.util.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/user") +public class UserController { + @Autowired + private UserService userService; + @PostMapping("/UserList") + public R UserList(){ + return userService.UserList(); + } + @PostMapping("/login") + public R login(@RequestBody User user){ + return userService.login(user); + } + + +} diff --git a/modules/src/main/java/com/bw/dao/GetailsDao.java b/modules/src/main/java/com/bw/dao/GetailsDao.java new file mode 100644 index 0000000..e765cac --- /dev/null +++ b/modules/src/main/java/com/bw/dao/GetailsDao.java @@ -0,0 +1,11 @@ +package com.bw.dao; + +import com.bwie.pojo.Details; + +import java.util.List; + +public interface GetailsDao { + + + List
GetailsList(); +} diff --git a/modules/src/main/java/com/bw/dao/StortDao.java b/modules/src/main/java/com/bw/dao/StortDao.java new file mode 100644 index 0000000..a41c7b1 --- /dev/null +++ b/modules/src/main/java/com/bw/dao/StortDao.java @@ -0,0 +1,10 @@ +package com.bw.dao; + +import com.bwie.pojo.Stort; + +import java.util.List; + +public interface StortDao { + + List StortList(); +} diff --git a/modules/src/main/java/com/bw/dao/StudentDao.java b/modules/src/main/java/com/bw/dao/StudentDao.java new file mode 100644 index 0000000..810a3cd --- /dev/null +++ b/modules/src/main/java/com/bw/dao/StudentDao.java @@ -0,0 +1,14 @@ +package com.bw.dao; + +import com.bwie.Student; + +import java.util.List; + +public interface StudentDao { + List StudentList(); + + int add(Student student); + + int delect(Integer id); + +} diff --git a/modules/src/main/java/com/bw/dao/UserDao.java b/modules/src/main/java/com/bw/dao/UserDao.java new file mode 100644 index 0000000..dc991de --- /dev/null +++ b/modules/src/main/java/com/bw/dao/UserDao.java @@ -0,0 +1,13 @@ +package com.bw.dao; + +import com.bwie.pojo.User; + +import java.util.List; + +public interface UserDao { + User login(User user); + + + List UserList(); + +} diff --git a/modules/src/main/java/com/bw/service/GetailsService.java b/modules/src/main/java/com/bw/service/GetailsService.java new file mode 100644 index 0000000..07b83fd --- /dev/null +++ b/modules/src/main/java/com/bw/service/GetailsService.java @@ -0,0 +1,9 @@ +package com.bw.service; + +import com.bwie.pojo.util.R; + +public interface GetailsService { + + + R GetailsList(); +} diff --git a/modules/src/main/java/com/bw/service/StortService.java b/modules/src/main/java/com/bw/service/StortService.java new file mode 100644 index 0000000..5d6ae20 --- /dev/null +++ b/modules/src/main/java/com/bw/service/StortService.java @@ -0,0 +1,9 @@ +package com.bw.service; + +import com.bwie.pojo.util.R; + +public interface StortService { + + + R StortList(); +} diff --git a/modules/src/main/java/com/bw/service/StudentService.java b/modules/src/main/java/com/bw/service/StudentService.java new file mode 100644 index 0000000..37e805e --- /dev/null +++ b/modules/src/main/java/com/bw/service/StudentService.java @@ -0,0 +1,12 @@ +package com.bw.service; + +import com.bwie.Student; +import com.bwie.pojo.util.R; + +public interface StudentService { + R StudentList(); + + R add(Student student); + + R delect(Integer id); +} diff --git a/modules/src/main/java/com/bw/service/UserService.java b/modules/src/main/java/com/bw/service/UserService.java new file mode 100644 index 0000000..aae8d97 --- /dev/null +++ b/modules/src/main/java/com/bw/service/UserService.java @@ -0,0 +1,12 @@ +package com.bw.service; + +import com.bwie.pojo.User; +import com.bwie.pojo.util.R; + +public interface UserService { + R login(User user); + + + R UserList(); + +} diff --git a/modules/src/main/java/com/bw/service/impl/GetailsServiceImpl.java b/modules/src/main/java/com/bw/service/impl/GetailsServiceImpl.java new file mode 100644 index 0000000..b79762c --- /dev/null +++ b/modules/src/main/java/com/bw/service/impl/GetailsServiceImpl.java @@ -0,0 +1,22 @@ +package com.bw.service.impl; + +import com.bw.dao.GetailsDao; +import com.bw.service.GetailsService; +import com.bwie.pojo.Details; +import com.bwie.pojo.util.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class GetailsServiceImpl implements GetailsService { + @Autowired + private GetailsDao getailsDao; + + @Override + public R GetailsList() { + List
list=getailsDao.GetailsList(); + return new R(200,list,"成功"); + } +} diff --git a/modules/src/main/java/com/bw/service/impl/StortServiceImpl.java b/modules/src/main/java/com/bw/service/impl/StortServiceImpl.java new file mode 100644 index 0000000..9c40cc9 --- /dev/null +++ b/modules/src/main/java/com/bw/service/impl/StortServiceImpl.java @@ -0,0 +1,23 @@ +package com.bw.service.impl; + +import com.bw.dao.StortDao; +import com.bw.service.StortService; +import com.bwie.pojo.Stort; +import com.bwie.pojo.util.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class StortServiceImpl implements StortService { + @Autowired + private StortDao stortDao; + + + @Override + public R StortList() { + List list=stortDao.StortList(); + return new R(200,list,"成功"); + } +} diff --git a/modules/src/main/java/com/bw/service/impl/StudentServiceImpl.java b/modules/src/main/java/com/bw/service/impl/StudentServiceImpl.java new file mode 100644 index 0000000..c44dcc0 --- /dev/null +++ b/modules/src/main/java/com/bw/service/impl/StudentServiceImpl.java @@ -0,0 +1,36 @@ +package com.bw.service.impl; + +import com.bw.dao.StudentDao; +import com.bw.service.StudentService; +import com.bwie.Student; +import com.bwie.pojo.util.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class StudentServiceImpl implements StudentService { + @Autowired + private StudentDao studentDao; + @Override + public R StudentList() { + List list=studentDao.StudentList(); + return new R(200,list,"成功"); + } + + @Override + public R add(Student student) { + if(student.getId()!=null && student.getId()<0){ + int i=studentDao.add(student); + return new R(i>0?200:500,i>0?"添加成功":"添加失败"); + } + return null; + } + + @Override + public R delect(Integer id) { + int i=studentDao.delect(id); + return new R(i>0?200:500,i>0?"删除成功":"删除失败"); + } +} diff --git a/modules/src/main/java/com/bw/service/impl/UserServiceImpl.java b/modules/src/main/java/com/bw/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..a47a65d --- /dev/null +++ b/modules/src/main/java/com/bw/service/impl/UserServiceImpl.java @@ -0,0 +1,35 @@ +package com.bw.service.impl; + +import com.bw.dao.UserDao; +import com.bw.service.UserService; +import com.bwie.pojo.User; +import com.bwie.pojo.util.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class UserServiceImpl implements UserService { + @Autowired + private UserDao userDao; + @Override + public R login(User user) { + User user1=userDao.login(user); + if(user1==null){ + return new R(500,"登录失败"); + } + if(user1!=null){ + return new R(200,user1,"登录成功"); + } + return new R(500,"密码错误"); + } + + @Override + public R UserList() { + List list=userDao.UserList(); + return new R(200,list,"成功"); + } + + +} diff --git a/modules/src/main/java/com/bw/util/AliyunOssConfig.java b/modules/src/main/java/com/bw/util/AliyunOssConfig.java new file mode 100644 index 0000000..5f75fab --- /dev/null +++ b/modules/src/main/java/com/bw/util/AliyunOssConfig.java @@ -0,0 +1,32 @@ +package com.bw.util; + +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class AliyunOssConfig { + + @Value("${aliyun.end-point}") + private String endPoint; + + + @Value("${aliyun.access-key-id}") + private String accessKeyId; + + @Value("${aliyun.access-key-secret}") + private String accesskeySecret; + + @Value("${aliyun.access-pre}") + private String accessPre; + + @Value("${aliyun.bucket-name}") + private String bucketName; + + + + public OSS getOssClient(){ + return new OSSClientBuilder().build(endPoint, accessKeyId, accesskeySecret); + } +} diff --git a/modules/src/main/java/com/bw/util/HttpPost.java b/modules/src/main/java/com/bw/util/HttpPost.java new file mode 100644 index 0000000..b022db6 --- /dev/null +++ b/modules/src/main/java/com/bw/util/HttpPost.java @@ -0,0 +1,74 @@ +package com.bw.util; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.*; +import java.util.Map.Entry; + +public class HttpPost { + public static void main(String[] args) { + //你的本地地址 配你的项目地址 这个是我电脑本地的地址 + String doGet = doGet("http://127.0.0.1:8081/sell/list"); + System.out.println("----------SSSS---DDS--S--"+doGet); + } + public static String doGet(String httpUrl){ + //链接 + HttpURLConnection connection=null; + + InputStream is=null; + BufferedReader br = null; + StringBuffer result=new StringBuffer(); + try { + //创建连接 + URL url=new URL(httpUrl); + connection= (HttpURLConnection) url.openConnection(); + //设置请求方式 + connection.setRequestMethod("GET"); + //设置连接超时时间 + connection.setConnectTimeout(15000); + //设置读取超时时间 + connection.setReadTimeout(15000); + + //开始连接 + connection.connect(); + //获取响应数据 + if(connection.getResponseCode()==200){ + //获取返回的数据 + is=connection.getInputStream(); + if(is!=null){ + br=new BufferedReader(new InputStreamReader(is,"UTF-8")); + String temp = null; + while ((temp=br.readLine())!=null){ + result.append(temp); + } + } + } + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + }finally { + if(br!=null){ + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if(is!=null){ + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + connection.disconnect();// 关闭远程连接 + } + return result.toString(); + } + + + +} diff --git a/modules/src/main/java/com/bw/util/HttpUtils.java b/modules/src/main/java/com/bw/util/HttpUtils.java new file mode 100644 index 0000000..fd9fc44 --- /dev/null +++ b/modules/src/main/java/com/bw/util/HttpUtils.java @@ -0,0 +1,311 @@ +package com.bw.util; + +import org.apache.commons.lang.StringUtils; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpDelete; +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.conn.ClientConnectionManager; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicNameValuePair; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class HttpUtils { + + /** + * get + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @return + * @throws Exception + */ + public static HttpResponse doGet(String host, String path, String method, + Map headers, + Map querys) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpGet request = new HttpGet(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + return httpClient.execute(request); + } + + /** + * post form + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param bodys + * @return + * @throws Exception + */ + public static HttpResponse doPost(String host, String path, String method, + Map headers, + Map querys, + Map bodys) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPost request = new HttpPost(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (bodys != null) { + List nameValuePairList = new ArrayList(); + + for (String key : bodys.keySet()) { + nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key))); + } + UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8"); + formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8"); + request.setEntity(formEntity); + } + + return httpClient.execute(request); + } + + /** + * Post String + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPost(String host, String path, String method, + Map headers, + Map querys, + String body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPost request = new HttpPost(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (StringUtils.isNotBlank(body)) { + request.setEntity(new StringEntity(body, "utf-8")); + } + + return httpClient.execute(request); + } + + /** + * Post stream + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPost(String host, String path, String method, + Map headers, + Map querys, + byte[] body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPost request = new HttpPost(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (body != null) { + request.setEntity(new ByteArrayEntity(body)); + } + + return httpClient.execute(request); + } + + /** + * Put String + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPut(String host, String path, String method, + Map headers, + Map querys, + String body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPut request = new HttpPut(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (StringUtils.isNotBlank(body)) { + request.setEntity(new StringEntity(body, "utf-8")); + } + + return httpClient.execute(request); + } + + /** + * Put stream + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPut(String host, String path, String method, + Map headers, + Map querys, + byte[] body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPut request = new HttpPut(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (body != null) { + request.setEntity(new ByteArrayEntity(body)); + } + + return httpClient.execute(request); + } + + /** + * Delete + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @return + * @throws Exception + */ + public static HttpResponse doDelete(String host, String path, String method, + Map headers, + Map querys) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpDelete request = new HttpDelete(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + return httpClient.execute(request); + } + + private static String buildUrl(String host, String path, Map querys) throws UnsupportedEncodingException { + StringBuilder sbUrl = new StringBuilder(); + sbUrl.append(host); + if (!StringUtils.isBlank(path)) { + sbUrl.append(path); + } + if (null != querys) { + StringBuilder sbQuery = new StringBuilder(); + for (Map.Entry query : querys.entrySet()) { + if (0 < sbQuery.length()) { + sbQuery.append("&"); + } + if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) { + sbQuery.append(query.getValue()); + } + if (!StringUtils.isBlank(query.getKey())) { + sbQuery.append(query.getKey()); + if (!StringUtils.isBlank(query.getValue())) { + sbQuery.append("="); + sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8")); + } + } + } + if (0 < sbQuery.length()) { + sbUrl.append("?").append(sbQuery); + } + } + + return sbUrl.toString(); + } + + private static HttpClient wrapClient(String host) { + HttpClient httpClient = new DefaultHttpClient(); + if (host.startsWith("https://")) { + sslClient(httpClient); + } + + return httpClient; + } + + private static void sslClient(HttpClient httpClient) { + try { + SSLContext ctx = SSLContext.getInstance("TLS"); + X509TrustManager tm = new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { + return null; + } + public void checkClientTrusted(X509Certificate[] xcs, String str) { + + } + public void checkServerTrusted(X509Certificate[] xcs, String str) { + + } + }; + ctx.init(null, new TrustManager[] { tm }, null); + SSLSocketFactory ssf = new SSLSocketFactory(ctx); + ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + ClientConnectionManager ccm = httpClient.getConnectionManager(); + SchemeRegistry registry = ccm.getSchemeRegistry(); + registry.register(new Scheme("https", 443, ssf)); + } catch (KeyManagementException ex) { + throw new RuntimeException(ex); + } catch (NoSuchAlgorithmException ex) { + throw new RuntimeException(ex); + } + } +} \ No newline at end of file diff --git a/modules/src/main/java/com/bw/util/ImageVerificationCode.java b/modules/src/main/java/com/bw/util/ImageVerificationCode.java new file mode 100644 index 0000000..c94c996 --- /dev/null +++ b/modules/src/main/java/com/bw/util/ImageVerificationCode.java @@ -0,0 +1,137 @@ +package com.bw.util; + +import org.springframework.stereotype.Component; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Random; + +import javax.imageio.ImageIO; + + +public class ImageVerificationCode { + + private int weight = 100; //验证码图片的长和宽 + private int height = 40; + private String text; //用来保存验证码的文本内容 + private Random r = new Random(); //获取随机数对象 + //private String[] fontNames = {"宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312"}; //字体数组 + //字体数组 + private String[] fontNames = {"Georgia"}; + //验证码数组 + // private String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ"; + private String codes = "123456780"; + /** + * 获取随机的颜色 + * + * @return + */ + private Color randomColor() { + int r = this.r.nextInt(225); //这里为什么是225,因为当r,g,b都为255时,即为白色,为了好辨认,需要颜色深一点。 + int g = this.r.nextInt(225); + int b = this.r.nextInt(225); + return new Color(r, g, b); //返回一个随机颜色 + } + + /** + * 获取随机字体 + * + * @return + */ + private Font randomFont() { + int index = r.nextInt(fontNames.length); //获取随机的字体 + String fontName = fontNames[index]; + int style = r.nextInt(4); //随机获取字体的样式,0是无样式,1是加粗,2是斜体,3是加粗加斜体 + int size = r.nextInt(10) + 24; //随机获取字体的大小 + return new Font(fontName, style, size); //返回一个随机的字体 + } + + /** + * 获取随机字符 + * + * @return + */ + private char randomChar() { + int index = r.nextInt(codes.length()); + return codes.charAt(index); + } + + /** + * 画干扰线,验证码干扰线用来防止计算机解析图片 + * + * @param image + */ + private void drawLine(BufferedImage image) { + int num = r.nextInt(10); //定义干扰线的数量 + Graphics2D g = (Graphics2D) image.getGraphics(); + for (int i = 0; i < num; i++) { + int x1 = r.nextInt(weight); + int y1 = r.nextInt(height); + int x2 = r.nextInt(weight); + int y2 = r.nextInt(height); + g.setColor(randomColor()); + g.drawLine(x1, y1, x2, y2); + } + } + + /** + * 创建图片的方法 + * + * @return + */ + private BufferedImage createImage() { + //创建图片缓冲区 + BufferedImage image = new BufferedImage(weight, height, BufferedImage.TYPE_INT_RGB); + //获取画笔 + Graphics2D g = (Graphics2D) image.getGraphics(); + //设置背景色随机 + g.setColor(new Color(255, 255, r.nextInt(245) + 10)); + g.fillRect(0, 0, weight, height); + //返回一个图片 + return image; + } + + /** + * 获取验证码图片的方法 + * + * @return + */ + public BufferedImage getImage() { + BufferedImage image = createImage(); + Graphics2D g = (Graphics2D) image.getGraphics(); //获取画笔 + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 4; i++) //画四个字符即可 + { + String s = randomChar() + ""; //随机生成字符,因为只有画字符串的方法,没有画字符的方法,所以需要将字符变成字符串再画 + sb.append(s); //添加到StringBuilder里面 + float x = i * 1.0F * weight / 4; //定义字符的x坐标 + g.setFont(randomFont()); //设置字体,随机 + g.setColor(randomColor()); //设置颜色,随机 + g.drawString(s, x, height - 5); + } + this.text = sb.toString(); + drawLine(image); + return image; + } + + /** + * 获取验证码文本的方法 + * + * @return + */ + public String getText() { + return text; + } + + public static void output(BufferedImage image, OutputStream out) throws IOException //将验证码图片写出的方法 + { + ImageIO.write(image, "JPEG", out); + } + +} diff --git a/modules/src/main/java/com/bw/util/JwtConstants.java b/modules/src/main/java/com/bw/util/JwtConstants.java new file mode 100644 index 0000000..c86144b --- /dev/null +++ b/modules/src/main/java/com/bw/util/JwtConstants.java @@ -0,0 +1,34 @@ +package com.bw.util; + +public class JwtConstants { + /** + * 用户ID字段 + */ + public static final String DETAILS_USER_ID = "user_id"; + + /** + * 用户名字段 + */ + public static final String DETAILS_USERNAME = "user_name"; + + /** + * 用户标识 + */ + public static final String USER_KEY = "user_key"; + + /** + * 令牌秘钥 + */ + public final static String SECRET = "abcdefghijklmnopqrstuvwxyz"; + + /** + * 手机 + */ + public static final String USER_PHONE = "user_phone"; + + + /** + * 用户token 的键的前缀 + */ + public static final String LOGIN_TOKEN = "login_token:"; +} diff --git a/modules/src/main/java/com/bw/util/JwtUtils.java b/modules/src/main/java/com/bw/util/JwtUtils.java new file mode 100644 index 0000000..1869f81 --- /dev/null +++ b/modules/src/main/java/com/bw/util/JwtUtils.java @@ -0,0 +1,108 @@ +package com.bw.util; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.util.Map; + +/** + * @description: Jwt工具类 + * @author DongZl + */ +public class JwtUtils { + + /** + * 秘钥 + */ + public static String secret = JwtConstants.SECRET; + + /** + * 从数据声明生成令牌 + * + * @param claims 数据声明 + * @return 令牌 + */ + public static String createToken(Map claims){ + String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact(); + return token; + } + + /** + * 从令牌中获取数据声明 + * + * @param token 令牌 + * @return 数据声明 + */ + public static Claims parseToken(String token){ + return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + } + /** + * 根据令牌获取用户标识 + * + * @param token 令牌 + * @return 用户ID + */ + public static String getUserKey(String token){ + Claims claims = parseToken(token); + return getValue(claims, JwtConstants.USER_KEY); + } + /** + * 根据令牌获取用户标识 + * + * @param claims 身份信息 + * @return 用户ID + */ + public static String getUserKey(Claims claims){ + return getValue(claims, JwtConstants.USER_KEY); + } + /** + * 根据令牌获取用户ID + * + * @param token 令牌 + * @return 用户ID + */ + public static String getUserId(String token){ + Claims claims = parseToken(token); + return getValue(claims, JwtConstants.DETAILS_USER_ID); + } + /** + * 根据身份信息获取用户ID + * + * @param claims 身份信息 + * @return 用户ID + */ + public static String getUserId(Claims claims){ + return getValue(claims, JwtConstants.DETAILS_USER_ID); + } + /** + * 根据令牌获取用户名 + * + * @param token 令牌 + * @return 用户名 + */ + public static String getUserName(String token){ + Claims claims = parseToken(token); + return getValue(claims, JwtConstants.DETAILS_USERNAME); + } + /** + * 根据身份信息获取用户名 + * + * @param claims 身份信息 + * @return 用户名 + */ + public static String getUserName(Claims claims){ + return getValue(claims, JwtConstants.DETAILS_USERNAME); + } + /** + * 根据身份信息获取键值 + * + * @param claims 身份信息 + * @param key 键 + * @return 值 + */ + public static String getValue(Claims claims, String key){ + Object obj = claims.get(key); + return obj == null ? "" : obj.toString(); + } +} diff --git a/modules/src/main/java/com/bw/util/Md5Utils.java b/modules/src/main/java/com/bw/util/Md5Utils.java new file mode 100644 index 0000000..82ddb8c --- /dev/null +++ b/modules/src/main/java/com/bw/util/Md5Utils.java @@ -0,0 +1,55 @@ +package com.bw.util; + +import java.security.MessageDigest; + +/** + * MD5工具类 + * @author 高州 + */ +public class Md5Utils { + /** + * 生成32位md5 + * + * @param str + * @return + */ + public static String string2Md5(String str) { + try { + MessageDigest md5 = MessageDigest.getInstance("MD5"); + char[] charArray = str.toCharArray(); + byte[] byteArray = new byte[charArray.length]; + for (int i = 0; i < charArray.length; i++) { + byteArray[i] = (byte) charArray[i]; + } + byte[] md5Bytes = md5.digest(byteArray); + StringBuffer hexValue = new StringBuffer(); + for (int i = 0; i < md5Bytes.length; i++) { + int val = ((int) md5Bytes[i]) & 0xff; + if (val < 16) { + hexValue.append("0"); + } + hexValue.append(Integer.toHexString(val)); + } + return hexValue.toString(); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } + + public static void main(String[] args) { + String md5 = string2Md5("111"); + System.out.println(md5); + } + + /** + * 生成16位md5 + * + * @param str + * @return + */ + public static String string2Md5_16(String str) { + String md5 = string2Md5(str); + return md5.substring(8, 24); + } +} diff --git a/modules/src/main/java/com/bw/util/MsgUtil.java b/modules/src/main/java/com/bw/util/MsgUtil.java new file mode 100644 index 0000000..0f67d30 --- /dev/null +++ b/modules/src/main/java/com/bw/util/MsgUtil.java @@ -0,0 +1,40 @@ +package com.bw.util; + + +import org.apache.http.HttpResponse; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author + * @version 1.0.0 + * @ClassName MsgUtil.java + * @Description TODO + * @createTime 2022年05月26日 15:49:00 + */ +public class MsgUtil { + + + public static void sendMsg(String phone,String code){ + String host = "http://dingxin.market.alicloudapi.com"; + String path = "/dx/sendSms"; + String method = "POST"; + String appcode = "dcb3dabebd3843a7a138901659ed112a"; + Map headers = new HashMap(); + headers.put("Authorization", "APPCODE " + appcode); + Map querys = new HashMap(); + querys.put("mobile", phone); + querys.put("param", "code:"+code); + querys.put("tpl_id", "TP1711063"); + Map bodys = new HashMap(); + + try { + + HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys); + System.out.println(response.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/modules/src/main/java/com/bw/util/core/date/DateUtils.java b/modules/src/main/java/com/bw/util/core/date/DateUtils.java new file mode 100644 index 0000000..9fd5e54 --- /dev/null +++ b/modules/src/main/java/com/bw/util/core/date/DateUtils.java @@ -0,0 +1,137 @@ +package com.bw.util.core.date; + +import org.apache.commons.lang3.time.DateFormatUtils; + +import java.io.File; +import java.lang.management.ManagementFactory; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 时间工具类 + * + * @author markGuo + */ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils +{ + public static String YYYY = "yyyy"; + + public static String YYYY_MM = "yyyy-MM"; + + public static String YYYY_MM_DD = "yyyy-MM-dd"; + + public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; + + public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + + private static String[] parsePatterns = { + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + + /** + * 获取当前Date型日期 + * + * @return Date() 当前日期 + */ + public static Date getNowDate() { + return new Date(); + } + + /** + * 获取当前日期, 默认格式为yyyy-MM-dd + * + * @return String + */ + public static String getDate() { + return dateTimeNow(YYYY_MM_DD); + } + + public static final String getTime() { + return dateTimeNow(YYYY_MM_DD_HH_MM_SS); + } + + public static final String dateTimeNow() { + return dateTimeNow(YYYYMMDDHHMMSS); + } + + public static final String dateTimeNow(final String format) { + return parseDateToStr(format, new Date()); + } + + public static final String dateTime(final Date date) { + return parseDateToStr(YYYY_MM_DD, date); + } + + public static final String parseDateToStr(final String format, final Date date) { + return new SimpleDateFormat(format).format(date); + } + + public static final Date dateTime(final String format, final String ts) { + try { + return new SimpleDateFormat(format).parse(ts); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + + /** + * 日期路径 即年/月/日 如2018/08/08 + */ + public static final String datePath() { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyy"+File.separator+"MM"+ File.separator +"dd"); + } + + /** + * 日期路径 即年/月/日 如20180808 + */ + public static final String dateTime() { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyyMMdd"); + } + + /** + * 日期型字符串转化为日期 格式 + */ + public static Date parseDate(Object str) { + if (str == null) { + return null; + } + try { + return parseDate(str.toString(), parsePatterns); + } catch (ParseException e) { + return null; + } + } + + /** + * 获取服务器启动时间 + */ + public static Date getServerStartDate() { + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + return new Date(time); + } + + /** + * 计算两个时间差 + */ + public static String getDatePoor(Date endDate, Date nowDate) { + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + // long ns = 1000; + // 获得两个时间的毫秒时间差异 + long diff = endDate.getTime() - nowDate.getTime(); + // 计算差多少天 + long day = diff / nd; + // 计算差多少小时 + long hour = diff % nd / nh; + // 计算差多少分钟 + long min = diff % nd % nh / nm; + // 计算差多少秒//输出结果 + // long sec = diff % nd % nh % nm / ns; + return day + "天" + hour + "小时" + min + "分钟"; + } +} diff --git a/modules/src/main/java/com/bw/util/core/reflect/ReflectUtils.java b/modules/src/main/java/com/bw/util/core/reflect/ReflectUtils.java new file mode 100644 index 0000000..98dda94 --- /dev/null +++ b/modules/src/main/java/com/bw/util/core/reflect/ReflectUtils.java @@ -0,0 +1,386 @@ +package com.bw.util.core.reflect; + +import com.bw.util.core.date.DateUtils; +import com.bw.util.core.text.Convert; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.*; +import java.util.Date; + +/** + * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. + * + * @author markGuo + */ +@SuppressWarnings("rawtypes") +public class ReflectUtils { + /** + * set方法前缀 + */ + private static final String SETTER_PREFIX = "set"; + + /** + * get方法前缀 + */ + private static final String GETTER_PREFIX = "get"; + + /** + * CGLIB 类分隔符 + */ + private static final String CGLIB_CLASS_SEPARATOR = "$$"; + + /** + * 日志 + */ + private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class); + + /** + * 调用Getter方法. + * 支持多级,如:对象名.对象名.方法 + * @param obj + * @param propertyName + * @param + * @return + */ + @SuppressWarnings("unchecked") + public static E invokeGetter(Object obj, String propertyName) { + Object object = obj; + for (String name : StringUtils.split(propertyName, ".")) { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + return (E) object; + } + + /** + * 调用Setter方法, 仅匹配方法名。 + * 支持多级,如:对象名.对象名.方法 + * @param obj + * @param propertyName + * @param value + * @param + */ + public static void invokeSetter(Object obj, String propertyName, E value) { + Object object = obj; + String[] names = StringUtils.split(propertyName, "."); + for (int i = 0; i < names.length; i++) { + if (i < names.length - 1) { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } else { + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); + invokeMethodByName(object, setterMethodName, new Object[] { value }); + } + } + } + + /** + * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. + * @param obj + * @param fieldName + * @param + * @return + */ + @SuppressWarnings("unchecked") + public static E getFieldValue(final Object obj, final String fieldName) { + Field field = getAccessibleField(obj, fieldName); + if (field == null) { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return null; + } + E result = null; + try { + result = (E) field.get(obj); + } catch (IllegalAccessException e) { + logger.error("不可能抛出的异常{}", e.getMessage()); + } + return result; + } + + /** + * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. + * @param obj + * @param fieldName + * @param value + * @param + */ + public static void setFieldValue(final Object obj, final String fieldName, final E value) { + Field field = getAccessibleField(obj, fieldName); + if (field == null) { + // throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return; + } + try { + field.set(obj, value); + } catch (IllegalAccessException e) { + logger.error("不可能抛出的异常: {}", e.getMessage()); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符. + * 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用. + * 同时匹配方法名+参数类型, + * @param obj + * @param methodName + * @param parameterTypes + * @param args + * @param + * @return + */ + @SuppressWarnings("unchecked") + public static E invokeMethod(final Object obj, final String methodName, final Class[] parameterTypes, + final Object[] args) { + if (obj == null || methodName == null) { + return null; + } + Method method = getAccessibleMethod(obj, methodName, parameterTypes); + if (method == null) { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try { + return (E) method.invoke(obj, args); + } catch (Exception e) { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符, + * 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用. + * 只匹配函数名,如果有多个同名函数调用第一个。 + * @param obj + * @param methodName + * @param args + * @param + * @return + */ + @SuppressWarnings("unchecked") + public static E invokeMethodByName(final Object obj, final String methodName, final Object[] args) { + Method method = getAccessibleMethodByName(obj, methodName, args.length); + if (method == null) { + // 如果为空不报错,直接返回空。 + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try { + // 类型转换(将参数数据类型转换为目标方法参数类型) + Class[] cs = method.getParameterTypes(); + for (int i = 0; i < cs.length; i++) { + if (args[i] != null && !args[i].getClass().equals(cs[i])) { + if (cs[i] == String.class) { + args[i] = Convert.toStr(args[i]); + if (StringUtils.endsWith((String) args[i], ".0")) { + args[i] = StringUtils.substringBefore((String) args[i], ".0"); + } + } else if (cs[i] == Integer.class) { + args[i] = Convert.toInt(args[i]); + } else if (cs[i] == Long.class) { + args[i] = Convert.toLong(args[i]); + } else if (cs[i] == Double.class) { + args[i] = Convert.toDouble(args[i]); + } else if (cs[i] == Float.class) { + args[i] = Convert.toFloat(args[i]); + } else if (cs[i] == Date.class) { + if (args[i] instanceof String) { + args[i] = DateUtils.parseDate(args[i]); + } + } + } + } + return (E) method.invoke(obj, args); + } catch (Exception e) { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * @param obj + * @param fieldName + * @return + */ + public static Field getAccessibleField(final Object obj, final String fieldName) { + // 为空不报错。直接返回 null + if (obj == null) { + return null; + } + Validate.notBlank(fieldName, "fieldName can't be blank"); + for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) { + try { + Field field = superClass.getDeclaredField(fieldName); + makeAccessible(field); + return field; + } + catch (NoSuchFieldException e) { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 匹配函数名+参数类型。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + * @param obj + * @param methodName + * @param parameterTypes + * @return + */ + public static Method getAccessibleMethod(final Object obj, final String methodName, + final Class... parameterTypes) { + // 为空不报错。直接返回 null + if (obj == null) { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) { + try { + Method method = searchType.getDeclaredMethod(methodName, parameterTypes); + makeAccessible(method); + return method; + } catch (NoSuchMethodException e) { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 只匹配函数名。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + * @param obj + * @param methodName + * @param argsNum + * @return + */ + public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) { + // 为空不报错。直接返回 null + if (obj == null) { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) { + Method[] methods = searchType.getDeclaredMethods(); + for (Method method : methods) { + if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) { + makeAccessible(method); + return method; + } + } + } + return null; + } + + /** + * 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + * @param method + */ + public static void makeAccessible(Method method) { + if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) + && !method.isAccessible()) { + method.setAccessible(true); + } + } + + /** + * 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + * @param field + */ + public static void makeAccessible(Field field) { + if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) + || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) { + field.setAccessible(true); + } + } + + /** + * 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处 + * 如无法找到, 返回Object.class. + * @param clazz + * @param + * @return + */ + @SuppressWarnings("unchecked") + public static Class getClassGenricType(final Class clazz) { + return getClassGenricType(clazz, 0); + } + + /** + * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. + * 如无法找到, 返回Object.class. + * @param clazz + * @param index + * @return + */ + public static Class getClassGenricType(final Class clazz, final int index) { + Type genType = clazz.getGenericSuperclass(); + + if (!(genType instanceof ParameterizedType)) { + logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); + return Object.class; + } + + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); + + if (index >= params.length || index < 0) { + logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + + params.length); + return Object.class; + } + if (!(params[index] instanceof Class)) { + logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); + return Object.class; + } + + return (Class) params[index]; + } + + /** + * 通过实例化对象获取反射对象 + * @param instance + * @return + */ + public static Class getUserClass(Object instance) { + if (instance == null) { + throw new RuntimeException("Instance must not be null"); + } + Class clazz = instance.getClass(); + if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) { + Class superClass = clazz.getSuperclass(); + if (superClass != null && !Object.class.equals(superClass)) { + return superClass; + } + } + return clazz; + + } + + /** + * 将反射时的checked exception转换为unchecked exception. + * @param msg + * @param e + * @return + */ + public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) { + if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException + || e instanceof NoSuchMethodException) { + return new IllegalArgumentException(msg, e); + } else if (e instanceof InvocationTargetException) { + return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); + } + return new RuntimeException(msg, e); + } +} diff --git a/modules/src/main/java/com/bw/util/core/spring/SpringUtils.java b/modules/src/main/java/com/bw/util/core/spring/SpringUtils.java new file mode 100644 index 0000000..e62700b --- /dev/null +++ b/modules/src/main/java/com/bw/util/core/spring/SpringUtils.java @@ -0,0 +1,106 @@ +package com.bw.util.core.spring; + +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.stereotype.Component; + +/** + * spring工具类 方便在非spring管理环境中获取bean + * + * @author markGuo + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor +{ + /** Spring应用上下文环境 */ + private static ConfigurableListableBeanFactory beanFactory; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringUtils.beanFactory = beanFactory; + } + + /** + * 获取对象 + * + * @param name + * @return Object 一个以所给名字注册的bean的实例 + * @throws BeansException + * + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + /** + * 获取类型为requiredType的对象 + * + * @param clz + * @return + * @throws BeansException + * + */ + public static T getBean(Class clz) throws BeansException { + T result = beanFactory.getBean(clz); + return result; + } + + /** + * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + /** + * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) + * + * @param name + * @return boolean + * @throws NoSuchBeanDefinitionException + * + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 注册对象的类型 + * @throws NoSuchBeanDefinitionException + * + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException { + return beanFactory.getType(name); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + * + * @param name + * @return + * @throws NoSuchBeanDefinitionException + * + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { + return beanFactory.getAliases(name); + } + + /** + * 获取aop代理对象 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) { + return (T) AopContext.currentProxy(); + } +} diff --git a/modules/src/main/java/com/bw/util/core/text/CharsetKit.java b/modules/src/main/java/com/bw/util/core/text/CharsetKit.java new file mode 100644 index 0000000..7a0b29c --- /dev/null +++ b/modules/src/main/java/com/bw/util/core/text/CharsetKit.java @@ -0,0 +1,78 @@ +package com.bw.util.core.text; + +import org.apache.commons.lang3.StringUtils; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +/** + * 字符集工具类 + * + * @author markGuo + */ +public class CharsetKit +{ + /** ISO-8859-1 */ + public static final String ISO_8859_1 = "ISO-8859-1"; + /** UTF-8 */ + public static final String UTF_8 = "UTF-8"; + /** GBK */ + public static final String GBK = "GBK"; + + /** ISO-8859-1 */ + public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); + /** UTF-8 */ + public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); + /** GBK */ + public static final Charset CHARSET_GBK = Charset.forName(GBK); + + /** + * 转换为Charset对象 + * + * @param charset 字符集,为空则返回默认字符集 + * @return Charset + */ + public static Charset charset(String charset) { + return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, String srcCharset, String destCharset) { + return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, Charset srcCharset, Charset destCharset) { + if (null == srcCharset) { + srcCharset = StandardCharsets.ISO_8859_1; + } + if (null == destCharset) { + srcCharset = StandardCharsets.UTF_8; + } + if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) { + return source; + } + return new String(source.getBytes(srcCharset), destCharset); + } + + /** + * @return 系统字符集编码 + */ + public static String systemCharset() { + return Charset.defaultCharset().name(); + } +} diff --git a/modules/src/main/java/com/bw/util/core/text/Convert.java b/modules/src/main/java/com/bw/util/core/text/Convert.java new file mode 100644 index 0000000..9d64780 --- /dev/null +++ b/modules/src/main/java/com/bw/util/core/text/Convert.java @@ -0,0 +1,818 @@ +package com.bw.util.core.text; + + +import org.apache.commons.lang3.StringUtils; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.text.NumberFormat; +import java.util.Set; + +/** + * 类型转换器 + * + * @author markGuo + */ +public class Convert { + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static String toStr(Object value, String defaultValue) { + if (null == value) { + return defaultValue; + } + if (value instanceof String) { + return (String) value; + } + return value.toString(); + } + + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static String toStr(Object value) { + return toStr(value, null); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Character toChar(Object value, Character defaultValue) { + if (null == value) { + return defaultValue; + } + if (value instanceof Character) { + return (Character) value; + } + + final String valueStr = toStr(value, null); + return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Character toChar(Object value) { + return toChar(value, null); + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Byte toByte(Object value, Byte defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof Byte) { + return (Byte) value; + }else if (value instanceof Number) { + return ((Number) value).byteValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Byte.parseByte(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Byte toByte(Object value) { + return toByte(value, null); + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Short toShort(Object value, Short defaultValue) { + if (value == null) { + return defaultValue; + }else if (value instanceof Short) { + return (Short) value; + } else if (value instanceof Number) { + return ((Number) value).shortValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Short.parseShort(valueStr.trim()); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Short toShort(Object value) { + return toShort(value, null); + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Number toNumber(Object value, Number defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof Number) { + return (Number) value; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return NumberFormat.getInstance().parse(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Number toNumber(Object value) { + return toNumber(value, null); + } + + /** + * 转换为int
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Integer toInt(Object value, Integer defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof Integer) { + return (Integer) value; + } else if (value instanceof Number) { + return ((Number) value).intValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Integer.parseInt(valueStr.trim()); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为int
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Integer toInt(Object value) { + return toInt(value, null); + } + + /** + * 转换为Integer数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String str) { + return toIntArray(",", str); + } + + /** + * 转换为Long数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String str) { + return toLongArray(",", str); + } + + /** + * 转换为Integer数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String split, String str) { + if (StringUtils.isEmpty(str)) { + return new Integer[] {}; + } + String[] arr = str.split(split); + final Integer[] ints = new Integer[arr.length]; + for (int i = 0; i < arr.length; i++) { + final Integer v = toInt(arr[i], 0); + ints[i] = v; + } + return ints; + } + + /** + * 转换为Long数组
+ * + * @param split 分隔符 + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String split, String str) { + if (StringUtils.isEmpty(str)) { + return new Long[] {}; + } + String[] arr = str.split(split); + final Long[] longs = new Long[arr.length]; + for (int i = 0; i < arr.length; i++) { + final Long v = toLong(arr[i], null); + longs[i] = v; + } + return longs; + } + + /** + * 转换为String数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String str) { + return toStrArray(",", str); + } + + /** + * 转换为String数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String split, String str) { + return str.split(split); + } + + /** + * 转换为long
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Long toLong(Object value, Long defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof Long) { + return (Long) value; + } else if (value instanceof Number) { + return ((Number) value).longValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).longValue(); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为long
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Long toLong(Object value) { + return toLong(value, null); + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Double toDouble(Object value, Double defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof Double) { + return (Double) value; + } else if (value instanceof Number) { + return ((Number) value).doubleValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).doubleValue(); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Double toDouble(Object value) { + return toDouble(value, null); + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Float toFloat(Object value, Float defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof Float) { + return (Float) value; + } else if (value instanceof Number) { + return ((Number) value).floatValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Float.parseFloat(valueStr.trim()); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Float toFloat(Object value) { + return toFloat(value, null); + } + + /** + * 转换为boolean
+ * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Boolean toBool(Object value, Boolean defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof Boolean) { + return (Boolean) value; + } + String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + valueStr = valueStr.trim().toLowerCase(); + switch (valueStr) { + case "true": + return true; + case "false": + return false; + case "yes": + return true; + case "ok": + return true; + case "no": + return false; + case "1": + return true; + case "0": + return false; + default: + return defaultValue; + } + } + + /** + * 转换为boolean
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Boolean toBool(Object value) { + return toBool(value, null); + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * + * @param clazz Enum的Class + * @param value 值 + * @param defaultValue 默认值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value, E defaultValue) { + if (value == null) { + return defaultValue; + } else if (clazz.isAssignableFrom(value.getClass())) { + @SuppressWarnings("unchecked") + E myE = (E) value; + return myE; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Enum.valueOf(clazz, valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * + * @param clazz Enum的Class + * @param value 值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value) { + return toEnum(clazz, value, null); + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value, BigInteger defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof BigInteger) { + return (BigInteger) value; + } else if (value instanceof Long) { + return BigInteger.valueOf((Long) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return new BigInteger(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value) { + return toBigInteger(value, null); + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof BigDecimal) { + return (BigDecimal) value; + } else if (value instanceof Long) { + return new BigDecimal((Long) value); + } else if (value instanceof Double) { + return new BigDecimal((Double) value); + } else if (value instanceof Integer) { + return new BigDecimal((Integer) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return new BigDecimal(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value) { + return toBigDecimal(value, null); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @return 字符串 + */ + public static String utf8Str(Object obj) { + return str(obj, CharsetKit.CHARSET_UTF_8); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charsetName 字符集 + * @return 字符串 + */ + public static String str(Object obj, String charsetName) { + return str(obj, Charset.forName(charsetName)); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(Object obj, Charset charset) { + if (null == obj) { + return null; + } else if (obj instanceof String) { + return (String) obj; + } else if (obj instanceof byte[] || obj instanceof Byte[]) { + return str(obj, charset); + } else if (obj instanceof ByteBuffer) { + return str((ByteBuffer) obj, charset); + } + return obj.toString(); + } + + /** + * 将byte数组转为字符串 + * + * @param bytes byte数组 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(byte[] bytes, String charset) { + return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset)); + } + + /** + * 解码字节码 + * + * @param data 字符串 + * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 + * @return 解码后的字符串 + */ + public static String str(byte[] data, Charset charset) { + if (data == null) { + return null; + } else if (null == charset) { + return new String(data); + } + return new String(data, charset); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, String charset) { + if (data == null) { + return null; + } + return str(data, Charset.forName(charset)); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, Charset charset) { + if (null == charset) { + charset = Charset.defaultCharset(); + } + return charset.decode(data).toString(); + } + + // ----------------------------------------------------------------------- 全角半角转换 + /** + * 半角转全角 + * + * @param input String. + * @return 全角字符串. + */ + public static String toSBC(String input) { + return toSBC(input, null); + } + + /** + * 半角转全角 + * + * @param input String + * @param notConvertSet 不替换的字符集合 + * @return 全角字符串. + */ + public static String toSBC(String input, Set notConvertSet) { + char c[] = input.toCharArray(); + for (int i = 0; i < c.length; i++) { + if (null != notConvertSet && notConvertSet.contains(c[i])) { + // 跳过不替换的字符 + continue; + } else if (c[i] == ' ') { + c[i] = '\u3000'; + } else if (c[i] < '\177') { + c[i] = (char) (c[i] + 65248); + + } + } + return new String(c); + } + + /** + * 全角转半角 + * + * @param input String. + * @return 半角字符串 + */ + public static String toDBC(String input) { + return toDBC(input, null); + } + + /** + * 替换全角为半角 + * + * @param text 文本 + * @param notConvertSet 不替换的字符集合 + * @return 替换后的字符 + */ + public static String toDBC(String text, Set notConvertSet) { + char c[] = text.toCharArray(); + for (int i = 0; i < c.length; i++) { + if (null != notConvertSet && notConvertSet.contains(c[i])) { + // 跳过不替换的字符 + continue; + } else if (c[i] == '\u3000') { + c[i] = ' '; + } else if (c[i] > '\uFF00' && c[i] < '\uFF5F') { + c[i] = (char) (c[i] - 65248); + } + } + return new String(c); + } + + /** + * 数字金额大写转换 先写个完整的然后将如零拾替换成零 + * + * @param n 数字 + * @return 中文大写数字 + */ + public static String digitUppercase(double n) { + String[] fraction = { "角", "分" }; + String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; + String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } }; + + String head = n < 0 ? "负" : ""; + n = Math.abs(n); + + String s = ""; + for (int i = 0; i < fraction.length; i++) { + s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", ""); + } + if (s.length() < 1) { + s = "整"; + } + int integerPart = (int) Math.floor(n); + + for (int i = 0; i < unit[0].length && integerPart > 0; i++) { + String p = ""; + for (int j = 0; j < unit[1].length && n > 0; j++) { + p = digit[integerPart % 10] + unit[1][j] + p; + integerPart = integerPart / 10; + } + s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s; + } + return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整"); + } +} diff --git a/modules/src/main/java/com/bw/util/poi/ExcelUtil.java b/modules/src/main/java/com/bw/util/poi/ExcelUtil.java new file mode 100644 index 0000000..d6085ec --- /dev/null +++ b/modules/src/main/java/com/bw/util/poi/ExcelUtil.java @@ -0,0 +1,787 @@ +package com.bw.util.poi; + + +import com.bw.util.core.date.DateUtils; +import com.bw.util.core.reflect.ReflectUtils; +import com.bw.util.core.spring.SpringUtils; +import com.bw.util.core.text.Convert; +import com.bw.util.poi.annotation.Excel; +import com.bw.util.poi.annotation.Excel.Type; +import com.bw.util.poi.annotation.Excels; +import com.bw.util.poi.exception.PoiException; +import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.hssf.usermodel.HSSFDateUtil; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.util.*; + +/** + * Excel相关处理 + * + * @author + */ +@Log4j2 +public class ExcelUtil +{ + + /** + * Excel sheet最大行数,默认65536 + */ + public static final int sheetSize = 65536; + + /** + * 工作表名称 + */ + private String sheetName; + + /** + * 导出类型(EXPORT:导出数据;IMPORT:导入模板) + */ + private Type type; + + /** + * 工作薄对象 + */ + private Workbook wb; + + /** + * 工作表对象 + */ + private Sheet sheet; + + /** + * 样式列表 + */ + private Map styles; + + /** + * 导入导出数据列表 + */ + private List list; + + /** + * 注解列表 + */ + private List fields; + + /** + * 实体对象 + */ + public Class clazz; + + public ExcelUtil(Class clazz) { + this.clazz = clazz; + } + + public void init(List list, String sheetName, Type type) { + if (list == null) { + list = new ArrayList(); + } + this.list = list; + this.sheetName = sheetName; + this.type = type; + createExcelField(); + createWorkbook(); + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(InputStream is) throws Exception { + return importExcel(StringUtils.EMPTY, is); + } + + /** + * 对excel表单指定表格索引名转换成list + * + * @param sheetName 表格索引名 + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(String sheetName, InputStream is) throws Exception { + this.type = Type.IMPORT; + this.wb = WorkbookFactory.create(is); + List list = new ArrayList(); + Sheet sheet = null; + if (StringUtils.isNotEmpty(sheetName)) { + // 如果指定sheet名,则取指定sheet中的内容. + sheet = wb.getSheet(sheetName); + } else { + // 如果传入的sheet名不存在则默认指向第1个sheet. + sheet = wb.getSheetAt(0); + } + + if (sheet == null) { + throw new IOException("文件sheet不存在"); + } + + int rows = sheet.getPhysicalNumberOfRows(); + + if (rows > 0) { + // 定义一个map用于存放excel列的序号和field. + Map cellMap = new HashMap(); + // 获取表头 + Row heard = sheet.getRow(0); + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) { + Cell cell = heard.getCell(i); + if (cell != null) { + String value = this.getCellValue(heard, i).toString(); + cellMap.put(value, i); + } + else { + cellMap.put(null, i); + } + } + // 有数据时才处理 得到类的所有field. + Field[] allFields = clazz.getDeclaredFields(); + // 定义一个map用于存放列的序号和field. + Map fieldsMap = new HashMap(); + for (int col = 0; col < allFields.length; col++) { + Field field = allFields[col]; + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) { + // 设置类的私有字段属性可访问. + field.setAccessible(true); + Integer column = cellMap.get(attr.name()); + fieldsMap.put(column, field); + } + } + for (int i = 1; i < rows; i++) { + // 从第2行开始取数据,默认第一行是表头. + Row row = sheet.getRow(i); + T entity = null; + for (Map.Entry entry : fieldsMap.entrySet()) { + if (entry.getKey() == null){ + continue; + } + Object val = this.getCellValue(row, entry.getKey()); + + // 如果不存在实例则新建. + entity = (entity == null ? clazz.newInstance() : entity); + // 从map中得到对应列的field. + Field field = fieldsMap.get(entry.getKey()); + // 取得类型,并根据对象类型设置值. + Class fieldType = field.getType(); + if (String.class == fieldType) { + String s = Convert.toStr(val); + if (StringUtils.endsWith(s, ".0")) { + val = StringUtils.substringBefore(s, ".0"); + } else { + String dateFormat = field.getAnnotation(Excel.class).dateFormat(); + if (StringUtils.isNotEmpty(dateFormat)) { + val = DateUtils.parseDateToStr(dateFormat, (Date) val); + } else { + val = Convert.toStr(val); + } + } + } else if ((Integer.TYPE == fieldType) || (Integer.class == fieldType)) { + val = Convert.toInt(val); + } else if ((Long.TYPE == fieldType) || (Long.class == fieldType)) { + val = Convert.toLong(val); + } else if ((Double.TYPE == fieldType) || (Double.class == fieldType)) { + val = Convert.toDouble(val); + } else if ((Float.TYPE == fieldType) || (Float.class == fieldType)) { + val = Convert.toFloat(val); + } else if (BigDecimal.class == fieldType) { + val = Convert.toBigDecimal(val); + } else if (Date.class == fieldType) { + if (val instanceof String) { + val = DateUtils.parseDate(val); + } else if (val instanceof Double) { + val = DateUtil.getJavaDate((Double) val); + } + } + if (fieldType != null) { + Excel attr = field.getAnnotation(Excel.class); + String propertyName = field.getName(); + if (StringUtils.isNotEmpty(attr.targetAttr())) { + propertyName = field.getName() + "." + attr.targetAttr(); + } else if (StringUtils.isNotEmpty(attr.readConverterExp())) { + val = reverseByExp(String.valueOf(val), attr.readConverterExp()); + } + ReflectUtils.invokeSetter(entity, propertyName, val); + } + } + list.add(entity); + } + } + return list; + } + + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + * @throws IOException + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName){ + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(list, sheetName, Type.EXPORT); + writeSheet(); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public void exportExcel(HttpServletResponse response){ + try{ + wb.write(response.getOutputStream()); + } catch (Exception e){ + log.error("导出Excel异常{}", e.getMessage()); + } finally { + IOUtils.closeQuietly(wb); + } + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public String exportExcel(List list, String sheetName) { + this.init(list, sheetName, Type.EXPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public String importTemplateExcel(String sheetName) { + this.init(null, sheetName, Type.IMPORT); + return exportExcel(); + } + + /** + * 写入sheet数据 + */ + public void writeSheet(){ + // 取出一共有多少个sheet. + double sheetNo = Math.ceil(list.size() / sheetSize); + for (int index = 0; index <= sheetNo; index++) { + createSheet(sheetNo, index); + + // 产生一行 + Row row = sheet.createRow(0); + int column = 0; + // 写入各个字段的列头名称 + for (Object[] os : fields) { + Excel excel = (Excel) os[1]; + this.createCell(excel, row, column++); + } + if (Type.EXPORT.equals(type)) { + fillExcelData(index, row); + } + } + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public String exportExcel() { + OutputStream out = null; + try { + writeSheet(); + String filename = encodingFilename(sheetName); + out = new FileOutputStream(getAbsoluteFile(filename)); + wb.write(out); + return filename; + } catch (Exception e) { + log.error("导出Excel异常{}", e.getMessage()); + throw new PoiException("导出Excel失败,请联系管理员!"); + } finally { + try { + if (wb != null) { + wb.close(); + } + if (out != null) { + out.close(); + } + } catch (IOException e1) { + e1.printStackTrace(); + } + + } + } + + /** + * 填充excel数据 + * + * @param index 序号 + * @param row 单元格行 + */ + public void fillExcelData(int index, Row row) { + int startNo = index * sheetSize; + int endNo = Math.min(startNo + sheetSize, list.size()); + for (int i = startNo; i < endNo; i++) { + row = sheet.createRow(i + 1 - startNo); + // 得到导出对象. + T vo = (T) list.get(i); + int column = 0; + for (Object[] os : fields) { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + // 设置实体类私有属性可访问 + field.setAccessible(true); + this.addCell(excel, row, vo, field, column++); + } + } + } + + /** + * 创建表格样式 + * + * @param wb 工作薄对象 + * @return 样式列表 + */ + private Map createStyles(Workbook wb) { + // 写入各条记录,每条记录对应excel表中的一行 + Map styles = new HashMap(); + CellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + style.setFont(dataFont); + styles.put("data", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + Font headerFont = wb.createFont(); + headerFont.setFontName("Arial"); + headerFont.setFontHeightInPoints((short) 10); + headerFont.setBold(true); + headerFont.setColor(IndexedColors.WHITE.getIndex()); + style.setFont(headerFont); + styles.put("header", style); + + return styles; + } + + /** + * 创建单元格 + */ + public Cell createCell(Excel attr, Row row, int column) { + // 创建列 + Cell cell = row.createCell(column); + // 写入列信息 + cell.setCellValue(attr.name()); + setDataValidation(attr, row, column); + cell.setCellStyle(styles.get("header")); + return cell; + } + + /** + * 设置单元格信息 + * + * @param value 单元格值 + * @param attr 注解相关 + * @param cell 单元格信息 + */ + public void setCellVo(Object value, Excel attr, Cell cell) { + if (Excel.ColumnType.STRING == attr.cellType()) { + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(value == null ? attr.defaultValue() : value + attr.suffix()); + } else if (Excel.ColumnType.NUMERIC == attr.cellType()) { + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(Integer.parseInt(value + "")); + } + } + + /** + * 创建表格样式 + */ + public void setDataValidation(Excel attr, Row row, int column) { + if (attr.name().indexOf("注:") >= 0) { + sheet.setColumnWidth(column, 6000); + } else { + // 设置列宽 + sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); + row.setHeight((short) (attr.height() * 20)); + } + // 如果设置了提示信息则鼠标放上去提示. + if (StringUtils.isNotEmpty(attr.prompt())) { + // 这里默认设了2-101列提示. + setXSSFPrompt(sheet, "", attr.prompt(), 1, 100, column, column); + } + // 如果设置了combo属性则本列只能选择不能输入 + if (attr.combo().length > 0) { + // 这里默认设了2-101列只能选择不能输入. + setXSSFValidation(sheet, attr.combo(), 1, 100, column, column); + } + } + + /** + * 添加单元格 + */ + public Cell addCell(Excel attr, Row row, T vo, Field field, int column) { + Cell cell = null; + try { + // 设置行高 + row.setHeight((short) (attr.height() * 20)); + // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. + if (attr.isExport()) { + // 创建cell + cell = row.createCell(column); + cell.setCellStyle(styles.get("data")); + + // 用于读取对象中的属性 + Object value = getTargetValue(vo, field, attr); + //时间类型格式化 + String dateFormat = attr.dateFormat(); + //读取表达式 + String readConverterExp = attr.readConverterExp(); + //分隔符 + String splitStr = attr.splitStr(); + //反射对象 + Class invokeClass = attr.invokeClass(); + //反射方法名称 + String invokeMethod = attr.invokeMethod(); + if (StringUtils.isNotEmpty(dateFormat) && value != null) { + cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value)); + } else if (StringUtils.isNotEmpty(readConverterExp) && value != null) { + // 判断是否有分隔符 + if (StringUtils.isNotEmpty(splitStr)){ + StringBuilder cellValue = new StringBuilder(); + String valueStr = String.valueOf(value); + String[] valueStrSplit = valueStr.split(splitStr); + int valueStrSplitLength = valueStrSplit.length; + for (int i = 0; ; i++) { + cellValue.append(convertByExp(valueStrSplit[i], readConverterExp)); + if (i == valueStrSplitLength-1){ + break; + } + cellValue.append(","); + } + cell.setCellValue(cellValue.toString()); + } else { + cell.setCellValue(convertByExp(String.valueOf(value), readConverterExp)); + } + + } + // 判断是否需要取值 + else if((!invokeClass.getName().equals(String.class.getName())) && StringUtils.isNotEmpty(invokeMethod)){ + Object bean = SpringUtils.getBean(invokeClass); + Method thisMethod = null; + Method[] methods = invokeClass.getMethods(); + for (Method method : methods) { + if (method.getName().equals(invokeMethod)){ + thisMethod = method; + continue; + } + } + cell.setCellValue(thisMethod.invoke(bean,value).toString()); + } else { + // 设置列类型 + setCellVo(value, attr, cell); + } + } + } catch (Exception e) { + log.error("导出Excel失败{}", e); + } + return cell; + } + + /** + * 设置 POI XSSFSheet 单元格提示 + * + * @param sheet 表单 + * @param promptTitle 提示标题 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setXSSFPrompt(Sheet sheet, String promptTitle, String promptContent, int firstRow, int endRow, + int firstCol, int endCol) { + DataValidationHelper helper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = helper.createCustomConstraint("DD1"); + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + DataValidation dataValidation = helper.createValidation(constraint, regions); + dataValidation.createPromptBox(promptTitle, promptContent); + dataValidation.setShowPromptBox(true); + sheet.addValidationData(dataValidation); + } + + /** + * 设置某些列的值只能输入预制的数据,显示下拉框. + * + * @param sheet 要设置的sheet. + * @param textlist 下拉框显示的内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + * @return 设置好的sheet. + */ + public void setXSSFValidation(Sheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol) { + DataValidationHelper helper = sheet.getDataValidationHelper(); + // 加载下拉列表内容 + DataValidationConstraint constraint = helper.createExplicitListConstraint(textlist); + // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + // 数据有效性对象 + DataValidation dataValidation = helper.createValidation(constraint, regions); + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } else { + dataValidation.setSuppressDropDownArrow(false); + } + + sheet.addValidationData(dataValidation); + } + + /** + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @return 解析后值 + * @throws Exception + */ + public static String convertByExp(String propertyValue, String converterExp) throws Exception { + try { + String[] convertSource = converterExp.split(","); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (itemArray[0].equals(propertyValue)) { + return itemArray[1]; + } + } + } catch (Exception e) { + throw e; + } + return propertyValue; + } + + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @return 解析后值 + * @throws Exception + */ + public static String reverseByExp(String propertyValue, String converterExp) throws Exception { + try { + String[] convertSource = converterExp.split(","); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (itemArray[1].equals(propertyValue)) { + return itemArray[0]; + } + } + } catch (Exception e) { + throw e; + } + return propertyValue; + } + + /** + * 编码文件名 + */ + public String encodingFilename(String filename) { + filename = UUID.randomUUID().toString() + "_" + filename + ".xlsx"; + return filename; + } + + /** + * 获取下载路径 + * + * @param filename 文件名称 + */ + public String getAbsoluteFile(String filename) { + String downloadPath = System.getProperty("user.dir") + File.separator + filename; + File desc = new File(downloadPath); + if (!desc.getParentFile().exists()) { + desc.getParentFile().mkdirs(); + } + return downloadPath; + } + + /** + * 获取bean中的属性值 + * + * @param vo 实体对象 + * @param field 字段 + * @param excel 注解 + * @return 最终的属性值 + * @throws Exception + */ + private Object getTargetValue(T vo, Field field, Excel excel) throws Exception { + Object o = field.get(vo); + if (StringUtils.isNotEmpty(excel.targetAttr())) { + String target = excel.targetAttr(); + if (target.indexOf(".") > -1) { + String[] targets = target.split("[.]"); + for (String name : targets) { + o = getValue(o, name); + } + } else { + o = getValue(o, target); + } + } + return o; + } + + /** + * 以类的属性的get方法方法形式获取值 + * + * @param o + * @param name + * @return value + * @throws Exception + */ + private Object getValue(Object o, String name) throws Exception { + if (StringUtils.isNotEmpty(name)) { + Class clazz = o.getClass(); + String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1); + Method method = clazz.getMethod(methodName); + o = method.invoke(o); + } + return o; + } + + /** + * 得到所有定义字段 + */ + private void createExcelField() { + this.fields = new ArrayList<>(); + List tempFields = new ArrayList<>(); + tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); + for (Field field : tempFields) { + // 单注解 + if (field.isAnnotationPresent(Excel.class)) { + putToField(field, field.getAnnotation(Excel.class)); + } + + // 多注解 + if (field.isAnnotationPresent(Excels.class)) { + Excels attrs = field.getAnnotation(Excels.class); + Excel[] excels = attrs.value(); + for (Excel excel : excels) { + putToField(field, excel); + } + } + } + } + + /** + * 放到字段集合中 + */ + private void putToField(Field field, Excel attr) { + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) { + this.fields.add(new Object[] { field, attr }); + } + } + + /** + * 创建一个工作簿 + */ + public void createWorkbook() { + this.wb = new SXSSFWorkbook(500); + } + + /** + * 创建工作表 + * + * @param sheetNo sheet数量 + * @param index 序号 + */ + public void createSheet(double sheetNo, int index) { + this.sheet = wb.createSheet(); + this.styles = createStyles(wb); + // 设置工作表的名称. + if (sheetNo == 0) { + wb.setSheetName(index, sheetName); + } else { + wb.setSheetName(index, sheetName + index); + } + } + + /** + * 获取单元格值 + * + * @param row 获取的行 + * @param column 获取单元格列号 + * @return 单元格值 + */ + public Object getCellValue(Row row, int column) { + if (row == null) { + return row; + } + Object val = ""; + try { + Cell cell = row.getCell(column); + if (cell != null) { + if (cell.getCellTypeEnum() == CellType.NUMERIC || cell.getCellTypeEnum() == CellType.FORMULA) { + val = cell.getNumericCellValue(); + if (HSSFDateUtil.isCellDateFormatted(cell)) { + val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 + } else { + if ((Double) val % 1 > 0) { + val = new DecimalFormat("0.00").format(val); + } else { + val = new DecimalFormat("0").format(val); + } + } + } else if (cell.getCellTypeEnum() == CellType.STRING) { + val = cell.getStringCellValue(); + } else if (cell.getCellTypeEnum() == CellType.BOOLEAN) { + val = cell.getBooleanCellValue(); + } else if (cell.getCellTypeEnum() == CellType.ERROR) { + val = cell.getErrorCellValue(); + } + + } + } catch (Exception e) { + return val; + } + return val; + } +} diff --git a/modules/src/main/java/com/bw/util/poi/annotation/Excel.java b/modules/src/main/java/com/bw/util/poi/annotation/Excel.java new file mode 100644 index 0000000..0e8d8ad --- /dev/null +++ b/modules/src/main/java/com/bw/util/poi/annotation/Excel.java @@ -0,0 +1,122 @@ +package com.bw.util.poi.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义导出Excel数据注解 + * + * @author + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel +{ + /** + * 导出到Excel中的名字. + */ + public String name() default ""; + + /** + * 日期格式, 如: yyyy-MM-dd + */ + public String dateFormat() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + public String readConverterExp() default ""; + + /** + * 分隔符 + */ + public String splitStr() default ""; + + /** + * 可执行的反射方法值为1个 + */ + public String invokeMethod() default ""; + + /** + * 可执行的反射类 从SpringIoc容器当中取值 + */ + public Class invokeClass() default String.class; + + /** + * 导出类型(0数字 1字符串) + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 导出时在excel中每个列的高度 单位为字符 + */ + public double height() default 14; + + /** + * 导出时在excel中每个列的宽 单位为字符 + */ + public double width() default 16; + + /** + * 文字后缀,如% 90 变成90% + */ + public String suffix() default ""; + + /** + * 当值为空时,字段的默认值 + */ + public String defaultValue() default ""; + + /** + * 提示信息 + */ + public String prompt() default ""; + + /** + * 设置只能选择不能输入的列内容. + */ + public String[] combo() default {}; + + /** + * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. + */ + public boolean isExport() default true; + + /** + * 另一个类中的属性名称,支持多级获取,以小数点隔开 + */ + public String targetAttr() default ""; + + /** + * 字段类型(0:导出导入;1:仅导出;2:仅导入) + */ + Type type() default Type.ALL; + + public enum Type { + ALL(0), EXPORT(1), IMPORT(2); + private final int value; + + Type(int value) { + this.value = value; + } + + public int value() { + return this.value; + } + } + + public enum ColumnType { + NUMERIC(0), STRING(1); + private final int value; + + ColumnType(int value) { + this.value = value; + } + + public int value() { + return this.value; + } + } +} diff --git a/modules/src/main/java/com/bw/util/poi/annotation/Excels.java b/modules/src/main/java/com/bw/util/poi/annotation/Excels.java new file mode 100644 index 0000000..914e0af --- /dev/null +++ b/modules/src/main/java/com/bw/util/poi/annotation/Excels.java @@ -0,0 +1,18 @@ +package com.bw.util.poi.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Excel注解集 + * + * @author + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Excels +{ + Excel[] value(); +} diff --git a/modules/src/main/java/com/bw/util/poi/exception/PoiException.java b/modules/src/main/java/com/bw/util/poi/exception/PoiException.java new file mode 100644 index 0000000..27ee107 --- /dev/null +++ b/modules/src/main/java/com/bw/util/poi/exception/PoiException.java @@ -0,0 +1,27 @@ +package com.bw.util.poi.exception; + +/** + * 业务异常 + * + * @author + */ +public class PoiException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + protected final String message; + + public PoiException(String message) { + this.message = message; + } + + public PoiException(String message, Throwable e) { + super(message, e); + this.message = message; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/modules/src/main/resources/application.yml b/modules/src/main/resources/application.yml new file mode 100644 index 0000000..30125d4 --- /dev/null +++ b/modules/src/main/resources/application.yml @@ -0,0 +1,102 @@ +# 服务器相关 + +server: + port: 10005 + +spring: + mvc: + pathmatch: + matching-strategy: ant_path_matcher + datasource: + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/day280?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false + username: root + password: 1234 + druid: + # 下面为连接池的补充设置,应用到上面所有数据源中 + # 初始化大小,最小,最大 + initial-size: 5 + min-idle: 5 + max-active: 20 + # 配置获取连接等待超时的时间 + max-wait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + time-between-eviction-runs-millis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + min-evictable-idle-time-millis: 300000 + validation-query: SELECT 1 FROM DUAL + test-while-idle: true + test-on-borrow: false + test-on-return: false + # 打开PSCache,并且指定每个连接上PSCache的大小 + pool-prepared-statements: true + # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + max-pool-prepared-statement-per-connection-size: 20 + filters: stat,wall + use-global-data-source-stat: true + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 + application: + name: shop-server + redis: + host: 127.0.0.1 + port: 6379 + mail: + host: smtp.qq.com + username: 358795815@qq.com + password: uuyemjigqlhvbgcj + port: 587 # 这个端口根据实际情况配置,一般都是465 + protocol: smtp # 这里应该是不用改的,我没试过其他的配置 + test-connection: false + default-encoding: UTF-8 + properties: + mail: + debug: true + smtp: + auth: true + connectiontimeout: 10000 + timeout: 10000 + writetimeout: 10000 + socketFactory: + class: javax.net.ssl.SSLSocketFactory + port: 587 + starttls: + enable: true + required: true + select: + multipart: + max-file-size: 100MB # 最大支持文件大小 + max-request-size: 100MB # 最大请求大小 + enabled: true + + +# mybatis +mybatis: + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + mapper-locations: classpath*:mapper/*Mapper.xml + global-config: + db-config: + id-type: auto + + +aliyun: + end-point: oss-cn-shanghai.aliyuncs.com + access-key-id: LTAI5tSFAGrms29r1xwEFtRM + access-key-secret: rztMfqxdYlsMUtIoy9bIOSGEKCWQT7 + access-pre: https://dongxiaojie.oss-cn-shanghai.aliyuncs.com + bucket-name: dongxiaojie + +fdfs: + so-timeout: 1500 # socket 连接时长 + connect-timeout: 600 # 连接 tracker 服务器超时时长 + # 这两个是你服务器的 IP 地址,注意 23000 端口也要打开,阿里云服务器记得配置安全组。tracker 要和 stroage 服务进行交流 + tracker-list: 192.168.159.167:22122 + web-server-url: 192.168.159.167:8888 + pool: + jmx-enabled: false + # 生成缩略图 + thumb-image: + height: 500 + width: 500 \ No newline at end of file diff --git a/modules/src/main/resources/mapper/GomMapper.xml b/modules/src/main/resources/mapper/GomMapper.xml new file mode 100644 index 0000000..d427fd7 --- /dev/null +++ b/modules/src/main/resources/mapper/GomMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/src/main/resources/mapper/SpanMapper.xml b/modules/src/main/resources/mapper/SpanMapper.xml new file mode 100644 index 0000000..3a56f1b --- /dev/null +++ b/modules/src/main/resources/mapper/SpanMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/src/main/resources/mapper/StudentMapper.xml b/modules/src/main/resources/mapper/StudentMapper.xml new file mode 100644 index 0000000..ef0abc9 --- /dev/null +++ b/modules/src/main/resources/mapper/StudentMapper.xml @@ -0,0 +1,20 @@ + + + + + + insert into t_student VALUES (null,#{name},#{age}) + + + + + + + + \ No newline at end of file diff --git a/modules/src/main/resources/mapper/XXXMapper.xml b/modules/src/main/resources/mapper/XXXMapper.xml new file mode 100644 index 0000000..024c106 --- /dev/null +++ b/modules/src/main/resources/mapper/XXXMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/modules/target/classes/META-INF/modules.kotlin_module b/modules/target/classes/META-INF/modules.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..a49347afef10a9b5f95305e1058ba36adec7d6dd GIT binary patch literal 16 RcmZQzU|?ooU|@t|0RRA102TlM literal 0 HcmV?d00001 diff --git a/modules/target/classes/application.yml b/modules/target/classes/application.yml new file mode 100644 index 0000000..30125d4 --- /dev/null +++ b/modules/target/classes/application.yml @@ -0,0 +1,102 @@ +# 服务器相关 + +server: + port: 10005 + +spring: + mvc: + pathmatch: + matching-strategy: ant_path_matcher + datasource: + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/day280?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false + username: root + password: 1234 + druid: + # 下面为连接池的补充设置,应用到上面所有数据源中 + # 初始化大小,最小,最大 + initial-size: 5 + min-idle: 5 + max-active: 20 + # 配置获取连接等待超时的时间 + max-wait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + time-between-eviction-runs-millis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + min-evictable-idle-time-millis: 300000 + validation-query: SELECT 1 FROM DUAL + test-while-idle: true + test-on-borrow: false + test-on-return: false + # 打开PSCache,并且指定每个连接上PSCache的大小 + pool-prepared-statements: true + # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + max-pool-prepared-statement-per-connection-size: 20 + filters: stat,wall + use-global-data-source-stat: true + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 + application: + name: shop-server + redis: + host: 127.0.0.1 + port: 6379 + mail: + host: smtp.qq.com + username: 358795815@qq.com + password: uuyemjigqlhvbgcj + port: 587 # 这个端口根据实际情况配置,一般都是465 + protocol: smtp # 这里应该是不用改的,我没试过其他的配置 + test-connection: false + default-encoding: UTF-8 + properties: + mail: + debug: true + smtp: + auth: true + connectiontimeout: 10000 + timeout: 10000 + writetimeout: 10000 + socketFactory: + class: javax.net.ssl.SSLSocketFactory + port: 587 + starttls: + enable: true + required: true + select: + multipart: + max-file-size: 100MB # 最大支持文件大小 + max-request-size: 100MB # 最大请求大小 + enabled: true + + +# mybatis +mybatis: + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + mapper-locations: classpath*:mapper/*Mapper.xml + global-config: + db-config: + id-type: auto + + +aliyun: + end-point: oss-cn-shanghai.aliyuncs.com + access-key-id: LTAI5tSFAGrms29r1xwEFtRM + access-key-secret: rztMfqxdYlsMUtIoy9bIOSGEKCWQT7 + access-pre: https://dongxiaojie.oss-cn-shanghai.aliyuncs.com + bucket-name: dongxiaojie + +fdfs: + so-timeout: 1500 # socket 连接时长 + connect-timeout: 600 # 连接 tracker 服务器超时时长 + # 这两个是你服务器的 IP 地址,注意 23000 端口也要打开,阿里云服务器记得配置安全组。tracker 要和 stroage 服务进行交流 + tracker-list: 192.168.159.167:22122 + web-server-url: 192.168.159.167:8888 + pool: + jmx-enabled: false + # 生成缩略图 + thumb-image: + height: 500 + width: 500 \ No newline at end of file diff --git a/modules/target/classes/com/bw/MapperApp.class b/modules/target/classes/com/bw/MapperApp.class new file mode 100644 index 0000000000000000000000000000000000000000..a33894e95feec71dc4a0294320e52407d62081d3 GIT binary patch literal 798 zcmZ`%O>Yx15Pim~yLH*MS6**ZeikPX z68r#u6k@!MN~pq0>#^sJ-^@JEuixK)0(g#RA)43;@F2j$5RdRUz!QenOQn@NWT^M| zrwomenMsC?vC{HQnMKlm5K&5=-q^$?cyo+{(;^`=Q4Iw$A9~{s(h(xdQV%D{84{N{ZT54Vz@%^{gn!lFiu`NK3WLm zAATtXxjj6@9%?jM{;Poo3IVNabmC+g+2+AlurC$drnOZ$+X!jjy$V2wc0e1quudfY z@{5WL==5s!AEQ0$O#RB{y-oJ8z=<~2&5?xXh-BtTL0s?PMn@j{)^884iH*y%WWV|!VBzH`oQ7DFA) z#dn_Xd;g#B{oc(7pT2hsz&gAWK|6*t9F0K1kd9+ItO^VxsbeGp8>8hI!*~P^CUhLv zkJ!>I@sV@NK~NFQI+@N5K4@}vpR z={T+9jE3hUc+fw3LBop?tdN@(I4hSg$>qy(`HEa#lFK;_FKc*3AiUX0JMI<%wRz=$ zKv`F2#1^RTang40)a0<8+iwl0cw+Qql2&TK$~kf$9G1D`PF|q0Cz+W{44+KwxAXQU zI+?Vbv_O6Hk)8?bgq28H>9It=n{(1*o4g=aZj5HJdx!nVVJYgrL=ZYX(-@;4RhZ++K z5c3VhGGQM^M{{1vow=MfBe3+dLwOo9l5Y_h_&Yb)#e?f{>_j#*ks*^#nkFH6OKXDf zT3*-PH$0Oq-0~wOl#!gx3#lnN32NWM0RNX=&>qrmXGuJHMM1zq7yOU$rKiaD>7<=? zolH8f;j6s-J+?cZ8QE*)tV!EtpHZbhGnGr)JJ?C=J=wskWzR*i2IQo6zW=(d{J7T| zWoa7o;oSN8rQ6r}j=mPfd3>D@$QrXXd?Si);#CdbisCiAuHlU+zKu8eCX$ZJs|?@1 z{_@<_Yh*p|TCV5j%DE4J_BPE=Iqdk*n)dc~UP^fG;`uulE)ab9){VK#R{{xB3jg)| zE4SZ!%~N^z&b9AJl`FrTyYU89*80Y=`K-Mb@H<}%no6KWK3CbXc5Zqym6))S$7Sn| zSgtkfq(>6|9kN*VdlYZsJF*7m(j@KvOUFwhzAK;wT`!=l-5{{!Gp)SjqPPeaVfZ7Y zv`3@(J}yOZ85g4XfkZ!)=xw=Nk?BsGT<92*;(7xwtVla&jP3O(c{wkz%0V|I=dov>0^}CN5DJzvy9LII{C_zqR<7Ccp z?E#rkXWoB?0?Y5ETvA=|T>rysa4NmtMObiNVjql&($a$?0o~0M(ug;gY7~Qp^0vEc zM3PtHvOt}T&f)L&`p=Z8bBqs79(8$dP$%jSULWCMCyQlB@HbrkDG>7MbA6b*1iymc z(5hxtxQ4yMT0BA=^%bxl8@MaSMtmNsG!94jtpn7dn@|p2gWA(#lo_EL2&))u zF|-=cQ0Yc>r2|`cX6rTwt2md zGP7*nGjXM1_*TT#My%-DEGsbznIXE52Z|y3UsUSf43+4H%`gMh1-fAds4wDb<8$)? z!k*D0vSM~`Ldf>%(MGQMq`IgR!n^sOKzfxhf6!k&2mZLES3!t`TWU^)GPNK z`g##FBFpsjA}p*XKx8toz2A&TRB&8jR!9atVTGX?4@e}vR+M;+n$e=ysHDzQk4oYS z>I}&{^pmJGDEnScUX6D<+%vdO}k4Y|9nK7>urG3n|k4e(nxFchpJ-!9zHQ<#?U{7hk5uyI6^o7eR%{d9=oI_#s5pu)F^0!P7Td)s>=0+MQ=CV)coVzD zWjro^gdTAfd&Do$E8a(+_$~H|Kj8^+8~eoHuwQ(P1L9v8P@))A;y9=@;*hcehm|!r zqHMyGN*9Kd9voE$a7?i|`5n!sswJQnp~mJ{%I{**%pSq5}<0GsgzPQ`Y0HMS5b%<)rfB~o#Yk+%_*;g)g< zokSsg#LOQh3X3LXE4uI)G_irzZs(2ZqFbrQPIRMOWX0dHizp&4legVO72SgdEDSkGXwo`GULgT;Cd(#s)wE2EFYI6@Q>B#RyEHLQZC{tdMP Bd29dx literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/config/BloomFilterUtil$SimpleHash.class b/modules/target/classes/com/bw/config/BloomFilterUtil$SimpleHash.class new file mode 100644 index 0000000000000000000000000000000000000000..260b296b9d7fd848e049171336dc498dbf331d99 GIT binary patch literal 893 zcma)*&2G~`6ot>kPC{I_DW#!6lhQ(f{E%i-At1C+A|WEBfE1|2j)^lQE{+{JPT8^I zNe~hnHb}HcEO-FkgjZluIOA3nfrOByJ2Q9g&v&lvuLqyM09ZraLK^2YNMTu<6$=+| zQJZ2Km(#c+U^sFlAX)s>Xz%f(S|^>)M}Nt>2C%-C6H~qzIrejc2)RTc0GFL z+JPgzZ5g`yeB?BvfjbtkI__}fsrzy~5U^XmufnD$$7992O4|vB_3q2M6Zp^Fe*LZ& z1jBo-7pd?`J?~x4UP%(n}<{++`E46pzuB>~~@7Fs~==%LenL30^ z_Fd^sV#L2fs4!IHi5F43r+k6wP9&WdTXJ-y!0H5(&`|_pf%!k+R&_laQz+Rufs73c znKa5aDyZ7Hidq`00;T^INPWkE54$_c(O4xt_TMfJ#Sxsm{fGl)1cj!Yfebg9V3u0t zra(zaj8^$#= zXBOUIq4E(%eo)Ps`$#@pe{G6)KfckIFnjq|@0nn*KX8uXfDIPAO_6uVu!$wEMKoi! zH5RuRwLlI{U;9N_!x@|{X9KaGnd}o*zkQB_&V=TmWiSy8M L_&#t6Cz1IHNJy)E literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/config/BloomFilterUtil.class b/modules/target/classes/com/bw/config/BloomFilterUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..694a29b6d70975c08fbef488e789e95f1795f5db GIT binary patch literal 1648 zcmaJ?%~M-d96k4ah7j5`HX;I25HKWxR8&*~NJzm(L*tm1nb3vv5+3l{)Ne+ z-D%eJ3oY`5dq1X4GPHLsDW-p$lJch}j=tkpfQvEkHxyLE#FlP}@0$XIe* z$6pap6Ej=vk@t4E=lP=J+SfXbs@=M7RqOP`ieAmCZ&@uzuDed*u)^PWh-mEWO}W!R z*|%!9H?3w+Ofk8qwX-7-Pn@!;Tkc+_?6(|uFDtQ#U4i7;ZU4_jzjLZsSDoH|CWZu} zo3_92?R;gmtcFcB2s=cLe9Lh;eJzY_f^6A7!EBqj!lP!%Qmx+AEL`?Ft(r}3snEq& zbe@w(Brx=K$Mv0tz2&qWDwlIz&$oPsXDr!yt-VaUDJkztPt`c)8^fgV>bVPyo_X4`ZasoGF&M!`#03&(ruPUM!CM%TD+=#O9|e}sAb zD?*RZr!Ec4#eIw>e@5T%6NH#W&+yz4AMk+?4^IC0flXA5a(ss^<){(L1?oD2F-+qU z7HL;8!3Ze1LOVf^gv{+3AE%w*Hwxv1LB+(o4E;^Nz$B(vApw8KT@2c^gtD1FUQrjc zxHd{`>9{t(sMBo>>8V5XYlny&XvFsCOKdTs0(%V-(G))^Bmz8_*maOXPUAi3vU?Yg zoFyhPk26zpL_Yed3U}_JbsmljCasNK@kZpQJO%Z;Y^ym0XnxQb4k)_RH zJ|K}~bev}^Nl1zE|B=XdNrad`#|kB&lZI}bkd#5COMS078PPnbx}!Q6?Mz>e#yh)JYZL-)jvhajJrLPk0^QK5u z?C;Xym_0B8+r2~@5%Hmj1qz=_sSGnhNz^@Zl@4e;(Lx3z%_2Tk`aT_E_{>oD)k^2X z5}gro=J9`tj!a*3dBK@mn<7h_XWRg;7???ZY3WfiODt5co z>Gqr(=epe=v^y;e3Q#1l_1C5dRMUmfkja2{y)pL<>_QH|Dm?@*^3j$M(F_9=51xTM oVIl`*v?WXf)L;RvmBmF^gi2Ol%B%&;=vT3S1-*?uRgSRs0i}GBlK=n! literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/config/FastUtil.class b/modules/target/classes/com/bw/config/FastUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..29d23e9ce91e001585e1dc4f2880f2b18125021b GIT binary patch literal 2581 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 P7FKiqP0F{X9rykM*|gKuNjT;;`cCfvP_*Yb_ zgy6sr=#Q$H-7HBCDTnoF?D-xuJ6G4g{{T3_(*QN>HBrT*b?oDD0|yN}VF;Z!)_0|y zs6;aCM~NBnc*@=EhIf~qUoq@X4gHo8dSSQDi{Bq2zT`t1S(`4Anz4KJ)0sjyW zWkNIE`_KNMP3u>qb!4dIVia#tR;SpcSfNNh=nN_26dA?Z@lUXe;`uh6c`>M9qd1EK zY+{Qtmis1>9DGuOgX2q7eqoK_2i;b%U}!Bd1SLamW`mG->D&Gc=5UWN_Y35M!fMXH KL;3E!;^ALXvELm4 literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/controller/StudentController.class b/modules/target/classes/com/bw/controller/StudentController.class new file mode 100644 index 0000000000000000000000000000000000000000..1d65b7de5026121db48fbba4264916e80108765f GIT binary patch literal 1505 zcma)6T~8B16unbg7TT3>D~O1IXerA00mcNQK@$^`qNEsJe42KLGPvETyR$U>D@{xc zKKKLtQN}avmeSA?9(L~B$-U>Cd+*Ht{rCG15pB{|mK<6irD1xMqsO#i7jBm)4n1|~ z8Kbet#GVYyz6?)PRWe#ERdt9EG5MyP_?VJPadsl%_lB1I7KLs2z4Jmum%f$zjdH&rM-zz)AsfikZd4Hec77^UB7 z4|2v!Dv%%JdPRnx1=tu(m2_432O?C~PY%=ONP&K}BfhEw6Kda=VMqVF^Am98lA=l~ zGK^*mYe}AxyrGXZkB#zq8G&1U>uJgguc*MgSjwJ`%&urOP&o23C&G^**6q-@nTCYt zF)9|ibcvAdfeM^tK(_GqWFWGW#b{zznj`J)3EONVLo^}HTP(}HV>*xMnb-B}E6Z=O zjLci@o!VhV(w9~AZoN=C7AJ!HBB=2Xfsr*C4lX98Q2unE3`P$3637?V@3}BXor?fb z*?k>{Rry}oYm!fT)Sdf=6*}mO_8Vy#^>))i(EoP#Pi=Lpdm%=6GDnwOy5Z6YjXLz) zrD>XRX_n?(yw)W~E6L-#>i%Nr-Ijl<9Jl7MaOJDTz}nrVCHxB<{2LghtOnRDykXcJ zY#J8wu#Umwunaa+{6*{sHYpm%YJ&;k6Ik7L08P>qJj|A65M`4$;n}!s@h7FuXo%5w zcoz{SFCb(S1S@6?c{lOpzYvS)7Ix?lq*>HAKuE#nEb96hrBjz+^DWqXJ1l{El-?-x!Y#cBzZ40n2vjQZltPt4UU>3u+|*&S4qk7f{uM|_ zs66lid=%n%8`6{}5)bisymQW+8ISYp_m7`Mv`4!I%F@F;W$00n9@7)IRCBbIqisgT zIFjZ>nx66{qt%+PJKXDY9J&+!;p*!?qvd)WTGf#a6)7)}2VtnKuu6v!qvthkT0H6+ z6}C=|=*Ye{pSUMQ81Yl#TW!v{7y|e~Y;|85*#vF&g$k8@$!My&)nJr9)JJyS@(`B%BGLu+&pNRx;^9J)v}?aHaC$TC{0ZVeDh z@~&=c9$OXgI-;J9t)wqK?y0ajTEwxA?2+hpQ8I9uo(N*d%qNL2(_{kOQX!+=>Oa|> zlKqJi((YCm&5r{ynmdyAOgE2(YqOOGDOhj8 zVl>ieStU1P#Iw; z3>ci48Q|veyYrD)L<`uV7nDv|Ux6Won4)9dxuA6F2JK=(yKoscpap=IX$4ew0nXqL g0p@0|Rl0}soD+T@n-r}j>v|GehQ9%Sb13b>ACJu_B>(^b literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/dao/GetailsDao.class b/modules/target/classes/com/bw/dao/GetailsDao.class new file mode 100644 index 0000000000000000000000000000000000000000..11d116cd0e2e8d400de16e894dc67a1816edf262 GIT binary patch literal 221 zcmZXOF%E)25JmqWfUDqre0~AA!z#uy#wB5%ht_Z%GTQ{gDp_Yc{jOCTY^AzdN|@!gtaWHT6K;+M z?z6(})%L@(I#{I-vNYDl5U!Hr?s`L5K67|;=2d&W=fJ)p#LWOghzwU;2+egez*M>} z)us+yvQNA9krnUL+_k>oCtC^E;*kBQ-EDV(L=RZXX!i#uO^NRB>n&flJIRR%;wWDM k#uEX@MD$eD2$AR*C!%Mfr;-UsX^yl1(z$d97ybO=7x%$cSO5S3 literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/dao/UserDao.class b/modules/target/classes/com/bw/dao/UserDao.class new file mode 100644 index 0000000000000000000000000000000000000000..e569cfd3f7e947be5d532832481f90a51c42e693 GIT binary patch literal 307 zcmZus%WlFj5S*n6;gLSnuLvCQg&T+y>M0dSQ9r;0D|HlNuR$)$ATgczIXu(;WBG%9C=+ zc7({Yo-hiwTz8J}n$7ZBeo5h-ZbaZ#gmIy(RyuDLA^Rs--;3L@ZBiI-OZBE3_N5_X zE6pNY=bXN`ILf{>Z@A$txsh!pc86M(Zb%>u_;+9s5grgRjv2*-A;46E5mVzJz=Wsi HZA$+Drfg0^ literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/service/GetailsService.class b/modules/target/classes/com/bw/service/GetailsService.class new file mode 100644 index 0000000000000000000000000000000000000000..7f754563e72f6088dda35fdb2916714b8528e579 GIT binary patch literal 173 zcmX^0Z`VEs1_l!bPId-%b_Nbc25$G%lEloMVxP?75=I6I4Nafq{9OH{^2}8Ig8Zy} z{nC=m9Q`0`Mh33n{L-T2RJY8WR7M72sIK7DqO#27RK2XkvP4D(S%_BsVu+|dsv<@P t0gy8NoW#6zegCAa)Z`L2Mg~R(CZK~D7#LX?8JHPZKr9AUAj!nQ1^`CzEnWZs literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/service/StortService.class b/modules/target/classes/com/bw/service/StortService.class new file mode 100644 index 0000000000000000000000000000000000000000..af0981c394ab4ca9d17d02d5f92b76b2b24f8543 GIT binary patch literal 167 zcmYk0F$%&k7=_Xe3SR-5flChZ0-6xI7+@?}PXL zJYN9zCJu(&5VW!y3K^7r0H<^Z7uS%g{z`j@BE(^5;ksJFCsk qsZJ5rqsYy;@;^dY3=n&DyYQ)YMyG;6$oeY)<%9|Hp<&u*hT;qVQ7cgZ literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/service/StudentService.class b/modules/target/classes/com/bw/service/StudentService.class new file mode 100644 index 0000000000000000000000000000000000000000..a15d717b40a9c6247084979194ae772b8ed1f2c2 GIT binary patch literal 351 zcmZ{gJx;?w5QX13i46%qmS||w8<5zBE%yJ zX=bEve%_n;{`vd@@PstMRf226tO%XqCgipagxl;cFWpY9KP;A z+-F1mFu6E6k}f%HompwGcO2Nagrx1|2(jUsOVNDD@=EWus&%tbFHPVL`_nrkD=wym z>wL-2wr0Z3!AHSbQxJ4w|p)N{qw=LL|=tMq@b_V?go*vG7Fb UgmCtc&M_U(Oe%y6i4iV;0ZAcR!TSjf zsk%R|Hvm)g5_A%D32|X}=13S17nwb%^kP_@Y;M)2WH%dqm6bPzTFnSQOZI!a{nJh# z*t07MQ6&bU8N`JtJ)uAR*Kei_9xi};6t*+5M70LsW&2Feb znN5atsa#{oJkbY|VbW89-08OKGJGzm8biU;4dK^BsO)zFX3R@P0H84arrz zKa>r!ae0J0 zJPyO$x&IWMDcS#zz0-g7tAUX%88SFW!tcu6CYfKVCY*i;Nd_7ExD-nb!2?j-Yh?i0 zH}-d}lxuW9a&%khQ0Pfn4=G-tYm}vUkz$G>*-Ps*eQ}D6;@Ij5*oXdhfmWLgqRr51 z1tNC;|-dAK^Oym0}jI9;2Cve`=b{baF?WfLAobAgN hV`?JnlHdXsN%#`w+LAG{L~kivCM<>JvpKE+e*ja73+4a- literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/service/impl/StortServiceImpl.class b/modules/target/classes/com/bw/service/impl/StortServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..d598c05acf6eaa9517abbccafda4fba884028bbb GIT binary patch literal 1035 zcmaJ=U279T6g`uq-6V}RNt4=IwSLq#NwuTkgP2k%icnZAG!pP}vYEt*o1L&bY3V-@ zpZo{@1qGpgfY0Lp(4QgR{b)^V@nPrgp1J4Td(Z6r`2FP@fCsprM-Iz5WO024H*nL! ztvpt6JB!skGFY=vvrxCtV8{kW`{s$z3{~6FL*6;yU7>j^ftw7Adt=Y2p=_%_bzHga zdD;l0v==Zuw6)*o!N^x$zvqjgJkb6t-jTu!cuzPaa>&IAfp3qEK2W~wlI--R@|4+P zNZ0CZhRkE#l?=1C^5nDeup|BFf~ql;ZS4rREqoPzCt$|BR8)TTxaC0l`^u4A4M%R= zdn-nE2%uuQXdYVyhGC&rPiRW=ksfG1Hp=CDl$LR$jG{dd`yz%z4(-gJ?&5HC+{xOR z+|4uEQQ_tmN#t94>^t(Q3a6?@_(YQ%VM&JCxrPQt`cfOJ$`eYnfLRm^m_fn9dI9se z!%&G2@bp*~?iR2CPLBV2{r2aZcOmm0!%A}6|Fw>x7+K*8ug`Zo1L=@~OJ|sqqcF^! z^B2)6lIj1LTKcQK;~CkPK7+L{+_Bv4k>$0WgcDUyGRVkBwOHyDJORahHYbpl34hRL zy-l|vOLv0~gPv6A9>oiEX{IS&q?n>e#?o4%FHVtBoN63_eTcTpw1&wb+8nK+041P; zDn;rVmuL;ilF$^zrN&33J|oRwe?{g+3Ew|qYP~#t1nWI*rx8l#qtpt;Y9u=!Qxn-d c2`*rfgfCNWSTaVI=q-gSgr#uxWR7dVA8vRB!~g&Q literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/service/impl/StudentServiceImpl.class b/modules/target/classes/com/bw/service/impl/StudentServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..bdeb275d9e596237f4a8d8dfb38da858b4cdc605 GIT binary patch literal 2071 zcmah~U2_vv7=BK^HchtDMB0KBrHGienziBwl2WW78cbVku!`b1+vK!tNq0M&O*{Mp zhAVHKag+-fZefO@A~Rk(j+g$2GJ5BQS6*12v%A?QrN~Tj&Yt)4dEWOuyTAYU^DhA2 z!q*w(al8jPyqCoZlr&6aa1xVgoXQ}9_cNHn2TF2Usn4YGVH#(Z<|B3fIE``|=QMnx zp`u}0Ak*|(b!mHNOh;g_Qgc>}g>|EDIz}~8lmzzAwQSE?k@Hs5T4=~A+jczDvmCoA zaJ=HUOGb0mwd|!u*Ibe7j(f#ekfz-<7R{RHxK|A`axkV^p0jSbvd*xn3Cp&;Nr8A_ zWL_X~+Nn!{Jr&EAGp&^c>0U6IO(0)!YGz~JbS-rbg$eJn#q@8$f;sAJ%N3NkmL};RH|uqQ(KcviZflX*lF z@r;I94d(^=rloh;sh>Ahdpzl~Y^l0z$QsKqRtS(cOnb>F+n!vKZt1CDViw^)zl#S) zsp_=cnmlW%jtz#iIvP+^#Z>*;ZCsi}B^{6TG(wk>j(ym#V=wwOe5&Im%n9s`h<7xM zEOk_IfutT?`*!pCkIM5i4Kq6C@wtvKa8buA_)AJ&eN){4#YaWgt1iC&6hx zN^6z!Z{m-0pBlT5^sgwX?LK3sG!l6idt zy?4YmuslP8CCRZULrijts{(k4iG~R0RTO-vQz29)#|TCVYm8RkAi2duT*GS`UT4YE z7~*e>E|DxA$ix=1PY5*>w-_q2O$4?SYcT#Lgg2NZDVR~!ejIOxh4>>ZL^0(3-2d_3 zqj>iz-i*@Oj$tA?9I*w85yv8q@%zhpRixz6(4C^ws3B literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/service/impl/UserServiceImpl.class b/modules/target/classes/com/bw/service/impl/UserServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..b24c0cd309a9cc263eceba6196f4080c11784cdb GIT binary patch literal 1530 zcma)6OK($07(L_IxsGEXaZE}Q2#@e^62mQR+J-nyNeM`i96)g!iRIXtmwaZfVf27cTmk4p@Ugu>6wF}SZIrBZvobQ|a*ZW_82QY>k z2^>bY1BY<26PI9H_%wmb_$-dk6Nq9gjxUV;GLEmz`FI>xEKFF)S(p^C8g=E(NLL`8 zFS%8_xN0v-*Zw|4a{_(y4ae72wV>;|SW(lC4xvFYELaPZTqBlv_B=#mKk0Uh+cCSmB5j_cGS&AwWz%B zB&!Le@@`317Nn=mz6nPCyPD6KsM71(8{j4 z%i%3^!!2OL*A;u7VNoN^t}gq6nADtJ7C2P!W$E6WtOeXGd@ay5r~JF_;%#Xp@s&ra zaU*D6*L{IwnU7bj1Rh=aWw|2lfQX49m)`v{+^=m*alXZOvgJ0WZf=Sh5(T&6mDCMw zR81SWuq)CfQ&1ptU_a};f^vPIa(OeHaZZJI=(8K ztk#OGG}Nsnb~H0P9QH0C+Vo(fGMNM5Jy5|n&n;(O&BTAWhPTfh9Gv1Dw#*q$^DA-~ ze24r+OnYfl{K~Y`_RzM`vh!SfxwB~nZER!{;u-%$@CjGr3?@3pH5odf5B=N;PRen5 znc#KAm=2g3d5*~FOSDBWmwk<%SBT!}7XQ9LEY-dV>uL56qyr3p63eFIo9KAD$0=c) zn5QkM-OuVEPz&153-JYGQb|mV4G?RZ_&B>A>cDn}%+7+1@jq!| zB+VJ70H%>v~moomIrOMTd%p)s_QVx>v zP`Vwu3B$sOlSLbv!bF;Usorp&9VtgeOi#yp@Wu8^_y5?<+5Qr7xZLBPIP{7VGQjflMuK;+XGtI>ak? zOkzX%LivK#3wfG;nha0I4koLs!d1kx8feh(}g}|p{XxA^l!T*Vj)dzRzwU_9BDA0qaHbKIY z=f78IU5znA0JVM@xJCe7=Q1!)Ky@6jK)~WSphf`mVv@Z<@#h0SSCA} z21~d}`$|T@3RcOZA>cMyf4GHwiq*a&_x2PM8()y8RiHKb6~#|PIiGIzT)Ns>x*W;k MS$9)0eA#=zZ%`csBLDyZ literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/util/HttpPost.class b/modules/target/classes/com/bw/util/HttpPost.class new file mode 100644 index 0000000000000000000000000000000000000000..2f0aebfee21e80190a457d047692d402096feefa GIT binary patch literal 3029 zcma)8U2GIp6#j0zyR#jJ{TDDbd%YulMAFJC^X$w{qo!yVJ7@NX|GxPa!0q@@MLS0Q7*lZz#;dRw`xHE&!YhRna(++_`&B%IhZP)9u>_+E z9#OFrkIF$;5b-0bq82eZ7;>1D!;~DRIhfK~TCNT$uvD}m zqr%1^iODK>T*b{&vIP4T%qTc4;M*Ke#qBKumF?^H3U~(0m?2OTj;D;_Y%*e4V|pY( zNqyLi>WRI&6_?L>p~s$%X9SwVQ8O8g%mlM`JQ2Ldw$meK#@n> zD56)kkxVn-td$U`b~RFl9UR{irq6=GHo3yM864cb<8ahS+i^3+y|$9_ke-+{t)vkn zs$4~xX87aMvKlp0DI+SO0xL>LnID1%in}yiA=6lPYAT(znI}U}%FT!+u)OHfw(R7j zVHvSKh8{C4?)xkwlT9#Fd7ZK>ySmg_I%@0D$A?2!94+Tf* z_o$h*qQ=g+y!NGq+uR^8LBl$92&|MbhJwMKTl+S2^V1XR@9ysjW{gB4n22X=jb+fM z;7JWn;c0{&uDlS#}z!M;d#738ZERVGa;Zk z8~H1gKE9ygMZ6@?QruXObl(529b+0^mddZ-RSmDn;dOLqIDt1byot98N0JBglTOba z%aS0at8y=d#2p{o+0`%ocv}wdXm}ULWk4r2yeIS5Pz0CQrQv;a@J2LzAXQq6o-ax? zfyTv3j&EE&MWzqen6<9cIqV(r$^aBP{3= zU442wZKPrXUDs8Rc`}fre%mZK*x0^k#?F-iMo}|E;=O*WzuFU zW4L{lO?HqF%FB4e3MsfVpHTFrBOlQ<8*VcwD|DxwHk6d}%|SZoXB&yhelF0tSbi4R zDmD#oG+|~4t8o(SbdWJik5Zz>;+cGySjG2TJ70Z3C4_7c9M|(H$XRgqcASGa%S8n` zIr+3=v=Fs3yjr6LC-{v}8_yl)wwQQ(!4qdZY zJ~4~HL}z`=Ioxm#D~3hL*OkMK6CvLmsso;YFNfBBXRiL)HHSKGtULqNJ!%#4b)7k^ zE=g$irZYI{?ytFiL?mzV`VrkBrCiw`V9Mt?><#hk*Y&U_I+%UNimRy3eZ zw2IYY4QHS5JNuQARiYU?h^gmAHo}7@USu;*4)D{0)mTA-wvuCQy!o3D!WwKRX$L7C zB4HmPWg}!=f|h2;kE0~SF=`!0KVLi>`F7aMXtpq(yBX14Y}8xv5eD!vt(+ofPm{Hu z68AZAXNmiYxEyh_#GNPZd*bGZyFlEJ#Qj9vMUw9lS@|<@zYzB;alaAwJ8^#y_ZM-0 z6L*=oE5u#JfT+ZFM%*hj^od%8n2mnXgpHyFn?)c^Oe*b=q0o$uU=yT_~VkFjiJ^?5`uBiqKi^3lfuW}^}{qJ!S<c5=; literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/util/HttpUtils$1.class b/modules/target/classes/com/bw/util/HttpUtils$1.class new file mode 100644 index 0000000000000000000000000000000000000000..4e22c8ae26ab05c7c47d45d3e520dda745df56e4 GIT binary patch literal 962 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 I_l9f#AHiR35dZ)H literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/util/ImageVerificationCode.class b/modules/target/classes/com/bw/util/ImageVerificationCode.class new file mode 100644 index 0000000000000000000000000000000000000000..c3bc51f76745f3b41e32c0d705ce59178f0cb282 GIT binary patch literal 3452 zcmai0X;)j<72QwMlf=UY88H|<)k!SGARA-s8k@u>hR9{GjcbB4)DP()9??L=!(caU z>?S3h=d?}dI&IUmX_Ky1L|0kO>gWE8{)m3bhq(LP_k`4xl`PO5&OP^@ea_kENdNlq z@9zT`#CuWnq7Xq3iZYaREJqP=B`@kIhp{4ZCyZ5@Z_DADj`b)SaYx79DE8v>QRsL{ zhA%|XjxXwXIZEAoQMBN`3}4dmik#e$&8u?uWgQz)bfF-d*JSmTFup4D*JSv5;E8*H zoP9&Cd{c&RiT!Vj>^ot6H;V7!`#OH0<8=+8HOtN|IvTVzH;djT;8^RF#U_@_+h!_n z7IUc?r)(E5X#XUZ&CD;oAav)k2Rrj(V_&^fzkJ0lwW ziS8R30;3db*gIhtt*O<*yj8w#&gUtKO_VZb{)Sn$W$y_C&Z5mXj!tAsh1C37N`Xih z%$#+@D%%To#&qmbQJy5GhO$C8TFRFMcB0#bWv)3XB@=&g{LE{Jx~gMzLPK-CriiE* zw2N75T|>C)Cq*mH9RV6xvF~#7o)}#;X^g&&QaM{T*TgXmM-nyTw%|=&TwPeO%2rmP zAC^$~)=zM_Bg6WDtT<@4*p>?#4u1R-v|3y(Xo%O;#>?jNqMcb8c#2%pv&_snR+*t~$doP9u@ou|hwDSJ8*Vz8vm8%b<9&@m(#D8>g<)l)>>vk zh1Sm}G_>xnz}#J0&sfVsofREFX+&;a2jU}^r7EC3jGYI zs+qddFff3VRe7CTbbH(?m2)=V7{nYhSh4p8 zGr1!bc8c&P27Zd48TdJVVc?he6^n33r$zz;BY51vukpaZWxT1OYe#99+#2`|-Zbzu z<}|b^#X9_69t}K&w1MB^cN!q`TLylQtbvOdHSjk6VBn8<$G~y%=rTUTYPo#n(zuR4 z8Td2aWnFw?A^%VCrstQe3^VC^$4sZEcT&fY7D=PDlyD%C?v|dGNT<_MT5TS4>O2^B zPeOUCm~$3Y$;yok>-U290!z4orHj|s+FRlZx`?%ryq7oZo{Ts0&|;MtPYpzX#y)M4XUcU zTa3oWL@h4aUr#BHNX(@jrKj1L*2=cS3Q50_ zL-0viapjZBQZq@UW>%D%SvP8Cxp0nv4FYF4eww=if?NTqn*Le2Ph1;)AB@_cPMvW>>M&aMMn*z=xxL+px0;1M+7QMBSQ z2IQEsmvrCs>@`q6z_75V@$U()e3Ufc0#|;nS$-axH;5+47f*{_ej@LCcp{wxlOof( zACW~;Y})tRVId&wP*oMU~!p{(c%! zwp-nMp6$Klfot0*{f1{`gLa7cBD}k_?eCwl!!xR30LSJ2uQ55_}rJsz&0?bU$x*28y&NPdO4pJ@R-j?&v0{p}>K1d*M> z1k*H$X-r|3V}@rot}36NCE5g66O2=kn*G%4Cm}B~$x~eE)NkRZA7N7SI<9afv{~|^ zAgimm#@I%23o|_R(e~3M%5|dpEHxY9`w($W#|`ZRD$G(8)Obgt%#QD6<#k%}Q#QVh z_BjawKYr4pW5NsHWUp|z84vj{k!i+%ghbI>-Sf0Rj|M3qhz{?W;}}yJkP@Y z9EoBo=MTFkJy)9fZRonvK{vz!AHm(MLe$POKsq7bXDT{(U~Qv|MSj4|uKobCo`6aR zD>xK8T)~kFK6N(O*Ae7$HXhh8gdDz&rP$HpnNTkkAF1F`nI*x!9l2@{K_r350@sbywM!x2TC(c)&XF%Odcfj|M zSA#lk=`fja9sFg64^#v*$a<+xah8TD)IU~BR7eT$D_m~N3wo9#u&_WI(rqtrmg;2} z?e6&-lC!lw>Xz#UiTav)#4Xo|0?ivFdJc;;Vsjnfyrj4o@hL9mDAX85VP*cmsrA+; literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/util/JwtConstants.class b/modules/target/classes/com/bw/util/JwtConstants.class new file mode 100644 index 0000000000000000000000000000000000000000..3662e9fb3de56b6660f1aa6b0bba363e6941f18b GIT binary patch literal 610 zcmZ{h&2G~`6ot=i(#B0w+NS)J@>2>dXcu_HszpduY9Q1&s1A`>Sz~8NCUItpJ#Hv( z#R`c955PkqZY&Vqu(_UZ=FFLMuYdmf{sX`>JZ_?fI}O}z;2vS))a##g{V;kTdgoF1 zl+gAk;!?P&&?7grnbMcmw|{fz+(a`pMV82yYT>d~J$$-o zxrH{i2|NFD;FkYQrWa3SVhN2RmszBSgw=AT#f;6Jay^w-oJhpUP<|YZ)nuB^w7K|{ z<+iw-f4=&{iAvqY*l51gO3g^=$eO9tN7%;_|0iGtw^7G3cs@)^XfQh!US)1pc#XML z;dSO~72aUptnd~)^GvbL^*X=cmJBQ(egl0ipS)4VAg(ps6vW_Ls_e&OBl@=roPdv z6?A)3D^$6X$XP|Lx~>C7+)3D~~o7TQ= zO1M7l5pYkfYxTvMKtjc;X4Hr}+H+b$#PNWV-CPdqCwvyVuPpWBcdR@uRP>^=xJ;hs z*L7#lDm~L|t)@G=P3zITQ8qQFY18-B9^z-j4RkM7*X+hgMCN?p&L^448CIs!u*{ZT zaQ)3>-GGp0tgJg*4c&gCA4-@Cyc_Vs@knQG%}G5>hI5QC6`BLq!GqGO8+SFjZKn%Xp!} zhLC)4+*HirriAgHe8^g6!_iEK7nLR-aEC6ctN{xWWOr^bqEUBbGM*|NG$k;f4`4`0 zX@z1*-!1PMmHleXwCXSHhSNM~{doA3gs~n|Zt79dr$X@J*0tn?pO<^RV64bdE;Nm5 zNw+0TPWQ`^XI8v@N-`CI;P29-hVFRcm2k5shnW0>uM+rL?`}IEA5_bhZ8&>17KF$7 zg*)>SZuDXGpC+c#U`{{hRSBE@Dh;?2q}X0wUEz@V8g;G6VmrpjoxZ_oxpmW@k-ZWe zS(YH`gIq5K*zq(cF0*P5x8-cd4)sGs4OA>@hBe zus-)Ul*HK2kmr8G8@-Y?pzv=eQst_5%YAfCk;FY$(hAPueSARF`&?BK`WF{ue3+H7 p=t_fv6%TrkpMs@!a!$J9U^XU_uMiR0$-fF)&z}TmA8{7K^8eoxdlvuz literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/util/Md5Utils.class b/modules/target/classes/com/bw/util/Md5Utils.class new file mode 100644 index 0000000000000000000000000000000000000000..cb2d1a5f855240ed0056ac9436d4a5c393278c0c GIT binary patch literal 1936 zcmZ`(T~`}b6y29hW|GMOArK_3RcUP-K10e!Enu~L*f&Niu|?Nrp9XUE&g}(TTKBO#l@dJGFkN5+0xr%!xg@B|FnS1BlbNAW%oSpgO)vreY#$c(4;%)#R zsrVT8RLo%3-OVYOS0TG63-0=fiu*{pyF~?`s?d-QAQQlniY_b%v4YQ3e2!HYU`@dT z1?vLxv{^Qty8^y=A77ze*6K~%9Mawacr|(xW$mbjd*%n-_;XEy-z#N8?y{#_Z{OjFe4Bk z&J1JZ8`v`T*7ahQvU)BMn5k}V8a5#XkE3Uf=l62Pj$>M7p7|)u?a2i}0ErDO1fEQBjXzvA-%Eac7bV~O^#Wy z(d8$}33h$es@geY!F1==dNPh-m#cdE8aAt zeTRQL$1~!Zt-B34)6&)bier>G9IML4zIM22C06QpY(p1r>eM$U1ooW_q_&eLM2i+Gv1@%WyX5BQ!tHDFDA2+#XHx?B!q3=y3PiL zVc-UClG6z05$8@~)oC*5hoATg1~BMxe}*9plW~H-+mMf0%&%ZXK~ljj1*4qLKZw3U zgnI>J;$QTNzY#trj9{Mo7{>%J`vsBQ5#7cI^$}r_YYSs-k@iD`)4!mDU5hjZ-9~;O zCz-5T$;cgecl`$0PV!CWh_8~LI4N<5!62qiTz~~acqRJX3IpLlxTl8B17_8|qM7H*FXFZrDdUw literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/util/MsgUtil.class b/modules/target/classes/com/bw/util/MsgUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..f02beda0c38a6ab0d45eccf305b3d9e32c72b806 GIT binary patch literal 1977 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 literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/util/core/reflect/ReflectUtils.class b/modules/target/classes/com/bw/util/core/reflect/ReflectUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..466c90a8eb96dac0eea48cf3ff6983777b20aa63 GIT binary patch literal 10821 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 K;u@1^D7sPA7RYebde$P4pu(Tdbyc z=r6%DH^vQSdN6yb&P>Ec-eEBlEt8pO2_JLt-&kzc`Iz>3L)t-*Nn+zd@*8aYfP4x) z$?wzFDfr(kq>{5>n;k8m0%0Xu8jLl=f-pAC)~CT%e5l2yQvUn|td+pMtU?b7m4SMr z8fn-niKVS7pnip>S0S;iXa}7xtR6-tap6c-wH-QpiY0-}pam#ARzixDEJh-J9dAE? zUT>h-`e)4eA&%)ynh&VT=*Lt}Z&4NcmjY}nIL^gvNfR!Nx&YZT_${VcIG*Qp$6aQD zhcIg-7AuJuvz|8{w~##EGc-}5kxLXh;(8Bp!mekG0J%@T^Fq2<{~n%_UK=dyS39k5 zuNLcr)s?WfQNrXXttoMXuz&zOUDbZ*>{})Tl`yC&1A^b+?Oho4TR`wTK=21D#dhW3 zRTZ59Odrr9^e;!vB@nE{%u=w%h)Fd%1TR2BG0g)fpTj$pv>|A)_=7$pvI!W)fWVml zyg5G|&(g4LR_GSD@d=>5;k^p#-tU=+9tNUTRkv6w zeR!aoQL1u)3V9OE;K?+Xi)aNGQwL9>tvr=3!~0bj>*E6n}mJzxbF9&EMUN#&+N_CG=t5m$k z-5>yah)ZcIpGUKJKF#AY-FBn;EY)q7T2-*jnUbe_frrs;Y<|MrJZ5fQgI(J6&8MN& zZfw4vCK%lt_v>nGGS#?btQxgYV49L;LiGB^^l@5_!`WF0wEPK9X)Ari{6(9W#yP%B`*ABvf&bF#osp|lhrb|Ke zZbnfO*kV*Bda)c(hpUcL*HKW4+NW3JCZkM$jOx;h0+(X;^by(?xC{+T#CEi+kD=Ep zx*?}}I+9*q)*Ua;+z~U6Q(pSYXHdQc<=F=Ow{@*l!EL~F6V-7CHF75@GqCXPycA1j>I2{K+6#WCcH>Hwgs*@LRY>51SYjso}hW~?5hHy5$fJg zQ_x=3R&|2%11iEMY7|e^aAn%1=fWY0HMsOn%I7|s#1T-pAKckR=W`Tx#&vsw*su%* zvlaiBBRR{3b`r9P*vPh%8ndkUpG!IUXQ)hkPvSlp|2iH5FV_HHI^nw))w4`8V-9bI%D#|Uk4&VzIeE|P_$dJ}YiaC0K bfaeChqty2-6^a9L+Cu;e)4!lEhkp3K-<#B( literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/util/core/spring/SpringUtils.class b/modules/target/classes/com/bw/util/core/spring/SpringUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..a6a36153556aedb174b081a9ae44a99ca69685d6 GIT binary patch literal 2476 zcmb_d+ji4N6y0N+xOUVMD1_diLpwtOzo#vrkU8{b0{%*%3H zmOHX6$Z}Vf#X9cceichqJgDNK!sv$f!X?kQCVHvxsA;0M8+W51Y;Q*1wtiuvXRfHk z?q;gw`X<~A+U{bq^&)Shqnkl&WxqSXnpGH?3&Oz8E0i0P>k5@c^F%8gZ3dxU>1}W5 zXiaPsjyH|(b=JKokaH%i*sUN|m}vTD+ueBK_H5AM(~-{Dxvhlcw-m>GYrJb>yBZl^ z$8nB@!gAyPb4k3Y-{0|d*9InxtN2o3Y+2ha^JLYNXjvVRbG5Cla8S6|Xg>9xdv3=I z+iuHBRA(o1qQ@IgwQotk64F{CaX?+6)(YC8XL}J9uFS37%;{wI^F`0Btr2%3f3w)} z;<)(zvfueh;aCnjRb~<+9rrqRFSlLZ<9k#0vfEGJ_2a>8ro^?oD-Qme_t z#$n-EF9?(TDxA!_){pIXEa)I^G0q)rO<2XFG#zVXwl5lell?@=u~7uQUvF+o+^I9y z3!T7=H4}fS$nN``VfH3Tika!MV0YMcd&(q>ZDE;IgYda|rXz(jhXjz3N~2Y8nO@}U zr9e7tEY~borNk88{iYY%U|X*Talo!y2t#ANq^uRD3R@;-b!%f8N%sDB*MvH>vks18 z%)y&@tBS82ypIoLIqP5w(+)1nauu$F8GKwt)4?)U6wVLP(cA{+8>51rq%Pe#PFWplyS$wkVAO*dW7M|slw$VD9?1=!JKAA zaVlHA!*+H2UKBAyS&5x!6ciM*B7YlH=C3YEZ(ew4tU&ES6| zl+brl_(}=QX?dWWgdp|e8sj#T^TNS7oTrZ5UcdzDUF0eCQ0^}6-ZhFmJjd&l$|R|< zhX_;P>5&qCre@yL*#b|qu!(;)>BTH9`@%MI5bQw#SU+r6`q@Zf+1=|qywwBkk5pd^d( X4SuG)KV@P*3@h20v1)_P_Fo5`Aajnv{Wb-!+4*GK_V2-y2$w-%2>DByYd!NCBDtQQzaeA=zYcWLR>^>;|Pw zx25D2OB8NAI7n5P7u}{}8Z!!7D%P<d`p z9d}1yyUZBsXjzOeesy+iMaAs;T2NK2c4JK(m-7fX*BvK{`^ z7!%Xo>;~iZj-ea4T;Uax@Ch3coK#pp977XXeiXcn&RLGtnI~TGwvZzE9 zn-kTMGZjc8kvz;0Qh_X;W=3($_} zRz5-G1yU!7{tShT*h|`thLC1MNE#uWrTvfTQ4q<{2e*h48F5BCf}xB`z_3OrQSxQV z6+*4jbAq@456iqF!3%yMsuEm?pOg6zt9e>QBu6Gn0iZ3A)92Cyt{)JS5H(i$3CgcX zv{+Rxl$N;Pj~J^|kCA*qxqA5rQjf}&W2CFEF!tuM({v%wUrQV}=o+`EO1Gh*L5XNm z`j$gFYeSti5|fuHu92iXi4loOAeKsI*=WsIP@@9{3KL}%KZR0%3{@zhW~R|EU<*ln sGOYDN5S-Jpl*r#Ou1(1KJx!DI`=b8-@vO|mIXa%hgp_xc_9D3U513<-#sB~S literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/util/core/text/Convert.class b/modules/target/classes/com/bw/util/core/text/Convert.class new file mode 100644 index 0000000000000000000000000000000000000000..cdd31b1a162ce121e50651d6a50e15a158bda4fb GIT binary patch literal 14220 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 S+Tvf}VGHnL9)nWhvHt;?Bh3f^ literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/util/poi/ExcelUtil.class b/modules/target/classes/com/bw/util/poi/ExcelUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..54596ce22136543a4fa365ca30d79481f50e987d GIT binary patch literal 26443 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 literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/util/poi/annotation/Excel$ColumnType.class b/modules/target/classes/com/bw/util/poi/annotation/Excel$ColumnType.class new file mode 100644 index 0000000000000000000000000000000000000000..eb3da1dfb1cfc9978dc750e4614c53f6408afd16 GIT binary patch literal 1390 zcmb7DZBNrs6n^g7ty}2^3>@+*;?!*j1qI(WVPu)QWPo8nLj2T?3MJhw={nGF{vban zs2Gig&;BUmx!oconwT}YJw5k4_c_lw_w?tluRj1RU^xOAvnq7VDM%=|t0Ibf;&4eK(@tKT&N755n;WIIXAHq3!)_8ED^aTC_DXrHSYeob z*)5+>Lqg_K>2A-;1!tEO^p-7dt~Kjb)7>G~^%l~nn_I5KqG;Cp(-b1lA? zO?N3VUUq7Ry=}ObU~i|8xlyM~@xSRA`c_SE-`Ra(xP#RzE_#S;zJv7})DgW_vS zLk#^I;^=3HU0j!tO>|6VxmrT zo@>LX<@tH~#iI0c%K2d-93V^DX(uj90{TWoi^vZmf+1W5!!UVMWW}SNfPF^b9MXI8 z7)IzF@?)IvqZmWL$1ji-C)Bu{`GVj%WPuM{!jIFA)`+%FY1_*SE zRsgq2#{g3F7S-xxh5BITBb0YO;G)oDKSN7+u$>`{G&1eOWon&x=DtDRiH9ZW43Sf) zzSkqmzNZDhQ&2jgLEVv0pjA%6L`AKJs=j)Mn#oCXOW-u_P&|MckZ!1ilrfLq{P1sy CZZCBJ literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/util/poi/annotation/Excel$Type.class b/modules/target/classes/com/bw/util/poi/annotation/Excel$Type.class new file mode 100644 index 0000000000000000000000000000000000000000..b4fff32e2b2c12e8768bf2c74429e41e751b3679 GIT binary patch literal 1394 zcma)6VNcUg6g_Wk*R7N>2MmXRphLEyOcYey#39bOWC(FcB!00QWt4O+DIMxJe~=#( zRE$Q$XMdFOzPCk2G;vG%?z?^GoqNuGulxDy>kj~PSPnzRtcDx7sUo3bUPB*l@!>XK zxf4QEqqxA6yCDqlmzZjN`Mw-Ou=sp!_31iIN-M32a$wj^qGTloHMy}=epak7 zq+WDSDF{eKCYA1fm%Qw5QPsY(<(N;JjjHLb8&#X$sDf^Fn<1Af?-~b2);64aw&Hu1 zQ_rQlmK7_zHN)O8Jd5+T$z{iAP>tB%#0=3D)8BEo)(np@zUh&pVBT^pf01G6A5u!C z^adS>zheDA0f7Vn}aPJM>=Pse$F;}SX+abHD&VX~{+qGJq8I+A#xBaR_H zo753Szm5Su45FVQa(Y5sFN0FEU55k=q|zN;R;#;a%_ouL|0~Tf-`Q(%#d94@f9}EA z!bBbK+}DOtuM4yE3H8xOs1y=hJwTBRh)5o2CC2>$(P7>xjzk#4xB!L`$}UmlKkX3g zGXf`&-c!afN@Gy08H69hMFa$Xjw0Wo#pKKvC?}9PK5zyT4w$ literal 0 HcmV?d00001 diff --git a/modules/target/classes/com/bw/util/poi/annotation/Excel.class b/modules/target/classes/com/bw/util/poi/annotation/Excel.class new file mode 100644 index 0000000000000000000000000000000000000000..4fcb558db29eeaee92797a5305046b7997e86b5e GIT binary patch literal 1387 zcmb7E+j0^?5bX)DOD-z8Dn^aQTp+jgevKBX02WmwT7Y>-o(7n}#Mv2Ycb1S}^T7}B zqbz$D5L~IkP({I<={|k>bnpKB_5B9`ynqiTyfNXe3GYmJPhjd$3D1_5s}>_LQ;?E5 zhl08;b4}PM5ba(>CAIN>A(bv(&^EOMl?|(`9WEQlF?%4T(o}OLv+SIDLK6U_u2aqO z%CRY)6Aq*GLnYhH(agzpS_I;5OK^=WSeVPU`o@l!ZmK$g>FzNQLSX){ssV^a=SC@+ zEc1q>+H+9s(!Xi@TOTnqUSmRZ`?4^mrfjQvX?dCptEIR_|1@LeIvBb(a0rukuNiNY zE2YBmCjv&3@kSG!h@{e4BeR3Uzz>1gC9mtIk$KVw4A(n9=N&Yq-Zk@t3J?1+T8^?? zNDxECRYhPil|CC~LY%wkuX4JzP9uI9oQ9@OgXsh9`yJK6ywm^FzV8$^zB#_}US#B; zSj2i|bS+hr5`*jpQ{(F zh7(yCKtufvJRq<=j(2Dw39OHe_GNDn+_VY&`pb}r5}1T3JWb;%;=&99H^RWpFmNjj zB*MTf%wds$v_*z=L661%XFl`qeP-I1H@8 zdY|+R068{bvk#m?3W0PuWec_k(sp1M9oh?YTi`#D%hPl?r=4g>55Xa_hT_)}#nCR|=!_v5@6h1o|~Ic>smp+jYD z;gr*b4WrMT%^jinT2zyqyV{7Twdj^NLp4=|qolGC{! zghun<<5q`IJkr;Ed9JMzd6vgrnO=!*BsN zlQ~%Y4f9&5isz)3o!ncjFu-;b@@}D};1|4~9C&OS%x{Y;j^7^wM*KWdhg$m!iuj$@ literal 0 HcmV?d00001 diff --git a/modules/target/classes/mapper/GomMapper.xml b/modules/target/classes/mapper/GomMapper.xml new file mode 100644 index 0000000..d427fd7 --- /dev/null +++ b/modules/target/classes/mapper/GomMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/target/classes/mapper/SpanMapper.xml b/modules/target/classes/mapper/SpanMapper.xml new file mode 100644 index 0000000..3a56f1b --- /dev/null +++ b/modules/target/classes/mapper/SpanMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/target/classes/mapper/StudentMapper.xml b/modules/target/classes/mapper/StudentMapper.xml new file mode 100644 index 0000000..ef0abc9 --- /dev/null +++ b/modules/target/classes/mapper/StudentMapper.xml @@ -0,0 +1,20 @@ + + + + + + insert into t_student VALUES (null,#{name},#{age}) + + + + + + + + \ No newline at end of file diff --git a/modules/target/classes/mapper/XXXMapper.xml b/modules/target/classes/mapper/XXXMapper.xml new file mode 100644 index 0000000..024c106 --- /dev/null +++ b/modules/target/classes/mapper/XXXMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..dc85465 --- /dev/null +++ b/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + org.example + bwie-54 + pom + 1.0-SNAPSHOT + + common + modules + + + + 1.8 + UTF-8 + UTF-8 + 2.2.2.RELEASE + false + + + + + spring-boot-starter-parent + org.springframework.boot + 2.6.2 + + + + + \ No newline at end of file