mirror of
https://gitee.com/jzsw-it/yexuejc-base.git
synced 2025-11-19 08:47:43 +08:00
Compare commits
36 Commits
develop-gi
...
4c77c4ebe8
| Author | SHA1 | Date | |
|---|---|---|---|
| 4c77c4ebe8 | |||
| d25dee8fe4 | |||
| 44eee0bbd2 | |||
| 4dc1d9d767 | |||
| 9340edb0ef | |||
| 933eacc1c2 | |||
| 6ff859b4fb | |||
| 8741562463 | |||
| b97fdf65bc | |||
| 3987f982be | |||
| 556f2a49d2 | |||
| 3b0cdc832b | |||
| 5a96c23882 | |||
| d602d4370e | |||
| 471da3dbcb | |||
| 58d713e025 | |||
| 2cdcf4fc7c | |||
| 1711fc8a0d | |||
| 45aeabca96 | |||
| 9d7d7331c3 | |||
|
|
7f1b49df93 | ||
|
|
0cfd7e78f1 | ||
|
|
0d66a62e6c | ||
| 9d160bdede | |||
| 831ba7b866 | |||
| df43189a0c | |||
| 03aaeff1bf | |||
| f1aa91c81d | |||
| 70c4fb67b1 | |||
| 873bfcbe9f | |||
| 763616c67d | |||
| 1f4d31f842 | |||
| 3b83e22ac7 | |||
| e7e89563d9 | |||
| c9863373fe | |||
| 6c186e39cd |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -22,4 +22,5 @@ build/
|
||||
nbbuild/
|
||||
dist/
|
||||
nbdist/
|
||||
.nb-gradle/
|
||||
.nb-gradle/
|
||||
*.iml~
|
||||
|
||||
201
LICENSE
Normal file
201
LICENSE
Normal 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
134
README.md
@@ -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. 支持环境:java8(1.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
521
UPDATE.md
@@ -1,210 +1,313 @@
|
||||
yexuejc-base 更新记录
|
||||
------------------
|
||||
|
||||
#### version :1.3.4
|
||||
**time:2019-1-2 20:32:12** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. objUtil list类型修复
|
||||
#
|
||||
#### version :1.3.3
|
||||
**time:2019-1-2 14:06:47** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. MoneyUtil 扩展元转分
|
||||
#
|
||||
#### version :1.3.2
|
||||
**time:2019-1-2 14:06:47** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. objUtil 枚举类型修复
|
||||
#
|
||||
#### version :1.3.1
|
||||
**time:2019-1-2 14:06:47** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. objUtil 增加类字段(驼峰)转换成下划线
|
||||
#
|
||||
#### version :1.3.0
|
||||
**time:2018-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
|
||||
**time:2018-12-29 14:51:33** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 获取RSA密钥增加以输入流的形式获取密钥
|
||||
|
||||
#
|
||||
#### version :1.2.6
|
||||
**time:2018-12-21 14:58:49** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. RSA 验签增加初始化方法
|
||||
|
||||
#
|
||||
#### version :1.2.8
|
||||
**time:2018-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
|
||||
**time:2018-12-21 14:58:49** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. RSA 验签增加初始化方法
|
||||
|
||||
#
|
||||
#### version :1.2.7
|
||||
**time:2018-12-24 15:31:01** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. FileUtil增加base64转File `base64ToFile()`
|
||||
|
||||
#
|
||||
#### version :1.2.6
|
||||
**time:2018-12-21 14:58:49** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. RSA 验签增加初始化方法
|
||||
|
||||
#
|
||||
#### version :1.2.5
|
||||
**time:2018-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
|
||||
**time:2018-11-27 14:46:04** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 工具类的优化
|
||||
>2.规范代码
|
||||
|
||||
#
|
||||
#### version :1.2.3
|
||||
**time:2018-11-23 16:45:42** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 修复RSA加密(签名)时选择的Base64(encodeBase64URLSafeString、encodeBase64String)区分
|
||||
#
|
||||
#### version :1.2.1
|
||||
**time:2018-11-9 15:05:06** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 优化resps
|
||||
#
|
||||
#### version :1.2.2
|
||||
**time:2018-11-20 20:20:12** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 优化RSA 加解密
|
||||
>1. 增加RSA 签名
|
||||
#
|
||||
#### version :1.2.1
|
||||
**time:2018-11-9 15:05:06** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 优化resps
|
||||
#
|
||||
#### version :1.2.0
|
||||
**time:2018-10-19 11:38:20** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 增加异步线程处理工具
|
||||
```$java
|
||||
SysUtil.threadRun(() -> {
|
||||
//异步执行代码块
|
||||
}
|
||||
```
|
||||
#
|
||||
|
||||
#### version :1.1.9
|
||||
**time:2018-9-23 11:57:36** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 优化工具类包名:不向下兼容,升级请修改
|
||||
>2. 升级JWT工具类:更改为单例模式,可配置参数
|
||||
#
|
||||
|
||||
#### version :1.1.8
|
||||
**time:2018-9-3 19:29:56** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 增肌图片处理工具类
|
||||
>2. 增肌3des工具类
|
||||
>3. 增肌RSA工具类
|
||||
>4. 优化其他工具类
|
||||
#
|
||||
#### version :1.1.7
|
||||
**time:2018-8-17 11:22:50** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 优化ApiVO
|
||||
#
|
||||
|
||||
#### version :1.1.6
|
||||
**time:2018-7-7 11:32:56** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. maven仓库更新
|
||||
#
|
||||
|
||||
#### version :1.1.5
|
||||
**time:2018-6-19 22:16:34** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 优化ApiVO
|
||||
|
||||
#
|
||||
#### version :1.1.4
|
||||
**time:2018-6-14 22:27:59** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 统一编码:UTF-8
|
||||
|
||||
#
|
||||
#### version :1.1.3
|
||||
**time:2018年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
|
||||
**time:2022-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
|
||||
**time:2022-5-9 13:37:31** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 扩展FileUtil,优化Base64的包
|
||||
#
|
||||
#### version :1.4.4
|
||||
**time:2021-4-24 00:41:31** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. JsonUtil类修复格式化出现的时区差:现使用TimeZone.getDefault()时区
|
||||
#
|
||||
#### version :1.4.3
|
||||
**time:2021-2-6 11:42:49** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. DateTimeUtil类增加时间格式
|
||||
#
|
||||
#### version :1.4.2
|
||||
**time:2021-2-3 11:40:11** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 优化时间转换格式
|
||||
>2. 增加注解 ToUeProperty 转换时间为时间戳的功能
|
||||
#
|
||||
#### version :1.4.1
|
||||
**time:2021-1-31 12:59:24** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 升级所有依赖
|
||||
>1. 增加DateTimeUtil类的功能
|
||||
#
|
||||
#### version :1.4.0
|
||||
**time:2020-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
|
||||
**time:2019-1-11 16:50:51** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. RSA2 增加证书格式转换 JKS(xx.keystore) 、 PKCS12(xx.pfx)相互转换
|
||||
#
|
||||
|
||||
#### version :1.3.8
|
||||
**time:2019-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
|
||||
**time:2019-1-11 10:02:03** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 考虑到向下兼容,回滚1.3.6【json增加下划线、驼峰互转】,考虑更优方案(解决加入下个版本)
|
||||
#
|
||||
|
||||
#### version :1.3.6
|
||||
**time:2019-1-10 14:55:13** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. json增加下划线、驼峰互转
|
||||
#
|
||||
#### version :1.3.5
|
||||
**time:2019-1-7 17:19:22** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. objUtil 增加兼容类型
|
||||
#
|
||||
#### version :1.3.4
|
||||
**time:2019-1-2 20:32:12** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. objUtil list类型修复
|
||||
#
|
||||
#### version :1.3.3
|
||||
**time:2019-1-2 14:06:47** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. MoneyUtil 扩展元转分
|
||||
#
|
||||
#### version :1.3.2
|
||||
**time:2019-1-2 14:06:47** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. objUtil 枚举类型修复
|
||||
#
|
||||
#### version :1.3.1
|
||||
**time:2019-1-2 14:06:47** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. objUtil 增加类字段(驼峰)转换成下划线
|
||||
#
|
||||
#### version :1.3.0
|
||||
**time:2018-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
|
||||
**time:2018-12-29 14:51:33** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 获取RSA密钥增加以输入流的形式获取密钥
|
||||
|
||||
#
|
||||
#### version :1.2.6
|
||||
**time:2018-12-21 14:58:49** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. RSA 验签增加初始化方法
|
||||
|
||||
#
|
||||
#### version :1.2.8
|
||||
**time:2018-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
|
||||
**time:2018-12-21 14:58:49** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. RSA 验签增加初始化方法
|
||||
|
||||
#
|
||||
#### version :1.2.7
|
||||
**time:2018-12-24 15:31:01** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. FileUtil增加base64转File `base64ToFile()`
|
||||
|
||||
#
|
||||
#### version :1.2.6
|
||||
**time:2018-12-21 14:58:49** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. RSA 验签增加初始化方法
|
||||
|
||||
#
|
||||
#### version :1.2.5
|
||||
**time:2018-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
|
||||
**time:2018-11-27 14:46:04** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 工具类的优化
|
||||
>2.规范代码
|
||||
|
||||
#
|
||||
#### version :1.2.3
|
||||
**time:2018-11-23 16:45:42** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 修复RSA加密(签名)时选择的Base64(encodeBase64URLSafeString、encodeBase64String)区分
|
||||
#
|
||||
#### version :1.2.1
|
||||
**time:2018-11-9 15:05:06** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 优化resps
|
||||
#
|
||||
#### version :1.2.2
|
||||
**time:2018-11-20 20:20:12** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 优化RSA 加解密
|
||||
>1. 增加RSA 签名
|
||||
#
|
||||
#### version :1.2.1
|
||||
**time:2018-11-9 15:05:06** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 优化resps
|
||||
#
|
||||
#### version :1.2.0
|
||||
**time:2018-10-19 11:38:20** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 增加异步线程处理工具
|
||||
```$java
|
||||
SysUtil.threadRun(() -> {
|
||||
//异步执行代码块
|
||||
}
|
||||
```
|
||||
#
|
||||
|
||||
#### version :1.1.9
|
||||
**time:2018-9-23 11:57:36** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 优化工具类包名:不向下兼容,升级请修改
|
||||
>2. 升级JWT工具类:更改为单例模式,可配置参数
|
||||
#
|
||||
|
||||
#### version :1.1.8
|
||||
**time:2018-9-3 19:29:56** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 增肌图片处理工具类
|
||||
>2. 增肌3des工具类
|
||||
>3. 增肌RSA工具类
|
||||
>4. 优化其他工具类
|
||||
#
|
||||
#### version :1.1.7
|
||||
**time:2018-8-17 11:22:50** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 优化ApiVO
|
||||
#
|
||||
|
||||
#### version :1.1.6
|
||||
**time:2018-7-7 11:32:56** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. maven仓库更新
|
||||
#
|
||||
|
||||
#### version :1.1.5
|
||||
**time:2018-6-19 22:16:34** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 优化ApiVO
|
||||
|
||||
#
|
||||
#### version :1.1.4
|
||||
**time:2018-6-14 22:27:59** <br/>
|
||||
**branch:** master <br/>
|
||||
**update:** <br/>
|
||||
>1. 统一编码:UTF-8
|
||||
|
||||
#
|
||||
#### version :1.1.3
|
||||
**time:2018年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
569
pom.xml
@@ -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> <!– 进行延签 –>-->
|
||||
<!--<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>-->
|
||||
<!-- <!– 是否打出可执行的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> -->
|
||||
<!-- <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>
|
||||
21
src/main/java/com/yexuejc/base/annotation/CsvHeader.java
Normal file
21
src/main/java/com/yexuejc/base/annotation/CsvHeader.java
Normal 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();
|
||||
}
|
||||
51
src/main/java/com/yexuejc/base/annotation/ToUeProperty.java
Normal file
51
src/main/java/com/yexuejc/base/annotation/ToUeProperty.java
Normal 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;
|
||||
|
||||
}
|
||||
173
src/main/java/com/yexuejc/base/encrypt/AES.java
Normal file
173
src/main/java/com/yexuejc/base/encrypt/AES.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
90
src/main/java/com/yexuejc/base/pojo/CreateZipFileBean.java
Normal file
90
src/main/java/com/yexuejc/base/pojo/CreateZipFileBean.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
85
src/main/java/com/yexuejc/base/pojo/ReadFileBean.java
Normal file
85
src/main/java/com/yexuejc/base/pojo/ReadFileBean.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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)));
|
||||
|
||||
}*/
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
// }
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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 "";
|
||||
}
|
||||
65
src/main/java/com/yexuejc/base/util/ZipUtil.java
Normal file
65
src/main/java/com/yexuejc/base/util/ZipUtil.java
Normal 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)
|
||||
57
src/test/java/com/yexuejc/base/util/JsonUtilTest.java
Normal file
57
src/test/java/com/yexuejc/base/util/JsonUtilTest.java
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
156
src/test/java/com/yexuejc/base/util/ObjUtilTest.java
Normal file
156
src/test/java/com/yexuejc/base/util/ObjUtilTest.java
Normal 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);
|
||||
// }
|
||||
}
|
||||
Reference in New Issue
Block a user