36 Commits

Author SHA1 Message Date
4c77c4ebe8 AES加解密
文件压缩
FileUtil.base64ToStr 优化
兼容jdk11
2022-11-11 19:25:46 +08:00
d25dee8fe4 Merge remote-tracking branch 'origin/master' 2022-08-26 11:36:15 +08:00
44eee0bbd2 [feat] 升级黑名单项目,变成一个task的集合项目 2022-08-26 11:35:17 +08:00
4dc1d9d767 add LICENSE. 2022-07-20 03:27:29 +00:00
9340edb0ef [feat] 增加读取大文件(csv) 2022-05-17 00:28:35 +08:00
933eacc1c2 1.5.0-jre8 2022-05-09 17:11:14 +08:00
6ff859b4fb 1.4.5 2022-05-09 13:44:53 +08:00
8741562463 扩展FileUtil 2022-05-08 19:30:08 +08:00
b97fdf65bc 变更Base64使用包,使其兼容openjdk11 2022-05-08 16:53:23 +08:00
3987f982be 变更Base64使用包,使其兼容openjdk11 2022-05-08 16:43:03 +08:00
556f2a49d2 Merge branch 'master' into develop 2022-05-08 13:56:27 +08:00
3b0cdc832b update 忽略文件 2022-05-08 13:52:23 +08:00
5a96c23882 1.4.4 JsonUtil类修复格式化出现的时区差 2021-04-24 00:52:35 +08:00
d602d4370e pom 1.4.3 2021-02-06 11:44:54 +08:00
471da3dbcb 提交文档 2021-02-06 11:43:45 +08:00
58d713e025 1.4.3
DateTimeUtil 增加时间格式
2021-02-06 11:41:51 +08:00
2cdcf4fc7c 1.4.2
优化时间转换格式
增加注解 ToUeProperty 转换时间为时间戳的功能
2021-02-03 11:40:11 +08:00
1711fc8a0d 更新文档 2021-01-31 13:57:53 +08:00
45aeabca96 Merge branch 'master' into gmaster
# Conflicts:
#	UPDATE.md
#	pom.xml
2021-01-31 13:57:32 +08:00
9d7d7331c3 1.4.1 升级所有依赖,增加DateTimeUtil方法 2021-01-31 13:12:13 +08:00
maxiaofeng
7f1b49df93 更新文档 2020-05-18 12:08:18 +08:00
maxiaofeng
0cfd7e78f1 合并代码版本 1.4.0 2020-05-18 12:05:42 +08:00
maxiaofeng
0d66a62e6c 更新仓库地址 https://nexus.yexuejc.club/https://nexus.yexuejc.top/ 2020-05-18 12:03:57 +08:00
9d160bdede 1.4.0 优化Execl 和 Jwt 工具 2020-04-13 20:49:32 +08:00
831ba7b866 1.4.0 优化Execl 和 Jwt 工具 2020-04-13 20:49:18 +08:00
df43189a0c 优化日志 2019-01-24 13:21:15 +08:00
03aaeff1bf 1.3.9 2019-01-11 16:51:02 +08:00
f1aa91c81d 公私钥配置 2019-01-11 16:49:34 +08:00
70c4fb67b1 1.3.8 ToUeProperty 增加 ignore 2019-01-11 13:28:38 +08:00
873bfcbe9f 返回参数优化 2019-01-11 10:24:46 +08:00
763616c67d 1.3.7 回滚1.3.6至1.3.5 2019-01-11 10:03:54 +08:00
1f4d31f842 1.3.6 json支持下划线、驼峰互转 2019-01-10 14:55:42 +08:00
3b83e22ac7 json支持下划线、驼峰互转 2019-01-10 14:54:56 +08:00
e7e89563d9 1.3.5 objUtil 增加兼容类型 2019-01-07 17:20:07 +08:00
c9863373fe 支付跑通 2019-01-07 17:18:52 +08:00
6c186e39cd 分账完善 2019-01-03 21:13:36 +08:00
27 changed files with 2425 additions and 803 deletions

3
.gitignore vendored
View File

@@ -22,4 +22,5 @@ build/
nbbuild/
dist/
nbdist/
.nb-gradle/
.nb-gradle/
*.iml~

201
LICENSE Normal file
View File

@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

134
README.md
View File

@@ -1,67 +1,67 @@
yexuejc-base 基于jdk8常用工具包
----------------------
源码地址:<br>
github:https://github.com/yexuejc/yexuejc-base
gitee:https://gitee.com/jzsw-it/yexuejc-base
### 说明
>1. 支持环境java8
>2. 该工具包基于springboot提取按理说适用于所有java工程
>3. 其中依赖jjwt、validation-api排除请使用
> ```
> <exclusions>
> <exclusion>
> <artifactId>xxx</artifactId>
> <groupId>xxxx</groupId>
> </exclusion>
> </exclusions>
> ```
>
>4. `1.1.9` 升级JWT为单例类
>5. `1.2.3` 修复RSA加密(签名)Base64Url 问题如需使用RSA请使用1.2.3+
>##### 6. 从`1.3.0`开始,版本维护转由`成都极致思维网络科技有限公司`向maven中央仓库发布版本同时变更组织`groupId``top.yexuejc`。使用者请尽快升级到`1.3.0`以上1.3.0代码向下兼容)
### 使用
>yexuejc.base.version=1.3.0
pom.xml
```
<dependencies>
<dependency>
<groupId>top.yexuejc</groupId>
<artifactId>yexuejc-base</artifactId>
<version>${yexuejc.base.version}</version>
</dependency>
</dependencies>
```
#### 附1.3.0之前的使用方式
pom.xml
```
<dependencies>
<dependency>
<groupId>com.yexuejc.base</groupId>
<artifactId>yexuejc-base</artifactId>
<version>1.3.0以下</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>yexuejc-nexus-public</id>
<name>yexuejc-nexus-public</name>
<url>https://nexus.yexuejc.club/repository/maven-public/</url>
</repository>
</repositories>
```
### 工具文档
[Wiki](WIKI.md)
### 更新日志
[更新记录](UPDATE.md)
#### 项目发展
本工程项目由maxf基于日常使用从[yexuejc-springboot](https://github.com/yexuejc/yexuejc-springboot.git)_准备移交版本控制_中抽离开源独立发展后续增加许多常用工具包。
使用者逐渐增多后考虑可靠性和稳定性原则,移交版本控制给`成都极致思维网络科技有限公司`管理maven包直接发布到中央仓库。
开源工程项目仍然保持继续维护和欢迎更多愿意贡献的小伙伴参与。
yexuejc-base 基于jdk8常用工具包
----------------------
源码地址:<br>
github:https://github.com/yexuejc/yexuejc-base
gitee:https://gitee.com/jzsw-it/yexuejc-base
### 说明
1. 支持环境java81.5.0开始支持java11请使用`x.x.x-jre11`版本)
2. 该工具包基于springboot提取按理说适用于所有java工程
3. 其中依赖jjwt相关、validation-api排除请使用
> ```
> <exclusions>
> <exclusion>
> <artifactId>xxx</artifactId>
> <groupId>xxxx</groupId>
> </exclusion>
> </exclusions>
> ```
>
4. `1.1.9` 升级JWT为单例类
5. `1.2.3` 修复RSA加密(签名)Base64Url 问题如需使用RSA请使用1.2.3+
6.`1.3.0`开始,变更组织`groupId``top.yexuejc`。使用者请尽快升级到`1.3.0`以上1.3.0代码向下兼容)
7.`1.5.0`开始,版本分为`1.5.0-jre8``1.5.0-jre11`分别对于jre8和jre11使用
### 使用
>yexuejc.base.version=1.5.0-jre8
pom.xml
```
<dependencies>
<dependency>
<groupId>top.yexuejc</groupId>
<artifactId>yexuejc-base</artifactId>
<version>${yexuejc.base.version}</version>
</dependency>
</dependencies>
```
#### 附1.3.0之前的使用方式
pom.xml
```
<dependencies>
<dependency>
<groupId>com.yexuejc.base</groupId>
<artifactId>yexuejc-base</artifactId>
<version>1.3.0以下</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>yexuejc-nexus-public</id>
<name>yexuejc-nexus-public</name>
<url>https://nexus.yexuejc.club/repository/maven-public/</url>
</repository>
</repositories>
```
### 工具文档
[Wiki](WIKI.md)
### 更新日志
[更新记录](UPDATE.md)
#### 项目发展
本工程项目由maxf基于日常使用从[yexuejc-springboot](https://github.com/yexuejc/yexuejc-springboot.git)_准备移交版本控制_中抽离开源独立发展后续增加许多常用工具包。
使用者逐渐增多后考虑可靠性和稳定性原则,移交版本控制给`成都极致思维网络科技有限公司`管理maven包直接发布到中央仓库。
开源工程项目仍然保持继续维护和欢迎更多愿意贡献的小伙伴参与。

521
UPDATE.md
View File

@@ -1,210 +1,313 @@
yexuejc-base 更新记录
------------------
#### version 1.3.4
**time2019-1-2 20:32:12** <br/>
**branch** master <br/>
**update** <br/>
>1. objUtil list类型修复
#
#### version 1.3.3
**time2019-1-2 14:06:47** <br/>
**branch** master <br/>
**update** <br/>
>1. MoneyUtil 扩展元转分
#
#### version 1.3.2
**time2019-1-2 14:06:47** <br/>
**branch** master <br/>
**update** <br/>
>1. objUtil 枚举类型修复
#
#### version 1.3.1
**time2019-1-2 14:06:47** <br/>
**branch** master <br/>
**update** <br/>
>1. objUtil 增加类字段(驼峰)转换成下划线
#
#### version 1.3.0
**time2018-12-30 16:47:50** <br/>
**branch** master <br/>
**update** <br/>
>1. 移交发布到maven中央仓库
>2. 移交后变更groupId 为`top.yexuejc`
>3. 源码发布由`成都极致思维网络科技有限公司`维护github开源地址不变gitee从组织[ICC(InCloudCode)](https://gitee.com/incloudcode)转移到[成都极致思维网络科技有限公司/yexuejc-base](https://gitee.com/jzsw-it/yexuejc-base)
#
#### version 1.2.9
**time2018-12-29 14:51:33** <br/>
**branch** master <br/>
**update** <br/>
>1. 获取RSA密钥增加以输入流的形式获取密钥
#
#### version 1.2.6
**time2018-12-21 14:58:49** <br/>
**branch** master <br/>
**update** <br/>
>1. RSA 验签增加初始化方法
#
#### version 1.2.8
**time2018-12-28 20:10:14** <br/>
**branch** master <br/>
**update** <br/>
>1. 新增[ObjUtil](src/main/java/com/yexuejc/base/util/ObjUtil.java) 对类(对象)进行处理,提供深度克隆
#
#### version 1.2.6
**time2018-12-21 14:58:49** <br/>
**branch** master <br/>
**update** <br/>
>1. RSA 验签增加初始化方法
#
#### version 1.2.7
**time2018-12-24 15:31:01** <br/>
**branch** master <br/>
**update** <br/>
>1. FileUtil增加base64转File `base64ToFile()`
#
#### version 1.2.6
**time2018-12-21 14:58:49** <br/>
**branch** master <br/>
**update** <br/>
>1. RSA 验签增加初始化方法
#
#### version 1.2.5
**time2018-12-20 13:13:23** <br/>
**branch** master <br/>
**update** <br/>
>1. 丰富[JsonUtil](src/main/java/com/yexuejc/base/util/JsonUtil.java),支持直接对Map泛型转换
#
#### version 1.2.4
**time2018-11-27 14:46:04** <br/>
**branch** master <br/>
**update** <br/>
>1. 工具类的优化
>2.规范代码
#
#### version 1.2.3
**time2018-11-23 16:45:42** <br/>
**branch** master <br/>
**update** <br/>
>1. 修复RSA加密签名时选择的Base64encodeBase64URLSafeString、encodeBase64String区分
#
#### version 1.2.1
**time2018-11-9 15:05:06** <br/>
**branch** master <br/>
**update** <br/>
>1. 优化resps
#
#### version 1.2.2
**time2018-11-20 20:20:12** <br/>
**branch** master <br/>
**update** <br/>
>1. 优化RSA 加解密
>1. 增加RSA 签名
#
#### version 1.2.1
**time2018-11-9 15:05:06** <br/>
**branch** master <br/>
**update** <br/>
>1. 优化resps
#
#### version 1.2.0
**time2018-10-19 11:38:20** <br/>
**branch** master <br/>
**update** <br/>
>1. 增加异步线程处理工具
```$java
SysUtil.threadRun(() -> {
//异步执行代码块
}
```
#
#### version 1.1.9
**time2018-9-23 11:57:36** <br/>
**branch** master <br/>
**update** <br/>
>1. 优化工具类包名:不向下兼容,升级请修改
>2. 升级JWT工具类更改为单例模式可配置参数
#
#### version 1.1.8
**time2018-9-3 19:29:56** <br/>
**branch** master <br/>
**update** <br/>
>1. 增肌图片处理工具类
>2. 增肌3des工具类
>3. 增肌RSA工具类
>4. 优化其他工具类
#
#### version 1.1.7
**time2018-8-17 11:22:50** <br/>
**branch** master <br/>
**update** <br/>
>1. 优化ApiVO
#
#### version 1.1.6
**time2018-7-7 11:32:56** <br/>
**branch** master <br/>
**update** <br/>
>1. maven仓库更新
#
#### version 1.1.5
**time2018-6-19 22:16:34** <br/>
**branch** master <br/>
**update** <br/>
>1. 优化ApiVO
#
#### version 1.1.4
**time2018-6-14 22:27:59** <br/>
**branch** master <br/>
**update** <br/>
>1. 统一编码UTF-8
#
#### version 1.1.3
**time2018年6月2日12:16:58** <br/>
**branch** master <br/>
**update** <br/>
>1. 修改正则RegexUtils.java
>2. 修改正则StrUtil.java->扩展genUUID()
#
#### version 1.1.2
**time** 2018-5-16 15:03:28<br/>
**branch** master <br/>
**update** <br/>
>1. 修改依赖
#
#### version 1.1.1
**time** 2018-5-12 22:25:05<br/>
**branch** master <br/>
**update** <br/>
>1. 添加RSA
#
##### version 1.1.0
**time** 2018-5-12 22:25:05<br/>
**branch** master <br/>
**update** <br/>
>1. 添加支持加密功能
#
#### version 1.0.0
**time** 2018-1-31 12:16:10<br/>
**branch** master <br/>
**update** <br/>
>1. 基于java8开发的web应用工具包
yexuejc-base 更新记录
------------------
#### version 1.5.0-jre8
**time2022-5-9 13:37:31** <br/>
**branch** master <br/>
**update** <br/>
1. 升级jwt相关包去除`io.jsonwebtoken:jjwt:0.9.1`(不再维护升级),
取而代之的是引入以下包,升级相关依赖
```
io.jsonwebtoken:jjwt-api:0.11.5
io.jsonwebtoken:jjwt-impl:0.11.5
io.jsonwebtoken:jjwt-jackson:0.11.5
org.bouncycastle:bcprov-jdk15on:1.70
```
2. 升级
```
jakarta.validation:jakarta.validation-api:3.0.1
org.apache.poi:poi:5.2.2
com.google.guava:guava:31.1-jre
commons-io:commons-io:2.11.0
```
4. 去除依赖
```
<commons-codec.version>1.15</commons-codec.version>
<!--base64使用到的依赖-->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${commons-codec.version}</version>
<scope>compile</scope>
</dependency>
```
#
#### version 1.4.5
**time2022-5-9 13:37:31** <br/>
**branch** master <br/>
**update** <br/>
>1. 扩展FileUtil,优化Base64的包
#
#### version 1.4.4
**time2021-4-24 00:41:31** <br/>
**branch** master <br/>
**update** <br/>
>1. JsonUtil类修复格式化出现的时区差现使用TimeZone.getDefault()时区
#
#### version 1.4.3
**time2021-2-6 11:42:49** <br/>
**branch** master <br/>
**update** <br/>
>1. DateTimeUtil类增加时间格式
#
#### version 1.4.2
**time2021-2-3 11:40:11** <br/>
**branch** master <br/>
**update** <br/>
>1. 优化时间转换格式
>2. 增加注解 ToUeProperty 转换时间为时间戳的功能
#
#### version 1.4.1
**time2021-1-31 12:59:24** <br/>
**branch** master <br/>
**update** <br/>
>1. 升级所有依赖
>1. 增加DateTimeUtil类的功能
#
#### version 1.4.0
**time2020-5-18 12:06:14** <br/>
**branch** master <br/>
**update** <br/>
>1. 更新仓库地址 https://nexus.yexuejc.club/ 为 https://nexus.yexuejc.top/
>2. 优化Execl 和 Jwt 工具
#
#### version 1.3.9
**time2019-1-11 16:50:51** <br/>
**branch** master <br/>
**update** <br/>
>1. RSA2 增加证书格式转换 JKS(xx.keystore) 、 PKCS12(xx.pfx)相互转换
#
#### version 1.3.8
**time2019-1-11 13:28:12** <br/>
**branch** master <br/>
**update** <br/>
>1. [ToUeProperty](src/main/java/com/yexuejc/base/util/ToUeProperty.java) 增加 ignore
#
#### version 1.3.7
**time2019-1-11 10:02:03** <br/>
**branch** master <br/>
**update** <br/>
>1. 考虑到向下兼容回滚1.3.6【json增加下划线、驼峰互转】,考虑更优方案(解决加入下个版本)
#
#### version 1.3.6
**time2019-1-10 14:55:13** <br/>
**branch** master <br/>
**update** <br/>
>1. json增加下划线、驼峰互转
#
#### version 1.3.5
**time2019-1-7 17:19:22** <br/>
**branch** master <br/>
**update** <br/>
>1. objUtil 增加兼容类型
#
#### version 1.3.4
**time2019-1-2 20:32:12** <br/>
**branch** master <br/>
**update** <br/>
>1. objUtil list类型修复
#
#### version 1.3.3
**time2019-1-2 14:06:47** <br/>
**branch** master <br/>
**update** <br/>
>1. MoneyUtil 扩展元转分
#
#### version 1.3.2
**time2019-1-2 14:06:47** <br/>
**branch** master <br/>
**update** <br/>
>1. objUtil 枚举类型修复
#
#### version 1.3.1
**time2019-1-2 14:06:47** <br/>
**branch** master <br/>
**update** <br/>
>1. objUtil 增加类字段(驼峰)转换成下划线
#
#### version 1.3.0
**time2018-12-30 16:47:50** <br/>
**branch** master <br/>
**update** <br/>
>1. 移交发布到maven中央仓库
>2. 移交后变更groupId 为`top.yexuejc`
>3. 源码发布由`成都极致思维网络科技有限公司`维护github开源地址不变gitee从组织[ICC(InCloudCode)](https://gitee.com/incloudcode)转移到[成都极致思维网络科技有限公司/yexuejc-base](https://gitee.com/jzsw-it/yexuejc-base)
#
#### version 1.2.9
**time2018-12-29 14:51:33** <br/>
**branch** master <br/>
**update** <br/>
>1. 获取RSA密钥增加以输入流的形式获取密钥
#
#### version 1.2.6
**time2018-12-21 14:58:49** <br/>
**branch** master <br/>
**update** <br/>
>1. RSA 验签增加初始化方法
#
#### version 1.2.8
**time2018-12-28 20:10:14** <br/>
**branch** master <br/>
**update** <br/>
>1. 新增[ObjUtil](src/main/java/com/yexuejc/base/util/ObjUtil.java) 对类(对象)进行处理,提供深度克隆
#
#### version 1.2.6
**time2018-12-21 14:58:49** <br/>
**branch** master <br/>
**update** <br/>
>1. RSA 验签增加初始化方法
#
#### version 1.2.7
**time2018-12-24 15:31:01** <br/>
**branch** master <br/>
**update** <br/>
>1. FileUtil增加base64转File `base64ToFile()`
#
#### version 1.2.6
**time2018-12-21 14:58:49** <br/>
**branch** master <br/>
**update** <br/>
>1. RSA 验签增加初始化方法
#
#### version 1.2.5
**time2018-12-20 13:13:23** <br/>
**branch** master <br/>
**update** <br/>
>1. 丰富[JsonUtil](src/main/java/com/yexuejc/base/util/JsonUtil.java),支持直接对Map泛型转换
#
#### version 1.2.4
**time2018-11-27 14:46:04** <br/>
**branch** master <br/>
**update** <br/>
>1. 工具类的优化
>2.规范代码
#
#### version 1.2.3
**time2018-11-23 16:45:42** <br/>
**branch** master <br/>
**update** <br/>
>1. 修复RSA加密签名时选择的Base64encodeBase64URLSafeString、encodeBase64String区分
#
#### version 1.2.1
**time2018-11-9 15:05:06** <br/>
**branch** master <br/>
**update** <br/>
>1. 优化resps
#
#### version 1.2.2
**time2018-11-20 20:20:12** <br/>
**branch** master <br/>
**update** <br/>
>1. 优化RSA 加解密
>1. 增加RSA 签名
#
#### version 1.2.1
**time2018-11-9 15:05:06** <br/>
**branch** master <br/>
**update** <br/>
>1. 优化resps
#
#### version 1.2.0
**time2018-10-19 11:38:20** <br/>
**branch** master <br/>
**update** <br/>
>1. 增加异步线程处理工具
```$java
SysUtil.threadRun(() -> {
//异步执行代码块
}
```
#
#### version 1.1.9
**time2018-9-23 11:57:36** <br/>
**branch** master <br/>
**update** <br/>
>1. 优化工具类包名:不向下兼容,升级请修改
>2. 升级JWT工具类更改为单例模式可配置参数
#
#### version 1.1.8
**time2018-9-3 19:29:56** <br/>
**branch** master <br/>
**update** <br/>
>1. 增肌图片处理工具类
>2. 增肌3des工具类
>3. 增肌RSA工具类
>4. 优化其他工具类
#
#### version 1.1.7
**time2018-8-17 11:22:50** <br/>
**branch** master <br/>
**update** <br/>
>1. 优化ApiVO
#
#### version 1.1.6
**time2018-7-7 11:32:56** <br/>
**branch** master <br/>
**update** <br/>
>1. maven仓库更新
#
#### version 1.1.5
**time2018-6-19 22:16:34** <br/>
**branch** master <br/>
**update** <br/>
>1. 优化ApiVO
#
#### version 1.1.4
**time2018-6-14 22:27:59** <br/>
**branch** master <br/>
**update** <br/>
>1. 统一编码UTF-8
#
#### version 1.1.3
**time2018年6月2日12:16:58** <br/>
**branch** master <br/>
**update** <br/>
>1. 修改正则RegexUtils.java
>2. 修改正则StrUtil.java->扩展genUUID()
#
#### version 1.1.2
**time** 2018-5-16 15:03:28<br/>
**branch** master <br/>
**update** <br/>
>1. 修改依赖
#
#### version 1.1.1
**time** 2018-5-12 22:25:05<br/>
**branch** master <br/>
**update** <br/>
>1. 添加RSA
#
##### version 1.1.0
**time** 2018-5-12 22:25:05<br/>
**branch** master <br/>
**update** <br/>
>1. 添加支持加密功能
#
#### version 1.0.0
**time** 2018-1-31 12:16:10<br/>
**branch** master <br/>
**update** <br/>
>1. 基于java8开发的web应用工具包
#

569
pom.xml
View File

@@ -1,257 +1,314 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>top.yexuejc</groupId>
<artifactId>yexuejc-base</artifactId>
<version>1.3.4</version>
<name>${project.artifactId}</name>
<url>https://github.com/yexuejc/yexuejc-base</url>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>yexuejc</name>
<email>yexuejc@gmail.com</email>
<organization>Chengdu Ultimate Thinking Network Technology Co., Ltd.</organization>
<timezone>+8</timezone>
</developer>
</developers>
<scm>
<connection>
scm:git:https://github.com/yexuejc/yexuejc-base.git
</connection>
<developerConnection>
scm:git:https://github.com/yexuejc/yexuejc-base.git
</developerConnection>
<url>https://github.com/yexuejc/yexuejc-base</url>
</scm>
<properties>
<repos.yexuejc.url>https://nexus.yexuejc.club/repository/</repos.yexuejc.url>
<repos.mcworle.url>https://nexus.mcworle.com/repository/</repos.mcworle.url>
<repos.aliyun.url>http://maven.aliyun.com/nexus/content/groups/public</repos.aliyun.url>
<repos.jitpack.url>https://jitpack.io</repos.jitpack.url>
<jjwt.version>0.7.0</jjwt.version>
<maven.compiler.verbose>true</maven.compiler.verbose>
<java.version>1.8</java.version>
<validation-api.version>1.1.0.Final</validation-api.version>
<commons-codec.version>1.10</commons-codec.version>
<commons-io.version>2.6</commons-io.version>
<bcprov-jdk15on.version>1.60</bcprov-jdk15on.version>
<guava.version>20.0</guava.version>
</properties>
<dependencies>
<!-- JJWT -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<!-- 数据校验框架 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>${validation-api.version}</version>
</dependency>
<!--base64使用到的依赖-->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${commons-codec.version}</version>
<scope>compile</scope>
</dependency>
<!--IOUtils使用到的依赖-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<!--支持大量的密码术算法并提供JCE 1.2.1的实现-->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>${bcprov-jdk15on.version}</version>
</dependency>
<!--com.yexuejc.base.util.SysUtil.threadRun 异步处理代码-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<!-- 打包源码 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 使用spring boot的maven插件进行打包 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 是否打出可执行的jar包(仅支持Linux格式) -->
<executable>true</executable>
</configuration>
</plugin>
<!-- Javadoc -->
<!--<plugin>-->
<!--<groupId>org.apache.maven.plugins</groupId>-->
<!--<artifactId>maven-javadoc-plugin</artifactId>-->
<!--<executions>-->
<!--<execution>-->
<!--<phase>package</phase>-->
<!--<goals>-->
<!--<goal>jar</goal>-->
<!--</goals>-->
<!--</execution>-->
<!--</executions>-->
<!--</plugin>-->
<!-- GPG -->
<!--<plugin> &lt;!&ndash; 进行延签 &ndash;&gt;-->
<!--<groupId>org.apache.maven.plugins</groupId>-->
<!--<artifactId>maven-gpg-plugin</artifactId>-->
<!--<version>1.6</version>-->
<!--<executions>-->
<!--<execution>-->
<!--<phase>verify</phase>-->
<!--<goals>-->
<!--<goal>sign</goal>-->
<!--</goals>-->
<!--</execution>-->
<!--</executions>-->
<!--</plugin>-->
</plugins>
</build>
<repositories>
<repository>
<id>yexuejc-nexus-public</id>
<name>yexuejc-nexus-public</name>
<url>${repos.yexuejc.url}maven-public/</url>
</repository>
<repository>
<id>aliyun-nexus-public</id>
<name>aliyun-nexus-public</name>
<url>${repos.aliyun.url}</url>
</repository>
<repository>
<id>jitpack.io</id>
<url>${repos.jitpack.url}</url>
</repository>
</repositories>
<!-- 中间件jar包发布目标 -->
<distributionManagement>
<!--中央仓库发布-->
<!--<snapshotRepository>-->
<!--<id>sonatype-nexus-snapshots</id>-->
<!--<name>Sonatype Nexus Snapshots</name>-->
<!--<url>https://oss.sonatype.org/content/repositories/snapshots/</url>-->
<!--</snapshotRepository>-->
<!--<repository>-->
<!--<id>sonatype-nexus-staging</id>-->
<!--<name>Nexus Release Repository</name>-->
<!--<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>-->
<!--</repository>-->
<!-- 私服仓库发布
<repository>
<id>releases</id>
<name>nexus-release</name>
<url>${repos.yexuejc.url}maven-releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>nexus-snapshots</name>
<url>${repos.yexuejc.url}maven-snapshots/</url>
</snapshotRepository>
-->
<repository>
<id>releases</id>
<name>nexus-release</name>
<url>${repos.mcworle.url}maven-releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>nexus-snapshots</name>
<url>${repos.mcworle.url}maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
<profiles>
<profile>
<id>sonatype-oss-release</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>top.yexuejc</groupId>
<artifactId>yexuejc-base</artifactId>
<version>1.5.1-jdk11</version>
<name>yexuejc-base</name>
<url>https://github.com/yexuejc/yexuejc-base</url>
<description>Common toolkits based on JDK11 packaging</description>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>yexuejc</name>
<email>yexuejc@gmail.com</email>
<organization>Chengdu Ultimate Thinking Network Technology Co., Ltd.</organization>
<timezone>+8</timezone>
</developer>
</developers>
<scm>
<connection>
scm:git:https://github.com/yexuejc/yexuejc-base.git
</connection>
<developerConnection>
scm:git:https://github.com/yexuejc/yexuejc-base.git
</developerConnection>
<url>https://github.com/yexuejc/yexuejc-base</url>
</scm>
<properties>
<repos.yexuejc.url>https://nexus.yexuejc.top/repository/</repos.yexuejc.url>
<repos.aliyun.url>https://maven.aliyun.com/repository/public</repos.aliyun.url>
<repos.jitpack.url>https://jitpack.io</repos.jitpack.url>
<jjwt.version>0.11.5</jjwt.version>
<maven.compiler.verbose>true</maven.compiler.verbose>
<java.version>11</java.version>
<validation-api.version>3.0.2</validation-api.version>
<commons-io.version>2.11.0</commons-io.version>
<bcprov-jdk15on.version>1.70</bcprov-jdk15on.version>
<guava.version>31.1-jre</guava.version>
<apache-poi.version>5.2.2</apache-poi.version>
<jackson.version>2.14.0</jackson.version>
<zip4j.version>2.11.2</zip4j.version>
<!-- 文件拷贝时的编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 编译时的编码 -->
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
</properties>
<dependencies>
<!-- JJWT -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>${jjwt.version}</version>
</dependency>
<!-- 数据校验框架 -->
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>${validation-api.version}</version>
</dependency>
<!--IOUtils使用到的依赖-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<!--支持大量的密码术算法并提供JCE 1.2.1的实现-->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>${bcprov-jdk15on.version}</version>
</dependency>
<!--com.yexuejc.base.util.SysUtil.threadRun 异步处理代码-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${apache-poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${apache-poi.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-csv</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>${zip4j.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<encoding>UTF-8</encoding>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
<!-- 打包源码 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 使用spring boot的maven插件进行打包 -->
<!-- <plugin>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
<!-- <version>2.4.2</version>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <goals>-->
<!-- <goal>build-info</goal>-->
<!-- </goals>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- <configuration>-->
<!-- &lt;!&ndash; 是否打出可执行的jar包(仅支持Linux格式) &ndash;&gt;-->
<!-- <executable>true</executable>-->
<!-- </configuration>-->
<!-- </plugin>-->
<!-- Javadoc -->
<!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-javadoc-plugin</artifactId>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <phase>package</phase>-->
<!-- <goals>-->
<!-- <goal>jar</goal>-->
<!-- </goals>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- </plugin>-->
<!-- GPG -->
<!-- 进行延签 -->
<!-- <plugin> -->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-gpg-plugin</artifactId>-->
<!-- <version>1.6</version>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <phase>verify</phase>-->
<!-- <goals>-->
<!-- <goal>sign</goal>-->
<!-- </goals>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- </plugin>-->
</plugins>
</build>
<repositories>
<repository>
<id>yexuejc-maven</id>
<name>yexuejc-nexus-public</name>
<url>${repos.yexuejc.url}maven-public/</url>
</repository>
<repository>
<id>aliyun-maven</id>
<name>aliyun-nexus-public</name>
<url>${repos.aliyun.url}</url>
</repository>
<repository>
<id>jitpack.io</id>
<url>${repos.jitpack.url}</url>
</repository>
</repositories>
<!-- 中间件jar包发布目标 -->
<distributionManagement>
<!--中央仓库发布-->
<!--<snapshotRepository>-->
<!--<id>sonatype-nexus-snapshots</id>-->
<!--<name>Sonatype Nexus Snapshots</name>-->
<!--<url>https://oss.sonatype.org/content/repositories/snapshots/</url>-->
<!--</snapshotRepository>-->
<!--<repository>-->
<!--<id>sonatype-nexus-staging</id>-->
<!--<name>Nexus Release Repository</name>-->
<!--<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>-->
<!--</repository>-->
<!-- 私服仓库发布-->
<repository>
<id>releases</id>
<name>nexus-release</name>
<url>${repos.yexuejc.url}maven-releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>nexus-snapshots</name>
<url>${repos.yexuejc.url}maven-snapshots/</url>
</snapshotRepository>
<!--
<repository>
<id>releases</id>
<name>nexus-release</name>
<url>${repos.hm.url}maven-releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>nexus-snapshots</name>
<url>${repos.hm.url}maven-snapshots/</url>
</snapshotRepository>-->
</distributionManagement>
<profiles>
<profile>
<id>sonatype-oss-release</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!--Javadoc-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

View File

@@ -0,0 +1,21 @@
package com.yexuejc.base.annotation;
import java.lang.annotation.*;
/**
* 设置csv header
*
* @author MAXF-MAC
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface CsvHeader {
/**
* 在类头上设置csv格式的header
* @return
*/
String header();
}

View File

@@ -0,0 +1,51 @@
package com.yexuejc.base.annotation;
import com.yexuejc.base.util.ObjUtil;
import java.lang.annotation.*;
/**
* json转换时的格式指定
*
* @author: yexuejc
* @date: 2021-01-31 12:48:29
*/
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ToUeProperty {
/**
* 字段名,默认该字段转下划线
*
* @return
*/
String value() default "";
/**
* 是否忽略该字段默认false
*
* @return
*/
boolean ignore() default false;
/**
* 转换格式
* <p>目前只支持</p>
* <p> {@link java.util.Date}、{@link java.time.LocalDate}、{@link java.time.LocalDateTime}
* 转{@link Integer}(10位长度)、{@link Long}(13位长度)</p>
* 其余无效
*
* @return <pre>
* this in out <br/>
* {@link java.util.Date} {@link Integer} {@link Integer}10位长度时间戳<br/>
* {@link java.util.Date} {@link Long} {@link Long}13位长度时间戳<br/>
* {@link java.time.LocalDate} {@link Integer} {@link Integer}10位长度时间戳<br/>
* {@link java.time.LocalDate} {@link Long} {@link Long}13位长度时间戳后三位为000<br/>
* {@link java.time.LocalDateTime} {@link Integer} {@link Integer}10位长度时间戳<br/>
* {@link java.time.LocalDateTime} {@link Long} {@link Long}13位长度时间戳
*
* </pre>
*/
Class<?> type() default ObjUtil.class;
}

View File

@@ -0,0 +1,173 @@
package com.yexuejc.base.encrypt;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
/**
* AES加解密
*
* @author maxf
* @class-name AES
* @description
* @date 2022/11/11 15:36
*/
public class AES {
public static AES builder() {
return Instace.aes;
}
private static class Instace {
private static AES aes = new AES();
}
public static final String AES_ALGORITHM = "AES";
/**
* 加密模式
*/
public static enum ALGORITHM {
//算法/模式/填充 16字节加密后数据长度 不满16字节加密后长度
//AES/CBC/NoPadding 16 不支持
AES_CBC_NoPadding("AES/CBC/NoPadding"),
//AES/CBC/PKCS5Padding 32 16
AES_CBC_PKCS5Padding("AES/CBC/PKCS5Padding"),
//AES/CBC/ISO10126Padding 32 16
AES_CBC_ISO10126Padding("AES/CBC/ISO10126Padding"),
//AES/CFB/NoPadding 16 原始数据长度
AES_CFB_NoPadding("AES/CFB/NoPadding"),
//AES/CFB/PKCS5Padding 32 16
AES_CFB_PKCS5Padding("AES/CFB/PKCS5Padding"),
//AES/CFB/ISO10126Padding 32 16
AES_CFB_ISO10126Padding("AES/CFB/ISO10126Padding"),
//AES/ECB/NoPadding 16 不支持
AES_ECB_NoPadding("AES/ECB/NoPadding"),
//AES/ECB/PKCS5Padding 32 16
AES_ECB_PKCS5Padding("AES/ECB/PKCS5Padding"),
//AES/ECB/ISO10126Padding 32 16
AES_ECB_ISO10126Padding("AES/ECB/ISO10126Padding"),
//AES/OFB/NoPadding 16 原始数据长度
AES_OFB_NoPadding("AES/OFB/NoPadding"),
//AES/OFB/PKCS5Padding 32 16
AES_OFB_PKCS5Padding("AES/OFB/PKCS5Padding"),
//AES/OFB/ISO10126Padding 32 16
AES_OFB_ISO10126Padding("AES/OFB/ISO10126Padding"),
//AES/PCBC/NoPadding 16 不支持
AES_PCBC_NoPadding("AES/PCBC/NoPadding"),
//AES/PCBC/PKCS5Padding 32 16
AES_PCBC_PKCS5Padding("AES/PCBC/PKCS5Padding"),
//AES/PCBC/ISO10126Padding 32 16
AES_PCBC_ISO10126Padding("AES/PCBC/ISO10126Padding");
public String name;
ALGORITHM(String name) {
this.name = name;
}
}
private ALGORITHM algorithm = ALGORITHM.AES_CBC_NoPadding;
private String key = "hj7x89H$yuBI0456";
private String iv = "NIfb&95GUY86Gfgh";
private Charset charset = StandardCharsets.UTF_8;
/**
* 加密
*
* @param data 明文
* @return 密文
* @Description AES算法加密明文
*/
public String encrypt(String data) throws Exception {
try {
Cipher cipher = Cipher.getInstance(algorithm.name);
int blockSize = cipher.getBlockSize();
byte[] dataBytes = data.getBytes(charset);
int plaintextLength = dataBytes.length;
if (plaintextLength % blockSize != 0) {
plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
}
byte[] plaintext = new byte[plaintextLength];
System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(charset), AES_ALGORITHM);
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes(charset));
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(plaintext);
return Base64.getEncoder().encodeToString(encrypted);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 解密
*
* @param data 密文
* @return 明文
* @Description AES算法解密密文
*/
public String decrypt(String data) throws Exception {
try {
byte[] encrypted = Base64.getDecoder().decode(data);
Cipher cipher = Cipher.getInstance(algorithm.name);
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(charset), AES_ALGORITHM);
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes(charset));
cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
byte[] original = cipher.doFinal(encrypted);
return new String(original, charset).trim();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
//
// public static void main(String[] args) throws Exception {
// String str = " 奥萨蒂 asd8阿斯顿8asd ";
// AES.builder().setAlgorithm(ALGORITHM.AES_CBC_ISO10126Padding);
// AES.builder().setKey("DEsx89H$yuBI0456");
// String encrypt = AES.builder().encrypt(str);
// System.out.println(encrypt);
// String decrypt = AES.builder().decrypt(encrypt);
// System.out.println(">>>" + decrypt + "<<<");
// }
public ALGORITHM getAlgorithm() {
return algorithm;
}
public AES setAlgorithm(ALGORITHM algorithm) {
this.algorithm = algorithm;
return this;
}
public String getKey() {
return key;
}
public AES setKey(String key) {
this.key = key;
return this;
}
public String getIv() {
return iv;
}
public AES setIv(String iv) {
this.iv = iv;
return this;
}
public Charset getCharset() {
return charset;
}
public AES setCharset(Charset charset) {
this.charset = charset;
return this;
}
}

View File

@@ -1,14 +1,11 @@
package com.yexuejc.base.encrypt;
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.io.*;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
@@ -17,7 +14,7 @@ import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
/**
* RSA加解密 配置模式
@@ -28,7 +25,7 @@ import java.util.Map;
* @date: 2018/5/15 14:39
*/
public class RSA {
private static Logger log = Logger.getLogger(RSA.class.getName());
public static final String CHARSET = "UTF-8";
public static final String RSA_ALGORITHM = "RSA";
/**
@@ -71,7 +68,6 @@ public class RSA {
*/
public static SignAlgorithm signAlgorithm = SignAlgorithm.SHA1withRSA;
/**
* 生成密钥对
*
@@ -119,11 +115,9 @@ public class RSA {
Map<String, String> keyPairMap = new HashMap<String, String>(2);
keyPairMap.put("publicKey", publicKeyStr);
keyPairMap.put("privateKey", privateKeyStr);
return keyPairMap;
}
/**
* 得到公钥
*
@@ -203,7 +197,6 @@ public class RSA {
}
}
/**
* 私钥加密
*
@@ -310,9 +303,7 @@ public class RSA {
private static Signature signature;
/**
* /**
* 私钥签名默认算法SHA1withRSA
* <p>
* 签名算法 {@link SignAlgorithm}

View File

@@ -2,14 +2,8 @@ package com.yexuejc.base.encrypt;
import com.yexuejc.base.util.StrUtil;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.io.*;
import java.security.*;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
@@ -192,4 +186,122 @@ public class RSA2 {
return (RSAPrivateKey) ks.getKey(alias, password.toCharArray());
}
/**
* 证书格式转换 JKS(xx.keystore) 转 PKCS12(xx.pfx)
*
* @param inPath 证书输入文件路径
* @param outPath 证书输出文件路径
* @param oPwd 原证书密码
* @param nPwd 新证书密码(为空同原证书密码一致)
*/
public static void cover2Pfx(String inPath, String outPath, String oPwd, String nPwd) {
try {
FileInputStream fis = new FileInputStream(inPath);
FileOutputStream out = new FileOutputStream(outPath);
if (nPwd == null) {
nPwd = oPwd;
}
cover2Pfx(fis, out, oPwd.toCharArray(), nPwd.toCharArray());
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 证书格式转换 JKS(xx.keystore) 转 PKCS12(xx.pfx)
*
* @param fis 证书输入文件流
* @param out 证书输出文件流[自行关闭->out.close()]
* @param oPwd 原证书密码
* @param nPwd 新证书密码(为空同原证书密码一致)
*/
public static void cover2Pfx(FileInputStream fis, FileOutputStream out, char[] oPwd, char[] nPwd) {
try {
KeyStore inputKeyStore = KeyStore.getInstance("JKS");
cover(fis, out, oPwd, nPwd, inputKeyStore, "PKCS12");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 证书格式转换 PKCS12(xx.pfx) 转 JKS(xx.keystore)
*
* @param inPath 证书输入文件路径
* @param outPath 证书输出文件路径
* @param oPwd 原证书密码
* @param nPwd 新证书密码(为空同原证书密码一致)
*/
public static void cover2keyStore(String inPath, String outPath, String oPwd, String nPwd) {
try {
FileInputStream fis = new FileInputStream(inPath);
FileOutputStream out = new FileOutputStream(outPath);
if (nPwd == null) {
nPwd = oPwd;
}
cover2keyStore(fis, out, oPwd.toCharArray(), nPwd.toCharArray());
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 证书格式转换 PKCS12(xx.pfx) 转 JKS(xx.keystore)
*
* @param fis 证书输入文件流
* @param out 证书输出文件流[自行关闭->out.close()]
* @param oPwd 原证书密码
* @param nPwd 新证书密码(为空同原证书密码一致)
*/
public static void cover2keyStore(FileInputStream fis, FileOutputStream out, char[] oPwd, char[] nPwd) {
try {
KeyStore inputKeyStore = KeyStore.getInstance("PKCS12");
cover(fis, out, oPwd, nPwd, inputKeyStore, "JKS");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 证书转换操作
*
* @param fis 证书输入文件流
* @param out 证书输出文件流[自行关闭->out.close()]
* @param oPwd 原证书密码
* @param nPwd 新证书密码(为空同原证书密码一致)
* @param inputKeyStore 输入格式
* @param type 目标类型
* @throws IOException
* @throws NoSuchAlgorithmException
* @throws CertificateException
* @throws KeyStoreException
* @throws UnrecoverableKeyException
*/
public static void cover(FileInputStream fis, FileOutputStream out, char[] oPwd, char[] nPwd, KeyStore inputKeyStore, String type) throws IOException, NoSuchAlgorithmException, CertificateException, KeyStoreException, UnrecoverableKeyException {
inputKeyStore.load(fis, oPwd);
fis.close();
if (nPwd == null) {
nPwd = oPwd;
}
KeyStore outputKeyStore = KeyStore.getInstance(type);
outputKeyStore.load(null, nPwd);
Enumeration<String> enums = inputKeyStore.aliases();
while (enums.hasMoreElements()) {
String keyAlias = enums.nextElement();
System.out.println("alias=[" + keyAlias + "]");
if (inputKeyStore.isKeyEntry(keyAlias)) {
Key key = inputKeyStore.getKey(keyAlias, oPwd);
Certificate[] certChain = inputKeyStore.getCertificateChain(keyAlias);
outputKeyStore.setKeyEntry(keyAlias, key, nPwd, certChain);
}
}
outputKeyStore.store(out, nPwd);
}
public static void main(String[] args) {
cover2Pfx("D:\\mykeystore.keystore", "D:\\m1.pfx", "123456", null);
}
}

View File

@@ -0,0 +1,90 @@
package com.yexuejc.base.pojo;
import java.util.List;
/**
* 压缩文件的参数设定
*
* @author maxf
* @class-name CreateZipFileBean
* @description 压缩文件参考 {@link com.yexuejc.base.util.ZipUtil}
* @date 2022/11/11 10:30
*/
public class CreateZipFileBean {
/**
* 压缩的源文件列表,为空表示压缩整个目录
*/
private List<String> sourceFileName;
/**
* 当压缩文件夹时,需要排除的文件。压缩文件时(该参数无效)
*/
private List<String> excludeFileName;
/**
* 压缩源文件的目录
*/
private String sourcePath;
/**
* 生成压缩文件路径(全路径+压缩文件名)
*/
private String zipFile;
/**
* 加密密码
*/
private String encryptPwd;
private String writeCharsetName = "UTF-8";
public List<String> getSourceFileName() {
return sourceFileName;
}
public String getEncryptPwd() {
return encryptPwd;
}
public CreateZipFileBean setEncryptPwd(String encryptPwd) {
this.encryptPwd = encryptPwd;
return this;
}
public CreateZipFileBean setSourceFileName(List<String> sourceFileName) {
this.sourceFileName = sourceFileName;
return this;
}
public String getSourcePath() {
return sourcePath;
}
public CreateZipFileBean setSourcePath(String sourcePath) {
this.sourcePath = sourcePath;
return this;
}
public String getZipFile() {
return zipFile;
}
public CreateZipFileBean setZipFile(String zipFile) {
this.zipFile = zipFile;
return this;
}
public String getWriteCharsetName() {
return writeCharsetName;
}
public CreateZipFileBean setWriteCharsetName(String writeCharsetName) {
this.writeCharsetName = writeCharsetName;
return this;
}
public List<String> getExcludeFileName() {
return excludeFileName;
}
public CreateZipFileBean setExcludeFileName(List<String> excludeFileName) {
this.excludeFileName = excludeFileName;
return this;
}
}

View File

@@ -1,9 +1,8 @@
package com.yexuejc.base.pojo;
import com.yexuejc.base.util.JsonUtil;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
/**
* 分页 VO

View File

@@ -0,0 +1,85 @@
package com.yexuejc.base.pojo;
import java.util.List;
/**
* @author maxf
* @class-name ReadFileBean
* @description 分段读取大文件
* @date 2022/5/16 21:53
*/
public class ReadFileBean<T> {
/**
* 开始行数
*/
private int startRowNum;
/**
* 结束行数
*/
private int endRowNum;
/**
* 每次读取的行数
*/
private int readRowNum;
/**
* 开始行到结束行的数据
*/
private List<T> datas;
/**
* 文件指针位置,默认0开始位置
*/
private long pointer = 0;
/**
* 文件的length
*/
private long fileLength;
public ReadFileBean(int readRow) {
this.readRowNum = readRow;
this.startRowNum = 1;
this.endRowNum = 0;
}
public int getReadRowNum() {
return readRowNum;
}
public int getStartRowNum() {
return startRowNum;
}
public int getEndRowNum() {
return endRowNum;
}
public List<T> getDatas() {
return datas;
}
public ReadFileBean<T> setDatas(List<T> datas) {
this.datas = datas;
this.startRowNum = this.endRowNum + 1;
this.endRowNum += this.readRowNum;
return this;
}
public long getPointer() {
return pointer;
}
public ReadFileBean<T> setPointer(long pointer) {
this.pointer = pointer;
return this;
}
public long getFileLength() {
return fileLength;
}
public ReadFileBean<T> setFileLength(long fileLength) {
this.fileLength = fileLength;
return this;
}
}

View File

@@ -13,6 +13,11 @@ import java.util.Date;
* @date: 2018/3/27 10:44
*/
public class DateTimeUtil {
public static String DATE_PATTERN = "yyyy-MM-dd";
public static String TIME_PATTERN = "HH:mm:ss";
public static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
public static String DATE_TIME_MS_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";
private DateTimeUtil() {
}
@@ -148,6 +153,55 @@ public class DateTimeUtil {
return date;
}
/**
* LocalDate 转 Date
*
* @param localDate
* @return
*/
public static Date parseDate(LocalDate localDate) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
return Date.from(instant);
}
/**
* LocalDateTime 转 Date
*
* @param localDateTime
* @return
*/
public static Date parseDate(LocalDateTime localDateTime) {
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = localDateTime.atZone(zoneId);
return Date.from(zdt.toInstant());
}
/**
* LocalTime 转 Date
*
* @param localTime 时间
* @return 当前日期的指定时间
*/
public static Date parseDate(LocalTime localTime) {
LocalDate localDate = LocalDate.now();
return parseDate(localDate, localTime);
}
/**
* LocalDate + LocalTime 转 Date
*
* @param localDate 日期
* @param localTime 时间
* @return 指定日期的指定时间
*/
public static Date parseDate(LocalDate localDate, LocalTime localTime) {
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
return Date.from(instant);
}
/**
* Date 转 ZonedDateTime
*
@@ -172,30 +226,6 @@ public class DateTimeUtil {
return instant.atZone(zoneId).toLocalDateTime();
}
/**
* LocalDateTime 转 Date
*
* @param localDateTime
* @return
*/
public static Date parseLocalDateTime(LocalDateTime localDateTime) {
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = localDateTime.atZone(zoneId);
return Date.from(zdt.toInstant());
}
/**
* LocalDate 转 Date
*
* @param localDate
* @return
*/
public static Date parseData(LocalDate localDate) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
return Date.from(instant);
}
/**
* Date 转 LocalDate
*
@@ -204,9 +234,8 @@ public class DateTimeUtil {
*/
public static LocalDate parseLocalDate(Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
return localDateTime.toLocalDate();
ZoneId zoneId = ZoneId.systemDefault();
return instant.atZone(zoneId).toLocalDate();
}
/**
@@ -223,28 +252,77 @@ public class DateTimeUtil {
}
/**
* Date 转 LocalTime
* Long 转 LocalDateTime
*
* @param localTime
* @return 当前日期的指定时间
* @param timestamp 13位毫秒
* @return
*/
public static Date parseDate(LocalTime localTime) {
LocalDate localDate = LocalDate.now();
return parseDate(localDate, localTime);
public static LocalDateTime parseLocalDateTime13(long timestamp) {
Instant instant = Instant.ofEpochMilli(timestamp);
ZoneId zone = ZoneId.systemDefault();
return LocalDateTime.ofInstant(instant, zone);
}
/**
* Date 转 LocalTime
* Long 转 LocalDateTime
*
* @param localDate
* @param localTime
* @return 指定日期的指定时间
* @param timestamp 10位
* @return
*/
public static Date parseDate(LocalDate localDate, LocalTime localTime) {
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
public static LocalDateTime parseLocalDateTime10(long timestamp) {
Instant instant = Instant.ofEpochMilli(timestamp * 1000);
ZoneId zone = ZoneId.systemDefault();
return LocalDateTime.ofInstant(instant, zone);
}
/**
* LocalDateTime 转 Long
*
* @param localDateTime
* @return 13位毫秒
*/
public static long parseLong(LocalDateTime localDateTime) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
return Date.from(instant);
return instant.toEpochMilli();
}
/**
* LocalDate 转 Long
*
* @param localDate
* @return 13位毫秒最后3位为0
*/
public static long parseLong(LocalDate localDate) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDate.atStartOfDay(zone).toInstant();
return instant.toEpochMilli();
}
/**
* 格式化时间 <br/>
* 格式 yyyy-MM-dd HH:mm:ss
*
* @param dateTime
* @return
*/
public static String format(LocalDate dateTime) {
return format(dateTime, null);
}
/**
* 格式化时间
*
* @param dateTime
* @param pattern 格式 默认:yyyy-MM-dd
* @return
*/
public static String format(LocalDate dateTime, String pattern) {
if (StrUtil.isEmpty(pattern)) {
pattern = DATE_PATTERN;
}
DateTimeFormatter df = DateTimeFormatter.ofPattern(pattern);
return df.format(dateTime);
}
/**
@@ -255,7 +333,7 @@ public class DateTimeUtil {
* @return
*/
public static String format(LocalDateTime dateTime) {
return format(dateTime, "");
return format(dateTime, null);
}
/**
@@ -266,29 +344,30 @@ public class DateTimeUtil {
* @return
*/
public static String format(LocalDateTime dateTime, String pattern) {
if (pattern.isEmpty()) {
pattern = "yyyy-MM-dd HH:mm:ss";
if (StrUtil.isEmpty(pattern)) {
pattern = DATE_TIME_PATTERN;
}
DateTimeFormatter df = DateTimeFormatter.ofPattern(pattern);
return df.format(dateTime);
}
/** public static void main(String[] args) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(df.format(zonedDateTime2Date(ZonedDateTime.now())));
System.out.println(df2.format(date2ZonedDateTime(new Date())));
System.out.println(getWeek4First());
System.out.println(format(getWeek4First(LocalDate.parse("2018-02-10")).atTime(LocalTime.MIN)));
System.out.println(format(getWeek4Last(LocalDate.parse("2018-02-10")).atTime(LocalTime.MAX)));
/** public static void main(String[] args) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(df.format(zonedDateTime2Date(ZonedDateTime.now())));
System.out.println(df2.format(date2ZonedDateTime(new Date())));
System.out.println(format(getMonth4First().atTime(LocalTime.MIN)));
System.out.println(format(getMonth4Last().atTime(LocalTime.MAX)));
System.out.println(getWeek4First());
System.out.println(format(getWeek4First(LocalDate.parse("2018-02-10")).atTime(LocalTime.MIN)));
System.out.println(format(getWeek4Last(LocalDate.parse("2018-02-10")).atTime(LocalTime.MAX)));
System.out.println(format(getYear4First().atTime(LocalTime.MIN)));
System.out.println(format(getYear4Last().atTime(LocalTime.MAX)));
System.out.println(format(getMonth4First().atTime(LocalTime.MIN)));
System.out.println(format(getMonth4Last().atTime(LocalTime.MAX)));
}*/
System.out.println(format(getYear4First().atTime(LocalTime.MIN)));
System.out.println(format(getYear4Last().atTime(LocalTime.MAX)));
}*/
}

View File

@@ -21,7 +21,7 @@ public class DateUtil {
public static DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
public static DateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm:ss");
public static DateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static DateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
public static String DAY_START_TIME = "00:00:00";
public static String DAY_END_TIME = "23:59:59";

View File

@@ -1,5 +1,15 @@
package com.yexuejc.base.util;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* excel 格式验证工具
*
@@ -48,5 +58,20 @@ public class ExcelImportUtil {
return true;
}
public void readExcel(String path) throws IOException {
Workbook wb = null;
if (isExcel2007(path)) {
wb = new XSSFWorkbook(new FileInputStream(new File(path)));
} else if (isExcel2003(path)) {
wb = new HSSFWorkbook(new FileInputStream(new File(path)));
} else {
throw new NullPointerException("请上传excel文件");
}
Sheet sheet = wb.getSheetAt(0);
for (int i = 2; i < sheet.getLastRowNum() + 1; i++) {
Row row = sheet.getRow(i);
}
}
}

View File

@@ -1,14 +1,44 @@
package com.yexuejc.base.util;
import sun.misc.BASE64Encoder;
import com.fasterxml.jackson.databind.MappingIterator;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
import com.google.common.io.ByteStreams;
import com.google.common.io.CharStreams;
import com.yexuejc.base.annotation.CsvHeader;
import com.yexuejc.base.pojo.ReadFileBean;
import io.jsonwebtoken.lang.Assert;
import org.apache.commons.io.IOUtils;
import java.io.*;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.io.Reader;
import java.io.StringWriter;
import java.math.BigInteger;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.Scanner;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import java.util.zip.CRC32;
/**
@@ -26,6 +56,7 @@ public class FileUtil {
}
private static final String TYPE_TAR_GZ = ".tar.gz";
private static final String TYPE_CSV = ".csv";
private static final String TAR_GZ = "tar.gz";
/**
@@ -50,7 +81,7 @@ public class FileUtil {
}
/**
* 判断文件是否存在
* 判断文件是否存在,不存在就创建一个空的
*
* @param file
*/
@@ -143,7 +174,6 @@ public class FileUtil {
return null;
}
/***
* 计算SHA1码
*
@@ -286,29 +316,36 @@ public class FileUtil {
* @param file
* @return
*/
public static String base64(File file) {
FileInputStream fileInputStream = null;
byte[] data = null;
// 读取图片字节数组
public static String base64ToStr(File file) {
try {
fileInputStream = new FileInputStream(file);
data = new byte[fileInputStream.available()];
fileInputStream.read(data);
fileInputStream.close();
byte[] bytes = Files.readAllBytes(Path.of(file.getPath()));
return Base64.getEncoder().encodeToString(bytes);
} catch (IOException e) {
logger.severe("The operation file is an IO exception.");
e.printStackTrace();
}
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
return null;
}
/**
* base64转文件
* <p>
* <i>
* 文件转base64请使用 {@link FileUtil#base64(File)}
* 文件转base64请使用 {@link FileUtil#base64ToStr(File)}
* </i>
*
* @param decode {@link FileUtil#base64ToStr(File)} 的结果
* @param fileName 保存文件名称(包含路径)
* @return 返回保存地址
*/
public static String base64ToFile(String decode, String fileName) {
return base64ToFile(Base64.getDecoder().decode(decode.getBytes()), fileName);
}
/**
* base64转文件
* <p>
* <i>
* 文件转base64请使用 {@link FileUtil#base64ToStr(File)}
* </i>
*
* @param decode baseByte
@@ -382,6 +419,323 @@ public class FileUtil {
return 0;
}
/**
* 字符串csv格式转 对象
*
* @param data 转换的字符串 如
* <p> ------------ </p>
* <p> id,name,age </p>
* <p> 1,zhangsan,18 </p>
* <p> 2,lisi,20 </p>
* <p> ------------ </p>
* @param cls 需要转换的对象,含有<b>id,name,age</b>字段
* @param delimiter 分隔符
* @param <I>
* @return
*/
public static <I> List<I> readCsv(String data, Class<I> cls, char delimiter) throws IOException {
CsvMapper csvMapper = new CsvMapper();
CsvSchema csvSchema = CsvSchema.emptySchema().withHeader().withColumnSeparator(delimiter);
MappingIterator<I> orderLines = csvMapper.readerFor(cls).with(csvSchema).readValues(data);
return orderLines.readAll();
}
/**
* 读取csv文件
*
* @param csvFilePath 文件地址
* @param cls 读取转化的对象
* @param hasHeader 是否存在header
* @param delimiter 分隔符.默认【,】
* @param <I>
* @return
*/
public static <I> List<I> readCsv(final String csvFilePath, Class<I> cls, boolean hasHeader, char delimiter) {
if (!isFileExist(csvFilePath)) {
throw new RuntimeException(String.format("解析用的csv\u0020[%s] 文件不存在。", csvFilePath));
}
if (StrUtil.isEmpty(delimiter)) {
delimiter = ',';
}
try {
File csvFile = new File(csvFilePath);
CsvMapper csvMapper = new CsvMapper();
CsvSchema csvSchema = csvMapper.typedSchemaFor(cls).withStrictHeaders(hasHeader).withColumnSeparator(delimiter).withComments();
MappingIterator<I> recordIterator = csvMapper.readerWithTypedSchemaFor(cls).with(csvSchema).readValues(csvFile);
return recordIterator.readAll();
} catch (IOException e) {
throw new RuntimeException("[" + csvFilePath + "] 文件解析失败。", e);
}
}
/**
* 判断文件是否存在
*
* @param filePath
* @return
*/
public static boolean isFileExist(String filePath) {
if (StrUtil.isEmpty(filePath)) {
return false;
}
File file = new File(filePath);
return file.exists() && !file.isDirectory();
}
/**
* 分段读取大文件
*
* @param path 文件路径
* @param readFileBean 分段每次读取的bean 初始值需要设置每次读取的行数
* @param <T> 读取结果类型bean
* @return
*/
public <T> ReadFileBean<T> readBigFile(String path, ReadFileBean<T> readFileBean, Class<T> readCls) {
File file = new File(path);
judeFileExists(file);
try {
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r");
randomAccessFile.seek(readFileBean.getPointer());
readFileBean.setFileLength(randomAccessFile.length());
List<String> datas = new ArrayList<>();
for (int i = 0; i < readFileBean.getReadRowNum(); i++) {
String s = randomAccessFile.readLine();
datas.add(charsetDecode(s, StandardCharsets.UTF_8));
readFileBean.setPointer(randomAccessFile.getFilePointer());
}
randomAccessFile.close();
if (path.contains(TYPE_CSV)) {
//csv文件处理
datas.add(0, getCsvHeader(readCls));
List<T> dataList = readCsv(String.join("\n", datas), readCls, ',');
readFileBean.setDatas(dataList);
}
} catch (FileNotFoundException e) {
logger.severe("file exists." + e.getMessage());
} catch (IOException e) {
logger.severe("read file error." + e.getMessage());
}
return readFileBean;
}
/**
* 获取csv的header,使用注解{@link CsvHeader}
*
* @param cls
* @param <T>
* @return
*/
public static <T> String getCsvHeader(Class<T> cls) {
CsvHeader annotation = cls.getAnnotation(CsvHeader.class);
Assert.notNull(annotation, cls.toString() + "类上需要添加注解@CsvHeader并指定header。");
String header = annotation.header();
Assert.notNull(header, cls.toString() + "类上需要添加注解@CsvHeader并指定header。");
return header;
}
/**
* 把字符串data按照指定编码解码
*
* @param data 解码字符串
* @param charset 字符编码
* @return
*/
public static String charsetDecode(String data, Charset charset) {
char[] chars = data.toCharArray();
byte[] result = new byte[chars.length];
for (int i = 0; i < chars.length; i++) {
result[i] = (byte) chars[i];
}
return new String(result, charset);
}
/**
* 提供读取IO流方法合集
* <p>读取速度快慢顺序:</p>
* 1. {@link #read4Buffer(InputStream, Charset)} <br>
* 2. {@link #read4IOUtilsCopy(InputStream, Charset)} <br>
* 3. {@link #read4ByteStreams(InputStream, Charset)} <br>
* 4. {@link #read4Byte(InputStream, Charset)} <br>
* 5. {@link #read4StringBuilder(InputStream, Charset)} <br>
* 6. {@link #read4BufferedReaderParallel(InputStream, Charset, String)}<br>
* 7. {@link #read4BufferedReader(InputStream, Charset, String)}<br>
* 8. {@link #read4ScannerA(InputStream)}<br>
* 9. {@link #read4BufferIO(InputStream, Charset)}<br>
* 10. {@link #read4IOUtils(InputStream, Charset)}<br>
* 11. {@link #read4ScannerZ(InputStream)}<br>
* 12. {@link #read4CharStreams(InputStream, Charset)}<br>
*/
public static class FileInput {
/**
* 读取IO流内容byte方式
*
* @param inputStream
* @param charset 编码:默认 {@link Charset#defaultCharset()}
* @return
* @throws IOException
*/
public static String read4Byte(InputStream inputStream, Charset charset) throws IOException {
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes);
return new String(bytes, charset == null ? Charset.defaultCharset() : charset);
}
/**
* 读取IO流内容BufferedReader方式
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @param lineSeparator 换行方式:默认跟随系统 {@link System#lineSeparator()}
* @return
*/
public static String read4BufferedReader(InputStream inputStream, Charset charset, String lineSeparator) {
return new BufferedReader(
new InputStreamReader(inputStream, charset == null ? Charset.defaultCharset() : charset)
).lines().collect(Collectors.joining(lineSeparator == null ? System.lineSeparator() : lineSeparator));
}
/**
* 读取IO流内容BufferedReader 并行方式
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @param lineSeparator 换行方式:默认跟随系统 {@link System#lineSeparator()}
* @return
*/
public static String read4BufferedReaderParallel(InputStream inputStream, Charset charset, String lineSeparator) {
return new BufferedReader(
new InputStreamReader(inputStream, charset == null ? Charset.defaultCharset() : charset)
).lines().parallel()
.collect(Collectors.joining(lineSeparator == null ? System.lineSeparator() : lineSeparator));
}
/**
* 读取IO流内容Scanner A方式
*
* @param inputStream
* @return
*/
public static String read4ScannerA(InputStream inputStream) {
Scanner s = new Scanner(inputStream).useDelimiter("\\A");
String str = s.hasNext() ? s.next() : "";
return str;
}
/**
* 读取IO流内容Scanner Z方式
*
* @param inputStream
* @return
*/
public static String read4ScannerZ(InputStream inputStream) {
return new Scanner(inputStream).useDelimiter("\\Z").next();
}
/**
* 读取IO流内容StringBuilder方式
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
*/
public static String read4StringBuilder(InputStream inputStream, Charset charset) throws IOException {
StringBuilder sb = new StringBuilder();
String line;
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, charset == null ? Charset.defaultCharset() : charset));
while ((line = br.readLine()) != null) {
sb.append(line);
}
return sb.toString();
}
/**
* 读取IO流内容ByteArrayOutputStream方式
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
*/
public static String read4Buffer(InputStream inputStream, Charset charset) throws IOException {
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
return result.toString(charset == null ? Charset.defaultCharset().name() : charset.name());
}
/**
* 读取IO流内容BufferedInputStream+ByteArrayOutputStream方式
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
*/
public static String read4BufferIO(InputStream inputStream, Charset charset) throws IOException {
BufferedInputStream bis = new BufferedInputStream(inputStream);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
int result = bis.read();
while (result != -1) {
buf.write((byte) result);
result = bis.read();
}
return buf.toString(charset == null ? Charset.defaultCharset().name() : charset.name());
}
/**
* 读取IO流内容 依赖于commons-io:commons-io {@link IOUtils#copy(Reader, OutputStream, Charset)}
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
* @throws IOException
*/
public static String read4IOUtilsCopy(InputStream inputStream, Charset charset) throws IOException {
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, charset == null ? Charset.defaultCharset() : charset);
return writer.toString();
}
/**
* 读取IO流内容 依赖于commons-io:commons-io {@link IOUtils#toString(InputStream, Charset)}
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
* @throws IOException
*/
public static String read4IOUtils(InputStream inputStream, Charset charset) throws IOException {
return IOUtils.toString(inputStream, charset == null ? Charset.defaultCharset() : charset);
}
/**
* 读取IO流内容 依赖于com.google.guava:guava {@link CharStreams#toString(Readable)}
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
* @throws IOException
*/
public static String read4CharStreams(InputStream inputStream, Charset charset) throws IOException {
return CharStreams.toString(new InputStreamReader(inputStream, charset == null ? Charset.defaultCharset() : charset));
}
/**
* 读取IO流内容 依赖于com.google.guava:guava {@link ByteStreams#toByteArray(InputStream)}
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
* @throws IOException
*/
public static String read4ByteStreams(InputStream inputStream, Charset charset) throws IOException {
return new String(ByteStreams.toByteArray(inputStream), charset == null ? Charset.defaultCharset() : charset);
}
}
/*public static void main(String[] args) {
long size = FileUtil.size(new File("E:\\OS\\deepin-15.6-amd64\\DeepinCloudPrintServerInstaller_1.0.0.1.exe"));
System.out.println(size);

View File

@@ -1,7 +1,5 @@
package com.yexuejc.base.util;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
@@ -11,6 +9,7 @@ import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;
import java.util.Base64;
import java.util.Iterator;
/**
@@ -47,8 +46,7 @@ public class ImgUtil {
e.printStackTrace();
}
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data.toByteArray());
return new String(Base64.getEncoder().encode(data.toByteArray()));
}
/**
@@ -237,7 +235,7 @@ public class ImgUtil {
* @return String 编码后的字符串
*/
public static String encode(byte[] bytes) {
return new BASE64Encoder().encode(bytes);
return new String(Base64.getEncoder().encode(bytes));
}
/**
@@ -248,10 +246,7 @@ public class ImgUtil {
* @throws IOException
*/
public static byte[] decode(String encodeStr) throws IOException {
byte[] bt = null;
BASE64Decoder decoder = new BASE64Decoder();
bt = decoder.decodeBuffer(encodeStr);
return bt;
return Base64.getDecoder().decode(encodeStr);
}
/**

View File

@@ -1,15 +1,18 @@
package com.yexuejc.base.util;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.type.MapType;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.TimeZone;
import java.util.logging.Logger;
/**
@@ -41,14 +44,32 @@ public class JsonUtil {
* @param objectMapper
*/
private static void initDefaultObjectMapper(ObjectMapper objectMapper) {
objectMapper.setSerializationInclusion(Include.NON_NULL);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//设置一下时区,可以和程序同步避免时区问题
objectMapper.setTimeZone(TimeZone.getDefault());
objectMapper.setDateFormat(DateUtil.DATE_TIME_FORMAT);
}
//TODO 待优化
public static void initSnakeCase() {
//驼峰下划线互转
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
}
/**
* 这个设置不能改变JsonUtil自带的objectMapper设置只能修改传入objMapper的设置
*
* @param objMapper
*/
public static void initSnakeCase(ObjectMapper objMapper) {
//驼峰下划线互转
objMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
}
/**
* 每调用一次生成一个全新的ObjectMapper供特殊场景使用与通用ObjectMapper没有关系
*
@@ -60,6 +81,15 @@ public class JsonUtil {
return objectMapper;
}
/**
* 返回 ObjectMapper对象供外部设置特定参数
*
* @return
*/
public static ObjectMapper getObjectMapper() {
return objectMapper;
}
/**
* 将json转换为某个类
*
@@ -92,7 +122,6 @@ public class JsonUtil {
*/
public static <T> T json2Obj(String json, Class<T> cls) {
T pojo = null;
try {
pojo = objectMapper.readValue(json, cls);
} catch (JsonParseException e) {
@@ -101,12 +130,13 @@ public class JsonUtil {
log.warning("json to Object JsonMappingException.\n" + e.getMessage());
} catch (IOException e) {
log.warning("json to Object IOException.\n" + e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
return pojo;
}
/**
* Json字符串转换为Java对象
*
@@ -117,8 +147,7 @@ public class JsonUtil {
*/
public static <T> T json2Obj(String json, Class<T> parametrized, Class<?>... parameterClasses) {
T pojo = null;
JavaType javaType = objectMapper.getTypeFactory().constructParametrizedType(parametrized, parametrized,
parameterClasses);
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(parametrized, parameterClasses);
try {
pojo = objectMapper.readValue(json, javaType);
} catch (JsonParseException e) {
@@ -159,26 +188,18 @@ public class JsonUtil {
/**
* Json字符串转换为Java-Map对象
*
* @param json 字符串
* @param mapClass Map 继承类
* @param keyType Key 类
* @param valueType Value 类
* @param json 字符串
* @param javaType 具体的java类型
* @param <T>
* @return
*/
public static <T> T json2Obj(String json, Class<? extends Map> mapClass, JavaType keyType, JavaType valueType) {
T pojo = null;
MapType mapType = objectMapper.getTypeFactory().constructMapType(mapClass, keyType, valueType);
public static <T extends Object> T json2Obj(String json, TypeReference<T> javaType) {
try {
pojo = objectMapper.readValue(json, mapType);
} catch (JsonParseException e) {
return objectMapper.readValue(json, javaType);
} catch (JsonProcessingException e) {
log.warning("json to Object JsonParseException.\n" + e.getMessage());
} catch (JsonMappingException e) {
log.warning("json to Object JsonMappingException.\n" + e.getMessage());
} catch (IOException e) {
log.warning("json to Object IOException.\n" + e.getMessage());
}
return pojo;
return null;
}
/**
@@ -220,4 +241,20 @@ public class JsonUtil {
}
return json;
}
/**
* 格式化输出
*
* @param obj 需要输出对象
* @return 格式化后的字符串
*/
public static String formatPrinter(Object obj) {
String json = null;
try {
json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
} catch (JsonProcessingException e) {
log.warning("json to Object JsonProcessingException.\n" + e.getMessage());
}
return json;
}
}

View File

@@ -124,4 +124,19 @@ public class JwtUtil {
return JsonUtil.json2Obj(subject, cls);
}
/**
* 解密token为字符串
*
* @param token
* @return
*/
public String parseStr(String token) {
String subject = null;
try {
subject = Jwts.parser().setSigningKey(JWT_SIGNATURE_KEY).parseClaimsJws(token).getBody().getSubject();
} catch (Exception e) {
e.printStackTrace();
}
return subject;
}
}

View File

@@ -1,7 +1,11 @@
package com.yexuejc.base.util;
import com.yexuejc.base.annotation.ToUeProperty;
import java.io.*;
import java.lang.reflect.Field;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
/**
@@ -10,7 +14,7 @@ import java.util.*;
* @author maxf
* @version 1.0
* @ClassName ObjUtil
* @Description
* @Description 对象工具:对类的操作
* @date 2018/12/28 15:54
*/
public class ObjUtil {
@@ -108,19 +112,66 @@ public class ObjUtil {
fName = StrUtil.camelToUnderline(f.getName());
}
boolean annotationPresent = f.isAnnotationPresent(ToUeProperty.class);
boolean ignore = false;
Class<?> toType = null;
if (annotationPresent) {
ToUeProperty annotation = f.getAnnotation(ToUeProperty.class);
ignore = annotation.ignore();
String value = annotation.value();
if (StrUtil.isNotEmpty(value)) {
fName = value;
}
if (!annotation.type().getClass().equals(ObjUtil.class)) {
toType = annotation.type();
}
}
//忽略
if (ignore) {
continue;
}
Object o = f.get(obj);
if (null == o || o.getClass().isPrimitive() || o instanceof String || o instanceof Enum) {
if (null == o && !putNull) {
continue;
if (null == o && !putNull) {
continue;
}
if (null == o || isPrimitive(o) || o instanceof String || o instanceof Enum) {
objMap.put(fName, o);
} else if (o instanceof Date) {
if (toType != null) {
Date date = (Date) o;
if (toType.equals(Integer.class)) {
objMap.put(fName, (int) date.getTime() / 1000);
} else if (toType.equals(Long.class)) {
objMap.put(fName, date.getTime());
}
} else {
objMap.put(fName, o);
}
} else if (o instanceof LocalDate) {
if (toType != null) {
LocalDate date = (LocalDate) o;
if (toType.equals(Integer.class)) {
objMap.put(fName, (int) DateTimeUtil.parseLong(date) / 1000);
} else if (toType.equals(Long.class)) {
objMap.put(fName, DateTimeUtil.parseLong(date));
} else if (toType.equals(String.class)) {
objMap.put(fName, DateTimeUtil.format(date));
}
} else {
objMap.put(fName, o);
}
} else if (o instanceof LocalDateTime) {
if (toType != null) {
LocalDateTime date = (LocalDateTime) o;
if (toType.equals(Integer.class)) {
objMap.put(fName, (int) DateTimeUtil.parseLong(date) / 1000);
} else if (toType.equals(Long.class)) {
objMap.put(fName, DateTimeUtil.parseLong(date));
} else if (toType.equals(String.class)) {
objMap.put(fName, DateTimeUtil.format(date));
}
} else {
objMap.put(fName, o);
}
objMap.put(fName, f.get(obj));
} else if (o instanceof List) {
List list = (List) o;
List bodyList = new ArrayList();
@@ -133,6 +184,23 @@ public class ObjUtil {
if (bodyList.size() > 0) {
objMap.put(fName, bodyList);
}
} else if (o instanceof Map) {
Map map = (Map) o;
if (map.size() > 0) {
objMap.put(fName, map);
}
} else if (o instanceof Set) {
Set list = (Set) o;
Set bodyList = new HashSet();
list.forEach(it -> {
if (null != it) {
Map<String, Object> underlineMap = getUnderlineMap(it, isAnnotationAll, putNull);
bodyList.add(underlineMap);
}
});
if (bodyList.size() > 0) {
objMap.put(fName, bodyList);
}
} else {
Map<String, Object> underlineMap = getUnderlineMap(o, isAnnotationAll, putNull);
objMap.put(fName, underlineMap);
@@ -144,75 +212,26 @@ public class ObjUtil {
return objMap;
}
public static void main(String[] args) {
B a = new B();
a.nameFirst = "张三";
a.ageInt = "5165458";
a.testAss = "asdasdsad";
a.setaM1("method1");
a.setbM1("b1Mthod1");
a.protectedStr = "protectedStr";
C c = new C();
c.ageInt = "test";
a.c = c;
a.list = new ArrayList<>();
a.list.add(c);
Map<String, Object> underlineMap = getUnderlineMap(a, false, false);
System.out.println(JsonUtil.obj2Json(underlineMap));
/**
* 判断是否基本类型包括String,BigDecimal,Number
*
* @param obj
* @return
*/
public static boolean isPrimitive(Object obj) {
if (null == obj) {
return false;
}
boolean b = obj.getClass().isPrimitive()
|| obj instanceof Integer || obj instanceof Character || obj instanceof Boolean
|| obj instanceof Number || obj instanceof String || obj instanceof Double || obj instanceof Float
|| obj instanceof Short || obj instanceof Long || obj instanceof Byte;
if (b) {
return true;
}
return false;
}
static class A implements Serializable {
private static final long serialVersionUID = -8462118058721865488L;
public String nameFirst;
public String ageInt;
private String aM1;
@ToUeProperty("p_str")
protected String protectedStr;
public String getaM1() {
return aM1;
}
public A setaM1(String aM1) {
this.aM1 = aM1;
return this;
}
}
static class B extends A {
private static final long serialVersionUID = -8462118058721865488L;
public String testAss;
private String bM1;
private C c;
List<C> list;
public String getbM1() {
return bM1;
}
public B setbM1(String bM1) {
this.bM1 = bM1;
return this;
}
}
static class C extends A {
private static final long serialVersionUID = -8462118058721865488L;
public String testAss;
private String bM1;
public String getbM1() {
return bM1;
}
public C setbM1(String bM1) {
this.bM1 = bM1;
return this;
}
}
/**
* <h2>深度克隆对象</h2>
* <p>
@@ -241,56 +260,4 @@ public class ObjUtil {
return outer;
}
// public static void main(String[] args) {
//// test1();
//// test2();
//
// }
//
// private static void test2() {
// B t = new B();
// t.sex = "男";
// t.age = 18;
// A test = new A();
// test.name = "张三";
// t.test = test;
// B b = depthClone(t);
// System.out.println(JsonUtil.obj2Json(b));
// }
//
// static class A implements Serializable {
// private static final long serialVersionUID = -8462118058721865488L;
// public String name;
// }
//
// static class B implements Serializable {
// private static final long serialVersionUID = 3297717505428005316L;
// public int age;
// public String sex;
// public A test;
// }
//
// static class C implements Serializable {
// private static final long serialVersionUID = 3297717505428005316L;
// public int age;
// public String sex;
// public A test;
// }
//
// private static void test1() {
// ApiVO apiVO = new ApiVO(ApiVO.STATUS.S);
// apiVO.setMsg("asdsadsad");
// apiVO.setObject1("sadsadsad");
//
// Resps<String> obj = new Resps<>();
// obj.setSucc("安达圣斗士", "ok");
// System.out.println(obj);
// apiVO.setObject2(obj);
// ApiVO apiVO1 = depthClone(apiVO);
// System.out.println(apiVO == apiVO1);
// System.out.println(JsonUtil.obj2Json(apiVO1));
// System.out.println(JsonUtil.obj2Json(apiVO1.getObject1(String.class)));
// System.out.println(JsonUtil.obj2Json(apiVO1.getObject2(Resps.class)));
// System.out.println(apiVO1.getObject2(Resps.class) == obj);
// }
}

View File

@@ -6,9 +6,11 @@ import java.util.regex.Pattern;
/**
* 正则验证
*
* @author yexue
* @expl
* @time 2017年11月9日 上午11:01:24
* @author maxf
* @version 1.3.4
* @ClassName RegexUtil
* @Description
* @date 2019/1/3 9:33
*/
public class RegexUtil {
private RegexUtil() {

View File

@@ -92,10 +92,10 @@ public final class StrUtil {
}
/**
* 生成11位编号可以用作订单号有很小几率出现重复需要做异常处理<br/>
* 左边第一位为正负标识正数1 负数0<br/>
* 剩余位数为UUID的hashcode值<br/>
* 可以再生成的编号基础上嵌入其他标识编码
* <p>生成11位编号可以用作订单号有很小几率出现重复需要做异常处理</p>
* <p>左边第一位为正负标识正数1 负数0</p>
* <p> 剩余位数为UUID的hashcode值</p>
* <p>可以再生成的编号基础上嵌入其他标识编码</p>
*
* @return
*/

View File

@@ -1,14 +0,0 @@
package com.yexuejc.base.util;
import java.lang.annotation.*;
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ToUeProperty {
/**
* 字段名,默认该字段转下划线
* @return
*/
String value() default "";
}

View File

@@ -0,0 +1,65 @@
package com.yexuejc.base.util;
import com.yexuejc.base.pojo.CreateZipFileBean;
import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ExcludeFileFilter;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.model.enums.CompressionMethod;
import net.lingala.zip4j.model.enums.EncryptionMethod;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 压缩相关
* <p>依赖于zip4j<a href='https://github.com/srikanth-lingala/zip4j'>https://github.com/srikanth-lingala/zip4j</a></p>
*
* @author maxf
* @class-name ZipUtil
* @description 文件压缩
* @date 2022/11/11 11:09
*/
public class ZipUtil {
/**
* 创建压缩文件
*
* @param zipFileBean
*/
public static void createZipFile(CreateZipFileBean zipFileBean) throws ZipException {
ZipParameters zipParameters = new ZipParameters();
zipParameters.setCompressionMethod(CompressionMethod.STORE);
//加密
zipParameters.setEncryptFiles(true);
zipParameters.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD);
ZipFile zipFile = new ZipFile(zipFileBean.getZipFile());
if (StrUtil.isNotEmpty(zipFileBean.getEncryptPwd())) {
zipFile = new ZipFile(zipFileBean.getZipFile(), zipFileBean.getEncryptPwd().toCharArray());
}
if (StrUtil.isNotEmpty(zipFileBean.getSourceFileName())) {
//压缩文件
List<File> filesToAdd = new ArrayList<>(16);
Map<String, String> fileNamesMap = new HashMap<>(16);
zipFileBean.getSourceFileName().forEach(it -> {
String file = zipFileBean.getSourcePath() + File.separator + it;
filesToAdd.add(new File(file));
fileNamesMap.put(file, it);
});
zipFile.renameFiles(fileNamesMap);
zipFile.addFiles(filesToAdd, zipParameters);
} else {
//压缩目录
ExcludeFileFilter excludeFileFilter = zipFileBean.getExcludeFileName()::contains;
zipParameters.setExcludeFileFilter(excludeFileFilter);
zipFile.addFolder(new File(zipFileBean.getSourcePath()), zipParameters);
}
}
}
//checkemun key -> codeMst检索(缓存)
//返回exception(message用区分分割文言和exp)

View File

@@ -0,0 +1,57 @@
package com.yexuejc.base.util;
import com.fasterxml.jackson.core.type.TypeReference;
import org.junit.jupiter.api.Test;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class JsonUtilTest {
@Test
public void test2() {
// TestA testA = new TestA("张三", 1, false);
// List<TestA> list = new ArrayList<>();
// list.add(testA);
// list.add(testA);
// Map<String, List<TestA>> data = new HashMap<>();
// data.put("data",list);
// System.out.println(JsonUtil.obj2Json(data));
// System.out.println("===========================");
String readData="{\"data\":[{\"name\":\"张三\",\"id\":1,\"sex\":false},{\"name\":\"张三\",\"id\":1,\"sex\":false}]}";
Map<String, List<TestA>> map = JsonUtil.json2Obj(readData, new TypeReference<Map<String, List<TestA>>>() {
});
System.out.println(JsonUtil.obj2Json(map));
List<TestA> testAS = map.get("data");
System.out.println(testAS.getClass().toString());
System.out.println(testAS.get(0).getClass().toString());
}
@Test
public void test1() {
TestA testA = new TestA("张三", 1, false);
System.out.println(JsonUtil.json2Obj(JsonUtil.obj2Json(testA), Map.class));
List<TestA> list = new ArrayList<>();
list.add(testA);
list.add(testA);
list.add(testA);
System.out.println(JsonUtil.json2Obj(JsonUtil.obj2Json(list), List.class, TestA.class));
}
static class TestA implements Serializable {
public String name;
public Integer id;
public Boolean sex;
public TestA() {
}
public TestA(String name, Integer id, Boolean sex) {
this.name = name;
this.id = id;
this.sex = sex;
}
}
}

View File

@@ -0,0 +1,156 @@
package com.yexuejc.base.util;
import com.yexuejc.base.annotation.ToUeProperty;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* json化输出改变属性名称输出类型 {@link ObjUtil} + {@link ToUeProperty} 测试类
*
* @author: yexuejc
* @date: 2021-02-03 10:02:55
*/
class ObjUtilTest {
public static void main(String[] args) {
start();
}
public static void start(){
B a = new B();
a.nameFirst = "张三";
a.ageInt = "5165458";
a.testAss = "asdasdsad";
a.setaM1("method1");
a.setbM1("b1Mthod1");
a.protectedStr = "protectedStr";
a.amount=new BigDecimal("3");
a.time = LocalDateTime.now();
a.dateTime=new Date();
C c = new C();
c.ageInt = "test";
a.c = c;
a.list = new ArrayList<>();
a.list.add(c);
Map<String, Object> underlineMap = ObjUtil.getUnderlineMap(a, false, false);
System.out.println(JsonUtil.formatPrinter(underlineMap));
}
static class A implements Serializable {
private static final long serialVersionUID = -8462118058721865488L;
public String nameFirst;
public String ageInt;
private String aM1;
@ToUeProperty("p_str")
protected String protectedStr;
public String getaM1() {
return aM1;
}
public A setaM1(String aM1) {
this.aM1 = aM1;
return this;
}
}
static class B extends A {
private static final long serialVersionUID = -8462118058721865488L;
public String testAss;
private String bM1;
@ToUeProperty(type = Integer.class)
public BigDecimal amount;
@ToUeProperty(type = String.class)
public LocalDateTime time;
public Date dateTime;
private C c;
List<C> list;
public String getbM1() {
return bM1;
}
public B setbM1(String bM1) {
this.bM1 = bM1;
return this;
}
}
static class C extends A {
private static final long serialVersionUID = -8462118058721865488L;
public String testAss;
private String bM1;
public String getbM1() {
return bM1;
}
public C setbM1(String bM1) {
this.bM1 = bM1;
return this;
}
}
// public static void main(String[] args) {
//// test1();
//// test2();
//
// }
//
// private static void test2() {
// B t = new B();
// t.sex = "男";
// t.age = 18;
// A test = new A();
// test.name = "张三";
// t.test = test;
// B b = depthClone(t);
// System.out.println(JsonUtil.obj2Json(b));
// }
//
// static class A implements Serializable {
// private static final long serialVersionUID = -8462118058721865488L;
// public String name;
// }
//
// static class B implements Serializable {
// private static final long serialVersionUID = 3297717505428005316L;
// public int age;
// public String sex;
// public A test;
// }
//
// static class C implements Serializable {
// private static final long serialVersionUID = 3297717505428005316L;
// public int age;
// public String sex;
// public A test;
// }
//
// private static void test1() {
// ApiVO apiVO = new ApiVO(ApiVO.STATUS.S);
// apiVO.setMsg("asdsadsad");
// apiVO.setObject1("sadsadsad");
//
// Resps<String> obj = new Resps<>();
// obj.setSucc("安达圣斗士", "ok");
// System.out.println(obj);
// apiVO.setObject2(obj);
// ApiVO apiVO1 = depthClone(apiVO);
// System.out.println(apiVO == apiVO1);
// System.out.println(JsonUtil.obj2Json(apiVO1));
// System.out.println(JsonUtil.obj2Json(apiVO1.getObject1(String.class)));
// System.out.println(JsonUtil.obj2Json(apiVO1.getObject2(Resps.class)));
// System.out.println(apiVO1.getObject2(Resps.class) == obj);
// }
}