初始化
commit
949a792222
|
@ -0,0 +1,46 @@
|
||||||
|
######################################################################
|
||||||
|
# Build Tools
|
||||||
|
|
||||||
|
.gradle
|
||||||
|
/build/
|
||||||
|
!gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
target/
|
||||||
|
!.mvn/wrapper/maven-wrapper.jar
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# IDE
|
||||||
|
|
||||||
|
### STS ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
|
||||||
|
### JRebel ###
|
||||||
|
rebel.xml
|
||||||
|
### NetBeans ###
|
||||||
|
nbproject/private/
|
||||||
|
build/*
|
||||||
|
nbbuild/
|
||||||
|
dist/
|
||||||
|
nbdist/
|
||||||
|
.nb-gradle/
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Others
|
||||||
|
*.log
|
||||||
|
*.xml.versionsBackup
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
!*/build/*.java
|
||||||
|
!*/build/*.html
|
||||||
|
!*/build/*.xml
|
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2020 若依
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
|
@ -0,0 +1,26 @@
|
||||||
|
## 系统模块
|
||||||
|
|
||||||
|
~~~
|
||||||
|
com.zhn
|
||||||
|
├── zhn-ui // 前端框架 [80]
|
||||||
|
├── zhn-gateway // 网关模块 [8080]
|
||||||
|
├── zhn-auth // 认证中心 [9200]
|
||||||
|
├── zhn-common // 通用模块
|
||||||
|
│ └── zhn-common-core // 核心模块
|
||||||
|
│ └── zhn-common-datascope // 权限范围
|
||||||
|
│ └── zhn-common-datasource // 多数据源
|
||||||
|
│ └── zhn-common-log // 日志记录
|
||||||
|
│ └── zhn-common-redis // 缓存服务
|
||||||
|
│ └── zhn-common-seata // 分布式事务
|
||||||
|
│ └── zhn-common-security // 安全模块
|
||||||
|
│ └── zhn-common-swagger // 系统接口
|
||||||
|
│ └── zhn-common-system // 系统基础
|
||||||
|
├── zhn-modules // 业务模块
|
||||||
|
│ └── zhn-system // 系统模块 [9201]
|
||||||
|
│ └── zhn-gen // 代码生成 [9202]
|
||||||
|
│ └── zhn-job // 定时任务 [9203]
|
||||||
|
│ └── zhn-file // 文件服务 [9300]
|
||||||
|
├── zhn-visual // 图形化管理模块
|
||||||
|
│ └── zhn-visual-monitor // 监控中心 [9100]
|
||||||
|
├──pom.xml // 公共依赖
|
||||||
|
~~~
|
|
@ -0,0 +1,12 @@
|
||||||
|
@echo off
|
||||||
|
echo.
|
||||||
|
echo [信息] 清理工程target生成路径。
|
||||||
|
echo.
|
||||||
|
|
||||||
|
%~d0
|
||||||
|
cd %~dp0
|
||||||
|
|
||||||
|
cd ..
|
||||||
|
call mvn clean
|
||||||
|
|
||||||
|
pause
|
|
@ -0,0 +1,12 @@
|
||||||
|
@echo off
|
||||||
|
echo.
|
||||||
|
echo [信息] 打包Web工程,生成war/jar包文件。
|
||||||
|
echo.
|
||||||
|
|
||||||
|
%~d0
|
||||||
|
cd %~dp0
|
||||||
|
|
||||||
|
cd ..
|
||||||
|
call mvn clean package -Dmaven.test.skip=true
|
||||||
|
|
||||||
|
pause
|
|
@ -0,0 +1,14 @@
|
||||||
|
@echo off
|
||||||
|
echo.
|
||||||
|
echo [<5B><>Ϣ] ʹ<><CAB9>Jar<61><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Auth<74><68><EFBFBD>̡<EFBFBD>
|
||||||
|
echo.
|
||||||
|
|
||||||
|
cd %~dp0
|
||||||
|
cd ../zhn-auth/target
|
||||||
|
|
||||||
|
set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
|
||||||
|
|
||||||
|
java -Dfile.encoding=utf-8 %JAVA_OPTS% -jar zhn-auth.jar
|
||||||
|
|
||||||
|
cd bin
|
||||||
|
pause
|
|
@ -0,0 +1,14 @@
|
||||||
|
@echo off
|
||||||
|
echo.
|
||||||
|
echo [<5B><>Ϣ] ʹ<><CAB9>Jar<61><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Gateway<61><79><EFBFBD>̡<EFBFBD>
|
||||||
|
echo.
|
||||||
|
|
||||||
|
cd %~dp0
|
||||||
|
cd ../zhn-gateway/target
|
||||||
|
|
||||||
|
set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
|
||||||
|
|
||||||
|
java -Dfile.encoding=utf-8 %JAVA_OPTS% -jar zhn-gateway.jar
|
||||||
|
|
||||||
|
cd bin
|
||||||
|
pause
|
|
@ -0,0 +1,14 @@
|
||||||
|
@echo off
|
||||||
|
echo.
|
||||||
|
echo [<5B><>Ϣ] ʹ<><CAB9>Jar<61><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Modules-File<6C><65><EFBFBD>̡<EFBFBD>
|
||||||
|
echo.
|
||||||
|
|
||||||
|
cd %~dp0
|
||||||
|
cd ../zhn-modules/zhn-file/target
|
||||||
|
|
||||||
|
set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
|
||||||
|
|
||||||
|
java -Dfile.encoding=utf-8 %JAVA_OPTS% -jar zhn-modules-file.jar
|
||||||
|
|
||||||
|
cd bin
|
||||||
|
pause
|
|
@ -0,0 +1,14 @@
|
||||||
|
@echo off
|
||||||
|
echo.
|
||||||
|
echo [<5B><>Ϣ] ʹ<><CAB9>Jar<61><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Modules-Gen<65><6E><EFBFBD>̡<EFBFBD>
|
||||||
|
echo.
|
||||||
|
|
||||||
|
cd %~dp0
|
||||||
|
cd ../zhn-modules/zhn-gen/target
|
||||||
|
|
||||||
|
set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
|
||||||
|
|
||||||
|
java -Dfile.encoding=utf-8 %JAVA_OPTS% -jar zhn-modules-gen.jar
|
||||||
|
|
||||||
|
cd bin
|
||||||
|
pause
|
|
@ -0,0 +1,14 @@
|
||||||
|
@echo off
|
||||||
|
echo.
|
||||||
|
echo [<5B><>Ϣ] ʹ<><CAB9>Jar<61><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Modules-Job<6F><62><EFBFBD>̡<EFBFBD>
|
||||||
|
echo.
|
||||||
|
|
||||||
|
cd %~dp0
|
||||||
|
cd ../zhn-modules/zhn-job/target
|
||||||
|
|
||||||
|
set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
|
||||||
|
|
||||||
|
java -Dfile.encoding=utf-8 %JAVA_OPTS% -jar zhn-modules-job.jar
|
||||||
|
|
||||||
|
cd bin
|
||||||
|
pause
|
|
@ -0,0 +1,14 @@
|
||||||
|
@echo off
|
||||||
|
echo.
|
||||||
|
echo [<5B><>Ϣ] ʹ<><CAB9>Jar<61><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Modules-System<65><6D><EFBFBD>̡<EFBFBD>
|
||||||
|
echo.
|
||||||
|
|
||||||
|
cd %~dp0
|
||||||
|
cd ../zhn-modules/zhn-system/target
|
||||||
|
|
||||||
|
set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
|
||||||
|
|
||||||
|
java -Dfile.encoding=utf-8 %JAVA_OPTS% -jar zhn-modules-system.jar
|
||||||
|
|
||||||
|
cd bin
|
||||||
|
pause
|
|
@ -0,0 +1,14 @@
|
||||||
|
@echo off
|
||||||
|
echo.
|
||||||
|
echo [<5B><>Ϣ] ʹ<><CAB9>Jar<61><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Monitor<6F><72><EFBFBD>̡<EFBFBD>
|
||||||
|
echo.
|
||||||
|
|
||||||
|
cd %~dp0
|
||||||
|
cd ../zhn-visual/zhn-monitor/target
|
||||||
|
|
||||||
|
set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
|
||||||
|
|
||||||
|
java -Dfile.encoding=utf-8 %JAVA_OPTS% -jar zhn-visual-monitor.jar
|
||||||
|
|
||||||
|
cd bin
|
||||||
|
pause
|
|
@ -0,0 +1,41 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# 复制项目的文件到对应docker路径,便于一键生成镜像。
|
||||||
|
usage() {
|
||||||
|
echo "Usage: sh copy.sh"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# copy sql
|
||||||
|
echo "begin copy sql "
|
||||||
|
cp ../sql/ry_20230706.sql ./mysql/db
|
||||||
|
cp ../sql/ry_config_20220929.sql ./mysql/db
|
||||||
|
|
||||||
|
# copy html
|
||||||
|
echo "begin copy html "
|
||||||
|
cp -r ../zhn-ui/dist/** ./nginx/html/dist
|
||||||
|
|
||||||
|
|
||||||
|
# copy jar
|
||||||
|
echo "begin copy zhn-gateway "
|
||||||
|
cp ../zhn-gateway/target/zhn-gateway.jar ./zhn/gateway/jar
|
||||||
|
|
||||||
|
echo "begin copy zhn-auth "
|
||||||
|
cp ../zhn-auth/target/zhn-auth.jar ./zhn/auth/jar
|
||||||
|
|
||||||
|
echo "begin copy zhn-visual "
|
||||||
|
cp ../zhn-visual/zhn-monitor/target/zhn-visual-monitor.jar ./zhn/visual/monitor/jar
|
||||||
|
|
||||||
|
echo "begin copy zhn-modules-system "
|
||||||
|
cp ../zhn-modules/zhn-system/target/zhn-modules-system.jar ./zhn/modules/system/jar
|
||||||
|
|
||||||
|
echo "begin copy zhn-modules-file "
|
||||||
|
cp ../zhn-modules/zhn-file/target/zhn-modules-file.jar ./zhn/modules/file/jar
|
||||||
|
|
||||||
|
echo "begin copy zhn-modules-job "
|
||||||
|
cp ../zhn-modules/zhn-job/target/zhn-modules-job.jar ./zhn/modules/job/jar
|
||||||
|
|
||||||
|
echo "begin copy zhn-modules-gen "
|
||||||
|
cp ../zhn-modules/zhn-gen/target/zhn-modules-gen.jar ./zhn/modules/gen/jar
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# 使用说明,用来提示输入参数
|
||||||
|
usage() {
|
||||||
|
echo "Usage: sh 执行脚本.sh [port|base|modules|stop|rm]"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# 开启所需端口
|
||||||
|
port(){
|
||||||
|
firewall-cmd --add-port=80/tcp --permanent
|
||||||
|
firewall-cmd --add-port=8080/tcp --permanent
|
||||||
|
firewall-cmd --add-port=8848/tcp --permanent
|
||||||
|
firewall-cmd --add-port=9848/tcp --permanent
|
||||||
|
firewall-cmd --add-port=9849/tcp --permanent
|
||||||
|
firewall-cmd --add-port=6379/tcp --permanent
|
||||||
|
firewall-cmd --add-port=3306/tcp --permanent
|
||||||
|
firewall-cmd --add-port=9100/tcp --permanent
|
||||||
|
firewall-cmd --add-port=9200/tcp --permanent
|
||||||
|
firewall-cmd --add-port=9201/tcp --permanent
|
||||||
|
firewall-cmd --add-port=9202/tcp --permanent
|
||||||
|
firewall-cmd --add-port=9203/tcp --permanent
|
||||||
|
firewall-cmd --add-port=9300/tcp --permanent
|
||||||
|
service firewalld restart
|
||||||
|
}
|
||||||
|
|
||||||
|
# 启动基础环境(必须)
|
||||||
|
base(){
|
||||||
|
docker-compose up -d zhn-mysql zhn-redis zhn-nacos
|
||||||
|
}
|
||||||
|
|
||||||
|
# 启动程序模块(必须)
|
||||||
|
modules(){
|
||||||
|
docker-compose up -d zhn-nginx zhn-gateway zhn-auth zhn-modules-system
|
||||||
|
}
|
||||||
|
|
||||||
|
# 关闭所有环境/模块
|
||||||
|
stop(){
|
||||||
|
docker-compose stop
|
||||||
|
}
|
||||||
|
|
||||||
|
# 删除所有环境/模块
|
||||||
|
rm(){
|
||||||
|
docker-compose rm
|
||||||
|
}
|
||||||
|
|
||||||
|
# 根据输入参数,选择执行对应方法,不输入则执行使用说明
|
||||||
|
case "$1" in
|
||||||
|
"port")
|
||||||
|
port
|
||||||
|
;;
|
||||||
|
"base")
|
||||||
|
base
|
||||||
|
;;
|
||||||
|
"modules")
|
||||||
|
modules
|
||||||
|
;;
|
||||||
|
"stop")
|
||||||
|
stop
|
||||||
|
;;
|
||||||
|
"rm")
|
||||||
|
rm
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
|
@ -0,0 +1,140 @@
|
||||||
|
version: '3.8'
|
||||||
|
services:
|
||||||
|
zhn-nacos:
|
||||||
|
container_name: zhn-nacos
|
||||||
|
image: nacos/nacos-server
|
||||||
|
build:
|
||||||
|
context: ./nacos
|
||||||
|
environment:
|
||||||
|
- MODE=standalone
|
||||||
|
volumes:
|
||||||
|
- ./nacos/logs/:/home/nacos/logs
|
||||||
|
- ./nacos/conf/application.properties:/home/nacos/conf/application.properties
|
||||||
|
ports:
|
||||||
|
- "8848:8848"
|
||||||
|
- "9848:9848"
|
||||||
|
- "9849:9849"
|
||||||
|
depends_on:
|
||||||
|
- zhn-mysql
|
||||||
|
zhn-mysql:
|
||||||
|
container_name: zhn-mysql
|
||||||
|
image: mysql:5.7
|
||||||
|
build:
|
||||||
|
context: ./mysql
|
||||||
|
ports:
|
||||||
|
- "3306:3306"
|
||||||
|
volumes:
|
||||||
|
- ./mysql/conf:/etc/mysql/conf.d
|
||||||
|
- ./mysql/logs:/logs
|
||||||
|
- ./mysql/data:/var/lib/mysql
|
||||||
|
command: [
|
||||||
|
'mysqld',
|
||||||
|
'--innodb-buffer-pool-size=80M',
|
||||||
|
'--character-set-server=utf8mb4',
|
||||||
|
'--collation-server=utf8mb4_unicode_ci',
|
||||||
|
'--default-time-zone=+8:00',
|
||||||
|
'--lower-case-table-names=1'
|
||||||
|
]
|
||||||
|
environment:
|
||||||
|
MYSQL_DATABASE: 'ry-cloud'
|
||||||
|
MYSQL_ROOT_PASSWORD: password
|
||||||
|
zhn-redis:
|
||||||
|
container_name: zhn-redis
|
||||||
|
image: redis
|
||||||
|
build:
|
||||||
|
context: ./redis
|
||||||
|
ports:
|
||||||
|
- "6379:6379"
|
||||||
|
volumes:
|
||||||
|
- ./redis/conf/redis.conf:/home/zhn/redis/redis.conf
|
||||||
|
- ./redis/data:/data
|
||||||
|
command: redis-server /home/zhn/redis/redis.conf
|
||||||
|
zhn-nginx:
|
||||||
|
container_name: zhn-nginx
|
||||||
|
image: nginx
|
||||||
|
build:
|
||||||
|
context: ./nginx
|
||||||
|
ports:
|
||||||
|
- "80:80"
|
||||||
|
volumes:
|
||||||
|
- ./nginx/html/dist:/home/zhn/projects/zhn-ui
|
||||||
|
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
|
||||||
|
- ./nginx/logs:/var/log/nginx
|
||||||
|
- ./nginx/conf.d:/etc/nginx/conf.d
|
||||||
|
depends_on:
|
||||||
|
- zhn-gateway
|
||||||
|
links:
|
||||||
|
- zhn-gateway
|
||||||
|
zhn-gateway:
|
||||||
|
container_name: zhn-gateway
|
||||||
|
build:
|
||||||
|
context: ./zhn/gateway
|
||||||
|
dockerfile: dockerfile
|
||||||
|
ports:
|
||||||
|
- "8080:8080"
|
||||||
|
depends_on:
|
||||||
|
- zhn-redis
|
||||||
|
links:
|
||||||
|
- zhn-redis
|
||||||
|
zhn-auth:
|
||||||
|
container_name: zhn-auth
|
||||||
|
build:
|
||||||
|
context: ./zhn/auth
|
||||||
|
dockerfile: dockerfile
|
||||||
|
ports:
|
||||||
|
- "9200:9200"
|
||||||
|
depends_on:
|
||||||
|
- zhn-redis
|
||||||
|
links:
|
||||||
|
- zhn-redis
|
||||||
|
zhn-modules-system:
|
||||||
|
container_name: zhn-modules-system
|
||||||
|
build:
|
||||||
|
context: ./zhn/modules/system
|
||||||
|
dockerfile: dockerfile
|
||||||
|
ports:
|
||||||
|
- "9201:9201"
|
||||||
|
depends_on:
|
||||||
|
- zhn-redis
|
||||||
|
- zhn-mysql
|
||||||
|
links:
|
||||||
|
- zhn-redis
|
||||||
|
- zhn-mysql
|
||||||
|
zhn-modules-gen:
|
||||||
|
container_name: zhn-modules-gen
|
||||||
|
build:
|
||||||
|
context: ./zhn/modules/gen
|
||||||
|
dockerfile: dockerfile
|
||||||
|
ports:
|
||||||
|
- "9202:9202"
|
||||||
|
depends_on:
|
||||||
|
- zhn-mysql
|
||||||
|
links:
|
||||||
|
- zhn-mysql
|
||||||
|
zhn-modules-job:
|
||||||
|
container_name: zhn-modules-job
|
||||||
|
build:
|
||||||
|
context: ./zhn/modules/job
|
||||||
|
dockerfile: dockerfile
|
||||||
|
ports:
|
||||||
|
- "9203:9203"
|
||||||
|
depends_on:
|
||||||
|
- zhn-mysql
|
||||||
|
links:
|
||||||
|
- zhn-mysql
|
||||||
|
zhn-modules-file:
|
||||||
|
container_name: zhn-modules-file
|
||||||
|
build:
|
||||||
|
context: ./zhn/modules/file
|
||||||
|
dockerfile: dockerfile
|
||||||
|
ports:
|
||||||
|
- "9300:9300"
|
||||||
|
volumes:
|
||||||
|
- ./zhn/uploadPath:/home/zhn/uploadPath
|
||||||
|
zhn-visual-monitor:
|
||||||
|
container_name: zhn-visual-monitor
|
||||||
|
build:
|
||||||
|
context: ./zhn/visual/monitor
|
||||||
|
dockerfile: dockerfile
|
||||||
|
ports:
|
||||||
|
- "9100:9100"
|
|
@ -0,0 +1,15 @@
|
||||||
|
# 基础镜像
|
||||||
|
FROM openjdk:8-jre
|
||||||
|
# author
|
||||||
|
MAINTAINER zhn
|
||||||
|
|
||||||
|
# 挂载目录
|
||||||
|
VOLUME /home/zhn
|
||||||
|
# 创建目录
|
||||||
|
RUN mkdir -p /home/zhn
|
||||||
|
# 指定路径
|
||||||
|
WORKDIR /home/zhn
|
||||||
|
# 复制jar文件到路径
|
||||||
|
COPY ./jar/zhn-auth.jar /home/zhn/zhn-auth.jar
|
||||||
|
# 启动认证服务
|
||||||
|
ENTRYPOINT ["java","-jar","zhn-auth.jar"]
|
|
@ -0,0 +1 @@
|
||||||
|
存放认证中心打包好的jar文件,用于docker启动应用。
|
|
@ -0,0 +1,15 @@
|
||||||
|
# 基础镜像
|
||||||
|
FROM openjdk:8-jre
|
||||||
|
# author
|
||||||
|
MAINTAINER zhn
|
||||||
|
|
||||||
|
# 挂载目录
|
||||||
|
VOLUME /home/zhn
|
||||||
|
# 创建目录
|
||||||
|
RUN mkdir -p /home/zhn
|
||||||
|
# 指定路径
|
||||||
|
WORKDIR /home/zhn
|
||||||
|
# 复制jar文件到路径
|
||||||
|
COPY ./jar/zhn-gateway.jar /home/zhn/zhn-gateway.jar
|
||||||
|
# 启动网关服务
|
||||||
|
ENTRYPOINT ["java","-jar","zhn-gateway.jar"]
|
|
@ -0,0 +1 @@
|
||||||
|
存放网关模块打包好的jar文件,用于docker启动应用。
|
|
@ -0,0 +1,15 @@
|
||||||
|
# 基础镜像
|
||||||
|
FROM openjdk:8-jre
|
||||||
|
# author
|
||||||
|
MAINTAINER zhn
|
||||||
|
|
||||||
|
# 挂载目录
|
||||||
|
VOLUME /home/zhn
|
||||||
|
# 创建目录
|
||||||
|
RUN mkdir -p /home/zhn
|
||||||
|
# 指定路径
|
||||||
|
WORKDIR /home/zhn
|
||||||
|
# 复制jar文件到路径
|
||||||
|
COPY ./jar/zhn-modules-file.jar /home/zhn/zhn-modules-file.jar
|
||||||
|
# 启动文件服务
|
||||||
|
ENTRYPOINT ["java","-jar","zhn-modules-file.jar"]
|
|
@ -0,0 +1 @@
|
||||||
|
存放文件服务打包好的jar文件,用于docker启动应用。
|
|
@ -0,0 +1,15 @@
|
||||||
|
# 基础镜像
|
||||||
|
FROM openjdk:8-jre
|
||||||
|
# author
|
||||||
|
MAINTAINER zhn
|
||||||
|
|
||||||
|
# 挂载目录
|
||||||
|
VOLUME /home/zhn
|
||||||
|
# 创建目录
|
||||||
|
RUN mkdir -p /home/zhn
|
||||||
|
# 指定路径
|
||||||
|
WORKDIR /home/zhn
|
||||||
|
# 复制jar文件到路径
|
||||||
|
COPY ./jar/zhn-modules-gen.jar /home/zhn/zhn-modules-gen.jar
|
||||||
|
# 启动代码生成服务
|
||||||
|
ENTRYPOINT ["java","-jar","zhn-modules-gen.jar"]
|
|
@ -0,0 +1 @@
|
||||||
|
存放代码生成打包好的jar文件,用于docker启动应用。
|
|
@ -0,0 +1,15 @@
|
||||||
|
# 基础镜像
|
||||||
|
FROM openjdk:8-jre
|
||||||
|
# author
|
||||||
|
MAINTAINER zhn
|
||||||
|
|
||||||
|
# 挂载目录
|
||||||
|
VOLUME /home/zhn
|
||||||
|
# 创建目录
|
||||||
|
RUN mkdir -p /home/zhn
|
||||||
|
# 指定路径
|
||||||
|
WORKDIR /home/zhn
|
||||||
|
# 复制jar文件到路径
|
||||||
|
COPY ./jar/zhn-modules-job.jar /home/zhn/zhn-modules-job.jar
|
||||||
|
# 启动定时任务服务
|
||||||
|
ENTRYPOINT ["java","-jar","zhn-modules-job.jar"]
|
|
@ -0,0 +1 @@
|
||||||
|
存放定时任务打包好的jar文件,用于docker启动应用。
|
|
@ -0,0 +1,15 @@
|
||||||
|
# 基础镜像
|
||||||
|
FROM openjdk:8-jre
|
||||||
|
# author
|
||||||
|
MAINTAINER zhn
|
||||||
|
|
||||||
|
# 挂载目录
|
||||||
|
VOLUME /home/zhn
|
||||||
|
# 创建目录
|
||||||
|
RUN mkdir -p /home/zhn
|
||||||
|
# 指定路径
|
||||||
|
WORKDIR /home/zhn
|
||||||
|
# 复制jar文件到路径
|
||||||
|
COPY ./jar/zhn-modules-system.jar /home/zhn/zhn-modules-system.jar
|
||||||
|
# 启动系统服务
|
||||||
|
ENTRYPOINT ["java","-jar","zhn-modules-system.jar"]
|
|
@ -0,0 +1 @@
|
||||||
|
存放系统模块打包好的jar文件,用于docker启动应用。
|
|
@ -0,0 +1,15 @@
|
||||||
|
# 基础镜像
|
||||||
|
FROM openjdk:8-jre
|
||||||
|
# author
|
||||||
|
MAINTAINER zhn
|
||||||
|
|
||||||
|
# 挂载目录
|
||||||
|
VOLUME /home/zhn
|
||||||
|
# 创建目录
|
||||||
|
RUN mkdir -p /home/zhn
|
||||||
|
# 指定路径
|
||||||
|
WORKDIR /home/zhn
|
||||||
|
# 复制jar文件到路径
|
||||||
|
COPY ./jar/zhn-visual-monitor.jar /home/zhn/zhn-visual-monitor.jar
|
||||||
|
# 启动系统服务
|
||||||
|
ENTRYPOINT ["java","-jar","zhn-visual-monitor.jar"]
|
|
@ -0,0 +1 @@
|
||||||
|
存放监控中心打包好的jar文件,用于docker启动应用。
|
|
@ -0,0 +1 @@
|
||||||
|
存放sql目录下的所有脚本,用于docker自动执行。
|
|
@ -0,0 +1,7 @@
|
||||||
|
# 基础镜像
|
||||||
|
FROM mysql:5.7
|
||||||
|
# author
|
||||||
|
MAINTAINER zhn
|
||||||
|
|
||||||
|
# 执行sql脚本
|
||||||
|
ADD ./db/*.sql /docker-entrypoint-initdb.d/
|
|
@ -0,0 +1,24 @@
|
||||||
|
spring.datasource.platform=mysql
|
||||||
|
db.num=1
|
||||||
|
db.url.0=jdbc:mysql://zhn-mysql:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
|
||||||
|
db.user=root
|
||||||
|
db.password=password
|
||||||
|
nacos.naming.empty-service.auto-clean=true
|
||||||
|
nacos.naming.empty-service.clean.initial-delay-ms=50000
|
||||||
|
nacos.naming.empty-service.clean.period-time-ms=30000
|
||||||
|
management.endpoints.web.exposure.include=*
|
||||||
|
management.metrics.export.elastic.enabled=false
|
||||||
|
management.metrics.export.influx.enabled=false
|
||||||
|
server.tomcat.accesslog.enabled=true
|
||||||
|
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
|
||||||
|
server.tomcat.basedir=/home/zhn/nacos/tomcat/logs
|
||||||
|
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
|
||||||
|
nacos.core.auth.system.type=nacos
|
||||||
|
nacos.core.auth.enabled=false
|
||||||
|
nacos.core.auth.default.token.expire.seconds=18000
|
||||||
|
nacos.core.auth.default.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
|
||||||
|
nacos.core.auth.caching.enabled=true
|
||||||
|
nacos.core.auth.enable.userAgentAuthWhite=false
|
||||||
|
nacos.core.auth.server.identity.key=serverIdentity
|
||||||
|
nacos.core.auth.server.identity.value=security
|
||||||
|
nacos.istio.mcp.server.enabled=false
|
|
@ -0,0 +1,7 @@
|
||||||
|
# 基础镜像
|
||||||
|
FROM nacos/nacos-server
|
||||||
|
# author
|
||||||
|
MAINTAINER zhn
|
||||||
|
|
||||||
|
# 复制conf文件到路径
|
||||||
|
COPY ./conf/application.properties /home/nacos/conf/application.properties
|
|
@ -0,0 +1,41 @@
|
||||||
|
worker_processes 1;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
include mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
sendfile on;
|
||||||
|
keepalive_timeout 65;
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name localhost;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
root /home/zhn/projects/zhn-ui;
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
index index.html index.htm;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /prod-api/{
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header REMOTE-HOST $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_pass http://zhn-gateway:8080/;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 避免actuator暴露
|
||||||
|
if ($request_uri ~ "/actuator") {
|
||||||
|
return 403;
|
||||||
|
}
|
||||||
|
|
||||||
|
error_page 500 502 503 504 /50x.html;
|
||||||
|
location = /50x.html {
|
||||||
|
root html;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
# 基础镜像
|
||||||
|
FROM nginx
|
||||||
|
# author
|
||||||
|
MAINTAINER zhn
|
||||||
|
|
||||||
|
# 挂载目录
|
||||||
|
VOLUME /home/zhn/projects/zhn-ui
|
||||||
|
# 创建目录
|
||||||
|
RUN mkdir -p /home/zhn/projects/zhn-ui
|
||||||
|
# 指定路径
|
||||||
|
WORKDIR /home/zhn/projects/zhn-ui
|
||||||
|
# 复制conf文件到路径
|
||||||
|
COPY ./conf/nginx.conf /etc/nginx/nginx.conf
|
||||||
|
# 复制html文件到路径
|
||||||
|
COPY ./html/dist /home/zhn/projects/zhn-ui
|
|
@ -0,0 +1 @@
|
||||||
|
# requirepass 123456
|
|
@ -0,0 +1,13 @@
|
||||||
|
# 基础镜像
|
||||||
|
FROM redis
|
||||||
|
# author
|
||||||
|
MAINTAINER zhn
|
||||||
|
|
||||||
|
# 挂载目录
|
||||||
|
VOLUME /home/zhn/redis
|
||||||
|
# 创建目录
|
||||||
|
RUN mkdir -p /home/zhn/redis
|
||||||
|
# 指定路径
|
||||||
|
WORKDIR /home/zhn/redis
|
||||||
|
# 复制conf文件到路径
|
||||||
|
COPY ./conf/redis.conf /home/zhn/redis/redis.conf
|
|
@ -0,0 +1,284 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
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>com.zhn</groupId>
|
||||||
|
<artifactId>zhn</artifactId>
|
||||||
|
<version>3.6.3</version>
|
||||||
|
|
||||||
|
<name>zhn</name>
|
||||||
|
<url>http://www.zhn.vip</url>
|
||||||
|
<description>沭云微服务系统</description>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<zhn.version>3.6.3</zhn.version>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
<java.version>17</java.version>
|
||||||
|
<spring-boot.version>2.7.13</spring-boot.version>
|
||||||
|
<spring-cloud.version>2021.0.8</spring-cloud.version>
|
||||||
|
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
|
||||||
|
<spring-boot-admin.version>2.7.10</spring-boot-admin.version>
|
||||||
|
<swagger.fox.version>3.0.0</swagger.fox.version>
|
||||||
|
<swagger.core.version>1.6.2</swagger.core.version>
|
||||||
|
<tobato.version>1.27.2</tobato.version>
|
||||||
|
<kaptcha.version>2.3.3</kaptcha.version>
|
||||||
|
<pagehelper.boot.version>1.4.7</pagehelper.boot.version>
|
||||||
|
<druid.version>1.2.16</druid.version>
|
||||||
|
<dynamic-ds.version>3.5.2</dynamic-ds.version>
|
||||||
|
<commons.io.version>2.13.0</commons.io.version>
|
||||||
|
<velocity.version>2.3</velocity.version>
|
||||||
|
<fastjson.version>2.0.41</fastjson.version>
|
||||||
|
<jjwt.version>0.9.1</jjwt.version>
|
||||||
|
<minio.version>8.2.2</minio.version>
|
||||||
|
<poi.version>4.1.2</poi.version>
|
||||||
|
<transmittable-thread-local.version>2.14.3</transmittable-thread-local.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<!-- 依赖声明 -->
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<!-- SpringCloud 微服务 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.cloud</groupId>
|
||||||
|
<artifactId>spring-cloud-dependencies</artifactId>
|
||||||
|
<version>${spring-cloud.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- SpringCloud Alibaba 微服务 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.cloud</groupId>
|
||||||
|
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
|
||||||
|
<version>${spring-cloud-alibaba.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- SpringBoot 依赖配置 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-dependencies</artifactId>
|
||||||
|
<version>${spring-boot.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- FastDFS 分布式文件系统 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.tobato</groupId>
|
||||||
|
<artifactId>fastdfs-client</artifactId>
|
||||||
|
<version>${tobato.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Swagger 依赖配置 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.swagger</groupId>
|
||||||
|
<artifactId>swagger-models</artifactId>
|
||||||
|
<version>${swagger.core.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.swagger</groupId>
|
||||||
|
<artifactId>swagger-annotations</artifactId>
|
||||||
|
<version>${swagger.core.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 验证码 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>pro.fessional</groupId>
|
||||||
|
<artifactId>kaptcha</artifactId>
|
||||||
|
<version>${kaptcha.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- pagehelper 分页插件 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.pagehelper</groupId>
|
||||||
|
<artifactId>pagehelper-spring-boot-starter</artifactId>
|
||||||
|
<version>${pagehelper.boot.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- io常用工具类 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-io</groupId>
|
||||||
|
<artifactId>commons-io</artifactId>
|
||||||
|
<version>${commons.io.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- excel工具 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.poi</groupId>
|
||||||
|
<artifactId>poi-ooxml</artifactId>
|
||||||
|
<version>${poi.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 代码生成使用模板 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.velocity</groupId>
|
||||||
|
<artifactId>velocity-engine-core</artifactId>
|
||||||
|
<version>${velocity.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- JSON 解析器和生成器 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.fastjson2</groupId>
|
||||||
|
<artifactId>fastjson2</artifactId>
|
||||||
|
<version>${fastjson.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- JWT -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.jsonwebtoken</groupId>
|
||||||
|
<artifactId>jjwt</artifactId>
|
||||||
|
<version>${jjwt.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 线程传递值 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>transmittable-thread-local</artifactId>
|
||||||
|
<version>${transmittable-thread-local.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 核心模块 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.zhn</groupId>
|
||||||
|
<artifactId>zhn-common-core</artifactId>
|
||||||
|
<version>${zhn.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 接口模块 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.zhn</groupId>
|
||||||
|
<artifactId>zhn-common-swagger</artifactId>
|
||||||
|
<version>${zhn.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 安全模块 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.zhn</groupId>
|
||||||
|
<artifactId>zhn-common-security</artifactId>
|
||||||
|
<version>${zhn.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 权限范围 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.zhn</groupId>
|
||||||
|
<artifactId>zhn-common-datascope</artifactId>
|
||||||
|
<version>${zhn.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 多数据源 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.zhn</groupId>
|
||||||
|
<artifactId>zhn-common-datasource</artifactId>
|
||||||
|
<version>${zhn.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 分布式事务 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.zhn</groupId>
|
||||||
|
<artifactId>zhn-common-seata</artifactId>
|
||||||
|
<version>${zhn.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 日志记录 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.zhn</groupId>
|
||||||
|
<artifactId>zhn-common-log</artifactId>
|
||||||
|
<version>${zhn.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 缓存服务 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.zhn</groupId>
|
||||||
|
<artifactId>zhn-common-redis</artifactId>
|
||||||
|
<version>${zhn.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 系统级别 插件 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.zhn</groupId>
|
||||||
|
<artifactId>zhn-common-system</artifactId>
|
||||||
|
<version>${zhn.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
|
<modules>
|
||||||
|
<module>zhn-auth</module>
|
||||||
|
<module>zhn-gateway</module>
|
||||||
|
<module>zhn-visual</module>
|
||||||
|
<module>zhn-modules</module>
|
||||||
|
<module>zhn-common</module>
|
||||||
|
</modules>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<!-- bootstrap 启动器 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.cloud</groupId>
|
||||||
|
<artifactId>spring-cloud-starter-bootstrap</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>${java.version}</source>
|
||||||
|
<target>${java.version}</target>
|
||||||
|
<encoding>${project.build.sourceEncoding}</encoding>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
<pluginManagement>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
<version>${spring-boot.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>repackage</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</pluginManagement>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>public</id>
|
||||||
|
<name>aliyun nexus</name>
|
||||||
|
<url>https://maven.aliyun.com/repository/public</url>
|
||||||
|
<releases>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
</releases>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
<pluginRepositories>
|
||||||
|
<pluginRepository>
|
||||||
|
<id>public</id>
|
||||||
|
<name>aliyun nexus</name>
|
||||||
|
<url>https://maven.aliyun.com/repository/public</url>
|
||||||
|
<releases>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
</releases>
|
||||||
|
<snapshots>
|
||||||
|
<enabled>false</enabled>
|
||||||
|
</snapshots>
|
||||||
|
</pluginRepository>
|
||||||
|
</pluginRepositories>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,174 @@
|
||||||
|
DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
|
||||||
|
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
|
||||||
|
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
|
||||||
|
DROP TABLE IF EXISTS QRTZ_LOCKS;
|
||||||
|
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
|
||||||
|
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
|
||||||
|
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
|
||||||
|
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
|
||||||
|
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
|
||||||
|
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
|
||||||
|
DROP TABLE IF EXISTS QRTZ_CALENDARS;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- 1、存储每一个已配置的 jobDetail 的详细信息
|
||||||
|
-- ----------------------------
|
||||||
|
create table QRTZ_JOB_DETAILS (
|
||||||
|
sched_name varchar(120) not null comment '调度名称',
|
||||||
|
job_name varchar(200) not null comment '任务名称',
|
||||||
|
job_group varchar(200) not null comment '任务组名',
|
||||||
|
description varchar(250) null comment '相关介绍',
|
||||||
|
job_class_name varchar(250) not null comment '执行任务类名称',
|
||||||
|
is_durable varchar(1) not null comment '是否持久化',
|
||||||
|
is_nonconcurrent varchar(1) not null comment '是否并发',
|
||||||
|
is_update_data varchar(1) not null comment '是否更新数据',
|
||||||
|
requests_recovery varchar(1) not null comment '是否接受恢复执行',
|
||||||
|
job_data blob null comment '存放持久化job对象',
|
||||||
|
primary key (sched_name, job_name, job_group)
|
||||||
|
) engine=innodb comment = '任务详细信息表';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- 2、 存储已配置的 Trigger 的信息
|
||||||
|
-- ----------------------------
|
||||||
|
create table QRTZ_TRIGGERS (
|
||||||
|
sched_name varchar(120) not null comment '调度名称',
|
||||||
|
trigger_name varchar(200) not null comment '触发器的名字',
|
||||||
|
trigger_group varchar(200) not null comment '触发器所属组的名字',
|
||||||
|
job_name varchar(200) not null comment 'qrtz_job_details表job_name的外键',
|
||||||
|
job_group varchar(200) not null comment 'qrtz_job_details表job_group的外键',
|
||||||
|
description varchar(250) null comment '相关介绍',
|
||||||
|
next_fire_time bigint(13) null comment '上一次触发时间(毫秒)',
|
||||||
|
prev_fire_time bigint(13) null comment '下一次触发时间(默认为-1表示不触发)',
|
||||||
|
priority integer null comment '优先级',
|
||||||
|
trigger_state varchar(16) not null comment '触发器状态',
|
||||||
|
trigger_type varchar(8) not null comment '触发器的类型',
|
||||||
|
start_time bigint(13) not null comment '开始时间',
|
||||||
|
end_time bigint(13) null comment '结束时间',
|
||||||
|
calendar_name varchar(200) null comment '日程表名称',
|
||||||
|
misfire_instr smallint(2) null comment '补偿执行的策略',
|
||||||
|
job_data blob null comment '存放持久化job对象',
|
||||||
|
primary key (sched_name, trigger_name, trigger_group),
|
||||||
|
foreign key (sched_name, job_name, job_group) references QRTZ_JOB_DETAILS(sched_name, job_name, job_group)
|
||||||
|
) engine=innodb comment = '触发器详细信息表';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- 3、 存储简单的 Trigger,包括重复次数,间隔,以及已触发的次数
|
||||||
|
-- ----------------------------
|
||||||
|
create table QRTZ_SIMPLE_TRIGGERS (
|
||||||
|
sched_name varchar(120) not null comment '调度名称',
|
||||||
|
trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键',
|
||||||
|
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
|
||||||
|
repeat_count bigint(7) not null comment '重复的次数统计',
|
||||||
|
repeat_interval bigint(12) not null comment '重复的间隔时间',
|
||||||
|
times_triggered bigint(10) not null comment '已经触发的次数',
|
||||||
|
primary key (sched_name, trigger_name, trigger_group),
|
||||||
|
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
|
||||||
|
) engine=innodb comment = '简单触发器的信息表';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- 4、 存储 Cron Trigger,包括 Cron 表达式和时区信息
|
||||||
|
-- ----------------------------
|
||||||
|
create table QRTZ_CRON_TRIGGERS (
|
||||||
|
sched_name varchar(120) not null comment '调度名称',
|
||||||
|
trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键',
|
||||||
|
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
|
||||||
|
cron_expression varchar(200) not null comment 'cron表达式',
|
||||||
|
time_zone_id varchar(80) comment '时区',
|
||||||
|
primary key (sched_name, trigger_name, trigger_group),
|
||||||
|
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
|
||||||
|
) engine=innodb comment = 'Cron类型的触发器表';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- 5、 Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)
|
||||||
|
-- ----------------------------
|
||||||
|
create table QRTZ_BLOB_TRIGGERS (
|
||||||
|
sched_name varchar(120) not null comment '调度名称',
|
||||||
|
trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键',
|
||||||
|
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
|
||||||
|
blob_data blob null comment '存放持久化Trigger对象',
|
||||||
|
primary key (sched_name, trigger_name, trigger_group),
|
||||||
|
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
|
||||||
|
) engine=innodb comment = 'Blob类型的触发器表';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- 6、 以 Blob 类型存储存放日历信息, quartz可配置一个日历来指定一个时间范围
|
||||||
|
-- ----------------------------
|
||||||
|
create table QRTZ_CALENDARS (
|
||||||
|
sched_name varchar(120) not null comment '调度名称',
|
||||||
|
calendar_name varchar(200) not null comment '日历名称',
|
||||||
|
calendar blob not null comment '存放持久化calendar对象',
|
||||||
|
primary key (sched_name, calendar_name)
|
||||||
|
) engine=innodb comment = '日历信息表';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- 7、 存储已暂停的 Trigger 组的信息
|
||||||
|
-- ----------------------------
|
||||||
|
create table QRTZ_PAUSED_TRIGGER_GRPS (
|
||||||
|
sched_name varchar(120) not null comment '调度名称',
|
||||||
|
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
|
||||||
|
primary key (sched_name, trigger_group)
|
||||||
|
) engine=innodb comment = '暂停的触发器表';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- 8、 存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息
|
||||||
|
-- ----------------------------
|
||||||
|
create table QRTZ_FIRED_TRIGGERS (
|
||||||
|
sched_name varchar(120) not null comment '调度名称',
|
||||||
|
entry_id varchar(95) not null comment '调度器实例id',
|
||||||
|
trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键',
|
||||||
|
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
|
||||||
|
instance_name varchar(200) not null comment '调度器实例名',
|
||||||
|
fired_time bigint(13) not null comment '触发的时间',
|
||||||
|
sched_time bigint(13) not null comment '定时器制定的时间',
|
||||||
|
priority integer not null comment '优先级',
|
||||||
|
state varchar(16) not null comment '状态',
|
||||||
|
job_name varchar(200) null comment '任务名称',
|
||||||
|
job_group varchar(200) null comment '任务组名',
|
||||||
|
is_nonconcurrent varchar(1) null comment '是否并发',
|
||||||
|
requests_recovery varchar(1) null comment '是否接受恢复执行',
|
||||||
|
primary key (sched_name, entry_id)
|
||||||
|
) engine=innodb comment = '已触发的触发器表';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- 9、 存储少量的有关 Scheduler 的状态信息,假如是用于集群中,可以看到其他的 Scheduler 实例
|
||||||
|
-- ----------------------------
|
||||||
|
create table QRTZ_SCHEDULER_STATE (
|
||||||
|
sched_name varchar(120) not null comment '调度名称',
|
||||||
|
instance_name varchar(200) not null comment '实例名称',
|
||||||
|
last_checkin_time bigint(13) not null comment '上次检查时间',
|
||||||
|
checkin_interval bigint(13) not null comment '检查间隔时间',
|
||||||
|
primary key (sched_name, instance_name)
|
||||||
|
) engine=innodb comment = '调度器状态表';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- 10、 存储程序的悲观锁的信息(假如使用了悲观锁)
|
||||||
|
-- ----------------------------
|
||||||
|
create table QRTZ_LOCKS (
|
||||||
|
sched_name varchar(120) not null comment '调度名称',
|
||||||
|
lock_name varchar(40) not null comment '悲观锁名称',
|
||||||
|
primary key (sched_name, lock_name)
|
||||||
|
) engine=innodb comment = '存储的悲观锁信息表';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- 11、 Quartz集群实现同步机制的行锁表
|
||||||
|
-- ----------------------------
|
||||||
|
create table QRTZ_SIMPROP_TRIGGERS (
|
||||||
|
sched_name varchar(120) not null comment '调度名称',
|
||||||
|
trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键',
|
||||||
|
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
|
||||||
|
str_prop_1 varchar(512) null comment 'String类型的trigger的第一个参数',
|
||||||
|
str_prop_2 varchar(512) null comment 'String类型的trigger的第二个参数',
|
||||||
|
str_prop_3 varchar(512) null comment 'String类型的trigger的第三个参数',
|
||||||
|
int_prop_1 int null comment 'int类型的trigger的第一个参数',
|
||||||
|
int_prop_2 int null comment 'int类型的trigger的第二个参数',
|
||||||
|
long_prop_1 bigint null comment 'long类型的trigger的第一个参数',
|
||||||
|
long_prop_2 bigint null comment 'long类型的trigger的第二个参数',
|
||||||
|
dec_prop_1 numeric(13,4) null comment 'decimal类型的trigger的第一个参数',
|
||||||
|
dec_prop_2 numeric(13,4) null comment 'decimal类型的trigger的第二个参数',
|
||||||
|
bool_prop_1 varchar(1) null comment 'Boolean类型的trigger的第一个参数',
|
||||||
|
bool_prop_2 varchar(1) null comment 'Boolean类型的trigger的第二个参数',
|
||||||
|
primary key (sched_name, trigger_name, trigger_group),
|
||||||
|
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
|
||||||
|
) engine=innodb comment = '同步机制的行锁表';
|
||||||
|
|
||||||
|
commit;
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,279 @@
|
||||||
|
DROP DATABASE IF EXISTS `ry-config`;
|
||||||
|
|
||||||
|
CREATE DATABASE `ry-config` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
|
||||||
|
|
||||||
|
SET NAMES utf8mb4;
|
||||||
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|
||||||
|
USE `ry-config`;
|
||||||
|
|
||||||
|
/******************************************/
|
||||||
|
/* 表名称 = config_info */
|
||||||
|
/******************************************/
|
||||||
|
CREATE TABLE `config_info`
|
||||||
|
(
|
||||||
|
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||||
|
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
|
||||||
|
`group_id` varchar(255) DEFAULT NULL,
|
||||||
|
`content` longtext NOT NULL COMMENT 'content',
|
||||||
|
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
|
||||||
|
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||||
|
`src_user` text COMMENT 'source user',
|
||||||
|
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
|
||||||
|
`app_name` varchar(128) DEFAULT NULL,
|
||||||
|
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
|
||||||
|
`c_desc` varchar(256) DEFAULT NULL,
|
||||||
|
`c_use` varchar(64) DEFAULT NULL,
|
||||||
|
`effect` varchar(64) DEFAULT NULL,
|
||||||
|
`type` varchar(64) DEFAULT NULL,
|
||||||
|
`c_schema` text,
|
||||||
|
`encrypted_data_key` text COMMENT '秘钥',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`, `group_id`, `tenant_id`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8
|
||||||
|
COLLATE = utf8_bin COMMENT ='config_info';
|
||||||
|
|
||||||
|
insert into config_info(id, data_id, group_id, content, md5, gmt_create, gmt_modified, src_user, src_ip, app_name,
|
||||||
|
tenant_id, c_desc, c_use, effect, type, c_schema, encrypted_data_key)
|
||||||
|
values (1, 'application-dev.yml', 'DEFAULT_GROUP',
|
||||||
|
'spring:\n autoconfigure:\n exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\n mvc:\n pathmatch:\n matching-strategy: ant_path_matcher\n\n# feign 配置\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# 暴露监控端点\nmanagement:\n endpoints:\n web:\n exposure:\n include: \'*\'\n',
|
||||||
|
'aaa73b809cfd4d0058893aa13da57806', '2020-05-20 12:00:00', '2022-04-24 10:26:34', 'nacos', '0:0:0:0:0:0:0:1',
|
||||||
|
'', '', '通用配置', 'null', 'null', 'yaml', NULL, ''),
|
||||||
|
(2, 'zhn-gateway-dev.yml', 'DEFAULT_GROUP',
|
||||||
|
'spring:\n redis:\n host: localhost\n port: 6379\n password:\n cloud:\n gateway:\n discovery:\n locator:\n lowerCaseServiceId: true\n enabled: true\n routes:\n # 认证中心\n - id: zhn-auth\n uri: lb://zhn-auth\n predicates:\n - Path=/auth/**\n filters:\n # 验证码处理\n - CacheRequestFilter\n - ValidateCodeFilter\n - StripPrefix=1\n # 代码生成\n - id: zhn-gen\n uri: lb://zhn-gen\n predicates:\n - Path=/code/**\n filters:\n - StripPrefix=1\n # 定时任务\n - id: zhn-job\n uri: lb://zhn-job\n predicates:\n - Path=/schedule/**\n filters:\n - StripPrefix=1\n # 系统模块\n - id: zhn-system\n uri: lb://zhn-system\n predicates:\n - Path=/system/**\n filters:\n - StripPrefix=1\n # 文件服务\n - id: zhn-file\n uri: lb://zhn-file\n predicates:\n - Path=/file/**\n filters:\n - StripPrefix=1\n\n# 安全配置\nsecurity:\n # 验证码\n captcha:\n enabled: true\n type: math\n # 防止XSS攻击\n xss:\n enabled: true\n excludeUrls:\n - /system/notice\n # 不校验白名单\n ignore:\n whites:\n - /auth/logout\n - /auth/login\n - /auth/register\n - /*/v2/api-docs\n - /csrf\n',
|
||||||
|
'57cec5abd0e0a6b77d853750344a9dc0', '2020-05-14 14:17:55', '2022-09-29 02:48:32', 'nacos', '0:0:0:0:0:0:0:1',
|
||||||
|
'', '', '网关模块', 'null', 'null', 'yaml', '', ''),
|
||||||
|
(3, 'zhn-auth-dev.yml', 'DEFAULT_GROUP',
|
||||||
|
'spring:\n redis:\n host: localhost\n port: 6379\n password:\n', '8bd9dada9a94822feeab40de55efced6',
|
||||||
|
'2020-11-20 00:00:00', '2022-09-29 02:48:42', 'nacos', '0:0:0:0:0:0:0:1', '', '', '认证中心', 'null', 'null',
|
||||||
|
'yaml', '', ''),
|
||||||
|
(4, 'zhn-monitor-dev.yml', 'DEFAULT_GROUP',
|
||||||
|
'# spring\nspring:\n security:\n user:\n name: zhn\n password: 123456\n boot:\n admin:\n ui:\n title: 若依服务状态监控\n',
|
||||||
|
'6f122fd2bfb8d45f858e7d6529a9cd44', '2020-11-20 00:00:00', '2022-09-29 02:48:54', 'nacos', '0:0:0:0:0:0:0:1',
|
||||||
|
'', '', '监控中心', 'null', 'null', 'yaml', '', ''),
|
||||||
|
(5, 'zhn-system-dev.yml', 'DEFAULT_GROUP',
|
||||||
|
'# spring配置\nspring:\n redis:\n host: localhost\n port: 6379\n password:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n # 主库数据源\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: root\n # 从库数据源\n # slave:\n # username: \n # password: \n # url: \n # driver-class-name: \n\n# mybatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.zhn.system\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath:mapper/**/*.xml\n\n# swagger配置\nswagger:\n title: 系统模块接口文档\n license: Powered By zhn\n licenseUrl: https://zhn.vip',
|
||||||
|
'48e0ed4a040c402bdc2444213a82c910', '2020-11-20 00:00:00', '2022-09-29 02:49:09', 'nacos', '0:0:0:0:0:0:0:1',
|
||||||
|
'', '', '系统模块', 'null', 'null', 'yaml', '', ''),
|
||||||
|
(6, 'zhn-gen-dev.yml', 'DEFAULT_GROUP',
|
||||||
|
'# spring配置\nspring:\n redis:\n host: localhost\n port: 6379\n password:\n datasource:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: root\n\n# mybatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.zhn.gen.domain\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath:mapper/**/*.xml\n\n# swagger配置\nswagger:\n title: 代码生成接口文档\n license: Powered By zhn\n licenseUrl: https://zhn.vip\n\n# 代码生成\ngen:\n # 作者\n author: zhn\n # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool\n packageName: com.zhn.system\n # 自动去除表前缀,默认是false\n autoRemovePre: false\n # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)\n tablePrefix: sys_\n',
|
||||||
|
'eb592420b3fceae1402881887b8a6a0d', '2020-11-20 00:00:00', '2022-09-29 02:49:42', 'nacos', '0:0:0:0:0:0:0:1',
|
||||||
|
'', '', '代码生成', 'null', 'null', 'yaml', '', ''),
|
||||||
|
(7, 'zhn-job-dev.yml', 'DEFAULT_GROUP',
|
||||||
|
'# spring配置\nspring:\n redis:\n host: localhost\n port: 6379\n password: \n datasource:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: root\n\n# mybatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.zhn.job.domain\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath:mapper/**/*.xml\n\n# swagger配置\nswagger:\n title: 定时任务接口文档\n license: Powered By zhn\n licenseUrl: https://zhn.vip\n',
|
||||||
|
'edcf0e3fe13fea07b4ec08b1088f30b3', '2020-11-20 00:00:00', '2022-09-29 02:50:50', 'nacos', '0:0:0:0:0:0:0:1',
|
||||||
|
'', '', '定时任务', 'null', 'null', 'yaml', '', ''),
|
||||||
|
(8, 'zhn-file-dev.yml', 'DEFAULT_GROUP',
|
||||||
|
'# 本地文件上传 \r\nfile:\r\n domain: http://127.0.0.1:9300\r\n path: D:/zhn/uploadPath\r\n prefix: /statics\r\n\r\n# FastDFS配置\r\nfdfs:\r\n domain: http://8.129.231.12\r\n soTimeout: 3000\r\n connectTimeout: 2000\r\n trackerList: 8.129.231.12:22122\r\n\r\n# Minio配置\r\nminio:\r\n url: http://8.129.231.12:9000\r\n accessKey: minioadmin\r\n secretKey: minioadmin\r\n bucketName: test',
|
||||||
|
'5382b93f3d8059d6068c0501fdd41195', '2020-11-20 00:00:00', '2020-12-21 21:01:59', NULL, '0:0:0:0:0:0:0:1', '',
|
||||||
|
'', '文件服务', 'null', 'null', 'yaml', NULL, ''),
|
||||||
|
(9, 'sentinel-zhn-gateway', 'DEFAULT_GROUP',
|
||||||
|
'[\r\n {\r\n \"resource\": \"zhn-auth\",\r\n \"count\": 500,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n },\r\n {\r\n \"resource\": \"zhn-system\",\r\n \"count\": 1000,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n },\r\n {\r\n \"resource\": \"zhn-gen\",\r\n \"count\": 200,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n },\r\n {\r\n \"resource\": \"zhn-job\",\r\n \"count\": 300,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n }\r\n]',
|
||||||
|
'9f3a3069261598f74220bc47958ec252', '2020-11-20 00:00:00', '2020-11-20 00:00:00', NULL, '0:0:0:0:0:0:0:1', '',
|
||||||
|
'', '限流策略', 'null', 'null', 'json', NULL, '');
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************/
|
||||||
|
/* 表名称 = config_info_aggr */
|
||||||
|
/******************************************/
|
||||||
|
CREATE TABLE `config_info_aggr`
|
||||||
|
(
|
||||||
|
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||||
|
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
|
||||||
|
`group_id` varchar(255) NOT NULL COMMENT 'group_id',
|
||||||
|
`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
|
||||||
|
`content` longtext NOT NULL COMMENT '内容',
|
||||||
|
`gmt_modified` datetime NOT NULL COMMENT '修改时间',
|
||||||
|
`app_name` varchar(128) DEFAULT NULL,
|
||||||
|
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`, `group_id`, `tenant_id`, `datum_id`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8
|
||||||
|
COLLATE = utf8_bin COMMENT ='增加租户字段';
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************/
|
||||||
|
/* 表名称 = config_info_beta */
|
||||||
|
/******************************************/
|
||||||
|
CREATE TABLE `config_info_beta`
|
||||||
|
(
|
||||||
|
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||||
|
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
|
||||||
|
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
|
||||||
|
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
|
||||||
|
`content` longtext NOT NULL COMMENT 'content',
|
||||||
|
`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
|
||||||
|
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
|
||||||
|
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||||
|
`src_user` text COMMENT 'source user',
|
||||||
|
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
|
||||||
|
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
|
||||||
|
`encrypted_data_key` text COMMENT '秘钥',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`, `group_id`, `tenant_id`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8
|
||||||
|
COLLATE = utf8_bin COMMENT ='config_info_beta';
|
||||||
|
|
||||||
|
/******************************************/
|
||||||
|
/* 表名称 = config_info_tag */
|
||||||
|
/******************************************/
|
||||||
|
CREATE TABLE `config_info_tag`
|
||||||
|
(
|
||||||
|
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||||
|
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
|
||||||
|
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
|
||||||
|
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
|
||||||
|
`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
|
||||||
|
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
|
||||||
|
`content` longtext NOT NULL COMMENT 'content',
|
||||||
|
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
|
||||||
|
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||||
|
`src_user` text COMMENT 'source user',
|
||||||
|
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`, `group_id`, `tenant_id`, `tag_id`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8
|
||||||
|
COLLATE = utf8_bin COMMENT ='config_info_tag';
|
||||||
|
|
||||||
|
/******************************************/
|
||||||
|
/* 表名称 = config_tags_relation */
|
||||||
|
/******************************************/
|
||||||
|
CREATE TABLE `config_tags_relation`
|
||||||
|
(
|
||||||
|
`id` bigint(20) NOT NULL COMMENT 'id',
|
||||||
|
`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
|
||||||
|
`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
|
||||||
|
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
|
||||||
|
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
|
||||||
|
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
|
||||||
|
`nid` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||||
|
PRIMARY KEY (`nid`),
|
||||||
|
UNIQUE KEY `uk_configtagrelation_configidtag` (`id`, `tag_name`, `tag_type`),
|
||||||
|
KEY `idx_tenant_id` (`tenant_id`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8
|
||||||
|
COLLATE = utf8_bin COMMENT ='config_tag_relation';
|
||||||
|
|
||||||
|
/******************************************/
|
||||||
|
/* 表名称 = group_capacity */
|
||||||
|
/******************************************/
|
||||||
|
CREATE TABLE `group_capacity`
|
||||||
|
(
|
||||||
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||||
|
`group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
|
||||||
|
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
|
||||||
|
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
|
||||||
|
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
|
||||||
|
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
|
||||||
|
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
|
||||||
|
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
|
||||||
|
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `uk_group_id` (`group_id`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8
|
||||||
|
COLLATE = utf8_bin COMMENT ='集群、各Group容量信息表';
|
||||||
|
|
||||||
|
/******************************************/
|
||||||
|
/* 表名称 = his_config_info */
|
||||||
|
/******************************************/
|
||||||
|
CREATE TABLE `his_config_info`
|
||||||
|
(
|
||||||
|
`id` bigint(64) unsigned NOT NULL,
|
||||||
|
`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
`data_id` varchar(255) NOT NULL,
|
||||||
|
`group_id` varchar(128) NOT NULL,
|
||||||
|
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
|
||||||
|
`content` longtext NOT NULL,
|
||||||
|
`md5` varchar(32) DEFAULT NULL,
|
||||||
|
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
`src_user` text,
|
||||||
|
`src_ip` varchar(50) DEFAULT NULL,
|
||||||
|
`op_type` char(10) DEFAULT NULL,
|
||||||
|
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
|
||||||
|
`encrypted_data_key` text COMMENT '秘钥',
|
||||||
|
PRIMARY KEY (`nid`),
|
||||||
|
KEY `idx_gmt_create` (`gmt_create`),
|
||||||
|
KEY `idx_gmt_modified` (`gmt_modified`),
|
||||||
|
KEY `idx_did` (`data_id`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8
|
||||||
|
COLLATE = utf8_bin COMMENT ='多租户改造';
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************/
|
||||||
|
/* 数据库全名 = nacos_config */
|
||||||
|
/* 表名称 = tenant_capacity */
|
||||||
|
/******************************************/
|
||||||
|
CREATE TABLE `tenant_capacity`
|
||||||
|
(
|
||||||
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||||
|
`tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
|
||||||
|
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
|
||||||
|
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
|
||||||
|
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
|
||||||
|
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
|
||||||
|
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
|
||||||
|
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
|
||||||
|
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `uk_tenant_id` (`tenant_id`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8
|
||||||
|
COLLATE = utf8_bin COMMENT ='租户容量信息表';
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE `tenant_info`
|
||||||
|
(
|
||||||
|
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||||
|
`kp` varchar(128) NOT NULL COMMENT 'kp',
|
||||||
|
`tenant_id` varchar(128) default '' COMMENT 'tenant_id',
|
||||||
|
`tenant_name` varchar(128) default '' COMMENT 'tenant_name',
|
||||||
|
`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
|
||||||
|
`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
|
||||||
|
`gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
|
||||||
|
`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`, `tenant_id`),
|
||||||
|
KEY `idx_tenant_id` (`tenant_id`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8
|
||||||
|
COLLATE = utf8_bin COMMENT ='tenant_info';
|
||||||
|
|
||||||
|
CREATE TABLE `users`
|
||||||
|
(
|
||||||
|
`username` varchar(50) NOT NULL PRIMARY KEY,
|
||||||
|
`password` varchar(500) NOT NULL,
|
||||||
|
`enabled` boolean NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE `roles`
|
||||||
|
(
|
||||||
|
`username` varchar(50) NOT NULL,
|
||||||
|
`role` varchar(50) NOT NULL,
|
||||||
|
UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE `permissions`
|
||||||
|
(
|
||||||
|
`role` varchar(50) NOT NULL,
|
||||||
|
`resource` varchar(255) NOT NULL,
|
||||||
|
`action` varchar(8) NOT NULL,
|
||||||
|
UNIQUE INDEX `uk_role_permission` (`role`, `resource`, `action`) USING BTREE
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO users (username, password, enabled)
|
||||||
|
VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
|
||||||
|
|
||||||
|
INSERT INTO roles (username, role)
|
||||||
|
VALUES ('nacos', 'ROLE_ADMIN');
|
|
@ -0,0 +1,80 @@
|
||||||
|
DROP DATABASE IF EXISTS `ry-seata`;
|
||||||
|
|
||||||
|
CREATE DATABASE `ry-seata` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
|
||||||
|
|
||||||
|
SET NAMES utf8mb4;
|
||||||
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|
||||||
|
USE `ry-seata`;
|
||||||
|
|
||||||
|
-- -------------------------------- The script used when storeMode is 'db' --------------------------------
|
||||||
|
-- the table to store GlobalSession data
|
||||||
|
CREATE TABLE IF NOT EXISTS `global_table`
|
||||||
|
(
|
||||||
|
`xid` VARCHAR(128) NOT NULL,
|
||||||
|
`transaction_id` BIGINT,
|
||||||
|
`status` TINYINT NOT NULL,
|
||||||
|
`application_id` VARCHAR(32),
|
||||||
|
`transaction_service_group` VARCHAR(32),
|
||||||
|
`transaction_name` VARCHAR(128),
|
||||||
|
`timeout` INT,
|
||||||
|
`begin_time` BIGINT,
|
||||||
|
`application_data` VARCHAR(2000),
|
||||||
|
`gmt_create` DATETIME,
|
||||||
|
`gmt_modified` DATETIME,
|
||||||
|
PRIMARY KEY (`xid`),
|
||||||
|
KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),
|
||||||
|
KEY `idx_transaction_id` (`transaction_id`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8mb4;
|
||||||
|
|
||||||
|
-- the table to store BranchSession data
|
||||||
|
CREATE TABLE IF NOT EXISTS `branch_table`
|
||||||
|
(
|
||||||
|
`branch_id` BIGINT NOT NULL,
|
||||||
|
`xid` VARCHAR(128) NOT NULL,
|
||||||
|
`transaction_id` BIGINT,
|
||||||
|
`resource_group_id` VARCHAR(32),
|
||||||
|
`resource_id` VARCHAR(256),
|
||||||
|
`branch_type` VARCHAR(8),
|
||||||
|
`status` TINYINT,
|
||||||
|
`client_id` VARCHAR(64),
|
||||||
|
`application_data` VARCHAR(2000),
|
||||||
|
`gmt_create` DATETIME(6),
|
||||||
|
`gmt_modified` DATETIME(6),
|
||||||
|
PRIMARY KEY (`branch_id`),
|
||||||
|
KEY `idx_xid` (`xid`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8mb4;
|
||||||
|
|
||||||
|
-- the table to store lock data
|
||||||
|
CREATE TABLE IF NOT EXISTS `lock_table`
|
||||||
|
(
|
||||||
|
`row_key` VARCHAR(128) NOT NULL,
|
||||||
|
`xid` VARCHAR(96),
|
||||||
|
`transaction_id` BIGINT,
|
||||||
|
`branch_id` BIGINT NOT NULL,
|
||||||
|
`resource_id` VARCHAR(256),
|
||||||
|
`table_name` VARCHAR(32),
|
||||||
|
`pk` VARCHAR(36),
|
||||||
|
`gmt_create` DATETIME,
|
||||||
|
`gmt_modified` DATETIME,
|
||||||
|
PRIMARY KEY (`row_key`),
|
||||||
|
KEY `idx_branch_id` (`branch_id`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8mb4;
|
||||||
|
|
||||||
|
-- for AT mode you must to init this sql for you business database. the seata server not need it.
|
||||||
|
CREATE TABLE IF NOT EXISTS `undo_log`
|
||||||
|
(
|
||||||
|
`branch_id` BIGINT(20) NOT NULL COMMENT 'branch transaction id',
|
||||||
|
`xid` VARCHAR(100) NOT NULL COMMENT 'global transaction id',
|
||||||
|
`context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
|
||||||
|
`rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info',
|
||||||
|
`log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status',
|
||||||
|
`log_created` DATETIME(6) NOT NULL COMMENT 'create datetime',
|
||||||
|
`log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime',
|
||||||
|
UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
AUTO_INCREMENT = 1
|
||||||
|
DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';
|
|
@ -0,0 +1,74 @@
|
||||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>com.zhn</groupId>
|
||||||
|
<artifactId>zhn</artifactId>
|
||||||
|
<version>3.6.3</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>zhn-auth</artifactId>
|
||||||
|
|
||||||
|
<description>
|
||||||
|
zhn-auth认证授权中心
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<!-- SpringCloud Alibaba Nacos -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.cloud</groupId>
|
||||||
|
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- SpringCloud Alibaba Nacos Config -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.cloud</groupId>
|
||||||
|
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- SpringCloud Alibaba Sentinel -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.cloud</groupId>
|
||||||
|
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- SpringBoot Web -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- SpringBoot Actuator -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Zhn Common Security-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.zhn</groupId>
|
||||||
|
<artifactId>zhn-common-security</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<finalName>${project.artifactId}</finalName>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>repackage</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.zhn.auth;
|
||||||
|
|
||||||
|
import com.zhn.common.security.annotation.EnableMyFeignClients;
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 认证授权中心
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
@EnableMyFeignClients
|
||||||
|
@SpringBootApplication (exclude = {DataSourceAutoConfiguration.class})
|
||||||
|
public class ZhnAuthMain {
|
||||||
|
public static void main (String[] args) {
|
||||||
|
SpringApplication.run (ZhnAuthMain.class, args);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
package com.zhn.auth.controller;
|
||||||
|
|
||||||
|
import com.zhn.auth.form.LoginBody;
|
||||||
|
import com.zhn.auth.form.RegisterBody;
|
||||||
|
import com.zhn.auth.service.SysLoginService;
|
||||||
|
import com.zhn.common.core.domain.Result;
|
||||||
|
import com.zhn.common.core.utils.JwtUtils;
|
||||||
|
import com.zhn.common.core.utils.StringUtils;
|
||||||
|
import com.zhn.common.security.auth.AuthUtil;
|
||||||
|
import com.zhn.common.security.service.TokenService;
|
||||||
|
import com.zhn.common.security.utils.SecurityUtils;
|
||||||
|
import com.zhn.common.system.domain.LoginUser;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* token 控制
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
public class TokenController {
|
||||||
|
@Autowired
|
||||||
|
private TokenService tokenService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SysLoginService sysLoginService;
|
||||||
|
|
||||||
|
@PostMapping ("login")
|
||||||
|
public Result<?> login (@RequestBody LoginBody form) {
|
||||||
|
// 用户登录
|
||||||
|
LoginUser userInfo = sysLoginService.login (form.getUsername (), form.getPassword ());
|
||||||
|
// 获取登录token
|
||||||
|
return Result.success (tokenService.createToken (userInfo));
|
||||||
|
}
|
||||||
|
|
||||||
|
@DeleteMapping ("logout")
|
||||||
|
public Result<?> logout (HttpServletRequest request) {
|
||||||
|
String token = SecurityUtils.getToken (request);
|
||||||
|
if (StringUtils.isNotEmpty (token)) {
|
||||||
|
String username = JwtUtils.getUserName (token);
|
||||||
|
// 删除用户缓存记录
|
||||||
|
AuthUtil.logoutByToken (token);
|
||||||
|
// 记录用户退出日志
|
||||||
|
sysLoginService.logout (username);
|
||||||
|
}
|
||||||
|
return Result.success ();
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping ("refresh")
|
||||||
|
public Result<?> refresh (HttpServletRequest request) {
|
||||||
|
LoginUser loginUser = tokenService.getLoginUser (request);
|
||||||
|
if (StringUtils.isNotNull (loginUser)) {
|
||||||
|
// 刷新令牌有效期
|
||||||
|
tokenService.refreshToken (loginUser);
|
||||||
|
return Result.success ();
|
||||||
|
}
|
||||||
|
return Result.success ();
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping ("register")
|
||||||
|
public Result<?> register (@RequestBody RegisterBody registerBody) {
|
||||||
|
// 用户注册
|
||||||
|
sysLoginService.register (registerBody.getUsername (), registerBody.getPassword ());
|
||||||
|
return Result.success ();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.zhn.auth.form;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户登录对象
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class LoginBody {
|
||||||
|
/**
|
||||||
|
* 用户名
|
||||||
|
*/
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户密码
|
||||||
|
*/
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
public String getUsername () {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsername (String username) {
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword () {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword (String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package com.zhn.auth.form;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户注册对象
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class RegisterBody extends com.zhn.auth.form.LoginBody {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,129 @@
|
||||||
|
package com.zhn.auth.service;
|
||||||
|
|
||||||
|
import com.zhn.common.core.constant.CacheConstants;
|
||||||
|
import com.zhn.common.core.constant.Constants;
|
||||||
|
import com.zhn.common.core.constant.SecurityConstants;
|
||||||
|
import com.zhn.common.core.constant.UserConstants;
|
||||||
|
import com.zhn.common.core.domain.Result;
|
||||||
|
import com.zhn.common.core.enums.UserStatus;
|
||||||
|
import com.zhn.common.core.exception.ServiceException;
|
||||||
|
import com.zhn.common.core.text.Convert;
|
||||||
|
import com.zhn.common.core.utils.StringUtils;
|
||||||
|
import com.zhn.common.core.utils.ip.IpUtils;
|
||||||
|
import com.zhn.common.redis.service.RedisService;
|
||||||
|
import com.zhn.common.security.utils.SecurityUtils;
|
||||||
|
import com.zhn.common.system.domain.LoginUser;
|
||||||
|
import com.zhn.common.system.domain.SysUser;
|
||||||
|
import com.zhn.common.system.remote.RemoteUserService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录校验方法
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class SysLoginService {
|
||||||
|
@Resource
|
||||||
|
private RemoteUserService remoteUserService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private com.zhn.auth.service.SysPasswordService passwordService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private com.zhn.auth.service.SysRecordLogService recordLogService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RedisService redisService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录
|
||||||
|
*/
|
||||||
|
public LoginUser login (String username, String password) {
|
||||||
|
// 用户名或密码为空 错误
|
||||||
|
if (StringUtils.isAnyBlank (username, password)) {
|
||||||
|
recordLogService.recordLogininfor (username, Constants.LOGIN_FAIL, "用户/密码必须填写");
|
||||||
|
throw new ServiceException ("用户/密码必须填写");
|
||||||
|
}
|
||||||
|
// 密码如果不在指定范围内 错误
|
||||||
|
if (password.length () < UserConstants.PASSWORD_MIN_LENGTH
|
||||||
|
|| password.length () > UserConstants.PASSWORD_MAX_LENGTH) {
|
||||||
|
recordLogService.recordLogininfor (username, Constants.LOGIN_FAIL, "用户密码不在指定范围");
|
||||||
|
throw new ServiceException ("用户密码不在指定范围");
|
||||||
|
}
|
||||||
|
// 用户名不在指定范围内 错误
|
||||||
|
if (username.length () < UserConstants.USERNAME_MIN_LENGTH
|
||||||
|
|| username.length () > UserConstants.USERNAME_MAX_LENGTH) {
|
||||||
|
recordLogService.recordLogininfor (username, Constants.LOGIN_FAIL, "用户名不在指定范围");
|
||||||
|
throw new ServiceException ("用户名不在指定范围");
|
||||||
|
}
|
||||||
|
// IP黑名单校验
|
||||||
|
String blackStr = Convert.toStr (redisService.getCacheObject (CacheConstants.SYS_LOGIN_BLACKIPLIST));
|
||||||
|
if (IpUtils.isMatchedIp (blackStr, IpUtils.getIpAddr ())) {
|
||||||
|
recordLogService.recordLogininfor (username, Constants.LOGIN_FAIL, "很遗憾,访问IP已被列入系统黑名单");
|
||||||
|
throw new ServiceException ("很遗憾,访问IP已被列入系统黑名单");
|
||||||
|
}
|
||||||
|
// 查询用户信息
|
||||||
|
Result<LoginUser> userResult = remoteUserService.getUserInfo (username, SecurityConstants.INNER);
|
||||||
|
|
||||||
|
if (StringUtils.isNull (userResult) || StringUtils.isNull (userResult.getData ())) {
|
||||||
|
recordLogService.recordLogininfor (username, Constants.LOGIN_FAIL, "登录用户不存在");
|
||||||
|
throw new ServiceException ("登录用户:" + username + " 不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Result.FAIL == userResult.getCode ()) {
|
||||||
|
throw new ServiceException (userResult.getMsg ());
|
||||||
|
}
|
||||||
|
|
||||||
|
LoginUser userInfo = userResult.getData ();
|
||||||
|
SysUser user = userResult.getData ().getSysUser ();
|
||||||
|
if (UserStatus.DELETED.getCode ().equals (user.getDelFlag ())) {
|
||||||
|
recordLogService.recordLogininfor (username, Constants.LOGIN_FAIL, "对不起,您的账号已被删除");
|
||||||
|
throw new ServiceException ("对不起,您的账号:" + username + " 已被删除");
|
||||||
|
}
|
||||||
|
if (UserStatus.DISABLE.getCode ().equals (user.getStatus ())) {
|
||||||
|
recordLogService.recordLogininfor (username, Constants.LOGIN_FAIL, "用户已停用,请联系管理员");
|
||||||
|
throw new ServiceException ("对不起,您的账号:" + username + " 已停用");
|
||||||
|
}
|
||||||
|
passwordService.validate (user, password);
|
||||||
|
recordLogService.recordLogininfor (username, Constants.LOGIN_SUCCESS, "登录成功");
|
||||||
|
return userInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void logout (String loginName) {
|
||||||
|
recordLogService.recordLogininfor (loginName, Constants.LOGOUT, "退出成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册
|
||||||
|
*/
|
||||||
|
public void register (String username, String password) {
|
||||||
|
// 用户名或密码为空 错误
|
||||||
|
if (StringUtils.isAnyBlank (username, password)) {
|
||||||
|
throw new ServiceException ("用户/密码必须填写");
|
||||||
|
}
|
||||||
|
if (username.length () < UserConstants.USERNAME_MIN_LENGTH
|
||||||
|
|| username.length () > UserConstants.USERNAME_MAX_LENGTH) {
|
||||||
|
throw new ServiceException ("账户长度必须在2到20个字符之间");
|
||||||
|
}
|
||||||
|
if (password.length () < UserConstants.PASSWORD_MIN_LENGTH
|
||||||
|
|| password.length () > UserConstants.PASSWORD_MAX_LENGTH) {
|
||||||
|
throw new ServiceException ("密码长度必须在5到20个字符之间");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 注册用户信息
|
||||||
|
SysUser sysUser = new SysUser ();
|
||||||
|
sysUser.setUserName (username);
|
||||||
|
sysUser.setNickName (username);
|
||||||
|
sysUser.setPassword (SecurityUtils.encryptPassword (password));
|
||||||
|
Result<?> registerResult = remoteUserService.registerUserInfo (sysUser, SecurityConstants.INNER);
|
||||||
|
|
||||||
|
if (Result.FAIL == registerResult.getCode ()) {
|
||||||
|
throw new ServiceException (registerResult.getMsg ());
|
||||||
|
}
|
||||||
|
recordLogService.recordLogininfor (username, Constants.REGISTER, "注册成功");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
package com.zhn.auth.service;
|
||||||
|
|
||||||
|
import com.zhn.common.core.constant.CacheConstants;
|
||||||
|
import com.zhn.common.core.constant.Constants;
|
||||||
|
import com.zhn.common.core.exception.ServiceException;
|
||||||
|
import com.zhn.common.redis.service.RedisService;
|
||||||
|
import com.zhn.common.security.utils.SecurityUtils;
|
||||||
|
import com.zhn.common.system.domain.SysUser;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录密码方法
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class SysPasswordService {
|
||||||
|
@Autowired
|
||||||
|
private RedisService redisService;
|
||||||
|
|
||||||
|
private int maxRetryCount = CacheConstants.PASSWORD_MAX_RETRY_COUNT;
|
||||||
|
|
||||||
|
private Long lockTime = CacheConstants.PASSWORD_LOCK_TIME;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private com.zhn.auth.service.SysRecordLogService recordLogService;
|
||||||
|
|
||||||
|
public void validate (SysUser user, String password) {
|
||||||
|
String username = user.getUserName ();
|
||||||
|
|
||||||
|
Integer retryCount = redisService.getCacheObject (getCacheKey (username));
|
||||||
|
|
||||||
|
if (retryCount == null) {
|
||||||
|
retryCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (retryCount >= Integer.valueOf (maxRetryCount).intValue ()) {
|
||||||
|
String errMsg = String.format ("密码输入错误%s次,帐户锁定%s分钟", maxRetryCount, lockTime);
|
||||||
|
recordLogService.recordLogininfor (username, Constants.LOGIN_FAIL, errMsg);
|
||||||
|
throw new ServiceException (errMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!matches (user, password)) {
|
||||||
|
retryCount = retryCount + 1;
|
||||||
|
recordLogService.recordLogininfor (username, Constants.LOGIN_FAIL, String.format ("密码输入错误%s次", retryCount));
|
||||||
|
redisService.setCacheObject (getCacheKey (username), retryCount, lockTime, TimeUnit.MINUTES);
|
||||||
|
throw new ServiceException ("用户不存在/密码错误");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
clearLoginRecordCache (username);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录账户密码错误次数缓存键名
|
||||||
|
*
|
||||||
|
* @param username 用户名
|
||||||
|
*
|
||||||
|
* @return 缓存键key
|
||||||
|
*/
|
||||||
|
private String getCacheKey (String username) {
|
||||||
|
return CacheConstants.PWD_ERR_CNT_KEY + username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean matches (SysUser user, String rawPassword) {
|
||||||
|
return SecurityUtils.matchesPassword (rawPassword, user.getPassword ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearLoginRecordCache (String loginName) {
|
||||||
|
if (redisService.hasKey (getCacheKey (loginName))) {
|
||||||
|
redisService.deleteObject (getCacheKey (loginName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
package com.zhn.auth.service;
|
||||||
|
|
||||||
|
import com.zhn.common.core.constant.Constants;
|
||||||
|
import com.zhn.common.core.constant.SecurityConstants;
|
||||||
|
import com.zhn.common.core.utils.StringUtils;
|
||||||
|
import com.zhn.common.core.utils.ip.IpUtils;
|
||||||
|
import com.zhn.common.system.domain.SysLogininfor;
|
||||||
|
import com.zhn.common.system.remote.RemoteLogService;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 记录日志方法
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class SysRecordLogService {
|
||||||
|
@Resource
|
||||||
|
private RemoteLogService remoteLogService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 记录登录信息
|
||||||
|
*
|
||||||
|
* @param username 用户名
|
||||||
|
* @param status 状态
|
||||||
|
* @param message 消息内容
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public void recordLogininfor (String username, String status, String message) {
|
||||||
|
SysLogininfor logininfor = new SysLogininfor ();
|
||||||
|
logininfor.setUserName (username);
|
||||||
|
logininfor.setIpaddr (IpUtils.getIpAddr ());
|
||||||
|
logininfor.setMsg (message);
|
||||||
|
// 日志状态
|
||||||
|
if (StringUtils.equalsAny (status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
|
||||||
|
logininfor.setStatus (Constants.LOGIN_SUCCESS_STATUS);
|
||||||
|
}
|
||||||
|
else if (Constants.LOGIN_FAIL.equals (status)) {
|
||||||
|
logininfor.setStatus (Constants.LOGIN_FAIL_STATUS);
|
||||||
|
}
|
||||||
|
remoteLogService.saveLogininfor (logininfor, SecurityConstants.INNER);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
Spring Boot Version: ${spring-boot.version}
|
||||||
|
Spring Application Name: ${spring.application.name}
|
|
@ -0,0 +1,25 @@
|
||||||
|
# Tomcat
|
||||||
|
server:
|
||||||
|
port: 9200
|
||||||
|
|
||||||
|
# Spring
|
||||||
|
spring:
|
||||||
|
application:
|
||||||
|
# 应用名称
|
||||||
|
name: zhn-auth
|
||||||
|
profiles:
|
||||||
|
# 环境配置
|
||||||
|
active: dev
|
||||||
|
cloud:
|
||||||
|
nacos:
|
||||||
|
discovery:
|
||||||
|
# 服务注册地址
|
||||||
|
server-addr: 39.101.77.5:8848
|
||||||
|
config:
|
||||||
|
# 配置中心地址
|
||||||
|
server-addr: 39.101.77.5:8848
|
||||||
|
# 配置文件格式
|
||||||
|
file-extension: yml
|
||||||
|
# 共享配置
|
||||||
|
shared-configs:
|
||||||
|
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
|
|
@ -0,0 +1,74 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration scan="true" scanPeriod="60 seconds" debug="false">
|
||||||
|
<!-- 日志存放路径 -->
|
||||||
|
<property name="log.path" value="logs/zhn-auth"/>
|
||||||
|
<!-- 日志输出格式 -->
|
||||||
|
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
|
||||||
|
|
||||||
|
<!-- 控制台输出 -->
|
||||||
|
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern}</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 系统日志输出 -->
|
||||||
|
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${log.path}/info.log</file>
|
||||||
|
<!-- 循环政策:基于时间创建日志文件 -->
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
|
<!-- 日志文件名格式 -->
|
||||||
|
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||||
|
<!-- 日志最大的历史 60天 -->
|
||||||
|
<maxHistory>60</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern}</pattern>
|
||||||
|
</encoder>
|
||||||
|
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||||
|
<!-- 过滤的级别 -->
|
||||||
|
<level>INFO</level>
|
||||||
|
<!-- 匹配时的操作:接收(记录) -->
|
||||||
|
<onMatch>ACCEPT</onMatch>
|
||||||
|
<!-- 不匹配时的操作:拒绝(不记录) -->
|
||||||
|
<onMismatch>DENY</onMismatch>
|
||||||
|
</filter>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${log.path}/error.log</file>
|
||||||
|
<!-- 循环政策:基于时间创建日志文件 -->
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
|
<!-- 日志文件名格式 -->
|
||||||
|
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||||
|
<!-- 日志最大的历史 60天 -->
|
||||||
|
<maxHistory>60</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern}</pattern>
|
||||||
|
</encoder>
|
||||||
|
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||||
|
<!-- 过滤的级别 -->
|
||||||
|
<level>ERROR</level>
|
||||||
|
<!-- 匹配时的操作:接收(记录) -->
|
||||||
|
<onMatch>ACCEPT</onMatch>
|
||||||
|
<!-- 不匹配时的操作:拒绝(不记录) -->
|
||||||
|
<onMismatch>DENY</onMismatch>
|
||||||
|
</filter>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 系统模块日志级别控制 -->
|
||||||
|
<logger name="com.zhn" level="info"/>
|
||||||
|
<!-- Spring日志级别控制 -->
|
||||||
|
<logger name="org.springframework" level="warn"/>
|
||||||
|
|
||||||
|
<root level="info">
|
||||||
|
<appender-ref ref="console"/>
|
||||||
|
</root>
|
||||||
|
|
||||||
|
<!--系统操作日志-->
|
||||||
|
<root level="info">
|
||||||
|
<appender-ref ref="file_info"/>
|
||||||
|
<appender-ref ref="file_error"/>
|
||||||
|
</root>
|
||||||
|
</configuration>
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>com.zhn</groupId>
|
||||||
|
<artifactId>zhn</artifactId>
|
||||||
|
<version>3.6.3</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<modules>
|
||||||
|
<module>zhn-common-log</module>
|
||||||
|
<module>zhn-common-core</module>
|
||||||
|
<module>zhn-common-redis</module>
|
||||||
|
<module>zhn-common-seata</module>
|
||||||
|
<module>zhn-common-swagger</module>
|
||||||
|
<module>zhn-common-security</module>
|
||||||
|
<module>zhn-common-datascope</module>
|
||||||
|
<module>zhn-common-datasource</module>
|
||||||
|
<module>zhn-common-system</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
<artifactId>zhn-common</artifactId>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
<description>
|
||||||
|
zhn-common通用模块
|
||||||
|
</description>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,141 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>com.zhn</groupId>
|
||||||
|
<artifactId>zhn-common</artifactId>
|
||||||
|
<version>3.6.3</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>zhn-common-core</artifactId>
|
||||||
|
|
||||||
|
<description>
|
||||||
|
zhn-common-core核心模块
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<!-- SpringCloud Openfeign -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.cloud</groupId>
|
||||||
|
<artifactId>spring-cloud-starter-openfeign</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- SpringCloud Loadbalancer -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.cloud</groupId>
|
||||||
|
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Spring Context Support -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-context-support</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Spring Web -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Transmittable ThreadLocal -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>transmittable-thread-local</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Pagehelper -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.pagehelper</groupId>
|
||||||
|
<artifactId>pagehelper-spring-boot-starter</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- mybatis - plus 依赖 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.baomidou</groupId>
|
||||||
|
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||||
|
<version>3.5.3.1</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>com.github.jsqlparser</groupId>
|
||||||
|
<artifactId>jsqlparser</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.mybatis</groupId>
|
||||||
|
<artifactId>mybatis</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Hibernate Validator -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-validation</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Jackson -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-databind</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Alibaba Fastjson -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.fastjson2</groupId>
|
||||||
|
<artifactId>fastjson2</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Jwt -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.jsonwebtoken</groupId>
|
||||||
|
<artifactId>jjwt</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Jaxb -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.xml.bind</groupId>
|
||||||
|
<artifactId>jaxb-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Apache Lang3 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Commons Io -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-io</groupId>
|
||||||
|
<artifactId>commons-io</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- excel工具 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.poi</groupId>
|
||||||
|
<artifactId>poi-ooxml</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Java Servlet -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.servlet</groupId>
|
||||||
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Swagger -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.swagger</groupId>
|
||||||
|
<artifactId>swagger-annotations</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- lombok -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,176 @@
|
||||||
|
package com.zhn.common.core.annotation;
|
||||||
|
|
||||||
|
import com.zhn.common.core.utils.poi.ExcelHandlerAdapter;
|
||||||
|
import org.apache.poi.ss.usermodel.HorizontalAlignment;
|
||||||
|
import org.apache.poi.ss.usermodel.IndexedColors;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义导出Excel数据注解
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
@Retention (RetentionPolicy.RUNTIME)
|
||||||
|
@Target (ElementType.FIELD)
|
||||||
|
public @interface Excel {
|
||||||
|
/**
|
||||||
|
* 导出时在excel中排序
|
||||||
|
*/
|
||||||
|
public int sort () default Integer.MAX_VALUE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出到Excel中的名字.
|
||||||
|
*/
|
||||||
|
public String name () default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日期格式, 如: yyyy-MM-dd
|
||||||
|
*/
|
||||||
|
public String dateFormat () default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取内容转表达式 (如: 0=男,1=女,2=未知)
|
||||||
|
*/
|
||||||
|
public String readConverterExp () default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分隔符,读取字符串组内容
|
||||||
|
*/
|
||||||
|
public String separator () default ",";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
|
||||||
|
*/
|
||||||
|
public int scale () default -1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
|
||||||
|
*/
|
||||||
|
public int roundingMode () default BigDecimal.ROUND_HALF_EVEN;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出时在excel中每个列的高度
|
||||||
|
*/
|
||||||
|
public double height () default 14;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出时在excel中每个列的宽度
|
||||||
|
*/
|
||||||
|
public double width () default 16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文字后缀,如% 90 变成90%
|
||||||
|
*/
|
||||||
|
public String suffix () default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当值为空时,字段的默认值
|
||||||
|
*/
|
||||||
|
public String defaultValue () default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提示信息
|
||||||
|
*/
|
||||||
|
public String prompt () default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置只能选择不能输入的列内容.
|
||||||
|
*/
|
||||||
|
public String[] combo () default {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否需要纵向合并单元格,应对需求:含有list集合单元格)
|
||||||
|
*/
|
||||||
|
public boolean needMerge () default false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
|
||||||
|
*/
|
||||||
|
public boolean isExport () default true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 另一个类中的属性名称,支持多级获取,以小数点隔开
|
||||||
|
*/
|
||||||
|
public String targetAttr () default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否自动统计数据,在最后追加一行统计数据总和
|
||||||
|
*/
|
||||||
|
public boolean isStatistics () default false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出类型(0数字 1字符串)
|
||||||
|
*/
|
||||||
|
public ColumnType cellType () default ColumnType.STRING;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出列头背景颜色
|
||||||
|
*/
|
||||||
|
public IndexedColors headerBackgroundColor () default IndexedColors.GREY_50_PERCENT;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出列头字体颜色
|
||||||
|
*/
|
||||||
|
public IndexedColors headerColor () default IndexedColors.WHITE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出单元格背景颜色
|
||||||
|
*/
|
||||||
|
public IndexedColors backgroundColor () default IndexedColors.WHITE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出单元格字体颜色
|
||||||
|
*/
|
||||||
|
public IndexedColors color () default IndexedColors.BLACK;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出字段对齐方式
|
||||||
|
*/
|
||||||
|
public HorizontalAlignment align () default HorizontalAlignment.CENTER;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义数据处理器
|
||||||
|
*/
|
||||||
|
public Class<?> handler () default ExcelHandlerAdapter.class;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义数据处理器参数
|
||||||
|
*/
|
||||||
|
public String[] args () default {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字段类型(0:导出导入;1:仅导出;2:仅导入)
|
||||||
|
*/
|
||||||
|
Type type () default Type.ALL;
|
||||||
|
|
||||||
|
public enum Type {
|
||||||
|
ALL (0), EXPORT (1), IMPORT (2);
|
||||||
|
private final int value;
|
||||||
|
|
||||||
|
Type (int value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int value () {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ColumnType {
|
||||||
|
NUMERIC (0), STRING (1), IMAGE (2);
|
||||||
|
private final int value;
|
||||||
|
|
||||||
|
ColumnType (int value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int value () {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package com.zhn.common.core.annotation;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Excel注解集
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
@Target (ElementType.FIELD)
|
||||||
|
@Retention (RetentionPolicy.RUNTIME)
|
||||||
|
public @interface Excels {
|
||||||
|
com.zhn.common.core.annotation.Excel[] value ();
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
package com.zhn.common.core.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缓存常量信息
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class CacheConstants {
|
||||||
|
/**
|
||||||
|
* 缓存有效期,默认720(分钟)
|
||||||
|
*/
|
||||||
|
public final static long EXPIRATION = 720;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缓存刷新时间,默认120(分钟)
|
||||||
|
*/
|
||||||
|
public final static long REFRESH_TIME = 120;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 密码最大错误次数
|
||||||
|
*/
|
||||||
|
public final static int PASSWORD_MAX_RETRY_COUNT = 5;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 密码锁定时间,默认10(分钟)
|
||||||
|
*/
|
||||||
|
public final static long PASSWORD_LOCK_TIME = 10;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 权限缓存前缀
|
||||||
|
*/
|
||||||
|
public final static String LOGIN_TOKEN_KEY = "login_tokens:";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证码 redis key
|
||||||
|
*/
|
||||||
|
public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数管理 cache key
|
||||||
|
*/
|
||||||
|
public static final String SYS_CONFIG_KEY = "sys_config:";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字典管理 cache key
|
||||||
|
*/
|
||||||
|
public static final String SYS_DICT_KEY = "sys_dict:";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录账户密码错误次数 redis key
|
||||||
|
*/
|
||||||
|
public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录IP黑名单 cache key
|
||||||
|
*/
|
||||||
|
public static final String SYS_LOGIN_BLACKIPLIST = SYS_CONFIG_KEY + "sys.login.blackIPList";
|
||||||
|
}
|
|
@ -0,0 +1,134 @@
|
||||||
|
package com.zhn.common.core.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通用常量信息
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class Constants {
|
||||||
|
/**
|
||||||
|
* UTF-8 字符集
|
||||||
|
*/
|
||||||
|
public static final String UTF8 = "UTF-8";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GBK 字符集
|
||||||
|
*/
|
||||||
|
public static final String GBK = "GBK";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* www主域
|
||||||
|
*/
|
||||||
|
public static final String WWW = "www.";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RMI 远程方法调用
|
||||||
|
*/
|
||||||
|
public static final String LOOKUP_RMI = "rmi:";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LDAP 远程方法调用
|
||||||
|
*/
|
||||||
|
public static final String LOOKUP_LDAP = "ldap:";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LDAPS 远程方法调用
|
||||||
|
*/
|
||||||
|
public static final String LOOKUP_LDAPS = "ldaps:";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* http请求
|
||||||
|
*/
|
||||||
|
public static final String HTTP = "http://";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* https请求
|
||||||
|
*/
|
||||||
|
public static final String HTTPS = "https://";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 成功标记
|
||||||
|
*/
|
||||||
|
public static final Integer SUCCESS = 200;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 失败标记
|
||||||
|
*/
|
||||||
|
public static final Integer FAIL = 500;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录成功状态
|
||||||
|
*/
|
||||||
|
public static final String LOGIN_SUCCESS_STATUS = "0";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录失败状态
|
||||||
|
*/
|
||||||
|
public static final String LOGIN_FAIL_STATUS = "1";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录成功
|
||||||
|
*/
|
||||||
|
public static final String LOGIN_SUCCESS = "Success";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注销
|
||||||
|
*/
|
||||||
|
public static final String LOGOUT = "Logout";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册
|
||||||
|
*/
|
||||||
|
public static final String REGISTER = "Register";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录失败
|
||||||
|
*/
|
||||||
|
public static final String LOGIN_FAIL = "Error";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前记录起始索引
|
||||||
|
*/
|
||||||
|
public static final String PAGE_NUM = "pageNum";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 每页显示记录数
|
||||||
|
*/
|
||||||
|
public static final String PAGE_SIZE = "pageSize";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 排序列
|
||||||
|
*/
|
||||||
|
public static final String ORDER_BY_COLUMN = "orderByColumn";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 排序的方向 "desc" 或者 "asc".
|
||||||
|
*/
|
||||||
|
public static final String IS_ASC = "isAsc";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证码有效期(分钟)
|
||||||
|
*/
|
||||||
|
public static final long CAPTCHA_EXPIRATION = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 资源映射路径 前缀
|
||||||
|
*/
|
||||||
|
public static final String RESOURCE_PREFIX = "/profile";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自动识别json对象白名单配置(仅允许解析的包名,范围越小越安全)
|
||||||
|
*/
|
||||||
|
public static final String[] JSON_WHITELIST_STR = {"org.springframework", "com.zhn"};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
|
||||||
|
*/
|
||||||
|
public static final String[] JOB_WHITELIST_STR = {"com.zhn"};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定时任务违规的字符
|
||||||
|
*/
|
||||||
|
public static final String[] JOB_ERROR_STR = {"java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
|
||||||
|
"org.springframework", "org.apache", "com.zhn.common.core.utils.file"};
|
||||||
|
}
|
|
@ -0,0 +1,186 @@
|
||||||
|
package com.zhn.common.core.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 代码生成通用常量
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class GenConstants {
|
||||||
|
/**
|
||||||
|
* 单表(增删改查)
|
||||||
|
*/
|
||||||
|
public static final String TPL_CRUD = "crud";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 树表(增删改查)
|
||||||
|
*/
|
||||||
|
public static final String TPL_TREE = "tree";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主子表(增删改查)
|
||||||
|
*/
|
||||||
|
public static final String TPL_SUB = "sub";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 树编码字段
|
||||||
|
*/
|
||||||
|
public static final String TREE_CODE = "treeCode";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 树父编码字段
|
||||||
|
*/
|
||||||
|
public static final String TREE_PARENT_CODE = "treeParentCode";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 树名称字段
|
||||||
|
*/
|
||||||
|
public static final String TREE_NAME = "treeName";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上级菜单ID字段
|
||||||
|
*/
|
||||||
|
public static final String PARENT_MENU_ID = "parentMenuId";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上级菜单名称字段
|
||||||
|
*/
|
||||||
|
public static final String PARENT_MENU_NAME = "parentMenuName";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据库字符串类型
|
||||||
|
*/
|
||||||
|
public static final String[] COLUMNTYPE_STR = {"char", "varchar", "nvarchar", "varchar2"};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据库文本类型
|
||||||
|
*/
|
||||||
|
public static final String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据库时间类型
|
||||||
|
*/
|
||||||
|
public static final String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp"};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据库数字类型
|
||||||
|
*/
|
||||||
|
public static final String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer",
|
||||||
|
"bigint", "float", "double", "decimal"};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 页面不需要编辑字段
|
||||||
|
*/
|
||||||
|
public static final String[] COLUMNNAME_NOT_EDIT = {"id", "create_by", "create_time", "del_flag"};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 页面不需要显示的列表字段
|
||||||
|
*/
|
||||||
|
public static final String[] COLUMNNAME_NOT_LIST = {"id", "create_by", "create_time", "del_flag", "update_by",
|
||||||
|
"update_time"};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 页面不需要查询字段
|
||||||
|
*/
|
||||||
|
public static final String[] COLUMNNAME_NOT_QUERY = {"id", "create_by", "create_time", "del_flag", "update_by",
|
||||||
|
"update_time", "remark"};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entity基类字段
|
||||||
|
*/
|
||||||
|
public static final String[] BASE_ENTITY = {"createBy", "createTime", "updateBy", "updateTime", "remark"};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tree基类字段
|
||||||
|
*/
|
||||||
|
public static final String[] TREE_ENTITY = {"parentName", "parentId", "orderNum", "ancestors"};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文本框
|
||||||
|
*/
|
||||||
|
public static final String HTML_INPUT = "input";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文本域
|
||||||
|
*/
|
||||||
|
public static final String HTML_TEXTAREA = "textarea";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下拉框
|
||||||
|
*/
|
||||||
|
public static final String HTML_SELECT = "select";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 单选框
|
||||||
|
*/
|
||||||
|
public static final String HTML_RADIO = "radio";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 复选框
|
||||||
|
*/
|
||||||
|
public static final String HTML_CHECKBOX = "checkbox";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日期控件
|
||||||
|
*/
|
||||||
|
public static final String HTML_DATETIME = "datetime";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图片上传控件
|
||||||
|
*/
|
||||||
|
public static final String HTML_IMAGE_UPLOAD = "imageUpload";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件上传控件
|
||||||
|
*/
|
||||||
|
public static final String HTML_FILE_UPLOAD = "fileUpload";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 富文本控件
|
||||||
|
*/
|
||||||
|
public static final String HTML_EDITOR = "editor";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字符串类型
|
||||||
|
*/
|
||||||
|
public static final String TYPE_STRING = "String";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 整型
|
||||||
|
*/
|
||||||
|
public static final String TYPE_INTEGER = "Integer";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 长整型
|
||||||
|
*/
|
||||||
|
public static final String TYPE_LONG = "Long";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 浮点型
|
||||||
|
*/
|
||||||
|
public static final String TYPE_DOUBLE = "Double";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 高精度计算类型
|
||||||
|
*/
|
||||||
|
public static final String TYPE_BIGDECIMAL = "BigDecimal";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 时间类型
|
||||||
|
*/
|
||||||
|
public static final String TYPE_DATE = "Date";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 模糊查询
|
||||||
|
*/
|
||||||
|
public static final String QUERY_LIKE = "LIKE";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 相等查询
|
||||||
|
*/
|
||||||
|
public static final String QUERY_EQ = "EQ";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 需要
|
||||||
|
*/
|
||||||
|
public static final String REQUIRE = "1";
|
||||||
|
}
|
|
@ -0,0 +1,93 @@
|
||||||
|
package com.zhn.common.core.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回状态码
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class HttpStatus {
|
||||||
|
/**
|
||||||
|
* 操作成功
|
||||||
|
*/
|
||||||
|
public static final int SUCCESS = 200;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对象创建成功
|
||||||
|
*/
|
||||||
|
public static final int CREATED = 201;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求已经被接受
|
||||||
|
*/
|
||||||
|
public static final int ACCEPTED = 202;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作已经执行成功,但是没有返回数据
|
||||||
|
*/
|
||||||
|
public static final int NO_CONTENT = 204;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 资源已被移除
|
||||||
|
*/
|
||||||
|
public static final int MOVED_PERM = 301;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重定向
|
||||||
|
*/
|
||||||
|
public static final int SEE_OTHER = 303;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 资源没有被修改
|
||||||
|
*/
|
||||||
|
public static final int NOT_MODIFIED = 304;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数列表错误(缺少,格式不匹配)
|
||||||
|
*/
|
||||||
|
public static final int BAD_REQUEST = 400;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 未授权
|
||||||
|
*/
|
||||||
|
public static final int UNAUTHORIZED = 401;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 访问受限,授权过期
|
||||||
|
*/
|
||||||
|
public static final int FORBIDDEN = 403;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 资源,服务未找到
|
||||||
|
*/
|
||||||
|
public static final int NOT_FOUND = 404;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不允许的http方法
|
||||||
|
*/
|
||||||
|
public static final int BAD_METHOD = 405;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 资源冲突,或者资源被锁
|
||||||
|
*/
|
||||||
|
public static final int CONFLICT = 409;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不支持的数据,媒体类型
|
||||||
|
*/
|
||||||
|
public static final int UNSUPPORTED_TYPE = 415;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统内部错误
|
||||||
|
*/
|
||||||
|
public static final int ERROR = 500;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 接口未实现
|
||||||
|
*/
|
||||||
|
public static final int NOT_IMPLEMENTED = 501;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统警告消息
|
||||||
|
*/
|
||||||
|
public static final int WARN = 601;
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
package com.zhn.common.core.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务调度通用常量
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class ScheduleConstants {
|
||||||
|
public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行目标key
|
||||||
|
*/
|
||||||
|
public static final String TASK_PROPERTIES = "TASK_PROPERTIES";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认
|
||||||
|
*/
|
||||||
|
public static final String MISFIRE_DEFAULT = "0";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 立即触发执行
|
||||||
|
*/
|
||||||
|
public static final String MISFIRE_IGNORE_MISFIRES = "1";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 触发一次执行
|
||||||
|
*/
|
||||||
|
public static final String MISFIRE_FIRE_AND_PROCEED = "2";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不触发立即执行
|
||||||
|
*/
|
||||||
|
public static final String MISFIRE_DO_NOTHING = "3";
|
||||||
|
|
||||||
|
public enum Status {
|
||||||
|
/**
|
||||||
|
* 正常
|
||||||
|
*/
|
||||||
|
NORMAL ("0"),
|
||||||
|
/**
|
||||||
|
* 暂停
|
||||||
|
*/
|
||||||
|
PAUSE ("1");
|
||||||
|
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
private Status (String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue () {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package com.zhn.common.core.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 权限相关通用常量
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class SecurityConstants {
|
||||||
|
/**
|
||||||
|
* 用户ID字段
|
||||||
|
*/
|
||||||
|
public static final String DETAILS_USER_ID = "user_id";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户名字段
|
||||||
|
*/
|
||||||
|
public static final String DETAILS_USERNAME = "username";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 授权信息字段
|
||||||
|
*/
|
||||||
|
public static final String AUTHORIZATION_HEADER = "authorization";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求来源
|
||||||
|
*/
|
||||||
|
public static final String FROM_SOURCE = "from-source";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 内部请求
|
||||||
|
*/
|
||||||
|
public static final String INNER = "inner";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户标识
|
||||||
|
*/
|
||||||
|
public static final String USER_KEY = "user_key";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录用户
|
||||||
|
*/
|
||||||
|
public static final String LOGIN_USER = "login_user";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色权限
|
||||||
|
*/
|
||||||
|
public static final String ROLE_PERMISSION = "role_permission";
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.zhn.common.core.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 服务名称
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class ServiceNameConstants {
|
||||||
|
/**
|
||||||
|
* 认证服务的serviceid
|
||||||
|
*/
|
||||||
|
public static final String AUTH_SERVICE = "zhn-auth";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统模块的serviceid
|
||||||
|
*/
|
||||||
|
public static final String SYSTEM_SERVICE = "zhn-system";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件服务的serviceid
|
||||||
|
*/
|
||||||
|
public static final String FILE_SERVICE = "zhn-file";
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.zhn.common.core.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Token的Key常量
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class TokenConstants {
|
||||||
|
/**
|
||||||
|
* 令牌自定义标识
|
||||||
|
*/
|
||||||
|
public static final String AUTHENTICATION = "Authorization";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 令牌前缀
|
||||||
|
*/
|
||||||
|
public static final String PREFIX = "Bearer ";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 令牌秘钥
|
||||||
|
*/
|
||||||
|
public final static String SECRET = "abcdefghijklmnopqrstuvwxyz";
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,113 @@
|
||||||
|
package com.zhn.common.core.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户常量信息
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class UserConstants {
|
||||||
|
/**
|
||||||
|
* 平台内系统用户的唯一标志
|
||||||
|
*/
|
||||||
|
public static final String SYS_USER = "SYS_USER";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 正常状态
|
||||||
|
*/
|
||||||
|
public static final String NORMAL = "0";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异常状态
|
||||||
|
*/
|
||||||
|
public static final String EXCEPTION = "1";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户封禁状态
|
||||||
|
*/
|
||||||
|
public static final String USER_DISABLE = "1";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色封禁状态
|
||||||
|
*/
|
||||||
|
public static final String ROLE_DISABLE = "1";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 部门正常状态
|
||||||
|
*/
|
||||||
|
public static final String DEPT_NORMAL = "0";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 部门停用状态
|
||||||
|
*/
|
||||||
|
public static final String DEPT_DISABLE = "1";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字典正常状态
|
||||||
|
*/
|
||||||
|
public static final String DICT_NORMAL = "0";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为系统默认(是)
|
||||||
|
*/
|
||||||
|
public static final String YES = "Y";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否菜单外链(是)
|
||||||
|
*/
|
||||||
|
public static final String YES_FRAME = "0";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否菜单外链(否)
|
||||||
|
*/
|
||||||
|
public static final String NO_FRAME = "1";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 菜单类型(目录)
|
||||||
|
*/
|
||||||
|
public static final String TYPE_DIR = "M";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 菜单类型(菜单)
|
||||||
|
*/
|
||||||
|
public static final String TYPE_MENU = "C";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 菜单类型(按钮)
|
||||||
|
*/
|
||||||
|
public static final String TYPE_BUTTON = "F";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Layout组件标识
|
||||||
|
*/
|
||||||
|
public final static String LAYOUT = "Layout";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ParentView组件标识
|
||||||
|
*/
|
||||||
|
public final static String PARENT_VIEW = "ParentView";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* InnerLink组件标识
|
||||||
|
*/
|
||||||
|
public final static String INNER_LINK = "InnerLink";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验是否唯一的返回标识
|
||||||
|
*/
|
||||||
|
public final static boolean UNIQUE = true;
|
||||||
|
public final static boolean NOT_UNIQUE = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户名长度限制
|
||||||
|
*/
|
||||||
|
public static final int USERNAME_MIN_LENGTH = 2;
|
||||||
|
|
||||||
|
public static final int USERNAME_MAX_LENGTH = 20;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 密码长度限制
|
||||||
|
*/
|
||||||
|
public static final int PASSWORD_MIN_LENGTH = 5;
|
||||||
|
|
||||||
|
public static final int PASSWORD_MAX_LENGTH = 20;
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
package com.zhn.common.core.context;
|
||||||
|
|
||||||
|
import com.alibaba.ttl.TransmittableThreadLocal;
|
||||||
|
import com.zhn.common.core.constant.SecurityConstants;
|
||||||
|
import com.zhn.common.core.text.Convert;
|
||||||
|
import com.zhn.common.core.utils.StringUtils;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前线程变量中的 用户id、用户名称、Token等信息
|
||||||
|
* 注意: 必须在网关通过请求头的方法传入,同时在HeaderInterceptor拦截器设置值。 否则这里无法获取
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class SecurityContextHolder {
|
||||||
|
private static final TransmittableThreadLocal<Map<String, Object>> THREAD_LOCAL = new TransmittableThreadLocal<> ();
|
||||||
|
|
||||||
|
public static <T> T get (String key, Class<T> clazz) {
|
||||||
|
Map<String, Object> map = getLocalMap ();
|
||||||
|
return StringUtils.cast (map.getOrDefault (key, null));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, Object> getLocalMap () {
|
||||||
|
Map<String, Object> map = THREAD_LOCAL.get ();
|
||||||
|
if (map == null) {
|
||||||
|
map = new ConcurrentHashMap<String, Object> ();
|
||||||
|
THREAD_LOCAL.set (map);
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setLocalMap (Map<String, Object> threadLocalMap) {
|
||||||
|
THREAD_LOCAL.set (threadLocalMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Long getUserId () {
|
||||||
|
return Convert.toLong (get (SecurityConstants.DETAILS_USER_ID), 0L);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String get (String key) {
|
||||||
|
Map<String, Object> map = getLocalMap ();
|
||||||
|
return Convert.toStr (map.getOrDefault (key, StringUtils.EMPTY));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setUserId (String account) {
|
||||||
|
set (SecurityConstants.DETAILS_USER_ID, account);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void set (String key, Object value) {
|
||||||
|
Map<String, Object> map = getLocalMap ();
|
||||||
|
map.put (key, value == null ? StringUtils.EMPTY : value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getUserName () {
|
||||||
|
return get (SecurityConstants.DETAILS_USERNAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setUserName (String username) {
|
||||||
|
set (SecurityConstants.DETAILS_USERNAME, username);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getUserKey () {
|
||||||
|
return get (SecurityConstants.USER_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setUserKey (String userKey) {
|
||||||
|
set (SecurityConstants.USER_KEY, userKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getPermission () {
|
||||||
|
return get (SecurityConstants.ROLE_PERMISSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setPermission (String permissions) {
|
||||||
|
set (SecurityConstants.ROLE_PERMISSION, permissions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void remove () {
|
||||||
|
THREAD_LOCAL.remove ();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,110 @@
|
||||||
|
package com.zhn.common.core.domain;
|
||||||
|
|
||||||
|
import com.zhn.common.core.constant.Constants;
|
||||||
|
import com.zhn.common.core.constant.HttpStatus;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 响应信息主体
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class Result<T> implements Serializable {
|
||||||
|
/**
|
||||||
|
* 成功
|
||||||
|
*/
|
||||||
|
public static final int SUCCESS = Constants.SUCCESS;
|
||||||
|
/**
|
||||||
|
* 失败
|
||||||
|
*/
|
||||||
|
public static final int FAIL = Constants.FAIL;
|
||||||
|
/**
|
||||||
|
* 警告
|
||||||
|
*/
|
||||||
|
public static final int WARN = HttpStatus.WARN;
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
private int code;
|
||||||
|
|
||||||
|
private String msg;
|
||||||
|
|
||||||
|
private T data;
|
||||||
|
|
||||||
|
public static <T> Result<T> success () {
|
||||||
|
return restResult (null, SUCCESS, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <T> Result<T> restResult (T data, int code, String msg) {
|
||||||
|
return Result.<T>builder ()
|
||||||
|
.code (code)
|
||||||
|
.data (data)
|
||||||
|
.msg (msg)
|
||||||
|
.build ();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Result<T> success (T data) {
|
||||||
|
return restResult (data, SUCCESS, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Result<T> success (T data, String msg) {
|
||||||
|
return restResult (data, SUCCESS, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Result<T> error () {
|
||||||
|
return restResult (null, FAIL, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Result<T> error (String msg) {
|
||||||
|
return restResult (null, FAIL, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Result<T> error (T data) {
|
||||||
|
return restResult (data, FAIL, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Result<T> error (T data, String msg) {
|
||||||
|
return restResult (data, FAIL, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Result<T> error (int code, String msg) {
|
||||||
|
return restResult (null, code, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Result<T> warn () {
|
||||||
|
return restResult (null, WARN, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Result<T> warn (String msg) {
|
||||||
|
return restResult (null, WARN, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Result<T> warn (T data) {
|
||||||
|
return restResult (data, WARN, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Result<T> warn (T data, String msg) {
|
||||||
|
return restResult (data, WARN, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Result<T> warn (int code, String msg) {
|
||||||
|
return restResult (null, code, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Boolean isError (Result<T> ret) {
|
||||||
|
return !isSuccess (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Boolean isSuccess (Result<T> ret) {
|
||||||
|
return Result.SUCCESS == ret.getCode ();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package com.zhn.common.core.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户状态
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public enum UserStatus {
|
||||||
|
OK ("0", "正常"), DISABLE ("1", "停用"), DELETED ("2", "删除");
|
||||||
|
|
||||||
|
private final String code;
|
||||||
|
private final String info;
|
||||||
|
|
||||||
|
UserStatus (String code, String info) {
|
||||||
|
this.code = code;
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCode () {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getInfo () {
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.zhn.common.core.exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证码错误异常类
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class CaptchaException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public CaptchaException (String msg) {
|
||||||
|
super (msg);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package com.zhn.common.core.exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查异常
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class CheckedException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public CheckedException (String message) {
|
||||||
|
super (message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CheckedException (Throwable cause) {
|
||||||
|
super (cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CheckedException (String message, Throwable cause) {
|
||||||
|
super (message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CheckedException (String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
|
||||||
|
super (message, cause, enableSuppression, writableStackTrace);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package com.zhn.common.core.exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 演示模式异常
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class DemoModeException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public DemoModeException () {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
package com.zhn.common.core.exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全局异常
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class GlobalException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误提示
|
||||||
|
*/
|
||||||
|
private String message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误明细,内部调试错误
|
||||||
|
* <p>
|
||||||
|
* 和 {@link CommonResult#getDetailMessage()} 一致的设计
|
||||||
|
*/
|
||||||
|
private String detailMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 空构造方法,避免反序列化问题
|
||||||
|
*/
|
||||||
|
public GlobalException () {
|
||||||
|
}
|
||||||
|
|
||||||
|
public GlobalException (String message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDetailMessage () {
|
||||||
|
return detailMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GlobalException setDetailMessage (String detailMessage) {
|
||||||
|
this.detailMessage = detailMessage;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMessage () {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GlobalException setMessage (String message) {
|
||||||
|
this.message = message;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.zhn.common.core.exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 内部认证异常
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class InnerAuthException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public InnerAuthException (String message) {
|
||||||
|
super (message);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package com.zhn.common.core.exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 权限异常
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class PreAuthorizeException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public PreAuthorizeException () {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
package com.zhn.common.core.exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 业务异常
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public final class ServiceException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误码
|
||||||
|
*/
|
||||||
|
private Integer code;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误提示
|
||||||
|
*/
|
||||||
|
private String message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误明细,内部调试错误
|
||||||
|
* <p>
|
||||||
|
* 和 {@link CommonResult#getDetailMessage()} 一致的设计
|
||||||
|
*/
|
||||||
|
private String detailMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 空构造方法,避免反序列化问题
|
||||||
|
*/
|
||||||
|
public ServiceException () {
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceException (String message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceException (String message, Integer code) {
|
||||||
|
this.message = message;
|
||||||
|
this.code = code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDetailMessage () {
|
||||||
|
return detailMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceException setDetailMessage (String detailMessage) {
|
||||||
|
this.detailMessage = detailMessage;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMessage () {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceException setMessage (String message) {
|
||||||
|
this.message = message;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getCode () {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package com.zhn.common.core.exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 工具类异常
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class UtilException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 8247610319171014183L;
|
||||||
|
|
||||||
|
public UtilException (Throwable e) {
|
||||||
|
super (e.getMessage (), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UtilException (String message) {
|
||||||
|
super (message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UtilException (String message, Throwable throwable) {
|
||||||
|
super (message, throwable);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.zhn.common.core.exception.auth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 未能通过的登录认证异常
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class NotLoginException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public NotLoginException (String message) {
|
||||||
|
super (message);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package com.zhn.common.core.exception.auth;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 未能通过的权限认证异常
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class NotPermissionException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public NotPermissionException (String permission) {
|
||||||
|
super (permission);
|
||||||
|
}
|
||||||
|
|
||||||
|
public NotPermissionException (String[] permissions) {
|
||||||
|
super (StringUtils.join (permissions, ","));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package com.zhn.common.core.exception.auth;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 未能通过的角色认证异常
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class NotRoleException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public NotRoleException (String role) {
|
||||||
|
super (role);
|
||||||
|
}
|
||||||
|
|
||||||
|
public NotRoleException (String[] roles) {
|
||||||
|
super (StringUtils.join (roles, ","));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
package com.zhn.common.core.exception.base;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础异常
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class BaseException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所属模块
|
||||||
|
*/
|
||||||
|
private String module;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误码
|
||||||
|
*/
|
||||||
|
private String code;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误码对应的参数
|
||||||
|
*/
|
||||||
|
private Object[] args;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误消息
|
||||||
|
*/
|
||||||
|
private String defaultMessage;
|
||||||
|
|
||||||
|
public BaseException (String module, String code, Object[] args) {
|
||||||
|
this (module, code, args, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaseException (String module, String code, Object[] args, String defaultMessage) {
|
||||||
|
this.module = module;
|
||||||
|
this.code = code;
|
||||||
|
this.args = args;
|
||||||
|
this.defaultMessage = defaultMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaseException (String module, String defaultMessage) {
|
||||||
|
this (module, null, null, defaultMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaseException (String code, Object[] args) {
|
||||||
|
this (null, code, args, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaseException (String defaultMessage) {
|
||||||
|
this (null, null, null, defaultMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getModule () {
|
||||||
|
return module;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCode () {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object[] getArgs () {
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDefaultMessage () {
|
||||||
|
return defaultMessage;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package com.zhn.common.core.exception.file;
|
||||||
|
|
||||||
|
import com.zhn.common.core.exception.base.BaseException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件信息异常类
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class FileException extends BaseException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public FileException (String code, Object[] args, String msg) {
|
||||||
|
super ("file", code, args, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.zhn.common.core.exception.file;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件名称超长限制异常类
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class FileNameLengthLimitExceededException extends com.zhn.common.core.exception.file.FileException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public FileNameLengthLimitExceededException (int defaultFileNameLength) {
|
||||||
|
super ("upload.filename.exceed.length", new Object[]{defaultFileNameLength}, "the filename is too long");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.zhn.common.core.exception.file;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件名大小限制异常类
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class FileSizeLimitExceededException extends com.zhn.common.core.exception.file.FileException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public FileSizeLimitExceededException (long defaultMaxSize) {
|
||||||
|
super ("upload.exceed.maxSize", new Object[]{defaultMaxSize}, "the filesize is too large");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
package com.zhn.common.core.exception.file;
|
||||||
|
|
||||||
|
import java.io.PrintStream;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件上传异常类
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class FileUploadException extends Exception {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private final Throwable cause;
|
||||||
|
|
||||||
|
public FileUploadException () {
|
||||||
|
this (null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileUploadException (String msg, Throwable cause) {
|
||||||
|
super (msg);
|
||||||
|
this.cause = cause;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileUploadException (final String msg) {
|
||||||
|
this (msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Throwable getCause () {
|
||||||
|
return cause;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void printStackTrace (PrintStream stream) {
|
||||||
|
super.printStackTrace (stream);
|
||||||
|
if (cause != null) {
|
||||||
|
stream.println ("Caused by:");
|
||||||
|
cause.printStackTrace (stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void printStackTrace (PrintWriter writer) {
|
||||||
|
super.printStackTrace (writer);
|
||||||
|
if (cause != null) {
|
||||||
|
writer.println ("Caused by:");
|
||||||
|
cause.printStackTrace (writer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
package com.zhn.common.core.exception.file;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件上传 误异常类
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class InvalidExtensionException extends FileUploadException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private String[] allowedExtension;
|
||||||
|
private String extension;
|
||||||
|
private String filename;
|
||||||
|
|
||||||
|
public InvalidExtensionException (String[] allowedExtension, String extension, String filename) {
|
||||||
|
super ("filename : [" + filename + "], extension : [" + extension + "], allowed extension : [" + Arrays.toString (allowedExtension) + "]");
|
||||||
|
this.allowedExtension = allowedExtension;
|
||||||
|
this.extension = extension;
|
||||||
|
this.filename = filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getAllowedExtension () {
|
||||||
|
return allowedExtension;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getExtension () {
|
||||||
|
return extension;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFilename () {
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class InvalidImageExtensionException extends InvalidExtensionException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public InvalidImageExtensionException (String[] allowedExtension, String extension, String filename) {
|
||||||
|
super (allowedExtension, extension, filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class InvalidFlashExtensionException extends InvalidExtensionException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public InvalidFlashExtensionException (String[] allowedExtension, String extension, String filename) {
|
||||||
|
super (allowedExtension, extension, filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class InvalidMediaExtensionException extends InvalidExtensionException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public InvalidMediaExtensionException (String[] allowedExtension, String extension, String filename) {
|
||||||
|
super (allowedExtension, extension, filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class InvalidVideoExtensionException extends InvalidExtensionException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public InvalidVideoExtensionException (String[] allowedExtension, String extension, String filename) {
|
||||||
|
super (allowedExtension, extension, filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.zhn.common.core.exception.job;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计划策略异常
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class TaskException extends Exception {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private Code code;
|
||||||
|
|
||||||
|
public TaskException (String msg, Code code) {
|
||||||
|
this (msg, code, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TaskException (String msg, Code code, Exception nestedEx) {
|
||||||
|
super (msg, nestedEx);
|
||||||
|
this.code = code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Code getCode () {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Code {
|
||||||
|
TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.zhn.common.core.exception.user;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证码失效异常类
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class CaptchaExpireException extends UserException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public CaptchaExpireException () {
|
||||||
|
super ("user.jcaptcha.expire", null);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.zhn.common.core.exception.user;
|
||||||
|
|
||||||
|
import com.zhn.common.core.exception.base.BaseException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户信息异常类
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class UserException extends BaseException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public UserException (String code, Object[] args) {
|
||||||
|
super ("user", code, args, null);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.zhn.common.core.exception.user;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户密码不正确或不符合规范异常类
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class UserPasswordNotMatchException extends UserException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public UserPasswordNotMatchException () {
|
||||||
|
super ("user.password.not.match", null);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,94 @@
|
||||||
|
package com.zhn.common.core.text;
|
||||||
|
|
||||||
|
import com.zhn.common.core.utils.StringUtils;
|
||||||
|
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字符集工具类
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class CharsetKit {
|
||||||
|
/**
|
||||||
|
* ISO-8859-1
|
||||||
|
*/
|
||||||
|
public static final String ISO_8859_1 = "ISO-8859-1";
|
||||||
|
/**
|
||||||
|
* UTF-8
|
||||||
|
*/
|
||||||
|
public static final String UTF_8 = "UTF-8";
|
||||||
|
/**
|
||||||
|
* GBK
|
||||||
|
*/
|
||||||
|
public static final String GBK = "GBK";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ISO-8859-1
|
||||||
|
*/
|
||||||
|
public static final Charset CHARSET_ISO_8859_1 = Charset.forName (ISO_8859_1);
|
||||||
|
/**
|
||||||
|
* UTF-8
|
||||||
|
*/
|
||||||
|
public static final Charset CHARSET_UTF_8 = Charset.forName (UTF_8);
|
||||||
|
/**
|
||||||
|
* GBK
|
||||||
|
*/
|
||||||
|
public static final Charset CHARSET_GBK = Charset.forName (GBK);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为Charset对象
|
||||||
|
*
|
||||||
|
* @param charset 字符集,为空则返回默认字符集
|
||||||
|
*
|
||||||
|
* @return Charset
|
||||||
|
*/
|
||||||
|
public static Charset charset (String charset) {
|
||||||
|
return StringUtils.isEmpty (charset) ? Charset.defaultCharset () : Charset.forName (charset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换字符串的字符集编码
|
||||||
|
*
|
||||||
|
* @param source 字符串
|
||||||
|
* @param srcCharset 源字符集,默认ISO-8859-1
|
||||||
|
* @param destCharset 目标字符集,默认UTF-8
|
||||||
|
*
|
||||||
|
* @return 转换后的字符集
|
||||||
|
*/
|
||||||
|
public static String convert (String source, String srcCharset, String destCharset) {
|
||||||
|
return convert (source, Charset.forName (srcCharset), Charset.forName (destCharset));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换字符串的字符集编码
|
||||||
|
*
|
||||||
|
* @param source 字符串
|
||||||
|
* @param srcCharset 源字符集,默认ISO-8859-1
|
||||||
|
* @param destCharset 目标字符集,默认UTF-8
|
||||||
|
*
|
||||||
|
* @return 转换后的字符集
|
||||||
|
*/
|
||||||
|
public static String convert (String source, Charset srcCharset, Charset destCharset) {
|
||||||
|
if (null == srcCharset) {
|
||||||
|
srcCharset = StandardCharsets.ISO_8859_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null == destCharset) {
|
||||||
|
destCharset = StandardCharsets.UTF_8;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringUtils.isEmpty (source) || srcCharset.equals (destCharset)) {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
return new String (source.getBytes (srcCharset), destCharset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return 系统字符集编码
|
||||||
|
*/
|
||||||
|
public static String systemCharset () {
|
||||||
|
return Charset.defaultCharset ().name ();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,918 @@
|
||||||
|
package com.zhn.common.core.text;
|
||||||
|
|
||||||
|
import com.zhn.common.core.utils.StringUtils;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.math.RoundingMode;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.text.NumberFormat;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 类型转换器
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class Convert {
|
||||||
|
/**
|
||||||
|
* 转换为字符串<br>
|
||||||
|
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static String toStr (Object value) {
|
||||||
|
return toStr (value, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为字符串<br>
|
||||||
|
* 如果给定的值为null,或者转换失败,返回默认值<br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
* @param defaultValue 转换错误时的默认值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static String toStr (Object value, String defaultValue) {
|
||||||
|
if (null == value) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
if (value instanceof String) {
|
||||||
|
return (String) value;
|
||||||
|
}
|
||||||
|
return value.toString ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为字符<br>
|
||||||
|
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Character toChar (Object value) {
|
||||||
|
return toChar (value, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为字符<br>
|
||||||
|
* 如果给定的值为null,或者转换失败,返回默认值<br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
* @param defaultValue 转换错误时的默认值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Character toChar (Object value, Character defaultValue) {
|
||||||
|
if (null == value) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
if (value instanceof Character) {
|
||||||
|
return (Character) value;
|
||||||
|
}
|
||||||
|
|
||||||
|
final String valueStr = toStr (value, null);
|
||||||
|
return StringUtils.isEmpty (valueStr) ? defaultValue : valueStr.charAt (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为byte<br>
|
||||||
|
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Byte toByte (Object value) {
|
||||||
|
return toByte (value, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为byte<br>
|
||||||
|
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
* @param defaultValue 转换错误时的默认值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Byte toByte (Object value, Byte defaultValue) {
|
||||||
|
if (value == null) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
if (value instanceof Byte) {
|
||||||
|
return (Byte) value;
|
||||||
|
}
|
||||||
|
if (value instanceof Number) {
|
||||||
|
return ((Number) value).byteValue ();
|
||||||
|
}
|
||||||
|
final String valueStr = toStr (value, null);
|
||||||
|
if (StringUtils.isEmpty (valueStr)) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return Byte.parseByte (valueStr);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为Short<br>
|
||||||
|
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Short toShort (Object value) {
|
||||||
|
return toShort (value, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为Short<br>
|
||||||
|
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
* @param defaultValue 转换错误时的默认值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Short toShort (Object value, Short defaultValue) {
|
||||||
|
if (value == null) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
if (value instanceof Short) {
|
||||||
|
return (Short) value;
|
||||||
|
}
|
||||||
|
if (value instanceof Number) {
|
||||||
|
return ((Number) value).shortValue ();
|
||||||
|
}
|
||||||
|
final String valueStr = toStr (value, null);
|
||||||
|
if (StringUtils.isEmpty (valueStr)) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return Short.parseShort (valueStr.trim ());
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为Number<br>
|
||||||
|
* 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Number toNumber (Object value) {
|
||||||
|
return toNumber (value, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为Number<br>
|
||||||
|
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
* @param defaultValue 转换错误时的默认值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Number toNumber (Object value, Number defaultValue) {
|
||||||
|
if (value == null) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
if (value instanceof Number) {
|
||||||
|
return (Number) value;
|
||||||
|
}
|
||||||
|
final String valueStr = toStr (value, null);
|
||||||
|
if (StringUtils.isEmpty (valueStr)) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return NumberFormat.getInstance ().parse (valueStr);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为int<br>
|
||||||
|
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Integer toInt (Object value) {
|
||||||
|
return toInt (value, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为int<br>
|
||||||
|
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
* @param defaultValue 转换错误时的默认值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Integer toInt (Object value, Integer defaultValue) {
|
||||||
|
if (value == null) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
if (value instanceof Integer) {
|
||||||
|
return (Integer) value;
|
||||||
|
}
|
||||||
|
if (value instanceof Number) {
|
||||||
|
return ((Number) value).intValue ();
|
||||||
|
}
|
||||||
|
final String valueStr = toStr (value, null);
|
||||||
|
if (StringUtils.isEmpty (valueStr)) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return Integer.parseInt (valueStr.trim ());
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为Integer数组<br>
|
||||||
|
*
|
||||||
|
* @param str 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Integer[] toIntArray (String str) {
|
||||||
|
return toIntArray (",", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为Integer数组<br>
|
||||||
|
*
|
||||||
|
* @param split 分隔符
|
||||||
|
* @param str 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Integer[] toIntArray (String split, String str) {
|
||||||
|
if (StringUtils.isEmpty (str)) {
|
||||||
|
return new Integer[]{};
|
||||||
|
}
|
||||||
|
String[] arr = str.split (split);
|
||||||
|
final Integer[] ints = new Integer[arr.length];
|
||||||
|
for (int i = 0; i < arr.length; i++) {
|
||||||
|
final Integer v = toInt (arr[i], 0);
|
||||||
|
ints[i] = v;
|
||||||
|
}
|
||||||
|
return ints;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为Long数组<br>
|
||||||
|
*
|
||||||
|
* @param str 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Long[] toLongArray (String str) {
|
||||||
|
return toLongArray (",", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为Long数组<br>
|
||||||
|
*
|
||||||
|
* @param split 分隔符
|
||||||
|
* @param str 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Long[] toLongArray (String split, String str) {
|
||||||
|
if (StringUtils.isEmpty (str)) {
|
||||||
|
return new Long[]{};
|
||||||
|
}
|
||||||
|
String[] arr = str.split (split);
|
||||||
|
final Long[] longs = new Long[arr.length];
|
||||||
|
for (int i = 0; i < arr.length; i++) {
|
||||||
|
final Long v = toLong (arr[i], null);
|
||||||
|
longs[i] = v;
|
||||||
|
}
|
||||||
|
return longs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为long<br>
|
||||||
|
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
* @param defaultValue 转换错误时的默认值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Long toLong (Object value, Long defaultValue) {
|
||||||
|
if (value == null) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
if (value instanceof Long) {
|
||||||
|
return (Long) value;
|
||||||
|
}
|
||||||
|
if (value instanceof Number) {
|
||||||
|
return ((Number) value).longValue ();
|
||||||
|
}
|
||||||
|
final String valueStr = toStr (value, null);
|
||||||
|
if (StringUtils.isEmpty (valueStr)) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// 支持科学计数法
|
||||||
|
return new BigDecimal (valueStr.trim ()).longValue ();
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为String数组<br>
|
||||||
|
*
|
||||||
|
* @param str 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static String[] toStrArray (String str) {
|
||||||
|
return toStrArray (",", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为String数组<br>
|
||||||
|
*
|
||||||
|
* @param split 分隔符
|
||||||
|
* @param str 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static String[] toStrArray (String split, String str) {
|
||||||
|
return str.split (split);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为long<br>
|
||||||
|
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Long toLong (Object value) {
|
||||||
|
return toLong (value, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为double<br>
|
||||||
|
* 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Double toDouble (Object value) {
|
||||||
|
return toDouble (value, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为double<br>
|
||||||
|
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
* @param defaultValue 转换错误时的默认值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Double toDouble (Object value, Double defaultValue) {
|
||||||
|
if (value == null) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
if (value instanceof Double) {
|
||||||
|
return (Double) value;
|
||||||
|
}
|
||||||
|
if (value instanceof Number) {
|
||||||
|
return ((Number) value).doubleValue ();
|
||||||
|
}
|
||||||
|
final String valueStr = toStr (value, null);
|
||||||
|
if (StringUtils.isEmpty (valueStr)) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// 支持科学计数法
|
||||||
|
return new BigDecimal (valueStr.trim ()).doubleValue ();
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为Float<br>
|
||||||
|
* 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Float toFloat (Object value) {
|
||||||
|
return toFloat (value, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为Float<br>
|
||||||
|
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
* @param defaultValue 转换错误时的默认值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Float toFloat (Object value, Float defaultValue) {
|
||||||
|
if (value == null) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
if (value instanceof Float) {
|
||||||
|
return (Float) value;
|
||||||
|
}
|
||||||
|
if (value instanceof Number) {
|
||||||
|
return ((Number) value).floatValue ();
|
||||||
|
}
|
||||||
|
final String valueStr = toStr (value, null);
|
||||||
|
if (StringUtils.isEmpty (valueStr)) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return Float.parseFloat (valueStr.trim ());
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为boolean<br>
|
||||||
|
* 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Boolean toBool (Object value) {
|
||||||
|
return toBool (value, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为boolean<br>
|
||||||
|
* String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
* @param defaultValue 转换错误时的默认值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Boolean toBool (Object value, Boolean defaultValue) {
|
||||||
|
if (value == null) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
if (value instanceof Boolean) {
|
||||||
|
return (Boolean) value;
|
||||||
|
}
|
||||||
|
String valueStr = toStr (value, null);
|
||||||
|
if (StringUtils.isEmpty (valueStr)) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
valueStr = valueStr.trim ().toLowerCase ();
|
||||||
|
switch (valueStr) {
|
||||||
|
case "true":
|
||||||
|
case "yes":
|
||||||
|
case "ok":
|
||||||
|
case "1":
|
||||||
|
return true;
|
||||||
|
case "false":
|
||||||
|
case "no":
|
||||||
|
case "0":
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为Enum对象<br>
|
||||||
|
* 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
|
||||||
|
*
|
||||||
|
* @param clazz Enum的Class
|
||||||
|
* @param value 值
|
||||||
|
*
|
||||||
|
* @return Enum
|
||||||
|
*/
|
||||||
|
public static <E extends Enum<E>> E toEnum (Class<E> clazz, Object value) {
|
||||||
|
return toEnum (clazz, value, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为Enum对象<br>
|
||||||
|
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||||
|
*
|
||||||
|
* @param clazz Enum的Class
|
||||||
|
* @param value 值
|
||||||
|
* @param defaultValue 默认值
|
||||||
|
*
|
||||||
|
* @return Enum
|
||||||
|
*/
|
||||||
|
public static <E extends Enum<E>> E toEnum (Class<E> clazz, Object value, E defaultValue) {
|
||||||
|
if (value == null) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
if (clazz.isAssignableFrom (value.getClass ())) {
|
||||||
|
@SuppressWarnings ("unchecked")
|
||||||
|
E myE = (E) value;
|
||||||
|
return myE;
|
||||||
|
}
|
||||||
|
final String valueStr = toStr (value, null);
|
||||||
|
if (StringUtils.isEmpty (valueStr)) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return Enum.valueOf (clazz, valueStr);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为BigInteger<br>
|
||||||
|
* 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static BigInteger toBigInteger (Object value) {
|
||||||
|
return toBigInteger (value, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为BigInteger<br>
|
||||||
|
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
* @param defaultValue 转换错误时的默认值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static BigInteger toBigInteger (Object value, BigInteger defaultValue) {
|
||||||
|
if (value == null) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
if (value instanceof BigInteger) {
|
||||||
|
return (BigInteger) value;
|
||||||
|
}
|
||||||
|
if (value instanceof Long) {
|
||||||
|
return BigInteger.valueOf ((Long) value);
|
||||||
|
}
|
||||||
|
final String valueStr = toStr (value, null);
|
||||||
|
if (StringUtils.isEmpty (valueStr)) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return new BigInteger (valueStr);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为BigDecimal<br>
|
||||||
|
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static BigDecimal toBigDecimal (Object value) {
|
||||||
|
return toBigDecimal (value, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换为BigDecimal<br>
|
||||||
|
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||||
|
* 转换失败不会报错
|
||||||
|
*
|
||||||
|
* @param value 被转换的值
|
||||||
|
* @param defaultValue 转换错误时的默认值
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static BigDecimal toBigDecimal (Object value, BigDecimal defaultValue) {
|
||||||
|
if (value == null) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
if (value instanceof BigDecimal) {
|
||||||
|
return (BigDecimal) value;
|
||||||
|
}
|
||||||
|
if (value instanceof Long) {
|
||||||
|
return new BigDecimal ((Long) value);
|
||||||
|
}
|
||||||
|
if (value instanceof Double) {
|
||||||
|
return BigDecimal.valueOf ((Double) value);
|
||||||
|
}
|
||||||
|
if (value instanceof Integer) {
|
||||||
|
return new BigDecimal ((Integer) value);
|
||||||
|
}
|
||||||
|
final String valueStr = toStr (value, null);
|
||||||
|
if (StringUtils.isEmpty (valueStr)) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return new BigDecimal (valueStr);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将对象转为字符串<br>
|
||||||
|
* 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
|
||||||
|
*
|
||||||
|
* @param obj 对象
|
||||||
|
*
|
||||||
|
* @return 字符串
|
||||||
|
*/
|
||||||
|
public static String utf8Str (Object obj) {
|
||||||
|
return str (obj, com.zhn.common.core.text.CharsetKit.CHARSET_UTF_8);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将对象转为字符串<br>
|
||||||
|
* 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
|
||||||
|
*
|
||||||
|
* @param obj 对象
|
||||||
|
* @param charset 字符集
|
||||||
|
*
|
||||||
|
* @return 字符串
|
||||||
|
*/
|
||||||
|
public static String str (Object obj, Charset charset) {
|
||||||
|
if (null == obj) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj instanceof String) {
|
||||||
|
return (String) obj;
|
||||||
|
}
|
||||||
|
else if (obj instanceof byte[] || obj instanceof Byte[]) {
|
||||||
|
if (obj instanceof byte[]) {
|
||||||
|
return str ((byte[]) obj, charset);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Byte[] bytes = (Byte[]) obj;
|
||||||
|
int length = bytes.length;
|
||||||
|
byte[] dest = new byte[length];
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
dest[i] = bytes[i];
|
||||||
|
}
|
||||||
|
return str (dest, charset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (obj instanceof ByteBuffer) {
|
||||||
|
return str ((ByteBuffer) obj, charset);
|
||||||
|
}
|
||||||
|
return obj.toString ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解码字节码
|
||||||
|
*
|
||||||
|
* @param data 字符串
|
||||||
|
* @param charset 字符集,如果此字段为空,则解码的结果取决于平台
|
||||||
|
*
|
||||||
|
* @return 解码后的字符串
|
||||||
|
*/
|
||||||
|
public static String str (byte[] data, Charset charset) {
|
||||||
|
if (data == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null == charset) {
|
||||||
|
return new String (data);
|
||||||
|
}
|
||||||
|
return new String (data, charset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将编码的byteBuffer数据转换为字符串
|
||||||
|
*
|
||||||
|
* @param data 数据
|
||||||
|
* @param charset 字符集,如果为空使用当前系统字符集
|
||||||
|
*
|
||||||
|
* @return 字符串
|
||||||
|
*/
|
||||||
|
public static String str (ByteBuffer data, Charset charset) {
|
||||||
|
if (null == charset) {
|
||||||
|
charset = Charset.defaultCharset ();
|
||||||
|
}
|
||||||
|
return charset.decode (data).toString ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将对象转为字符串<br>
|
||||||
|
* 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
|
||||||
|
*
|
||||||
|
* @param obj 对象
|
||||||
|
* @param charsetName 字符集
|
||||||
|
*
|
||||||
|
* @return 字符串
|
||||||
|
*/
|
||||||
|
public static String str (Object obj, String charsetName) {
|
||||||
|
return str (obj, Charset.forName (charsetName));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将byte数组转为字符串
|
||||||
|
*
|
||||||
|
* @param bytes byte数组
|
||||||
|
* @param charset 字符集
|
||||||
|
*
|
||||||
|
* @return 字符串
|
||||||
|
*/
|
||||||
|
public static String str (byte[] bytes, String charset) {
|
||||||
|
return str (bytes, StringUtils.isEmpty (charset) ? Charset.defaultCharset () : Charset.forName (charset));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将编码的byteBuffer数据转换为字符串
|
||||||
|
*
|
||||||
|
* @param data 数据
|
||||||
|
* @param charset 字符集,如果为空使用当前系统字符集
|
||||||
|
*
|
||||||
|
* @return 字符串
|
||||||
|
*/
|
||||||
|
public static String str (ByteBuffer data, String charset) {
|
||||||
|
if (data == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return str (data, Charset.forName (charset));
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------- 全角半角转换
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 半角转全角
|
||||||
|
*
|
||||||
|
* @param input String.
|
||||||
|
*
|
||||||
|
* @return 全角字符串.
|
||||||
|
*/
|
||||||
|
public static String toSBC (String input) {
|
||||||
|
return toSBC (input, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 半角转全角
|
||||||
|
*
|
||||||
|
* @param input String
|
||||||
|
* @param notConvertSet 不替换的字符集合
|
||||||
|
*
|
||||||
|
* @return 全角字符串.
|
||||||
|
*/
|
||||||
|
public static String toSBC (String input, Set<Character> notConvertSet) {
|
||||||
|
char[] c = input.toCharArray ();
|
||||||
|
for (int i = 0; i < c.length; i++) {
|
||||||
|
if (null != notConvertSet && notConvertSet.contains (c[i])) {
|
||||||
|
// 跳过不替换的字符
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c[i] == ' ') {
|
||||||
|
c[i] = '\u3000';
|
||||||
|
}
|
||||||
|
else if (c[i] < '\177') {
|
||||||
|
c[i] = (char) (c[i] + 65248);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new String (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全角转半角
|
||||||
|
*
|
||||||
|
* @param input String.
|
||||||
|
*
|
||||||
|
* @return 半角字符串
|
||||||
|
*/
|
||||||
|
public static String toDBC (String input) {
|
||||||
|
return toDBC (input, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 替换全角为半角
|
||||||
|
*
|
||||||
|
* @param text 文本
|
||||||
|
* @param notConvertSet 不替换的字符集合
|
||||||
|
*
|
||||||
|
* @return 替换后的字符
|
||||||
|
*/
|
||||||
|
public static String toDBC (String text, Set<Character> notConvertSet) {
|
||||||
|
char[] c = text.toCharArray ();
|
||||||
|
for (int i = 0; i < c.length; i++) {
|
||||||
|
if (null != notConvertSet && notConvertSet.contains (c[i])) {
|
||||||
|
// 跳过不替换的字符
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c[i] == '\u3000') {
|
||||||
|
c[i] = ' ';
|
||||||
|
}
|
||||||
|
else if (c[i] > '\uFF00' && c[i] < '\uFF5F') {
|
||||||
|
c[i] = (char) (c[i] - 65248);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new String (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数字金额大写转换 先写个完整的然后将如零拾替换成零
|
||||||
|
*
|
||||||
|
* @param n 数字
|
||||||
|
*
|
||||||
|
* @return 中文大写数字
|
||||||
|
*/
|
||||||
|
public static String digitUppercase (double n) {
|
||||||
|
String[] fraction = {"角", "分"};
|
||||||
|
String[] digit = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
|
||||||
|
String[][] unit = {{"元", "万", "亿"}, {"", "拾", "佰", "仟"}};
|
||||||
|
|
||||||
|
String head = n < 0 ? "负" : "";
|
||||||
|
n = Math.abs (n);
|
||||||
|
|
||||||
|
String s = "";
|
||||||
|
for (int i = 0; i < fraction.length; i++) {
|
||||||
|
// 优化double计算精度丢失问题
|
||||||
|
BigDecimal nNum = new BigDecimal (n);
|
||||||
|
BigDecimal decimal = new BigDecimal (10);
|
||||||
|
BigDecimal scale = nNum.multiply (decimal).setScale (2, RoundingMode.HALF_EVEN);
|
||||||
|
double d = scale.doubleValue ();
|
||||||
|
s += (digit[(int) (Math.floor (d * Math.pow (10, i)) % 10)] + fraction[i]).replaceAll ("(零.)+", "");
|
||||||
|
}
|
||||||
|
if (s.length () < 1) {
|
||||||
|
s = "整";
|
||||||
|
}
|
||||||
|
int integerPart = (int) Math.floor (n);
|
||||||
|
|
||||||
|
for (int i = 0; i < unit[0].length && integerPart > 0; i++) {
|
||||||
|
String p = "";
|
||||||
|
for (int j = 0; j < unit[1].length && n > 0; j++) {
|
||||||
|
p = digit[integerPart % 10] + unit[1][j] + p;
|
||||||
|
integerPart = integerPart / 10;
|
||||||
|
}
|
||||||
|
s = p.replaceAll ("(零.)*零$", "").replaceAll ("^$", "零") + unit[0][i] + s;
|
||||||
|
}
|
||||||
|
return head + s.replaceAll ("(零.)*零元", "元").replaceFirst ("(零.)+", "").replaceAll ("(零.)+", "零").replaceAll ("^整$", "零元整");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
package com.zhn.common.core.text;
|
||||||
|
|
||||||
|
import com.zhn.common.core.utils.StringUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字符串格式化
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class StrFormatter {
|
||||||
|
public static final String EMPTY_JSON = "{}";
|
||||||
|
public static final char C_BACKSLASH = '\\';
|
||||||
|
public static final char C_DELIM_START = '{';
|
||||||
|
public static final char C_DELIM_END = '}';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 格式化字符串<br>
|
||||||
|
* 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
|
||||||
|
* 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
|
||||||
|
* 例:<br>
|
||||||
|
* 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
|
||||||
|
* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
|
||||||
|
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
|
||||||
|
*
|
||||||
|
* @param strPattern 字符串模板
|
||||||
|
* @param argArray 参数列表
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static String format (final String strPattern, final Object... argArray) {
|
||||||
|
if (StringUtils.isEmpty (strPattern) || StringUtils.isEmpty (argArray)) {
|
||||||
|
return strPattern;
|
||||||
|
}
|
||||||
|
final int strPatternLength = strPattern.length ();
|
||||||
|
|
||||||
|
// 初始化定义好的长度以获得更好的性能
|
||||||
|
StringBuilder sbuf = new StringBuilder (strPatternLength + 50);
|
||||||
|
|
||||||
|
int handledPosition = 0;
|
||||||
|
int delimIndex;// 占位符所在位置
|
||||||
|
for (int argIndex = 0; argIndex < argArray.length; argIndex++) {
|
||||||
|
delimIndex = strPattern.indexOf (EMPTY_JSON, handledPosition);
|
||||||
|
if (delimIndex == -1) {
|
||||||
|
if (handledPosition == 0) {
|
||||||
|
return strPattern;
|
||||||
|
}
|
||||||
|
else { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
|
||||||
|
sbuf.append (strPattern, handledPosition, strPatternLength);
|
||||||
|
return sbuf.toString ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (delimIndex > 0 && strPattern.charAt (delimIndex - 1) == C_BACKSLASH) {
|
||||||
|
if (delimIndex > 1 && strPattern.charAt (delimIndex - 2) == C_BACKSLASH) {
|
||||||
|
// 转义符之前还有一个转义符,占位符依旧有效
|
||||||
|
sbuf.append (strPattern, handledPosition, delimIndex - 1);
|
||||||
|
sbuf.append (com.zhn.common.core.text.Convert.utf8Str (argArray[argIndex]));
|
||||||
|
handledPosition = delimIndex + 2;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// 占位符被转义
|
||||||
|
argIndex--;
|
||||||
|
sbuf.append (strPattern, handledPosition, delimIndex - 1);
|
||||||
|
sbuf.append (C_DELIM_START);
|
||||||
|
handledPosition = delimIndex + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// 正常占位符
|
||||||
|
sbuf.append (strPattern, handledPosition, delimIndex);
|
||||||
|
sbuf.append (com.zhn.common.core.text.Convert.utf8Str (argArray[argIndex]));
|
||||||
|
handledPosition = delimIndex + 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 加入最后一个占位符后所有的字符
|
||||||
|
sbuf.append (strPattern, handledPosition, strPattern.length ());
|
||||||
|
|
||||||
|
return sbuf.toString ();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,160 @@
|
||||||
|
package com.zhn.common.core.utils;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.time.DateFormatUtils;
|
||||||
|
|
||||||
|
import java.lang.management.ManagementFactory;
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.time.*;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 时间工具类
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
||||||
|
public static String YYYY = "yyyy";
|
||||||
|
|
||||||
|
public static String YYYY_MM = "yyyy-MM";
|
||||||
|
|
||||||
|
public static String YYYY_MM_DD = "yyyy-MM-dd";
|
||||||
|
|
||||||
|
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
|
||||||
|
|
||||||
|
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
|
||||||
|
|
||||||
|
private static String[] parsePatterns = {
|
||||||
|
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
|
||||||
|
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
|
||||||
|
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前Date型日期
|
||||||
|
*
|
||||||
|
* @return Date() 当前日期
|
||||||
|
*/
|
||||||
|
public static Date getNowDate () {
|
||||||
|
return new Date ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前日期, 默认格式为yyyy-MM-dd
|
||||||
|
*
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public static String getDate () {
|
||||||
|
return dateTimeNow (YYYY_MM_DD);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final String dateTimeNow (final String format) {
|
||||||
|
return parseDateToStr (format, new Date ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final String parseDateToStr (final String format, final Date date) {
|
||||||
|
return new SimpleDateFormat (format).format (date);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final String getTime () {
|
||||||
|
return dateTimeNow (YYYY_MM_DD_HH_MM_SS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final String dateTimeNow () {
|
||||||
|
return dateTimeNow (YYYYMMDDHHMMSS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final String dateTime (final Date date) {
|
||||||
|
return parseDateToStr (YYYY_MM_DD, date);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Date dateTime (final String format, final String ts) {
|
||||||
|
try {
|
||||||
|
return new SimpleDateFormat (format).parse (ts);
|
||||||
|
}
|
||||||
|
catch (ParseException e) {
|
||||||
|
throw new RuntimeException (e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日期路径 即年/月/日 如2018/08/08
|
||||||
|
*/
|
||||||
|
public static final String datePath () {
|
||||||
|
Date now = new Date ();
|
||||||
|
return DateFormatUtils.format (now, "yyyy/MM/dd");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日期路径 即年/月/日 如20180808
|
||||||
|
*/
|
||||||
|
public static final String dateTime () {
|
||||||
|
Date now = new Date ();
|
||||||
|
return DateFormatUtils.format (now, "yyyyMMdd");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日期型字符串转化为日期 格式
|
||||||
|
*/
|
||||||
|
public static Date parseDate (Object str) {
|
||||||
|
if (str == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return parseDate (str.toString (), parsePatterns);
|
||||||
|
}
|
||||||
|
catch (ParseException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取服务器启动时间
|
||||||
|
*/
|
||||||
|
public static Date getServerStartDate () {
|
||||||
|
long time = ManagementFactory.getRuntimeMXBean ().getStartTime ();
|
||||||
|
return new Date (time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算时间差
|
||||||
|
*
|
||||||
|
* @param endDate 最后时间
|
||||||
|
* @param startTime 开始时间
|
||||||
|
*
|
||||||
|
* @return 时间差(天/小时/分钟)
|
||||||
|
*/
|
||||||
|
public static String timeDistance (Date endDate, Date startTime) {
|
||||||
|
long nd = 1000 * 24 * 60 * 60;
|
||||||
|
long nh = 1000 * 60 * 60;
|
||||||
|
long nm = 1000 * 60;
|
||||||
|
// long ns = 1000;
|
||||||
|
// 获得两个时间的毫秒时间差异
|
||||||
|
long diff = endDate.getTime () - startTime.getTime ();
|
||||||
|
// 计算差多少天
|
||||||
|
long day = diff / nd;
|
||||||
|
// 计算差多少小时
|
||||||
|
long hour = diff % nd / nh;
|
||||||
|
// 计算差多少分钟
|
||||||
|
long min = diff % nd % nh / nm;
|
||||||
|
// 计算差多少秒//输出结果
|
||||||
|
// long sec = diff % nd % nh % nm / ns;
|
||||||
|
return day + "天" + hour + "小时" + min + "分钟";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 增加 LocalDateTime ==> Date
|
||||||
|
*/
|
||||||
|
public static Date toDate (LocalDateTime temporalAccessor) {
|
||||||
|
ZonedDateTime zdt = temporalAccessor.atZone (ZoneId.systemDefault ());
|
||||||
|
return Date.from (zdt.toInstant ());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 增加 LocalDate ==> Date
|
||||||
|
*/
|
||||||
|
public static Date toDate (LocalDate temporalAccessor) {
|
||||||
|
LocalDateTime localDateTime = LocalDateTime.of (temporalAccessor, LocalTime.of (0, 0, 0));
|
||||||
|
ZonedDateTime zdt = localDateTime.atZone (ZoneId.systemDefault ());
|
||||||
|
return Date.from (zdt.toInstant ());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package com.zhn.common.core.utils;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||||
|
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误信息处理类。
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class ExceptionUtil {
|
||||||
|
/**
|
||||||
|
* 获取exception的详细错误信息。
|
||||||
|
*/
|
||||||
|
public static String getExceptionMessage (Throwable e) {
|
||||||
|
StringWriter sw = new StringWriter ();
|
||||||
|
e.printStackTrace (new PrintWriter (sw, true));
|
||||||
|
return sw.toString ();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getRootErrorMessage (Exception e) {
|
||||||
|
Throwable root = ExceptionUtils.getRootCause (e);
|
||||||
|
root = (root == null ? e : root);
|
||||||
|
if (root == null) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
String msg = root.getMessage ();
|
||||||
|
if (msg == null) {
|
||||||
|
return "null";
|
||||||
|
}
|
||||||
|
return StringUtils.defaultString (msg);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,123 @@
|
||||||
|
package com.zhn.common.core.utils;
|
||||||
|
|
||||||
|
import com.zhn.common.core.constant.SecurityConstants;
|
||||||
|
import com.zhn.common.core.constant.TokenConstants;
|
||||||
|
import com.zhn.common.core.text.Convert;
|
||||||
|
import io.jsonwebtoken.Claims;
|
||||||
|
import io.jsonwebtoken.Jwts;
|
||||||
|
import io.jsonwebtoken.SignatureAlgorithm;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Jwt工具类
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class JwtUtils {
|
||||||
|
public static String secret = TokenConstants.SECRET;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从数据声明生成令牌
|
||||||
|
*
|
||||||
|
* @param claims 数据声明
|
||||||
|
*
|
||||||
|
* @return 令牌
|
||||||
|
*/
|
||||||
|
public static String createToken (Map<String, Object> claims) {
|
||||||
|
String token = Jwts.builder ().setClaims (claims).signWith (SignatureAlgorithm.HS512, secret).compact ();
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据令牌获取用户标识
|
||||||
|
*
|
||||||
|
* @param token 令牌
|
||||||
|
*
|
||||||
|
* @return 用户ID
|
||||||
|
*/
|
||||||
|
public static String getUserKey (String token) {
|
||||||
|
Claims claims = parseToken (token);
|
||||||
|
return getValue (claims, SecurityConstants.USER_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从令牌中获取数据声明
|
||||||
|
*
|
||||||
|
* @param token 令牌
|
||||||
|
*
|
||||||
|
* @return 数据声明
|
||||||
|
*/
|
||||||
|
public static Claims parseToken (String token) {
|
||||||
|
return Jwts.parser ().setSigningKey (secret).parseClaimsJws (token).getBody ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据身份信息获取键值
|
||||||
|
*
|
||||||
|
* @param claims 身份信息
|
||||||
|
* @param key 键
|
||||||
|
*
|
||||||
|
* @return 值
|
||||||
|
*/
|
||||||
|
public static String getValue (Claims claims, String key) {
|
||||||
|
return Convert.toStr (claims.get (key), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据令牌获取用户标识
|
||||||
|
*
|
||||||
|
* @param claims 身份信息
|
||||||
|
*
|
||||||
|
* @return 用户ID
|
||||||
|
*/
|
||||||
|
public static String getUserKey (Claims claims) {
|
||||||
|
return getValue (claims, SecurityConstants.USER_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据令牌获取用户ID
|
||||||
|
*
|
||||||
|
* @param token 令牌
|
||||||
|
*
|
||||||
|
* @return 用户ID
|
||||||
|
*/
|
||||||
|
public static String getUserId (String token) {
|
||||||
|
Claims claims = parseToken (token);
|
||||||
|
return getValue (claims, SecurityConstants.DETAILS_USER_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据身份信息获取用户ID
|
||||||
|
*
|
||||||
|
* @param claims 身份信息
|
||||||
|
*
|
||||||
|
* @return 用户ID
|
||||||
|
*/
|
||||||
|
public static String getUserId (Claims claims) {
|
||||||
|
return getValue (claims, SecurityConstants.DETAILS_USER_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据令牌获取用户名
|
||||||
|
*
|
||||||
|
* @param token 令牌
|
||||||
|
*
|
||||||
|
* @return 用户名
|
||||||
|
*/
|
||||||
|
public static String getUserName (String token) {
|
||||||
|
Claims claims = parseToken (token);
|
||||||
|
return getValue (claims, SecurityConstants.DETAILS_USERNAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据身份信息获取用户名
|
||||||
|
*
|
||||||
|
* @param claims 身份信息
|
||||||
|
*
|
||||||
|
* @return 用户名
|
||||||
|
*/
|
||||||
|
public static String getUserName (Claims claims) {
|
||||||
|
return getValue (claims, SecurityConstants.DETAILS_USERNAME);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package com.zhn.common.core.utils;
|
||||||
|
|
||||||
|
import com.github.pagehelper.PageHelper;
|
||||||
|
import com.zhn.common.core.utils.sql.SqlUtil;
|
||||||
|
import com.zhn.common.core.web.page.PageDomain;
|
||||||
|
import com.zhn.common.core.web.page.TableSupport;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页工具类
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class PageUtils extends PageHelper {
|
||||||
|
/**
|
||||||
|
* 设置请求分页数据
|
||||||
|
*/
|
||||||
|
public static void startPage () {
|
||||||
|
PageDomain pageDomain = TableSupport.buildPageRequest ();
|
||||||
|
Integer pageNum = pageDomain.getPageNum ();
|
||||||
|
Integer pageSize = pageDomain.getPageSize ();
|
||||||
|
String orderBy = SqlUtil.escapeOrderBySql (pageDomain.getOrderBy ());
|
||||||
|
Boolean reasonable = pageDomain.getReasonable ();
|
||||||
|
PageHelper.startPage (pageNum, pageSize, orderBy).setReasonable (reasonable);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清理分页的线程变量
|
||||||
|
*/
|
||||||
|
public static void clearPage () {
|
||||||
|
PageHelper.clearPage ();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,300 @@
|
||||||
|
package com.zhn.common.core.utils;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.zhn.common.core.constant.Constants;
|
||||||
|
import com.zhn.common.core.domain.Result;
|
||||||
|
import com.zhn.common.core.text.Convert;
|
||||||
|
import org.springframework.core.io.buffer.DataBuffer;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||||
|
import org.springframework.util.LinkedCaseInsensitiveMap;
|
||||||
|
import org.springframework.web.context.request.RequestAttributes;
|
||||||
|
import org.springframework.web.context.request.RequestContextHolder;
|
||||||
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||||
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
|
import javax.servlet.ServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.servlet.http.HttpSession;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLDecoder;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客户端工具类
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class ServletUtils {
|
||||||
|
/**
|
||||||
|
* 获取String参数
|
||||||
|
*/
|
||||||
|
public static String getParameter (String name) {
|
||||||
|
return getRequest ().getParameter (name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取request
|
||||||
|
*/
|
||||||
|
public static HttpServletRequest getRequest () {
|
||||||
|
try {
|
||||||
|
return getRequestAttributes ().getRequest ();
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ServletRequestAttributes getRequestAttributes () {
|
||||||
|
try {
|
||||||
|
RequestAttributes attributes = RequestContextHolder.getRequestAttributes ();
|
||||||
|
return (ServletRequestAttributes) attributes;
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取String参数
|
||||||
|
*/
|
||||||
|
public static String getParameter (String name, String defaultValue) {
|
||||||
|
return Convert.toStr (getRequest ().getParameter (name), defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Integer参数
|
||||||
|
*/
|
||||||
|
public static Integer getParameterToInt (String name) {
|
||||||
|
return Convert.toInt (getRequest ().getParameter (name));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Integer参数
|
||||||
|
*/
|
||||||
|
public static Integer getParameterToInt (String name, Integer defaultValue) {
|
||||||
|
return Convert.toInt (getRequest ().getParameter (name), defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Boolean参数
|
||||||
|
*/
|
||||||
|
public static Boolean getParameterToBool (String name) {
|
||||||
|
return Convert.toBool (getRequest ().getParameter (name));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Boolean参数
|
||||||
|
*/
|
||||||
|
public static Boolean getParameterToBool (String name, Boolean defaultValue) {
|
||||||
|
return Convert.toBool (getRequest ().getParameter (name), defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得所有请求参数
|
||||||
|
*
|
||||||
|
* @param request 请求对象{@link ServletRequest}
|
||||||
|
*
|
||||||
|
* @return Map
|
||||||
|
*/
|
||||||
|
public static Map<String, String> getParamMap (ServletRequest request) {
|
||||||
|
Map<String, String> params = new HashMap<> ();
|
||||||
|
for (Map.Entry<String, String[]> entry : getParams (request).entrySet ()) {
|
||||||
|
params.put (entry.getKey (), StringUtils.join (entry.getValue (), ","));
|
||||||
|
}
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得所有请求参数
|
||||||
|
*
|
||||||
|
* @param request 请求对象{@link ServletRequest}
|
||||||
|
*
|
||||||
|
* @return Map
|
||||||
|
*/
|
||||||
|
public static Map<String, String[]> getParams (ServletRequest request) {
|
||||||
|
final Map<String, String[]> map = request.getParameterMap ();
|
||||||
|
return Collections.unmodifiableMap (map);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取response
|
||||||
|
*/
|
||||||
|
public static HttpServletResponse getResponse () {
|
||||||
|
try {
|
||||||
|
return getRequestAttributes ().getResponse ();
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取session
|
||||||
|
*/
|
||||||
|
public static HttpSession getSession () {
|
||||||
|
return getRequest ().getSession ();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getHeader (HttpServletRequest request, String name) {
|
||||||
|
String value = request.getHeader (name);
|
||||||
|
if (StringUtils.isEmpty (value)) {
|
||||||
|
return StringUtils.EMPTY;
|
||||||
|
}
|
||||||
|
return urlDecode (value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 内容解码
|
||||||
|
*
|
||||||
|
* @param str 内容
|
||||||
|
*
|
||||||
|
* @return 解码后的内容
|
||||||
|
*/
|
||||||
|
public static String urlDecode (String str) {
|
||||||
|
try {
|
||||||
|
return URLDecoder.decode (str, Constants.UTF8);
|
||||||
|
}
|
||||||
|
catch (UnsupportedEncodingException e) {
|
||||||
|
return StringUtils.EMPTY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, String> getHeaders (HttpServletRequest request) {
|
||||||
|
Map<String, String> map = new LinkedCaseInsensitiveMap<> ();
|
||||||
|
Enumeration<String> enumeration = request.getHeaderNames ();
|
||||||
|
if (enumeration != null) {
|
||||||
|
while (enumeration.hasMoreElements ()) {
|
||||||
|
String key = enumeration.nextElement ();
|
||||||
|
String value = request.getHeader (key);
|
||||||
|
map.put (key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将字符串渲染到客户端
|
||||||
|
*
|
||||||
|
* @param response 渲染对象
|
||||||
|
* @param string 待渲染的字符串
|
||||||
|
*/
|
||||||
|
public static void renderString (HttpServletResponse response, String string) {
|
||||||
|
try {
|
||||||
|
response.setStatus (200);
|
||||||
|
response.setContentType ("application/json");
|
||||||
|
response.setCharacterEncoding ("utf-8");
|
||||||
|
response.getWriter ().print (string);
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
e.printStackTrace ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否是Ajax异步请求
|
||||||
|
*
|
||||||
|
* @param request
|
||||||
|
*/
|
||||||
|
public static boolean isAjaxRequest (HttpServletRequest request) {
|
||||||
|
String accept = request.getHeader ("accept");
|
||||||
|
if (accept != null && accept.contains ("application/json")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
String xRequestedWith = request.getHeader ("X-Requested-With");
|
||||||
|
if (xRequestedWith != null && xRequestedWith.contains ("XMLHttpRequest")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
String uri = request.getRequestURI ();
|
||||||
|
if (com.zhn.common.core.utils.StringUtils.inStringIgnoreCase (uri, ".json", ".xml")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
String ajax = request.getParameter ("__ajax");
|
||||||
|
return com.zhn.common.core.utils.StringUtils.inStringIgnoreCase (ajax, "json", "xml");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 内容编码
|
||||||
|
*
|
||||||
|
* @param str 内容
|
||||||
|
*
|
||||||
|
* @return 编码后的内容
|
||||||
|
*/
|
||||||
|
public static String urlEncode (String str) {
|
||||||
|
try {
|
||||||
|
return URLEncoder.encode (str, Constants.UTF8);
|
||||||
|
}
|
||||||
|
catch (UnsupportedEncodingException e) {
|
||||||
|
return StringUtils.EMPTY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置webflux模型响应
|
||||||
|
*
|
||||||
|
* @param response ServerHttpResponse
|
||||||
|
* @param value 响应内容
|
||||||
|
*
|
||||||
|
* @return Mono<Void>
|
||||||
|
*/
|
||||||
|
public static Mono<Void> webFluxResponseWriter (ServerHttpResponse response, Object value) {
|
||||||
|
return webFluxResponseWriter (response, HttpStatus.OK, value, Result.FAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置webflux模型响应
|
||||||
|
*
|
||||||
|
* @param response ServerHttpResponse
|
||||||
|
* @param status http状态码
|
||||||
|
* @param code 响应状态码
|
||||||
|
* @param value 响应内容
|
||||||
|
*
|
||||||
|
* @return Mono<Void>
|
||||||
|
*/
|
||||||
|
public static Mono<Void> webFluxResponseWriter (ServerHttpResponse response, HttpStatus status, Object value, int code) {
|
||||||
|
return webFluxResponseWriter (response, MediaType.APPLICATION_JSON_VALUE, status, value, code);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置webflux模型响应
|
||||||
|
*
|
||||||
|
* @param response ServerHttpResponse
|
||||||
|
* @param contentType content-type
|
||||||
|
* @param status http状态码
|
||||||
|
* @param code 响应状态码
|
||||||
|
* @param value 响应内容
|
||||||
|
*
|
||||||
|
* @return Mono<Void>
|
||||||
|
*/
|
||||||
|
public static Mono<Void> webFluxResponseWriter (ServerHttpResponse response, String contentType, HttpStatus status, Object value, int code) {
|
||||||
|
response.setStatusCode (status);
|
||||||
|
response.getHeaders ().add (HttpHeaders.CONTENT_TYPE, contentType);
|
||||||
|
Result<?> result = Result.error (code, value.toString ());
|
||||||
|
DataBuffer dataBuffer = response.bufferFactory ().wrap (JSON.toJSONString (result).getBytes ());
|
||||||
|
return response.writeWith (Mono.just (dataBuffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置webflux模型响应
|
||||||
|
*
|
||||||
|
* @param response ServerHttpResponse
|
||||||
|
* @param code 响应状态码
|
||||||
|
* @param value 响应内容
|
||||||
|
*
|
||||||
|
* @return Mono<Void>
|
||||||
|
*/
|
||||||
|
public static Mono<Void> webFluxResponseWriter (ServerHttpResponse response, Object value, int code) {
|
||||||
|
return webFluxResponseWriter (response, HttpStatus.OK, value, code);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,114 @@
|
||||||
|
package com.zhn.common.core.utils;
|
||||||
|
|
||||||
|
import org.springframework.aop.framework.AopContext;
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
|
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||||
|
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
|
||||||
|
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* spring工具类 方便在非spring管理环境中获取bean
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public final class SpringUtils implements BeanFactoryPostProcessor {
|
||||||
|
/**
|
||||||
|
* Spring应用上下文环境
|
||||||
|
*/
|
||||||
|
private static ConfigurableListableBeanFactory beanFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取对象
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
*
|
||||||
|
* @return Object 一个以所给名字注册的bean的实例
|
||||||
|
*
|
||||||
|
* @throws org.springframework.beans.BeansException
|
||||||
|
*/
|
||||||
|
@SuppressWarnings ("unchecked")
|
||||||
|
public static <T> T getBean (String name) throws BeansException {
|
||||||
|
return (T) beanFactory.getBean (name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取类型为requiredType的对象
|
||||||
|
*
|
||||||
|
* @param clz
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*
|
||||||
|
* @throws org.springframework.beans.BeansException
|
||||||
|
*/
|
||||||
|
public static <T> T getBean (Class<T> clz) throws BeansException {
|
||||||
|
T result = (T) beanFactory.getBean (clz);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static boolean containsBean (String name) {
|
||||||
|
return beanFactory.containsBean (name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*
|
||||||
|
* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
|
||||||
|
*/
|
||||||
|
public static boolean isSingleton (String name) throws NoSuchBeanDefinitionException {
|
||||||
|
return beanFactory.isSingleton (name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param name
|
||||||
|
*
|
||||||
|
* @return Class 注册对象的类型
|
||||||
|
*
|
||||||
|
* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
|
||||||
|
*/
|
||||||
|
public static Class<?> getType (String name) throws NoSuchBeanDefinitionException {
|
||||||
|
return beanFactory.getType (name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 如果给定的bean名字在bean定义中有别名,则返回这些别名
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*
|
||||||
|
* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
|
||||||
|
*/
|
||||||
|
public static String[] getAliases (String name) throws NoSuchBeanDefinitionException {
|
||||||
|
return beanFactory.getAliases (name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取aop代理对象
|
||||||
|
*
|
||||||
|
* @param invoker
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@SuppressWarnings ("unchecked")
|
||||||
|
public static <T> T getAopProxy (T invoker) {
|
||||||
|
return (T) AopContext.currentProxy ();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void postProcessBeanFactory (ConfigurableListableBeanFactory beanFactory) throws BeansException {
|
||||||
|
SpringUtils.beanFactory = beanFactory;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,512 @@
|
||||||
|
package com.zhn.common.core.utils;
|
||||||
|
|
||||||
|
import com.zhn.common.core.constant.Constants;
|
||||||
|
import com.zhn.common.core.text.StrFormatter;
|
||||||
|
import org.springframework.util.AntPathMatcher;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字符串工具类
|
||||||
|
*
|
||||||
|
* @author zhn
|
||||||
|
*/
|
||||||
|
public class StringUtils extends org.apache.commons.lang3.StringUtils {
|
||||||
|
/**
|
||||||
|
* 空字符串
|
||||||
|
*/
|
||||||
|
private static final String NULLSTR = "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下划线
|
||||||
|
*/
|
||||||
|
private static final char SEPARATOR = '_';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取参数不为空值
|
||||||
|
*
|
||||||
|
* @param value defaultValue 要判断的value
|
||||||
|
*
|
||||||
|
* @return value 返回值
|
||||||
|
*/
|
||||||
|
public static <T> T nvl (T value, T defaultValue) {
|
||||||
|
return value != null ? value : defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 判断一个Collection是否非空,包含List,Set,Queue
|
||||||
|
*
|
||||||
|
* @param coll 要判断的Collection
|
||||||
|
*
|
||||||
|
* @return true:非空 false:空
|
||||||
|
*/
|
||||||
|
public static boolean isNotEmpty (Collection<?> coll) {
|
||||||
|
return !isEmpty (coll);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 判断一个Collection是否为空, 包含List,Set,Queue
|
||||||
|
*
|
||||||
|
* @param coll 要判断的Collection
|
||||||
|
*
|
||||||
|
* @return true:为空 false:非空
|
||||||
|
*/
|
||||||
|
public static boolean isEmpty (Collection<?> coll) {
|
||||||
|
return isNull (coll) || coll.isEmpty ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 判断一个对象是否为空
|
||||||
|
*
|
||||||
|
* @param object Object
|
||||||
|
*
|
||||||
|
* @return true:为空 false:非空
|
||||||
|
*/
|
||||||
|
public static boolean isNull (Object object) {
|
||||||
|
return object == null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 判断一个对象数组是否非空
|
||||||
|
*
|
||||||
|
* @param objects 要判断的对象数组
|
||||||
|
*
|
||||||
|
* @return true:非空 false:空
|
||||||
|
*/
|
||||||
|
public static boolean isNotEmpty (Object[] objects) {
|
||||||
|
return !isEmpty (objects);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 判断一个对象数组是否为空
|
||||||
|
*
|
||||||
|
* @param objects 要判断的对象数组
|
||||||
|
* * @return true:为空 false:非空
|
||||||
|
*/
|
||||||
|
public static boolean isEmpty (Object[] objects) {
|
||||||
|
return isNull (objects) || (objects.length == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 判断一个Map是否为空
|
||||||
|
*
|
||||||
|
* @param map 要判断的Map
|
||||||
|
*
|
||||||
|
* @return true:非空 false:空
|
||||||
|
*/
|
||||||
|
public static boolean isNotEmpty (Map<?, ?> map) {
|
||||||
|
return !isEmpty (map);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 判断一个Map是否为空
|
||||||
|
*
|
||||||
|
* @param map 要判断的Map
|
||||||
|
*
|
||||||
|
* @return true:为空 false:非空
|
||||||
|
*/
|
||||||
|
public static boolean isEmpty (Map<?, ?> map) {
|
||||||
|
return isNull (map) || map.isEmpty ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 判断一个字符串是否为非空串
|
||||||
|
*
|
||||||
|
* @param str String
|
||||||
|
*
|
||||||
|
* @return true:非空串 false:空串
|
||||||
|
*/
|
||||||
|
public static boolean isNotEmpty (String str) {
|
||||||
|
return !isEmpty (str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 判断一个字符串是否为空串
|
||||||
|
*
|
||||||
|
* @param str String
|
||||||
|
*
|
||||||
|
* @return true:为空 false:非空
|
||||||
|
*/
|
||||||
|
public static boolean isEmpty (String str) {
|
||||||
|
return isNull (str) || NULLSTR.equals (str.trim ());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 判断一个对象是否是数组类型(Java基本型别的数组)
|
||||||
|
*
|
||||||
|
* @param object 对象
|
||||||
|
*
|
||||||
|
* @return true:是数组 false:不是数组
|
||||||
|
*/
|
||||||
|
public static boolean isArray (Object object) {
|
||||||
|
return isNotNull (object) && object.getClass ().isArray ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 判断一个对象是否非空
|
||||||
|
*
|
||||||
|
* @param object Object
|
||||||
|
*
|
||||||
|
* @return true:非空 false:空
|
||||||
|
*/
|
||||||
|
public static boolean isNotNull (Object object) {
|
||||||
|
return !isNull (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 截取字符串
|
||||||
|
*
|
||||||
|
* @param str 字符串
|
||||||
|
* @param start 开始
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static String substring (final String str, int start) {
|
||||||
|
if (str == null) {
|
||||||
|
return NULLSTR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start < 0) {
|
||||||
|
start = str.length () + start;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start < 0) {
|
||||||
|
start = 0;
|
||||||
|
}
|
||||||
|
if (start > str.length ()) {
|
||||||
|
return NULLSTR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return str.substring (start);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 截取字符串
|
||||||
|
*
|
||||||
|
* @param str 字符串
|
||||||
|
* @param start 开始
|
||||||
|
* @param end 结束
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static String substring (final String str, int start, int end) {
|
||||||
|
if (str == null) {
|
||||||
|
return NULLSTR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end < 0) {
|
||||||
|
end = str.length () + end;
|
||||||
|
}
|
||||||
|
if (start < 0) {
|
||||||
|
start = str.length () + start;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end > str.length ()) {
|
||||||
|
end = str.length ();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start > end) {
|
||||||
|
return NULLSTR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start < 0) {
|
||||||
|
start = 0;
|
||||||
|
}
|
||||||
|
if (end < 0) {
|
||||||
|
end = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return str.substring (start, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断是否为空,并且不是空白字符
|
||||||
|
*
|
||||||
|
* @param str 要判断的value
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static boolean hasText (String str) {
|
||||||
|
return (str != null && !str.isEmpty () && containsText (str));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean containsText (CharSequence str) {
|
||||||
|
int strLen = str.length ();
|
||||||
|
for (int i = 0; i < strLen; i++) {
|
||||||
|
if (!Character.isWhitespace (str.charAt (i))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 格式化文本, {} 表示占位符<br>
|
||||||
|
* 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
|
||||||
|
* 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
|
||||||
|
* 例:<br>
|
||||||
|
* 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
|
||||||
|
* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
|
||||||
|
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
|
||||||
|
*
|
||||||
|
* @param template 文本模板,被替换的部分用 {} 表示
|
||||||
|
* @param params 参数值
|
||||||
|
*
|
||||||
|
* @return 格式化后的文本
|
||||||
|
*/
|
||||||
|
public static String format (String template, Object... params) {
|
||||||
|
if (isEmpty (params) || isEmpty (template)) {
|
||||||
|
return template;
|
||||||
|
}
|
||||||
|
return StrFormatter.format (template, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为http(s)://开头
|
||||||
|
*
|
||||||
|
* @param link 链接
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static boolean ishttp (String link) {
|
||||||
|
return StringUtils.startsWithAny (link, Constants.HTTP, Constants.HTTPS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value
|
||||||
|
*
|
||||||
|
* @param collection 给定的集合
|
||||||
|
* @param array 给定的数组
|
||||||
|
*
|
||||||
|
* @return boolean 结果
|
||||||
|
*/
|
||||||
|
public static boolean containsAny (Collection<String> collection, String... array) {
|
||||||
|
if (isEmpty (collection) || isEmpty (array)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (String str : array) {
|
||||||
|
if (collection.contains (str)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 驼峰转下划线命名
|
||||||
|
*/
|
||||||
|
public static String toUnderScoreCase (String str) {
|
||||||
|
if (str == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
StringBuilder sb = new StringBuilder ();
|
||||||
|
// 前置字符是否大写
|
||||||
|
boolean preCharIsUpperCase = true;
|
||||||
|
// 当前字符是否大写
|
||||||
|
boolean curreCharIsUpperCase = true;
|
||||||
|
// 下一字符是否大写
|
||||||
|
boolean nexteCharIsUpperCase = true;
|
||||||
|
for (int i = 0; i < str.length (); i++) {
|
||||||
|
char c = str.charAt (i);
|
||||||
|
if (i > 0) {
|
||||||
|
preCharIsUpperCase = Character.isUpperCase (str.charAt (i - 1));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
preCharIsUpperCase = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
curreCharIsUpperCase = Character.isUpperCase (c);
|
||||||
|
|
||||||
|
if (i < (str.length () - 1)) {
|
||||||
|
nexteCharIsUpperCase = Character.isUpperCase (str.charAt (i + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) {
|
||||||
|
sb.append (SEPARATOR);
|
||||||
|
}
|
||||||
|
else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) {
|
||||||
|
sb.append (SEPARATOR);
|
||||||
|
}
|
||||||
|
sb.append (Character.toLowerCase (c));
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.toString ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否包含字符串
|
||||||
|
*
|
||||||
|
* @param str 验证字符串
|
||||||
|
* @param strs 字符串组
|
||||||
|
*
|
||||||
|
* @return 包含返回true
|
||||||
|
*/
|
||||||
|
public static boolean inStringIgnoreCase (String str, String... strs) {
|
||||||
|
if (str != null && strs != null) {
|
||||||
|
for (String s : strs) {
|
||||||
|
if (str.equalsIgnoreCase (trim (s))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 去空格
|
||||||
|
*/
|
||||||
|
public static String trim (String str) {
|
||||||
|
return (str == null ? "" : str.trim ());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
|
||||||
|
*
|
||||||
|
* @param name 转换前的下划线大写方式命名的字符串
|
||||||
|
*
|
||||||
|
* @return 转换后的驼峰式命名的字符串
|
||||||
|
*/
|
||||||
|
public static String convertToCamelCase (String name) {
|
||||||
|
StringBuilder result = new StringBuilder ();
|
||||||
|
// 快速检查
|
||||||
|
if (name == null || name.isEmpty ()) {
|
||||||
|
// 没必要转换
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
else if (!name.contains ("_")) {
|
||||||
|
// 不含下划线,仅将首字母大写
|
||||||
|
return name.substring (0, 1).toUpperCase () + name.substring (1);
|
||||||
|
}
|
||||||
|
// 用下划线将原始字符串分割
|
||||||
|
String[] camels = name.split ("_");
|
||||||
|
for (String camel : camels) {
|
||||||
|
// 跳过原始字符串中开头、结尾的下换线或双重下划线
|
||||||
|
if (camel.isEmpty ()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 首字母大写
|
||||||
|
result.append (camel.substring (0, 1).toUpperCase ());
|
||||||
|
result.append (camel.substring (1).toLowerCase ());
|
||||||
|
}
|
||||||
|
return result.toString ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 驼峰式命名法
|
||||||
|
* 例如:user_name->userName
|
||||||
|
*/
|
||||||
|
public static String toCamelCase (String s) {
|
||||||
|
if (s == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (s.indexOf (SEPARATOR) == -1) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
s = s.toLowerCase ();
|
||||||
|
StringBuilder sb = new StringBuilder (s.length ());
|
||||||
|
boolean upperCase = false;
|
||||||
|
for (int i = 0; i < s.length (); i++) {
|
||||||
|
char c = s.charAt (i);
|
||||||
|
|
||||||
|
if (c == SEPARATOR) {
|
||||||
|
upperCase = true;
|
||||||
|
}
|
||||||
|
else if (upperCase) {
|
||||||
|
sb.append (Character.toUpperCase (c));
|
||||||
|
upperCase = false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sb.append (c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查找指定字符串是否匹配指定字符串列表中的任意一个字符串
|
||||||
|
*
|
||||||
|
* @param str 指定字符串
|
||||||
|
* @param strs 需要检查的字符串数组
|
||||||
|
*
|
||||||
|
* @return 是否匹配
|
||||||
|
*/
|
||||||
|
public static boolean matches (String str, List<String> strs) {
|
||||||
|
if (isEmpty (str) || isEmpty (strs)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (String pattern : strs) {
|
||||||
|
if (isMatch (pattern, str)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断url是否与规则配置:
|
||||||
|
* ? 表示单个字符;
|
||||||
|
* * 表示一层路径内的任意字符串,不可跨层级;
|
||||||
|
* ** 表示任意层路径;
|
||||||
|
*
|
||||||
|
* @param pattern 匹配规则
|
||||||
|
* @param url 需要匹配的url
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static boolean isMatch (String pattern, String url) {
|
||||||
|
AntPathMatcher matcher = new AntPathMatcher ();
|
||||||
|
return matcher.match (pattern, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings ("unchecked")
|
||||||
|
public static <T> T cast (Object obj) {
|
||||||
|
return (T) obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。
|
||||||
|
*
|
||||||
|
* @param num 数字对象
|
||||||
|
* @param size 字符串指定长度
|
||||||
|
*
|
||||||
|
* @return 返回数字的字符串格式,该字符串为指定长度。
|
||||||
|
*/
|
||||||
|
public static final String padl (final Number num, final int size) {
|
||||||
|
return padl (num.toString (), size, '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。
|
||||||
|
*
|
||||||
|
* @param s 原始字符串
|
||||||
|
* @param size 字符串指定长度
|
||||||
|
* @param c 用于补齐的字符
|
||||||
|
*
|
||||||
|
* @return 返回指定长度的字符串,由原字符串左补齐或截取得到。
|
||||||
|
*/
|
||||||
|
public static final String padl (final String s, final int size, final char c) {
|
||||||
|
final StringBuilder sb = new StringBuilder (size);
|
||||||
|
if (s != null) {
|
||||||
|
final int len = s.length ();
|
||||||
|
if (s.length () <= size) {
|
||||||
|
for (int i = size - len; i > 0; i--) {
|
||||||
|
sb.append (c);
|
||||||
|
}
|
||||||
|
sb.append (s);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return s.substring (len - size, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (int i = size; i > 0; i--) {
|
||||||
|
sb.append (c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString ();
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue