初始化

main
张海宁 2023-11-16 21:26:21 +08:00
commit 949a792222
390 changed files with 38465 additions and 0 deletions

46
.gitignore vendored 100644
View File

@ -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

21
LICENSE 100644
View File

@ -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.

26
README.md 100644
View File

@ -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 // 公共依赖
~~~

12
bin/clean.bat 100644
View File

@ -0,0 +1,12 @@
@echo off
echo.
echo [信息] 清理工程target生成路径。
echo.
%~d0
cd %~dp0
cd ..
call mvn clean
pause

12
bin/package.bat 100644
View File

@ -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

14
bin/run-auth.bat 100644
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

41
docker/copy.sh 100644
View File

@ -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

67
docker/deploy.sh 100644
View File

@ -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

View File

@ -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"

View File

@ -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"]

View File

@ -0,0 +1 @@
存放认证中心打包好的jar文件用于docker启动应用。

View File

@ -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"]

View File

@ -0,0 +1 @@
存放网关模块打包好的jar文件用于docker启动应用。

View File

@ -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"]

View File

@ -0,0 +1 @@
存放文件服务打包好的jar文件用于docker启动应用。

View File

@ -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"]

View File

@ -0,0 +1 @@
存放代码生成打包好的jar文件用于docker启动应用。

View File

@ -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"]

View File

@ -0,0 +1 @@
存放定时任务打包好的jar文件用于docker启动应用。

View File

@ -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"]

View File

@ -0,0 +1 @@
存放系统模块打包好的jar文件用于docker启动应用。

View File

@ -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"]

View File

@ -0,0 +1 @@
存放监控中心打包好的jar文件用于docker启动应用。

View File

@ -0,0 +1 @@
存放sql目录下的所有脚本用于docker自动执行。

View File

@ -0,0 +1,7 @@
# 基础镜像
FROM mysql:5.7
# author
MAINTAINER zhn
# 执行sql脚本
ADD ./db/*.sql /docker-entrypoint-initdb.d/

View File

@ -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

View File

@ -0,0 +1,7 @@
# 基础镜像
FROM nacos/nacos-server
# author
MAINTAINER zhn
# 复制conf文件到路径
COPY ./conf/application.properties /home/nacos/conf/application.properties

View File

@ -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;
}
}
}

View File

@ -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

View File

@ -0,0 +1 @@
# requirepass 123456

View File

@ -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

284
pom.xml 100644
View File

@ -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>

174
sql/quartz.sql 100644
View File

@ -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;

1068
sql/ry_20230706.sql 100644

File diff suppressed because it is too large Load Diff

View File

@ -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');

View File

@ -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';

74
zhn-auth/pom.xml 100644
View File

@ -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>

View File

@ -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);
}
}

View File

@ -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 ();
}
}

View File

@ -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;
}
}

View File

@ -0,0 +1,10 @@
package com.zhn.auth.form;
/**
*
*
* @author zhn
*/
public class RegisterBody extends com.zhn.auth.form.LoginBody {
}

View File

@ -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, "注册成功");
}
}

View File

@ -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));
}
}
}

View File

@ -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);
}
}

View File

@ -0,0 +1,2 @@
Spring Boot Version: ${spring-boot.version}
Spring Application Name: ${spring.application.name}

View File

@ -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}

View File

@ -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>

30
zhn-common/pom.xml 100644
View File

@ -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>

View File

@ -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>

View File

@ -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 {};
/**
* 012
*/
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;
}
}
}

View File

@ -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 ();
}

View File

@ -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";
}

View File

@ -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"};
}

View 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";
}

View File

@ -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;
}

View File

@ -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;
}
}
}

View File

@ -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";
}

View File

@ -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";
}

View File

@ -0,0 +1,24 @@
package com.zhn.common.core.constant;
/**
* TokenKey
*
* @author zhn
*/
public class TokenConstants {
/**
*
*/
public static final String AUTHENTICATION = "Authorization";
/**
*
*/
public static final String PREFIX = "Bearer ";
/**
*
*/
public final static String SECRET = "abcdefghijklmnopqrstuvwxyz";
}

View File

@ -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;
}

View File

@ -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;
/**
* 线 idToken
* 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 ();
}
}

View File

@ -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 ();
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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 () {
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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 () {
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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, ","));
}
}

View File

@ -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, ","));
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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");
}
}

View File

@ -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");
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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 ();
}
}

View File

@ -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>
* Stringtruefalseyesokno1,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 EnumClass
* @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 EnumClass
* @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>
* 1ByteByteBuffer 2Arrays.toString
*
* @param obj
*
* @return
*/
public static String utf8Str (Object obj) {
return str (obj, com.zhn.common.core.text.CharsetKit.CHARSET_UTF_8);
}
/**
* <br>
* 1ByteByteBuffer 2Arrays.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>
* 1ByteByteBuffer 2Arrays.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 ("^整$", "零元整");
}
}

View File

@ -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 ();
}
}

View File

@ -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 ());
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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 ();
}
}

View File

@ -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);
}
}

View File

@ -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 便springbean
*
* @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;
}
/**
* BeanFactorybeantrue
*
* @param name
*
* @return boolean
*/
public static boolean containsBean (String name) {
return beanFactory.containsBean (name);
}
/**
* beansingletonprototype beanNoSuchBeanDefinitionException
*
* @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);
}
/**
* beanbean
*
* @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;
}
}

View File

@ -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;
}
/**
* * CollectionListSetQueue
*
* @param coll Collection
*
* @return true false
*/
public static boolean isNotEmpty (Collection<?> coll) {
return !isEmpty (coll);
}
/**
* * Collection ListSetQueue
*
* @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);
}
/**
* collectionarray arrayvalue
*
* @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');
}
/**
* ssizesize
*
* @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