2 Commits

Author SHA1 Message Date
75f7aaeb77 Merge branch 'master' into develop 2019-01-06 18:34:40 +08:00
a7132e9b5b Merge pull request #1 from yexuejc/master
1.1.7
2018-08-17 11:47:09 +08:00
16 changed files with 743 additions and 1271 deletions

134
README.md
View File

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

484
UPDATE.md
View File

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

553
pom.xml
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -10,7 +10,6 @@ import com.fasterxml.jackson.databind.type.MapType;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.Map; import java.util.Map;
import java.util.TimeZone;
import java.util.logging.Logger; import java.util.logging.Logger;
/** /**
@@ -47,26 +46,9 @@ public class JsonUtil {
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//设置一下时区,可以和程序同步避免时区问题
objectMapper.setTimeZone(TimeZone.getDefault());
objectMapper.setDateFormat(DateUtil.DATE_TIME_FORMAT); objectMapper.setDateFormat(DateUtil.DATE_TIME_FORMAT);
} }
//TODO 待优化
public static void initSnakeCase() {
//驼峰下划线互转
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
}
/**
* 这个设置不能改变JsonUtil自带的objectMapper设置只能修改传入objMapper的设置
* @param objMapper
*/
public static void initSnakeCase(ObjectMapper objMapper) {
//驼峰下划线互转
objMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
}
/** /**
* 每调用一次生成一个全新的ObjectMapper供特殊场景使用与通用ObjectMapper没有关系 * 每调用一次生成一个全新的ObjectMapper供特殊场景使用与通用ObjectMapper没有关系
* *
@@ -78,15 +60,6 @@ public class JsonUtil {
return objectMapper; return objectMapper;
} }
/**
* 返回 ObjectMapper对象供外部设置特定参数
*
* @return
*/
public static ObjectMapper getObjectMapper() {
return objectMapper;
}
/** /**
* 将json转换为某个类 * 将json转换为某个类
* *
@@ -119,6 +92,7 @@ public class JsonUtil {
*/ */
public static <T> T json2Obj(String json, Class<T> cls) { public static <T> T json2Obj(String json, Class<T> cls) {
T pojo = null; T pojo = null;
try { try {
pojo = objectMapper.readValue(json, cls); pojo = objectMapper.readValue(json, cls);
} catch (JsonParseException e) { } catch (JsonParseException e) {
@@ -127,13 +101,12 @@ public class JsonUtil {
log.warning("json to Object JsonMappingException.\n" + e.getMessage()); log.warning("json to Object JsonMappingException.\n" + e.getMessage());
} catch (IOException e) { } catch (IOException e) {
log.warning("json to Object IOException.\n" + e.getMessage()); log.warning("json to Object IOException.\n" + e.getMessage());
} catch (Exception e) {
e.printStackTrace();
} }
return pojo; return pojo;
} }
/** /**
* Json字符串转换为Java对象 * Json字符串转换为Java对象
* *
@@ -247,20 +220,4 @@ public class JsonUtil {
} }
return json; return json;
} }
/**
* 格式化输出
*
* @param obj 需要输出对象
* @return 格式化后的字符串
*/
public static String formatPrinter(Object obj) {
String json = null;
try {
json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
} catch (JsonProcessingException e) {
log.warning("json to Object JsonProcessingException.\n" + e.getMessage());
}
return json;
}
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,154 +0,0 @@
package com.yexuejc.base.util;
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);
// }
}