Compare commits
2 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
1ee3ba0aad | |
|
|
e956c901e0 |
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>cn.hangtag</groupId>
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
<version>2.1.0-jdk8-snapshot</version>
|
||||
<packaging>pom</packaging>
|
||||
<name>${project.artifactId}</name>
|
||||
<description>嘉晋OMS系统</description>
|
||||
<description>OMS管理系统</description>
|
||||
<modules>
|
||||
<module>hangtag-dependencies</module>
|
||||
<module>hangtag-framework</module>
|
||||
|
|
|
|||
|
|
@ -1,17 +1,17 @@
|
|||
# ---> Java
|
||||
# 编译后的类文件
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# 日志文件
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ 文件
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# 移动工具 for Java (J2ME)
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# 包文件
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
|
|
@ -20,72 +20,8 @@
|
|||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# 虚拟机崩溃日志,详见 http://www.java.com/en/download/help/error_hotspot.xml
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
replay_pid*
|
||||
|
||||
# 项目帮助文档
|
||||
HELP.md
|
||||
|
||||
# Maven 生成的目标文件夹
|
||||
/target/
|
||||
/**/target/
|
||||
# 保留 Maven wrapper 的 jar 文件
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
|
||||
### STS (Spring Tool Suite) ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea/
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
rebel-remote.xml
|
||||
rebel.xml
|
||||
|
||||
### Vite 项目 ###
|
||||
node_modules/
|
||||
dist/
|
||||
*.local
|
||||
*.env.local
|
||||
*.env.*.local
|
||||
.vite/deps
|
||||
|
||||
### macOS 系统文件 ###
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# 见 http://kb.mozillazine.org/Profiles.ini_file
|
||||
\Icon
|
||||
\Icon?
|
||||
.DS_Store
|
||||
._*
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
__MACOSX
|
||||
*/.Spotlight-V100
|
||||
*/.Trashes
|
||||
|
||||
# 自定义目录
|
||||
/logs
|
||||
/.idea
|
||||
target
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||
<inspection_tool class="Stylelint" enabled="true" level="ERROR" enabled_by_default="true" />
|
||||
</profile>
|
||||
</component>
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
@echo off
|
||||
echo.
|
||||
echo [信息] 清理工程target生成路径。
|
||||
echo.
|
||||
|
||||
%~d0
|
||||
cd %~dp0
|
||||
|
||||
cd ..
|
||||
call mvn clean
|
||||
|
||||
pause
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
@echo off
|
||||
echo.
|
||||
echo [信息] 打包Web工程,生成war/jar包文件。
|
||||
echo.
|
||||
|
||||
%~d0
|
||||
cd %~dp0
|
||||
|
||||
cd ..
|
||||
call mvn clean package -Dmaven.test.skip=true
|
||||
|
||||
pause
|
||||
14
bin/run.bat
14
bin/run.bat
|
|
@ -1,14 +0,0 @@
|
|||
@echo off
|
||||
echo.
|
||||
echo [信息] 使用Jar命令运行Web工程。
|
||||
echo.
|
||||
|
||||
cd %~dp0
|
||||
cd ../mikeenk-admin/target
|
||||
|
||||
set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
|
||||
|
||||
java -jar %JAVA_OPTS% mikeenk-admin.jar
|
||||
|
||||
cd bin
|
||||
pause
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>cn.hangtag</groupId>
|
||||
|
|
@ -77,8 +77,8 @@
|
|||
<version>${bizlog-sdk.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>spring-boot-starter</artifactId>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
|
@ -163,12 +163,12 @@
|
|||
<version>${easy-trans.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>spring-context</artifactId>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-context</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<artifactId>spring-cloud-commons</artifactId>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-commons</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
|
@ -193,8 +193,8 @@
|
|||
<version>${redisson.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
|
@ -229,8 +229,8 @@
|
|||
<version>${lock4j.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>redisson-spring-boot-starter</artifactId>
|
||||
<groupId>org.redisson</groupId>
|
||||
<artifactId>redisson-spring-boot-starter</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
|
@ -275,8 +275,8 @@
|
|||
<version>${spring-boot-admin.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>spring-boot-admin-server-cloud</artifactId>
|
||||
<groupId>de.codecentric</groupId>
|
||||
<artifactId>spring-boot-admin-server-cloud</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
|
@ -302,12 +302,12 @@
|
|||
<version>${spring.boot.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>asm</artifactId>
|
||||
<groupId>org.ow2.asm</groupId>
|
||||
<artifactId>asm</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
|
@ -452,12 +452,12 @@
|
|||
<version>${aliyun-java-sdk-core.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>opentracing-api</artifactId>
|
||||
<groupId>io.opentracing</groupId>
|
||||
<artifactId>opentracing-api</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<artifactId>opentracing-util</artifactId>
|
||||
<groupId>io.opentracing</groupId>
|
||||
<artifactId>opentracing-util</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
|
@ -477,8 +477,8 @@
|
|||
<version>${justauth.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>hutool-core</artifactId>
|
||||
<groupId>cn.hutool</groupId>
|
||||
<artifactId>hutool-core</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
|
@ -503,8 +503,8 @@
|
|||
<version>${jimureport.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>druid</artifactId>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>druid</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ public interface GlobalErrorCodeConstants {
|
|||
ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确");
|
||||
ErrorCode LOCKED = new ErrorCode(423, "请求失败,请稍后重试"); // 并发请求,不允许
|
||||
ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁,请稍后重试");
|
||||
ErrorCode NOT_SUPPORT_FILE_TYPE = new ErrorCode(430, "不支持上传该文件类型");
|
||||
|
||||
// ========== 服务端错误段 ==========
|
||||
|
||||
|
|
@ -39,8 +38,4 @@ public interface GlobalErrorCodeConstants {
|
|||
|
||||
ErrorCode UNKNOWN = new ErrorCode(999, "未知错误");
|
||||
|
||||
|
||||
ErrorCode DATA_EMPTY = new ErrorCode(1000, "数据不存在");
|
||||
|
||||
ErrorCode DATA_DUPLICATE = new ErrorCode(1001, "数据重复,操作失败");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,42 +0,0 @@
|
|||
package cn.hangtag.framework.common.pojo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Schema(description = "文件信息")
|
||||
@Data
|
||||
public class FileInfoVO {
|
||||
|
||||
/**
|
||||
* infra_file id
|
||||
*/
|
||||
@Schema(description = "文件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* infra_file_config id
|
||||
*/
|
||||
@Schema(description = "配置编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11")
|
||||
private Long configId;
|
||||
|
||||
@Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED, example = "hangtag.jpg")
|
||||
private String path;
|
||||
|
||||
@Schema(description = "原文件名", requiredMode = Schema.RequiredMode.REQUIRED, example = "hangtag.jpg")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "文件 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/hangtag.jpg")
|
||||
private String url;
|
||||
|
||||
@Schema(description = "文件MIME类型", example = "application/octet-stream")
|
||||
private String type;
|
||||
|
||||
@Schema(description = "文件大小", example = "2048", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private Integer size;
|
||||
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private LocalDateTime createTime;
|
||||
|
||||
}
|
||||
|
|
@ -6,7 +6,6 @@ import lombok.Data;
|
|||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Schema(description = "分页结果")
|
||||
@Data
|
||||
|
|
@ -18,10 +17,6 @@ public final class PageResult<T> implements Serializable {
|
|||
@Schema(description = "总量", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private Long total;
|
||||
|
||||
@Schema(description = "其他数据")
|
||||
private Map<String,Object> otherMap;
|
||||
|
||||
|
||||
public PageResult() {
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,30 +0,0 @@
|
|||
package cn.hangtag.framework.common.serialnumber;
|
||||
|
||||
import cn.hangtag.framework.common.util.FuncUtil;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public abstract class BaseCodingRulesType extends CodingRulesInfo {
|
||||
|
||||
public CodingRulesInfo setLastValue(String value){
|
||||
// 影响流水号,并与之前的值发生变了
|
||||
hasChanged = resetSerialNumber && !FuncUtil.equals(this.lastValue,value);
|
||||
// 最后为空时不作为变化
|
||||
if(FuncUtil.equals(this.lastValue,"")){
|
||||
hasChanged = false;
|
||||
}
|
||||
this.lastValue = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 对代码进行编码
|
||||
*
|
||||
* @param resetFlag 是否重置流水号
|
||||
* @return {@link String}
|
||||
*/
|
||||
public abstract String toCode(boolean resetFlag);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
package cn.hangtag.framework.common.serialnumber;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 构建器规则信息
|
||||
*
|
||||
* @author YuanFeng
|
||||
* @date 2024/07/20
|
||||
*/
|
||||
public class BuilderRuleUtils {
|
||||
/**
|
||||
* 解析一组规则信息,并将修改后的返回
|
||||
*
|
||||
* @param list 列表
|
||||
* @return {@link ParseRuleResult}
|
||||
*/
|
||||
public static ParseRuleResult parseRuleInfo(List<CodingRulesInfo> list) {
|
||||
ParseRuleResult ruleResult = new ParseRuleResult();
|
||||
Map<String, DateTimeType> timeMap = new HashMap<>();
|
||||
Map<String, SerialNumberType> serialNumberMap = new HashMap<>();
|
||||
Map<String, ConstantType> constantMap = new HashMap<>();
|
||||
String code = "";
|
||||
boolean reset = false;
|
||||
// 解析每一段code
|
||||
for (int i1 = 0; i1 < list.size(); i1++) {
|
||||
CodingRulesInfo item = list.get(i1);
|
||||
String mapKey = item.getItemKey();
|
||||
if ("constant".equals(item.getType())) {
|
||||
ConstantType constantType = constantMap.get(mapKey);
|
||||
if (constantType == null) {
|
||||
constantType = BeanUtil.toBean(item, ConstantType.class);
|
||||
constantMap.put(mapKey, constantType);
|
||||
} else {
|
||||
BeanUtil.copyProperties(item, constantType, "lastValue");
|
||||
}
|
||||
code += constantType.toCode(reset);
|
||||
} else if ("dateTime".equals(item.getType())) {
|
||||
DateTimeType dateTimeType = timeMap.get(mapKey);
|
||||
if (dateTimeType == null) {
|
||||
dateTimeType = BeanUtil.toBean(item, DateTimeType.class);
|
||||
timeMap.put(mapKey, dateTimeType);
|
||||
} else {
|
||||
BeanUtil.copyProperties(item, dateTimeType, "lastValue");
|
||||
}
|
||||
code += dateTimeType.toCode(reset);
|
||||
if (dateTimeType.isHasChanged()) {
|
||||
reset = true;
|
||||
}
|
||||
} else if ("serialNumber".equals(item.getType())) {
|
||||
SerialNumberType serialNumber = serialNumberMap.get(mapKey);
|
||||
if (serialNumber == null) {
|
||||
serialNumber = BeanUtil.toBean(item, SerialNumberType.class);
|
||||
serialNumberMap.put(mapKey, serialNumber);
|
||||
} else {
|
||||
BeanUtil.copyProperties(item, serialNumber);
|
||||
}
|
||||
String s = serialNumber.toCode(reset);
|
||||
// 覆盖之前数据
|
||||
item.setLastValue(s);
|
||||
serialNumberMap.put(mapKey, serialNumber);
|
||||
code += s;
|
||||
}
|
||||
}
|
||||
ruleResult.setCode(code);
|
||||
ruleResult.setList(list);
|
||||
return ruleResult;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
package cn.hangtag.framework.common.serialnumber;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
public class CodingRulesInfo implements Serializable {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
protected String itemKey;
|
||||
|
||||
/**
|
||||
* 类型 {@link CodingRulesTypeEnum}
|
||||
*/
|
||||
protected String type;
|
||||
|
||||
/**
|
||||
* 值
|
||||
*/
|
||||
protected String value;
|
||||
/**
|
||||
* 最后一个值
|
||||
*/
|
||||
protected String lastValue;
|
||||
|
||||
/**
|
||||
* 类型名称
|
||||
*/
|
||||
protected String typeName;
|
||||
|
||||
/**
|
||||
* 是否影响重置序列号
|
||||
*/
|
||||
protected boolean resetSerialNumber;
|
||||
|
||||
/**
|
||||
* 流水号长度
|
||||
*/
|
||||
protected Integer length;
|
||||
|
||||
/**
|
||||
* 每次递增数
|
||||
*/
|
||||
protected Integer step;
|
||||
|
||||
/**
|
||||
* 类型解释
|
||||
*/
|
||||
protected String typeExplain;
|
||||
|
||||
/**
|
||||
* 是否改变值
|
||||
*/
|
||||
protected boolean hasChanged;
|
||||
|
||||
}
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
package cn.hangtag.framework.common.serialnumber;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 编码规则类型枚举
|
||||
*
|
||||
* @author YuanFeng
|
||||
* @date 2024/01/31
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum CodingRulesTypeEnum {
|
||||
|
||||
CONSTANT("constant", "常量","固定值",ConstantType.class),
|
||||
DATE_TIME("dateTime", "日期时间","使用当前时间",DateTimeType.class),
|
||||
SERIAL_NUMBER_TYPE("serialNumber", "流水号","使用流水号",SerialNumberType.class);
|
||||
|
||||
|
||||
private final String type;
|
||||
private final String typeName;
|
||||
private final String typeExplain;
|
||||
private final Class clazz;
|
||||
|
||||
}
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
package cn.hangtag.framework.common.serialnumber;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 常量类型
|
||||
*
|
||||
* @author YuanFeng
|
||||
* @date 2024/01/31
|
||||
*/
|
||||
@Data
|
||||
public class ConstantType extends BaseCodingRulesType {
|
||||
|
||||
public ConstantType() {
|
||||
this.type = CodingRulesTypeEnum.CONSTANT.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toCode(boolean resetFlag) {
|
||||
String value = getValue();
|
||||
setLastValue(value);
|
||||
return value;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
ConstantType constantType = new ConstantType();
|
||||
constantType.setValue("PO");
|
||||
System.out.println(constantType.isHasChanged());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
package cn.hangtag.framework.common.serialnumber;
|
||||
|
||||
import cn.hangtag.framework.common.util.FuncUtil;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 日期时间类型
|
||||
*
|
||||
* @author YuanFeng
|
||||
* @date 2024/01/31
|
||||
*/
|
||||
@Data
|
||||
public class DateTimeType extends BaseCodingRulesType {
|
||||
|
||||
public DateTimeType() {
|
||||
this.type = CodingRulesTypeEnum.DATE_TIME.getType();
|
||||
this.value = "yyyyMMdd";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toCode(boolean resetFlag) {
|
||||
String res = "";
|
||||
if("time".equals(this.getValue())){
|
||||
res = FuncUtil.toStr(System.currentTimeMillis());
|
||||
}else{
|
||||
String format = DateUtil.format(DateUtil.date(), this.getValue());
|
||||
res = format;
|
||||
}
|
||||
setLastValue(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,71 +0,0 @@
|
|||
package cn.hangtag.framework.common.serialnumber;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class Demo {
|
||||
|
||||
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
List<CodingRulesInfo> list = new ArrayList<>();
|
||||
ConstantType constantType = new ConstantType();
|
||||
// 常量值
|
||||
constantType.setValue("TEST-");
|
||||
|
||||
DateTimeType dateTimeType = new DateTimeType();
|
||||
// 时间格式
|
||||
dateTimeType.setValue("yyyy");
|
||||
SerialNumberType serialNumberType = new SerialNumberType();
|
||||
// 起始值
|
||||
serialNumberType.setValue("1");
|
||||
serialNumberType.setStep(1);
|
||||
serialNumberType.setLength(6);
|
||||
ConstantType constantType2 = new ConstantType();
|
||||
// 常量值
|
||||
constantType2.setValue("-");
|
||||
|
||||
// 根据顺序生成条码
|
||||
list.add(constantType);
|
||||
list.add(dateTimeType);
|
||||
list.add(constantType2);
|
||||
list.add(serialNumberType);
|
||||
|
||||
ParseRuleResult ruleResult = BuilderRuleUtils.parseRuleInfo(list);
|
||||
System.out.println(ruleResult.getCode());
|
||||
System.out.println(builderCodeConfig());
|
||||
}
|
||||
|
||||
public static String builderCodeConfig(){
|
||||
// 根据需要生成条码 配置
|
||||
List<CodingRulesInfo> list = new ArrayList<>();
|
||||
ConstantType constantType = new ConstantType();
|
||||
// 常量值
|
||||
constantType.setValue("TEST-");
|
||||
|
||||
DateTimeType dateTimeType = new DateTimeType();
|
||||
// 时间格式
|
||||
dateTimeType.setValue("yyyy");
|
||||
SerialNumberType serialNumberType = new SerialNumberType();
|
||||
// 起始值
|
||||
serialNumberType.setValue("1");
|
||||
serialNumberType.setStep(1);
|
||||
serialNumberType.setLength(6);
|
||||
ConstantType constantType2 = new ConstantType();
|
||||
// 常量值
|
||||
constantType2.setValue("-");
|
||||
|
||||
// 根据顺序生成条码
|
||||
list.add(constantType);
|
||||
list.add(dateTimeType);
|
||||
list.add(constantType2);
|
||||
list.add(serialNumberType);
|
||||
return JSONUtil.toJsonStr(list);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
package cn.hangtag.framework.common.serialnumber;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class ParseRuleResult implements Serializable {
|
||||
|
||||
private String code;
|
||||
/**
|
||||
* 生成编码之后的数据
|
||||
*/
|
||||
List<CodingRulesInfo> list;
|
||||
|
||||
}
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
package cn.hangtag.framework.common.serialnumber;
|
||||
|
||||
import cn.hangtag.framework.common.util.FuncUtil;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 流水号类型
|
||||
*
|
||||
* @author YuanFeng
|
||||
* @date 2024/01/31
|
||||
*/
|
||||
@Data
|
||||
public class SerialNumberType extends BaseCodingRulesType {
|
||||
|
||||
private Integer length = 4;
|
||||
private Integer step = 1;
|
||||
private boolean fillZero = true;
|
||||
|
||||
public SerialNumberType() {
|
||||
this.type = CodingRulesTypeEnum.SERIAL_NUMBER_TYPE.getType();;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toCode(boolean resetFlag) {
|
||||
if(resetFlag){
|
||||
setValue(FuncUtil.toStr(getValue(),"1"));
|
||||
}else {
|
||||
long num = FuncUtil.toLong(getLastValue(),0L)+ step;
|
||||
setValue(FuncUtil.toStr(num));
|
||||
}
|
||||
setLastValue(getValue());
|
||||
return getNUmber();
|
||||
}
|
||||
private String getNUmber(){
|
||||
if(fillZero){
|
||||
return zeroPad(FuncUtil.toLong(getValue()), FuncUtil.toLong(getLength()));
|
||||
}
|
||||
return getValue();
|
||||
}
|
||||
public static String zeroPad(long number, long length) {
|
||||
// 将数字转换为字符串
|
||||
String numberStr = FuncUtil.toStr(number);
|
||||
|
||||
// 计算需要补零的位数
|
||||
long zeroCount = Math.max(0, length - numberStr.length());
|
||||
|
||||
// 构造补零的字符串
|
||||
StringBuilder zeroPadding = new StringBuilder();
|
||||
for (int i = 0; i < zeroCount; i++) {
|
||||
zeroPadding.append("0");
|
||||
}
|
||||
// 拼接补零和原始数字字符串
|
||||
return zeroPadding.toString() + numberStr;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
SerialNumberType serialNumberType = new SerialNumberType();
|
||||
serialNumberType.setStep(2);
|
||||
serialNumberType.setLength(6);
|
||||
serialNumberType.setFillZero(true);
|
||||
for (int i = 0; i < 10; i++) {
|
||||
System.out.println(serialNumberType.isHasChanged());
|
||||
System.out.println(serialNumberType.toCode(false));
|
||||
}
|
||||
serialNumberType.setFillZero(false);
|
||||
System.out.println(serialNumberType.toCode(true));
|
||||
}
|
||||
}
|
||||
|
|
@ -1,623 +0,0 @@
|
|||
package cn.hangtag.framework.common.util;
|
||||
|
||||
import cn.hangtag.framework.common.util.json.JsonUtils;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.lang.Snowflake;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.crypto.digest.DigestUtil;
|
||||
|
||||
import org.springframework.lang.NonNull;
|
||||
import org.springframework.util.*;
|
||||
import org.springframework.web.context.request.RequestAttributes;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.math.BigDecimal;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.SecureRandom;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.*;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* 常用功能工具类
|
||||
*/
|
||||
public class FuncUtil extends StringUtils {
|
||||
|
||||
private static final Pattern humpPattern = Pattern.compile("[A-Z]");
|
||||
public static boolean isBlank(@NonNull final CharSequence cs) {
|
||||
return cs == null || containsOnlyWhitespaces(cs);
|
||||
}
|
||||
|
||||
public static String dateFormat(LocalDateTime localDateTime){
|
||||
return DateUtil.format(localDateTime,"yyyy-MM-dd HH:mm:ss");
|
||||
}
|
||||
public static String dateFormat(Date date,String format){
|
||||
return DateUtil.format(date,format);
|
||||
}
|
||||
|
||||
public static String dateFormat(Date date){
|
||||
return DateUtil.format(date,"yyyy-MM-dd HH:mm:ss");
|
||||
}
|
||||
/**
|
||||
* 是全是空格
|
||||
*
|
||||
* @param string 字符串
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean containsOnlyWhitespaces(CharSequence string) {
|
||||
int size = string.length();
|
||||
|
||||
for(int i = 0; i < size; ++i) {
|
||||
char c = string.charAt(i);
|
||||
if (!isWhitespace(c)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
public static boolean isWhitespace(final char c) {
|
||||
return Character.isWhitespace(c)
|
||||
|| Character.isSpaceChar(c)
|
||||
|| c == '\ufeff'
|
||||
|| c == '\u202a'
|
||||
|| c == '\u0000';
|
||||
}
|
||||
public static boolean isEmpty(@NonNull Object obj) {
|
||||
return ObjectUtil.isEmpty(obj);
|
||||
}
|
||||
public static boolean isNotEmpty(@NonNull Object obj) {
|
||||
return !FuncUtil.isEmpty(obj);
|
||||
}
|
||||
public static boolean equals(Object a, Object b) {
|
||||
return equals(a,b,false);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param a a
|
||||
* @param b b
|
||||
* @param equalsValue 如果是数字类型是否判断值是否相等
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean equals(Object a, Object b,boolean equalsValue) {
|
||||
|
||||
if (a instanceof BigDecimal && b instanceof BigDecimal) {
|
||||
BigDecimal bigNum1 = (BigDecimal) a;
|
||||
BigDecimal bigNum2 = (BigDecimal) b;
|
||||
if (bigNum1 == bigNum2) {
|
||||
return true;
|
||||
} else if (bigNum1 != null && bigNum2 != null) {
|
||||
return 0 == bigNum1.compareTo(bigNum2);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else if ( equalsValue && a instanceof Long && b instanceof Integer) {
|
||||
return toLong(a) == toInt(b);
|
||||
} else if (equalsValue && a instanceof Integer && b instanceof Long) {
|
||||
return toInt(a) == toLong(b);
|
||||
}
|
||||
return (a == b) || (a != null && a.equals(b));
|
||||
}
|
||||
|
||||
public static boolean isEmpty(@NonNull Object[] array) {
|
||||
return ObjectUtil.isEmpty(array);
|
||||
}
|
||||
|
||||
public static <T> boolean contains(@NonNull T[] array, final T element) {
|
||||
return array == null ? false : Arrays.stream(array).anyMatch((x) -> {
|
||||
Object o1 =x;
|
||||
Object o2 = element;
|
||||
if (o1 == o2) {
|
||||
return true;
|
||||
}
|
||||
if (o1 == null || o2 == null) {
|
||||
return false;
|
||||
}
|
||||
if (o1.equals(o2)) {
|
||||
return true;
|
||||
}
|
||||
if (o1.getClass().isArray() && o2.getClass().isArray()) {
|
||||
if (o1 instanceof Object[] && o2 instanceof Object[]) {
|
||||
return Arrays.equals((Object[]) o1, (Object[]) o2);
|
||||
}
|
||||
if (o1 instanceof boolean[] && o2 instanceof boolean[]) {
|
||||
return Arrays.equals((boolean[]) o1, (boolean[]) o2);
|
||||
}
|
||||
if (o1 instanceof byte[] && o2 instanceof byte[]) {
|
||||
return Arrays.equals((byte[]) o1, (byte[]) o2);
|
||||
}
|
||||
if (o1 instanceof char[] && o2 instanceof char[]) {
|
||||
return Arrays.equals((char[]) o1, (char[]) o2);
|
||||
}
|
||||
if (o1 instanceof double[] && o2 instanceof double[]) {
|
||||
return Arrays.equals((double[]) o1, (double[]) o2);
|
||||
}
|
||||
if (o1 instanceof float[] && o2 instanceof float[]) {
|
||||
return Arrays.equals((float[]) o1, (float[]) o2);
|
||||
}
|
||||
if (o1 instanceof int[] && o2 instanceof int[]) {
|
||||
return Arrays.equals((int[]) o1, (int[]) o2);
|
||||
}
|
||||
if (o1 instanceof long[] && o2 instanceof long[]) {
|
||||
return Arrays.equals((long[]) o1, (long[]) o2);
|
||||
}
|
||||
if (o1 instanceof short[] && o2 instanceof short[]) {
|
||||
return Arrays.equals((short[]) o1, (short[]) o2);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
public static boolean contains(@NonNull Iterator<?> iterator, Object element) {
|
||||
if (iterator != null) {
|
||||
while (iterator.hasNext()) {
|
||||
Object candidate = iterator.next();
|
||||
if (ObjectUtils.nullSafeEquals(candidate, element)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean contains(@NonNull Enumeration<?> enumeration, Object element) {
|
||||
if (enumeration != null) {
|
||||
while (enumeration.hasMoreElements()) {
|
||||
Object candidate = enumeration.nextElement();
|
||||
if (ObjectUtils.nullSafeEquals(candidate, element)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static String toStr(Object str) {
|
||||
return toStr(str, "");
|
||||
}
|
||||
|
||||
public static String toStr(Object str, String defaultValue) {
|
||||
return null != str ? str.toString() : defaultValue;
|
||||
}
|
||||
|
||||
public static String toStrWithEmpty(Object str, String defaultValue) {
|
||||
return null != str && !str.equals("null") && !str.equals("") ? FuncUtil.toStr(str) : defaultValue;
|
||||
}
|
||||
|
||||
public static int toInt(final Object str) {
|
||||
return toInteger(str,-1);
|
||||
}
|
||||
|
||||
public static int toInt(@NonNull final Object str, final int defaultValue) {
|
||||
return toInteger(str, defaultValue);
|
||||
}
|
||||
public static Integer toInteger(final Object str) {
|
||||
return toInteger(str,null);
|
||||
}
|
||||
|
||||
public static Integer toInteger(@NonNull final Object str, final Integer defaultValue) {
|
||||
if (str == null) {
|
||||
return defaultValue;
|
||||
} else {
|
||||
try {
|
||||
return Integer.valueOf(FuncUtil.toStr(str));
|
||||
} catch (NumberFormatException var3) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
public static long tolong(final Object str) {
|
||||
return toLong(str,-1L);
|
||||
}
|
||||
|
||||
public static long tolong(@NonNull final Object str, final long defaultValue) {
|
||||
return toLong(str,defaultValue);
|
||||
}
|
||||
|
||||
public static Long toLong(final Object str) {
|
||||
return toLong(str,-1L);
|
||||
}
|
||||
|
||||
public static Long toLong(@NonNull final Object str, final Long defaultValue) {
|
||||
if (str == null) {
|
||||
return defaultValue;
|
||||
} else {
|
||||
try {
|
||||
return Long.valueOf(FuncUtil.toStr(str));
|
||||
} catch (NumberFormatException var4) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static Double toDouble(Object value) {
|
||||
return toDouble(FuncUtil.toStr(value), -1.0D);
|
||||
}
|
||||
|
||||
public static Double toDouble(Object value, Double defaultValue) {
|
||||
try {
|
||||
return value != null ? Double.valueOf(FuncUtil.toStr(value).trim()) : defaultValue;
|
||||
}catch (Exception var3) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
public static Float toFloat(Object value) {
|
||||
return toFloat(FuncUtil.toStr(value), -1.0F);
|
||||
}
|
||||
|
||||
public static Float toFloat(Object value, Float defaultValue) {
|
||||
return value != null ? Float.valueOf(FuncUtil.toStr(value).trim()) : defaultValue;
|
||||
}
|
||||
|
||||
public static Boolean toBoolean(Object value) {
|
||||
return toBoolean(value, (Boolean)null);
|
||||
}
|
||||
|
||||
public static Boolean toBoolean(Object value, Boolean defaultValue) {
|
||||
if (value != null) {
|
||||
if(value instanceof Boolean){
|
||||
return (Boolean) value;
|
||||
}
|
||||
String val = FuncUtil.toStr(value);
|
||||
val = val.toLowerCase().trim();
|
||||
return Boolean.parseBoolean(val);
|
||||
} else {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
public static Integer[] toIntArray(String str) {
|
||||
return toIntArray(",", str);
|
||||
}
|
||||
|
||||
public static Integer[] toIntArray(String split, String str) {
|
||||
if (isEmpty(str)) {
|
||||
return new Integer[0];
|
||||
} else {
|
||||
String[] arr = str.split(split);
|
||||
Integer[] ints = new Integer[arr.length];
|
||||
|
||||
for(int i = 0; i < arr.length; ++i) {
|
||||
Integer v = toInteger(arr[i], 0);
|
||||
ints[i] = v;
|
||||
}
|
||||
|
||||
return ints;
|
||||
}
|
||||
}
|
||||
|
||||
public static List<Integer> toIntList(String str) {
|
||||
return Arrays.asList(toIntArray(str));
|
||||
}
|
||||
|
||||
public static List<Integer> toIntList(String split, String str) {
|
||||
return Arrays.asList(toIntArray(split, str));
|
||||
}
|
||||
|
||||
public static Integer firstInt(String str) {
|
||||
return firstInt(",", str);
|
||||
}
|
||||
|
||||
public static Integer firstInt(String split, String str) {
|
||||
List<Integer> ints = toIntList(split, str);
|
||||
return isEmpty((Object)ints) ? null : (Integer)ints.get(0);
|
||||
}
|
||||
|
||||
public static Long[] toLongArray(String str) {
|
||||
return toLongArray(",", str);
|
||||
}
|
||||
|
||||
public static Long[] toLongArray(String split, String str) {
|
||||
if (isEmpty(str)) {
|
||||
return new Long[0];
|
||||
} else {
|
||||
String[] arr = str.split(split);
|
||||
Long[] longs = new Long[arr.length];
|
||||
|
||||
for(int i = 0; i < arr.length; ++i) {
|
||||
Long v = toLong(arr[i], 0L);
|
||||
longs[i] = v;
|
||||
}
|
||||
|
||||
return longs;
|
||||
}
|
||||
}
|
||||
|
||||
public static List<Long> toLongList(String str) {
|
||||
return Arrays.asList(toLongArray(str));
|
||||
}
|
||||
|
||||
public static List<Long> toLongList(String split, String str) {
|
||||
return Arrays.asList(toLongArray(split, str));
|
||||
}
|
||||
|
||||
public static Long firstLong(String str) {
|
||||
return firstLong(",", str);
|
||||
}
|
||||
|
||||
public static Long firstLong(String split, String str) {
|
||||
List<Long> longs = toLongList(split, str);
|
||||
return isEmpty((Object)longs) ? null : (Long)longs.get(0);
|
||||
}
|
||||
|
||||
public static String[] toStrArray(String str) {
|
||||
return toStrArray(",", str);
|
||||
}
|
||||
public static String[] toStringArray(Collection<String> collection) {
|
||||
if(isEmpty(collection)){
|
||||
return null;
|
||||
}
|
||||
int size = collection.size();
|
||||
String[] arr = new String[size];
|
||||
collection.toArray(arr);
|
||||
return arr;
|
||||
}
|
||||
public static String[] toStrArray(String split, String str) {
|
||||
return isBlank(str) ? new String[0] : str.split(split);
|
||||
}
|
||||
|
||||
public static List<String> toStrList(String str) {
|
||||
return Arrays.asList(toStrArray(str));
|
||||
}
|
||||
public static List<String> toStrListByArray(Object[] objects) {
|
||||
if(isEmpty(objects)){
|
||||
return null;
|
||||
}
|
||||
List<String> list = new ArrayList<>();
|
||||
for (Object o : objects) {
|
||||
list.add(toStr(o,null));
|
||||
}
|
||||
return list;
|
||||
}
|
||||
public static List<String> toStrListByCollection(Collection<Object> objects) {
|
||||
if(isEmpty(objects)){
|
||||
return null;
|
||||
}
|
||||
List<String> list = new ArrayList<>();
|
||||
for (Object o : objects) {
|
||||
list.add(toStr(o,null));
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public static List<String> toStrList(String split, String str) {
|
||||
return Arrays.asList(toStrArray(split, str));
|
||||
}
|
||||
|
||||
public static String firstStr(String str) {
|
||||
return firstStr(",", str);
|
||||
}
|
||||
|
||||
public static String firstStr(String split, String str) {
|
||||
List<String> strs = toStrList(split, str);
|
||||
return isEmpty((Object)strs) ? null : (String)strs.get(0);
|
||||
}
|
||||
|
||||
|
||||
public static String randomInt(int count) {
|
||||
return getRandomRange(count,1);
|
||||
}
|
||||
public static String randomChar(int count) {
|
||||
return getRandomRange(count,2);
|
||||
}
|
||||
public static String randomAll(int count) {
|
||||
return getRandomRange(count,-1);
|
||||
}
|
||||
private static String getRandomRange(int count,int type){
|
||||
if (count == 0) return "";
|
||||
String factor = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
||||
if(1 == type){
|
||||
factor = "0123456789";
|
||||
} else if(2 == type){
|
||||
factor = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
||||
}
|
||||
Assert.isTrue(count > 0, "Requested random string length " + count + " is less than 0.");
|
||||
Random random = new SecureRandom();
|
||||
char[] buffer = new char[count];
|
||||
for(int i = 0; i < count; ++i) {
|
||||
buffer[i] = factor.charAt(random.nextInt(factor.length()));
|
||||
}
|
||||
return new String(buffer);
|
||||
}
|
||||
public static String md5Hex(final String data) {
|
||||
return DigestUtil.md5Hex(data);
|
||||
}
|
||||
public static String md5Hex(final byte[] bytes) {
|
||||
return DigestUtil.md5Hex(bytes);
|
||||
}
|
||||
public static String sha1Hex(String data) {
|
||||
return DigestUtil.sha1Hex(data);
|
||||
}
|
||||
public static String sha1Hex(final byte[] bytes) {
|
||||
return DigestUtil.sha1Hex(bytes);
|
||||
}
|
||||
public static String sha256Hex(String data) {
|
||||
return DigestUtil.sha256Hex(data);
|
||||
}
|
||||
public static String sha256Hex(final byte[] bytes) {
|
||||
return DigestUtil.sha256Hex(bytes);
|
||||
}
|
||||
|
||||
public static String encodeBase64(String value, Charset charset) {
|
||||
byte[] val = value.getBytes(charset);
|
||||
return new String(Base64Utils.encode(val), charset);
|
||||
}
|
||||
public static String decodeBase64(String value) {
|
||||
return decodeBase64(value, StandardCharsets.UTF_8);
|
||||
}
|
||||
public static String decodeBase64(String value, Charset charset) {
|
||||
byte[] val = value.getBytes(charset);
|
||||
byte[] decodedValue = Base64Utils.decode(val);
|
||||
return new String(decodedValue, charset);
|
||||
}
|
||||
public static String decodeBase64UrlSafe(String value) {
|
||||
return decodeBase64UrlSafe(value,StandardCharsets.UTF_8);
|
||||
}
|
||||
public static String decodeBase64UrlSafe(String value, Charset charset) {
|
||||
byte[] val = value.getBytes(charset);
|
||||
return new String(Base64Utils.encodeUrlSafe(val), charset);
|
||||
}
|
||||
|
||||
public static String urlDecode(String source) {
|
||||
return StringUtils.uriDecode(source, StandardCharsets.UTF_8);
|
||||
}
|
||||
public static String urlDecode(String source, Charset charset) {
|
||||
return StringUtils.uriDecode(source, charset);
|
||||
}
|
||||
public static <T> T toBean(Map<String, Object> beanMap, Class<T> valueType) {
|
||||
return BeanUtil.toBean(beanMap, valueType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 高亮度文本
|
||||
*
|
||||
* @param sourceText 源文本
|
||||
* @param keyword 关键字
|
||||
* @param pre 前缀
|
||||
* @param suf 后缀
|
||||
* @return {@link String}
|
||||
*/
|
||||
public static String toHighLightText(String sourceText,String keyword,String pre,String suf){
|
||||
if(isEmpty(sourceText) || isEmpty(keyword)){
|
||||
return sourceText;
|
||||
}
|
||||
char[] chars = keyword.toCharArray();
|
||||
Set<Character> set = new HashSet<>();
|
||||
for (Character c : chars) {
|
||||
set.add(c);
|
||||
}
|
||||
for (Character item : set) {
|
||||
String tmp = FuncUtil.toStr(item).trim();
|
||||
sourceText = sourceText.replaceAll(tmp,pre+tmp+suf);
|
||||
}
|
||||
return sourceText;
|
||||
}
|
||||
public static String toHighLightText(String sourceText,String keyword){
|
||||
return toHighLightText(sourceText,keyword,HIGH_LIGHT_PRE_TAG, HIGH_LIGHT_POST_TAG);
|
||||
}
|
||||
public static final String HIGH_LIGHT_PRE_TAG = "<font color='#CC0000'>";
|
||||
public static final String HIGH_LIGHT_POST_TAG = "</font>";
|
||||
|
||||
/**
|
||||
* 高亮度文本
|
||||
*
|
||||
* @param textList 源文本
|
||||
* @param keyword 关键字
|
||||
* @return {@link List}<{@link String}>
|
||||
*/
|
||||
public static List<String> toHighLightText(List<String> textList,String keyword){
|
||||
return toHighLightText(keyword,textList,HIGH_LIGHT_PRE_TAG,HIGH_LIGHT_POST_TAG);
|
||||
}
|
||||
|
||||
/**
|
||||
* 高亮度文本
|
||||
*
|
||||
* @param keyword 关键字
|
||||
* @param textList 文本列表
|
||||
* @param pre 精准医疗
|
||||
* @param suf 进而
|
||||
* @return {@link List}<{@link String}>
|
||||
*/
|
||||
public static List<String> toHighLightText(String keyword,List<String> textList,String pre,String suf){
|
||||
List<String> list = new ArrayList<>();
|
||||
if(isEmpty(textList) || isEmpty(keyword)){
|
||||
return textList;
|
||||
}
|
||||
for (String s : textList) {
|
||||
list.add(toHighLightText(s,keyword,pre,suf));
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* 驼峰转下划线
|
||||
*
|
||||
* @param str
|
||||
* @return
|
||||
*/
|
||||
public static String humpToLine(String str) {
|
||||
if (str != null && str.length() > 0) {
|
||||
str = str.substring(0, 1).toLowerCase() + str.substring(1);
|
||||
Matcher matcher = humpPattern.matcher(str);
|
||||
StringBuffer sb = new StringBuffer();
|
||||
while (matcher.find()) {
|
||||
matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
|
||||
}
|
||||
matcher.appendTail(sb);
|
||||
return sb.toString();
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成数据指纹
|
||||
*
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
public static String createDataMD5(final Object data, final Object... datas) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append(getObjectStr(data));
|
||||
if (FuncUtil.isNotEmpty(datas)) {
|
||||
for (Object object : datas) {
|
||||
builder.append(getObjectStr(object));
|
||||
}
|
||||
}
|
||||
return DigestUtils.md5DigestAsHex(FuncUtil.toStr(builder, "").getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
private static String getObjectStr(Object object){
|
||||
|
||||
if(object instanceof ServletRequest){
|
||||
ServletRequest servletRequest = (ServletRequest) object;
|
||||
String remoteAddr = servletRequest.getRemoteAddr()+servletRequest.getRemoteHost();
|
||||
return DigestUtils.md5DigestAsHex(JsonUtils.toJson(remoteAddr).getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
return DigestUtils.md5DigestAsHex(JsonUtils.toJson(object,"{}").getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
public static String createDeviceId() {
|
||||
HttpServletRequest request = getRequest();
|
||||
String host = request.getHeader("host");
|
||||
String userAgent = request.getHeader("User-Agent");
|
||||
|
||||
String deviceId = createDataMD5("sessionUserId",host, userAgent, "8htcgeib794ual23nnyo6udyka746tgqfl74sldw0dae3ilm9abg2qqrkvogjtqm");
|
||||
return deviceId;
|
||||
}
|
||||
|
||||
public static HttpServletRequest getRequest() {
|
||||
RequestAttributes requestAttributes =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());
|
||||
return requestAttributes == null ? null : ((ServletRequestAttributes) requestAttributes).getRequest();
|
||||
}
|
||||
|
||||
public static LocalDateTime timeToLocalDate(Long timestamp) {
|
||||
if(isEmpty(timestamp)){
|
||||
return null;
|
||||
}
|
||||
Instant instant = Instant.ofEpochMilli(timestamp);
|
||||
// 将 Instant 转换为 LocalDateTime
|
||||
return LocalDateTime.ofInstant(instant, java.time.ZoneId.systemDefault());
|
||||
}
|
||||
public static Long localDateToLong(LocalDateTime date) {
|
||||
if(isEmpty(date)){
|
||||
return null;
|
||||
}
|
||||
Instant instant = date.atZone(TimeZone.getDefault().toZoneId()).toInstant();
|
||||
return instant.getEpochSecond();
|
||||
}
|
||||
private static final Snowflake snowflake = IdUtil.getSnowflake();
|
||||
public static long getNextId() {
|
||||
return snowflake.nextId();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,490 +0,0 @@
|
|||
package cn.hangtag.framework.common.util;
|
||||
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.core.JsonParser;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.core.TreeNode;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.*;
|
||||
import com.fasterxml.jackson.databind.module.SimpleModule;
|
||||
import com.fasterxml.jackson.databind.type.CollectionLikeType;
|
||||
import com.fasterxml.jackson.databind.type.MapType;
|
||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.lang.Nullable;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.Serializable;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
|
||||
@Slf4j
|
||||
public class JsonUtil {
|
||||
|
||||
public static <T> String toJson(T value) {
|
||||
try {
|
||||
return getFastInstance().writeValueAsString(value);
|
||||
} catch (Exception var2) {
|
||||
log.error(var2.getMessage(), var2);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static <T> String toJson(T value, String defaultValue) {
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
try {
|
||||
return getFastInstance().writeValueAsString(value);
|
||||
} catch (Exception var2) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static byte[] toJsonAsBytes(Object object) {
|
||||
return getFastInstance().writeValueAsBytes(object);
|
||||
|
||||
}
|
||||
|
||||
public static <T> T parse(String content, Class<T> valueType) {
|
||||
try {
|
||||
return getInstance().readValue(content, valueType);
|
||||
} catch (Exception var3) {
|
||||
log.error(var3.getMessage(), var3);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
public static <T> T parseFast(String content, Class<T> valueType) {
|
||||
try {
|
||||
return getFastInstance().readValue(content, valueType);
|
||||
} catch (Exception var3) {
|
||||
log.error(var3.getMessage(), var3);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static <T> T parse(String content, TypeReference<T> typeReference) {
|
||||
|
||||
return getInstance().readValue(content, typeReference);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static <T> T parse(byte[] bytes, Class<T> valueType) {
|
||||
return getInstance().readValue(bytes, valueType);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static <T> T parse(byte[] bytes, TypeReference<T> typeReference) {
|
||||
return getInstance().readValue(bytes, typeReference);
|
||||
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static <T> T parse(InputStream in, Class<T> valueType) {
|
||||
return getInstance().readValue(in, valueType);
|
||||
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static <T> T parse(InputStream in, TypeReference<T> typeReference) {
|
||||
return getInstance().readValue(in, typeReference);
|
||||
|
||||
}
|
||||
|
||||
public static <T> List<T> parseArray(String content, Class<T> valueTypeRef) {
|
||||
try {
|
||||
if (!content.toLowerCase().startsWith("[")) {
|
||||
content = "[" + content + "]";
|
||||
}
|
||||
|
||||
List<Map<String, Object>> list = getInstance().readValue(content, new TypeReference<List<Map<String, Object>>>() {
|
||||
});
|
||||
List<T> result = new ArrayList();
|
||||
Iterator var4 = list.iterator();
|
||||
|
||||
while (var4.hasNext()) {
|
||||
Map<String, Object> map = (Map) var4.next();
|
||||
result.add(toPojo(map, valueTypeRef));
|
||||
}
|
||||
|
||||
return result;
|
||||
} catch (IOException var6) {
|
||||
log.error(var6.getMessage(), var6);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static JsonNode readTree(String jsonString) {
|
||||
Objects.requireNonNull(jsonString, "jsonString is null");
|
||||
return getInstance().readTree(jsonString);
|
||||
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static JsonNode readTree(InputStream in) {
|
||||
Objects.requireNonNull(in, "InputStream in is null");
|
||||
return getInstance().readTree(in);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static JsonNode readTree(byte[] content) {
|
||||
Objects.requireNonNull(content, "byte[] content is null");
|
||||
|
||||
return getInstance().readTree(content);
|
||||
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static JsonNode readTree(JsonParser jsonParser) {
|
||||
|
||||
return getFastInstance().readTree(jsonParser);
|
||||
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@Nullable
|
||||
public static <T> T readValue(@Nullable byte[] content, Class<T> valueType) {
|
||||
if (ObjectUtil.isEmpty(content)) {
|
||||
return null;
|
||||
}
|
||||
return getInstance().readValue(content, valueType);
|
||||
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@Nullable
|
||||
public static <T> T readValue(@Nullable String jsonString, Class<T> valueType) {
|
||||
if (jsonString == null || jsonString.contains(" ")) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return getInstance().readValue(jsonString, valueType);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@Nullable
|
||||
public static <T> T readValue(@Nullable InputStream in, Class<T> valueType) {
|
||||
if (in == null) {
|
||||
return null;
|
||||
}
|
||||
return getInstance().readValue(in, valueType);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@Nullable
|
||||
public static <T> T readValue(@Nullable byte[] content, TypeReference<T> typeReference) {
|
||||
if (ObjectUtil.isEmpty(content)) {
|
||||
return null;
|
||||
}
|
||||
return getInstance().readValue(content, typeReference);
|
||||
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@Nullable
|
||||
public static <T> T readValue(@Nullable String jsonString, TypeReference<T> typeReference) {
|
||||
if (jsonString == null || jsonString.contains(" ")) {
|
||||
return null;
|
||||
}
|
||||
return getInstance().readValue(jsonString, typeReference);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@Nullable
|
||||
public static <T> T readValue(@Nullable InputStream in, TypeReference<T> typeReference) {
|
||||
if (in == null) {
|
||||
return null;
|
||||
}
|
||||
return getInstance().readValue(in, typeReference);
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static MapType getMapType(Class<?> keyClass, Class<?> valueClass) {
|
||||
return getFastInstance().getTypeFactory().constructMapType(Map.class, keyClass, valueClass);
|
||||
}
|
||||
|
||||
public static CollectionLikeType getListType(Class<?> elementClass) {
|
||||
return getFastInstance().getTypeFactory().constructCollectionLikeType(List.class, elementClass);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static <T> List<T> readList(@Nullable byte[] content, Class<T> elementClass) {
|
||||
if (ObjectUtil.isEmpty(content)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return getInstance().readValue(content, getListType(elementClass));
|
||||
|
||||
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static <T> List<T> readList(@Nullable InputStream content, Class<T> elementClass) {
|
||||
if (content == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return getInstance().readValue(content, getListType(elementClass));
|
||||
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static <T> List<T> readList(@Nullable String content, Class<T> elementClass) {
|
||||
if (ObjectUtil.isEmpty(content)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return getInstance().readValue(content, getListType(elementClass));
|
||||
|
||||
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static <K, V> Map<K, V> readMap(@Nullable byte[] content, Class<?> keyClass, Class<?> valueClass) {
|
||||
if (ObjectUtil.isEmpty(content)) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
return getInstance().readValue(content, getMapType(keyClass, valueClass));
|
||||
|
||||
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static <K, V> Map<K, V> readMap(@Nullable InputStream content, Class<?> keyClass, Class<?> valueClass) {
|
||||
if (ObjectUtil.isEmpty(content)) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
return getInstance().readValue(content, getMapType(keyClass, valueClass));
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static <K, V> Map<K, V> readMap(@Nullable String content, Class<?> keyClass, Class<?> valueClass) {
|
||||
if (ObjectUtil.isEmpty(content)) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
return getInstance().readValue(content, getMapType(keyClass, valueClass));
|
||||
|
||||
}
|
||||
|
||||
public static Map<String, Object> readMap(@Nullable String content) {
|
||||
return readMap(content, String.class, Object.class);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static List<Map<String, Object>> readListMap(@Nullable String content) {
|
||||
if (ObjectUtil.isEmpty(content)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return getInstance().readValue(content, new TypeReference<List<Map<String, Object>>>() {
|
||||
});
|
||||
}
|
||||
|
||||
public static <T> T convertValue(Object fromValue, Class<T> toValueType) {
|
||||
return getFastInstance().convertValue(fromValue, toValueType);
|
||||
}
|
||||
|
||||
public static <T> T convertValue(Object fromValue, JavaType toValueType) {
|
||||
return getFastInstance().convertValue(fromValue, toValueType);
|
||||
}
|
||||
|
||||
public static <T> T convertValue(Object fromValue, TypeReference<T> toValueTypeRef) {
|
||||
return getFastInstance().convertValue(fromValue, toValueTypeRef);
|
||||
}
|
||||
|
||||
public static <T> T treeToValue(TreeNode treeNode, Class<T> valueType) {
|
||||
try {
|
||||
return getFastInstance().treeToValue(treeNode, valueType);
|
||||
} catch (JsonProcessingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static JsonNode valueToTree(@Nullable Object value) {
|
||||
return getInstance().valueToTree(value);
|
||||
}
|
||||
|
||||
public static boolean canSerialize(@Nullable Object value) {
|
||||
return value == null || getInstance().canSerialize(value.getClass());
|
||||
}
|
||||
|
||||
public static Map<String, Object> toMap(String content) {
|
||||
try {
|
||||
return (Map) getInstance().readValue(content, Map.class);
|
||||
} catch (IOException var2) {
|
||||
log.error(var2.getMessage(), var2);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static <T> Map<String, T> toMap(String content, Class<T> valueTypeRef) {
|
||||
try {
|
||||
Map<String, Map<String, Object>> map = getInstance().readValue(content, new TypeReference<Map<String, Map<String, Object>>>() {
|
||||
});
|
||||
Map<String, T> result = new HashMap(16);
|
||||
Iterator var4 = map.entrySet().iterator();
|
||||
|
||||
while (var4.hasNext()) {
|
||||
Map.Entry<String, Map<String, Object>> entry = (Map.Entry) var4.next();
|
||||
result.put(entry.getKey(), toPojo(entry.getValue(), valueTypeRef));
|
||||
}
|
||||
|
||||
return result;
|
||||
} catch (IOException var6) {
|
||||
log.error(var6.getMessage(), var6);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static <T> T toPojo(Map fromValue, Class<T> toValueType) {
|
||||
return getFastInstance().convertValue(fromValue, toValueType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用这个覆盖更多类型配置,效率一点些,但是精度更高
|
||||
*
|
||||
* @param fromValue 从价值
|
||||
* @param toValueType 指向值类型
|
||||
* @return {@link T }
|
||||
*/
|
||||
public static <T> T toPojoFull(Object fromValue, Class<T> toValueType) {
|
||||
return getInstance().convertValue(fromValue, toValueType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用这个覆盖更多类型配置,效率一点些,但是精度更高
|
||||
*
|
||||
* @param fromValue
|
||||
* @param toValueType
|
||||
* @param <T>
|
||||
* @return
|
||||
*/
|
||||
public static <T> T convertValueFull(Object fromValue, Class<T> toValueType) {
|
||||
return getInstance().convertValue(fromValue, toValueType);
|
||||
}
|
||||
|
||||
private static final ObjectMapper INSTANCE = new NormalJacksonObjectMapper();
|
||||
private static final ObjectMapper FAST_INSTANCE = new FastObjectMapper();
|
||||
|
||||
public static ObjectMapper getInstance() {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
public static ObjectMapper getFastInstance() {
|
||||
return FAST_INSTANCE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用表达式获取值
|
||||
* String city = getValue2(jsonString, "person.address.city2", String.class);
|
||||
*
|
||||
* @param jsonString JSON字符串
|
||||
* @param expression 表达式
|
||||
* @param targetType 目标类型
|
||||
* @return {@link T}
|
||||
*/
|
||||
public static <T> T getJsonValue(String jsonString, String expression, Class<T> targetType) {
|
||||
JSONObject jsonObject = JSONUtil.parseObj(jsonString);
|
||||
Object result = jsonObject.getByPath(expression);
|
||||
return targetType.cast(result);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 一般的配置
|
||||
*
|
||||
* @author YuanFeng
|
||||
* @date 2022/11/21
|
||||
*/
|
||||
private static class NormalJacksonObjectMapper extends ObjectMapper implements Serializable {
|
||||
public NormalJacksonObjectMapper(ObjectMapper src) {
|
||||
super(src);
|
||||
}
|
||||
|
||||
public NormalJacksonObjectMapper() {
|
||||
//序列化BigDecimal时之间输出原始数字还是科学计数, 默认false, 即是否以toPlainString()科学计数方式来输出
|
||||
disable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
|
||||
//允许将JSON空字符串强制转换为null对象值
|
||||
enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
|
||||
//允许单个数值当做数组处理
|
||||
enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
|
||||
//禁止重复键, 抛出异常
|
||||
enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
|
||||
//禁止使用int代表Enum的order()來反序列化Enum, 抛出异常
|
||||
enable(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS);
|
||||
//有属性不能映射的时候不报错
|
||||
disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
|
||||
//使用null表示集合类型字段是时不抛异常
|
||||
disable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES);
|
||||
//对象为空时不抛异常
|
||||
disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
|
||||
|
||||
//允许在JSON中使用c/c++风格注释
|
||||
enable(JsonParser.Feature.ALLOW_COMMENTS);
|
||||
//强制转义非ascii字符
|
||||
disable(JsonGenerator.Feature.ESCAPE_NON_ASCII);
|
||||
//允许未知字段
|
||||
enable(JsonGenerator.Feature.IGNORE_UNKNOWN);
|
||||
//在JSON中允许未引用的字段名
|
||||
enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES);
|
||||
//时间格式
|
||||
disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
|
||||
setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
|
||||
//识别单引号
|
||||
enable(JsonParser.Feature.ALLOW_SINGLE_QUOTES);
|
||||
|
||||
// 配置 ObjectMapper
|
||||
setSerializationInclusion(JsonInclude.Include.NON_NULL); // NULL不参与序列化
|
||||
// 设置时区为默认系统时区
|
||||
setTimeZone(TimeZone.getDefault()); // 默认时区
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 快速对象映射器 不做复杂的序列化配置
|
||||
*
|
||||
* @author YuanFeng
|
||||
* @date 2022/11/26
|
||||
*/
|
||||
private static class FastObjectMapper extends ObjectMapper implements Serializable {
|
||||
public FastObjectMapper(ObjectMapper src) {
|
||||
super(src);
|
||||
}
|
||||
|
||||
public FastObjectMapper() {
|
||||
//序列化BigDecimal时之间输出原始数字还是科学计数, 默认false,不以toPlainString()科学计数方式来输出
|
||||
disable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
|
||||
//允许将JSON空字符串强制转换为null对象值
|
||||
enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
|
||||
//允许单个数值当做数组处理
|
||||
enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
|
||||
//禁止重复键, 抛出异常
|
||||
enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
|
||||
//禁止使用int代表Enum的order()來反序列化Enum, 抛出异常
|
||||
enable(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS);
|
||||
//有属性不能映射的时候不报错
|
||||
disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
|
||||
//使用null表示集合类型字段是时不抛异常
|
||||
disable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES);
|
||||
//对象为空时不抛异常
|
||||
disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
|
||||
//允许未知字段
|
||||
enable(JsonGenerator.Feature.IGNORE_UNKNOWN);
|
||||
//在JSON中允许未引用的字段名
|
||||
enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,118 +0,0 @@
|
|||
package cn.hangtag.framework.common.util;
|
||||
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
|
||||
import java.lang.reflect.Array;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* 安全使用值
|
||||
*
|
||||
* @author YuanFeng
|
||||
* @date 2024/5/16
|
||||
*/
|
||||
public class SafeUseUtil extends BeanUtil {
|
||||
// 缓存结果的 Map
|
||||
private static final Map<Object, Object> cache = new HashMap<>();
|
||||
private static final int CACHE_LIMIT = 1000; // 设置缓存大小限制
|
||||
|
||||
/**
|
||||
* Optional 的简单版
|
||||
* 安全使用值 对象中能取值则使用对象的值,否则返回默认值
|
||||
*
|
||||
* @param obj obj
|
||||
* @param extractor 提取器
|
||||
* @return {@link R }
|
||||
*/
|
||||
public static <T, R> R use(T obj, Function<T, R> extractor) {
|
||||
return use(obj, extractor, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 安全使用值 对象中能取值则使用对象的值,否则返回默认值
|
||||
*
|
||||
* @param obj obj
|
||||
* @param extractor 提取器
|
||||
* @param defaultValue 默认值
|
||||
* @return {@link R }
|
||||
*/
|
||||
public static <T, R> R use(T obj, Function<T, R> extractor, R defaultValue) {
|
||||
if (obj == null) return defaultValue;
|
||||
// 使用简单键,例如 obj 的哈希值
|
||||
Object key = generateCacheKey(obj, extractor,defaultValue);
|
||||
if (cache.containsKey(key)) {
|
||||
return (R) cache.get(key); // 从缓存中获取结果
|
||||
}
|
||||
R result = defaultValue;
|
||||
try {
|
||||
result = extractor.apply(obj);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
putCacheKey(key, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static <R> void putCacheKey(Object key, R result) {
|
||||
if (cache.size() >= CACHE_LIMIT) {
|
||||
// 进行简单的缓存清理
|
||||
cache.clear();
|
||||
}
|
||||
cache.put(key, result); // 缓存结果
|
||||
}
|
||||
|
||||
/**
|
||||
* 安全使用值 对象不为空 能取值并且不为空时 使用对象的中值,
|
||||
*
|
||||
* @param obj obj
|
||||
* @param extractor 提取器
|
||||
* @param defaultValue 默认值
|
||||
* @return {@link R }
|
||||
*/
|
||||
public static <T, R> R useNotEmpty(T obj, Function<T, R> extractor, R defaultValue) {
|
||||
if (isEmpty(obj)) return defaultValue;
|
||||
R result = use(obj, extractor, defaultValue);
|
||||
if (!isEmpty(result)) {
|
||||
return result;
|
||||
}
|
||||
return defaultValue; // 如果结果为空,返回默认值
|
||||
}
|
||||
public static boolean isEmpty(final Object object) {
|
||||
if (object == null) return true;
|
||||
if (object instanceof Collection) {
|
||||
return ((Collection<?>) object).isEmpty();
|
||||
} else if (object instanceof Map) {
|
||||
return ((Map<?,?>) object).isEmpty();
|
||||
} else if (object instanceof CharSequence) {
|
||||
return ((CharSequence) object).length() == 0;
|
||||
} else if (object.getClass().isArray()) {
|
||||
return Array.getLength(object) == 0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// 生成缓存键
|
||||
private static Object generateCacheKey(Object obj, Function<?, ?> extractor,Object val) {
|
||||
return Objects.hash(obj, extractor, val);
|
||||
}
|
||||
|
||||
// public static void main(String[] args) {
|
||||
// User2 user2 = new User2();
|
||||
//
|
||||
// user2.setName("yuanfeng");
|
||||
// Dept2 dept3 = new Dept2();
|
||||
// dept3.setName("parent");
|
||||
// Dept2 dept2 = new Dept2();
|
||||
// dept2.setParent(dept3);
|
||||
// dept2.setName("dept");
|
||||
// user2.setDept(dept2);
|
||||
// String name = use(use(use(user2, User2::getDept), Dept2::getParent),Dept2::getName);
|
||||
//
|
||||
// System.out.println(name);
|
||||
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -7,13 +7,11 @@ import cn.hutool.core.lang.Assert;
|
|||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hangtag.framework.common.enums.DateIntervalEnum;
|
||||
|
||||
import java.sql.Timestamp;
|
||||
import java.time.*;
|
||||
import java.time.format.DateTimeParseException;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.time.temporal.TemporalAdjusters;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
|
|
@ -308,10 +306,4 @@ public class LocalDateTimeUtils {
|
|||
}
|
||||
}
|
||||
|
||||
public static Date toDate(LocalDateTime localDateTime){
|
||||
Timestamp timestamp = Timestamp.valueOf(localDateTime); // 直接转换为 Timestamp
|
||||
Date date = new Date(timestamp.getTime()); // 使用 Timestamp 的时间戳构造 Date
|
||||
return date;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@ import lombok.SneakyThrows;
|
|||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.util.HashSet;
|
||||
|
||||
/**
|
||||
* 文件工具类
|
||||
|
|
@ -19,49 +18,6 @@ import java.util.HashSet;
|
|||
*/
|
||||
public class FileUtils {
|
||||
|
||||
public static final HashSet<String> SUFFIXS = new HashSet<String>() {{
|
||||
// 常用的图片文件类型
|
||||
add("jpg");
|
||||
add("jpeg");
|
||||
add("png");
|
||||
add("gif");
|
||||
add("bmp");
|
||||
add("tiff");
|
||||
add("webp");
|
||||
add("ico");
|
||||
add("svg");
|
||||
|
||||
// 常用的文档文件类型
|
||||
add("pdf");
|
||||
add("doc");
|
||||
add("docx");
|
||||
add("xls");
|
||||
add("xlsx");
|
||||
add("ppt");
|
||||
add("pptx");
|
||||
add("txt");
|
||||
add("rtf");
|
||||
|
||||
// 常用的视频文件类型
|
||||
add("mp4");
|
||||
add("avi");
|
||||
add("mov");
|
||||
add("wmv");
|
||||
add("flv");
|
||||
add("mkv");
|
||||
|
||||
// 常用的音频文件类型
|
||||
add("mp3");
|
||||
add("wav");
|
||||
add("ogg");
|
||||
add("aac");
|
||||
|
||||
// 压缩文件类型
|
||||
add("zip");
|
||||
add("rar");
|
||||
add("7z");
|
||||
|
||||
}};
|
||||
/**
|
||||
* 创建临时文件
|
||||
* 该文件会在 JVM 退出时,进行删除
|
||||
|
|
|
|||
|
|
@ -199,23 +199,4 @@ public class JsonUtils {
|
|||
return JSONUtil.isTypeJSON(text);
|
||||
}
|
||||
|
||||
|
||||
public static <T> String toJson(T value) {
|
||||
try {
|
||||
return objectMapper.writeValueAsString(value);
|
||||
} catch (Exception var2) {
|
||||
log.error(var2.getMessage(), var2);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
public static <T> String toJson(T value,String defaultValue) {
|
||||
if(value == null){
|
||||
return defaultValue;
|
||||
}
|
||||
try {
|
||||
return objectMapper.writeValueAsString(value);
|
||||
} catch (Exception var2) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,50 +0,0 @@
|
|||
package cn.hangtag.framework.common.util.validation;
|
||||
|
||||
import cn.hangtag.framework.common.exception.ErrorCode;
|
||||
import cn.hangtag.framework.common.exception.ServiceException;
|
||||
import cn.hangtag.framework.common.util.FuncUtil;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* 断言实用程序
|
||||
*
|
||||
* @author YuanFeng
|
||||
* @date 2024/09/23
|
||||
*/
|
||||
public class AssertUtil {
|
||||
public static void isEmpty(Object field, String errorMessage) {
|
||||
if (FuncUtil.isEmpty(field)) {
|
||||
throw new ServiceException(600, errorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
public static void isTrue(boolean b, String errorMessage) {
|
||||
if (b) {
|
||||
throw new ServiceException(600, errorMessage);
|
||||
}
|
||||
}
|
||||
public static void isFalse(boolean b, String errorMessage) {
|
||||
if (!b) {
|
||||
throw new ServiceException(600, errorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void isEmpty(Object field, ErrorCode errorCode) {
|
||||
if (FuncUtil.isEmpty(field)) {
|
||||
throw new ServiceException(errorCode);
|
||||
}
|
||||
}
|
||||
|
||||
public static void isNull(Object field, String errorMessage) {
|
||||
if (field == null) {
|
||||
throw new ServiceException(600,errorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
public static void isNull(Object field, ErrorCode errorCode) {
|
||||
if (field == null){
|
||||
throw new ServiceException(errorCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -24,20 +24,11 @@ public class ValidationUtils {
|
|||
|
||||
private static final Pattern PATTERN_XML_NCNAME = Pattern.compile("[a-zA-Z_][\\-_.0-9_a-zA-Z$]*");
|
||||
|
||||
private static final Pattern PATTERN_EMAIL = Pattern.compile("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$");
|
||||
|
||||
public static boolean isMobile(String mobile) {
|
||||
return StringUtils.hasText(mobile)
|
||||
&& PATTERN_MOBILE.matcher(mobile).matches();
|
||||
}
|
||||
|
||||
public static boolean isEmail(String email) {
|
||||
|
||||
return StringUtils.hasText(email)
|
||||
&& PATTERN_EMAIL.matcher(email).matches();
|
||||
}
|
||||
|
||||
|
||||
public static boolean isURL(String url) {
|
||||
return StringUtils.hasText(url)
|
||||
&& PATTERN_URL.matcher(url).matches();
|
||||
|
|
|
|||
|
|
@ -1,28 +0,0 @@
|
|||
package cn.hangtag.framework.common.validation;
|
||||
|
||||
import javax.validation.Constraint;
|
||||
import javax.validation.Payload;
|
||||
import java.lang.annotation.*;
|
||||
|
||||
@Target({
|
||||
ElementType.METHOD,
|
||||
ElementType.FIELD,
|
||||
ElementType.ANNOTATION_TYPE,
|
||||
ElementType.CONSTRUCTOR,
|
||||
ElementType.PARAMETER,
|
||||
ElementType.TYPE_USE
|
||||
})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
@Constraint(
|
||||
validatedBy = EmailValidator.class
|
||||
)
|
||||
public @interface Email {
|
||||
|
||||
String message() default "邮箱格式不正确";
|
||||
|
||||
Class<?>[] groups() default {};
|
||||
|
||||
Class<? extends Payload>[] payload() default {};
|
||||
|
||||
}
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
package cn.hangtag.framework.common.validation;
|
||||
|
||||
import cn.hangtag.framework.common.util.validation.ValidationUtils;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
|
||||
import javax.validation.ConstraintValidator;
|
||||
import javax.validation.ConstraintValidatorContext;
|
||||
|
||||
public class EmailValidator implements ConstraintValidator<Email, String> {
|
||||
|
||||
@Override
|
||||
public void initialize(Email annotation) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValid(String value, ConstraintValidatorContext context) {
|
||||
// 如果手机号为空,默认不校验,即校验通过
|
||||
if (StrUtil.isEmpty(value)) {
|
||||
return true;
|
||||
}
|
||||
// 校验手机
|
||||
return ValidationUtils.isEmail(value);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
artifactId=hangtag-common
|
||||
groupId=cn.hangtag
|
||||
version=2.1.0-jdk8-snapshot
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
cn\hangtag\framework\common\core\KeyValue.class
|
||||
cn\hangtag\framework\common\exception\ErrorCode.class
|
||||
cn\hangtag\framework\common\validation\MobileValidator.class
|
||||
cn\hangtag\framework\common\enums\TerminalEnum.class
|
||||
cn\hangtag\framework\common\util\date\DateUtils.class
|
||||
cn\hangtag\framework\common\util\validation\ValidationUtils.class
|
||||
cn\hangtag\framework\common\validation\Mobile.class
|
||||
cn\hangtag\framework\common\enums\DocumentEnum.class
|
||||
cn\hangtag\framework\common\util\json\JsonUtils.class
|
||||
cn\hangtag\framework\common\util\number\MoneyUtils.class
|
||||
cn\hangtag\framework\common\exception\util\ServiceExceptionUtil.class
|
||||
cn\hangtag\framework\common\util\servlet\ServletUtils.class
|
||||
cn\hangtag\framework\common\util\collection\MapUtils.class
|
||||
cn\hangtag\framework\common\util\io\FileUtils.class
|
||||
cn\hangtag\framework\common\exception\enums\ServiceErrorCodeRange.class
|
||||
cn\hangtag\framework\common\validation\InEnumCollectionValidator.class
|
||||
cn\hangtag\framework\common\validation\InEnum.class
|
||||
cn\hangtag\framework\common\exception\enums\GlobalErrorCodeConstants.class
|
||||
cn\hangtag\framework\common\util\cache\CacheUtils.class
|
||||
cn\hangtag\framework\common\pojo\PageParam.class
|
||||
cn\hangtag\framework\common\util\collection\CollectionUtils.class
|
||||
cn\hangtag\framework\common\util\spring\SpringExpressionUtils.class
|
||||
cn\hangtag\framework\common\validation\InEnumValidator.class
|
||||
cn\hangtag\framework\common\util\number\NumberUtils.class
|
||||
cn\hangtag\framework\common\pojo\PageResult.class
|
||||
cn\hangtag\framework\common\util\date\LocalDateTimeUtils.class
|
||||
cn\hangtag\framework\common\util\io\IoUtils.class
|
||||
cn\hangtag\framework\common\util\spring\SpringUtils.class
|
||||
cn\hangtag\framework\common\util\collection\ArrayUtils.class
|
||||
cn\hangtag\framework\common\pojo\CommonResult.class
|
||||
cn\hangtag\framework\common\util\http\HttpUtils.class
|
||||
cn\hangtag\framework\common\util\date\LocalDateTimeUtils$1.class
|
||||
cn\hangtag\framework\common\enums\WebFilterOrderEnum.class
|
||||
cn\hangtag\framework\common\exception\ServiceException.class
|
||||
cn\hangtag\framework\common\util\object\PageUtils.class
|
||||
cn\hangtag\framework\common\validation\Telephone.class
|
||||
cn\hangtag\framework\common\util\collection\SetUtils.class
|
||||
cn\hangtag\framework\common\enums\UserTypeEnum.class
|
||||
cn\hangtag\framework\common\core\IntArrayValuable.class
|
||||
cn\hangtag\framework\common\pojo\SortingField.class
|
||||
cn\hangtag\framework\common\pojo\SortablePageParam.class
|
||||
cn\hangtag\framework\common\util\object\ObjectUtils.class
|
||||
cn\hangtag\framework\common\util\object\BeanUtils.class
|
||||
cn\hangtag\framework\common\util\string\StrUtils.class
|
||||
cn\hangtag\framework\common\exception\ServerException.class
|
||||
cn\hangtag\framework\common\validation\TelephoneValidator.class
|
||||
cn\hangtag\framework\common\enums\DateIntervalEnum.class
|
||||
cn\hangtag\framework\common\util\monitor\TracerUtils.class
|
||||
cn\hangtag\framework\common\enums\CommonStatusEnum.class
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\number\MoneyUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\core\IntArrayValuable.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\pojo\PageParam.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\exception\util\ServiceExceptionUtil.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\Telephone.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\spring\SpringExpressionUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\enums\CommonStatusEnum.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\InEnum.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\exception\ServerException.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\pojo\SortablePageParam.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\enums\DateIntervalEnum.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\string\StrUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\validation\ValidationUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\MobileValidator.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\number\NumberUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\json\JsonUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\InEnumCollectionValidator.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\InEnumValidator.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\monitor\TracerUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\exception\enums\GlobalErrorCodeConstants.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\object\ObjectUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\collection\CollectionUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\pojo\PageResult.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\exception\enums\ServiceErrorCodeRange.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\date\LocalDateTimeUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\object\PageUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\enums\UserTypeEnum.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\object\BeanUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\spring\SpringUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\io\IoUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\collection\SetUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\core\KeyValue.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\TelephoneValidator.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\servlet\ServletUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\enums\TerminalEnum.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\pojo\SortingField.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\package-info.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\date\DateUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\package-info.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\enums\WebFilterOrderEnum.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\http\HttpUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\exception\ServiceException.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\package-info.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\collection\MapUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\collection\ArrayUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\enums\DocumentEnum.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\cache\CacheUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\pojo\CommonResult.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\util\io\FileUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\exception\ErrorCode.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\main\java\cn\hangtag\framework\common\validation\Mobile.java
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
cn\hangtag\framework\common\util\collection\CollectionUtilsTest.class
|
||||
cn\hangtag\framework\common\util\collection\CollectionUtilsTest$Dog.class
|
||||
|
|
@ -0,0 +1 @@
|
|||
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\test\java\cn\hangtag\framework\common\util\collection\CollectionUtilsTest.java
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
|
|
|
|||
|
|
@ -123,7 +123,6 @@ public class DeptDataPermissionRule implements DataPermissionRule {
|
|||
return new EqualsTo(null, null); // WHERE null = null,可以保证返回的数据为空
|
||||
}
|
||||
|
||||
if(true) return null;
|
||||
// 情况三,拼接 Dept 和 User 的条件,最后组合
|
||||
Expression deptExpression = buildDeptExpression(tableName,tableAlias, deptDataPermission.getDeptIds());
|
||||
Expression userExpression = buildUserExpression(tableName, tableAlias, deptDataPermission.getSelf(), loginUser.getId());
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
cn.hangtag.framework.datapermission.config.HangtagDataPermissionAutoConfiguration
|
||||
cn.hangtag.framework.datapermission.config.HangtagDeptDataPermissionAutoConfiguration
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
artifactId=hangtag-spring-boot-starter-biz-data-permission
|
||||
groupId=cn.hangtag
|
||||
version=2.1.0-jdk8-snapshot
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactory.class
|
||||
cn\hangtag\framework\datapermission\core\util\DataPermissionUtils.class
|
||||
cn\hangtag\framework\datapermission\core\rule\DataPermissionRule.class
|
||||
cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationInterceptor.class
|
||||
cn\hangtag\framework\datapermission\core\aop\DataPermissionContextHolder.class
|
||||
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptor.class
|
||||
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptor$ContextHolder.class
|
||||
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptor$MappedStatementCache.class
|
||||
cn\hangtag\framework\datapermission\config\HangtagDeptDataPermissionAutoConfiguration.class
|
||||
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImpl.class
|
||||
cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationAdvisor.class
|
||||
cn\hangtag\framework\datapermission\config\HangtagDataPermissionAutoConfiguration.class
|
||||
cn\hangtag\framework\datapermission\core\rule\dept\DeptDataPermissionRule.class
|
||||
cn\hangtag\framework\datapermission\core\annotation\DataPermission.class
|
||||
cn\hangtag\framework\datapermission\core\rule\dept\DeptDataPermissionRuleCustomizer.class
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImpl.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\rule\dept\DeptDataPermissionRule.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\config\HangtagDataPermissionAutoConfiguration.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\rule\dept\DeptDataPermissionRuleCustomizer.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\rule\DataPermissionRule.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\package-info.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\util\DataPermissionUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\annotation\DataPermission.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\aop\DataPermissionContextHolder.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactory.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationAdvisor.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\config\HangtagDeptDataPermissionAutoConfiguration.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationInterceptor.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptor.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\main\java\cn\hangtag\framework\datapermission\core\rule\dept\package-info.java
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$TestClass05.class
|
||||
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest2$1.class
|
||||
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest2$2.class
|
||||
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest2.class
|
||||
cn\hangtag\framework\datapermission\core\util\DataPermissionUtilsTest.class
|
||||
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest$DeptDataPermissionRule.class
|
||||
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest$EmptyDataPermissionRule.class
|
||||
cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationInterceptorTest$TestClass.class
|
||||
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$TestClass06.class
|
||||
cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationInterceptorTest$TestNone.class
|
||||
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$DataPermissionRule01.class
|
||||
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest.class
|
||||
cn\hangtag\framework\datapermission\core\rule\dept\DeptDataPermissionRuleTest.class
|
||||
cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationInterceptorTest$TestMethod.class
|
||||
cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationInterceptorTest.class
|
||||
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$DataPermissionRule02.class
|
||||
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$TestClass04.class
|
||||
cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$TestClass03.class
|
||||
cn\hangtag\framework\datapermission\core\aop\DataPermissionContextHolderTest.class
|
||||
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest.class
|
||||
cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest$1.class
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\test\java\cn\hangtag\framework\datapermission\core\aop\DataPermissionContextHolderTest.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\test\java\cn\hangtag\framework\datapermission\core\util\DataPermissionUtilsTest.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\test\java\cn\hangtag\framework\datapermission\core\rule\dept\DeptDataPermissionRuleTest.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\test\java\cn\hangtag\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\test\java\cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\test\java\cn\hangtag\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest2.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-data-permission\src\test\java\cn\hangtag\framework\datapermission\core\aop\DataPermissionAnnotationInterceptorTest.java
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
|
@ -0,0 +1,3 @@
|
|||
artifactId=hangtag-spring-boot-starter-biz-ip
|
||||
groupId=cn.hangtag
|
||||
version=2.1.0-jdk8-snapshot
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
cn\hangtag\framework\ip\core\enums\AreaTypeEnum.class
|
||||
cn\hangtag\framework\ip\core\utils\IPUtils.class
|
||||
cn\hangtag\framework\ip\core\Area.class
|
||||
cn\hangtag\framework\ip\core\utils\AreaUtils.class
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-ip\src\main\java\cn\hangtag\framework\ip\core\utils\IPUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-ip\src\main\java\cn\hangtag\framework\ip\core\Area.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-ip\src\main\java\cn\hangtag\framework\ip\package-info.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-ip\src\main\java\cn\hangtag\framework\ip\core\utils\AreaUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-ip\src\main\java\cn\hangtag\framework\ip\core\enums\AreaTypeEnum.java
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
cn\hangtag\framework\ip\core\utils\AreaUtilsTest.class
|
||||
cn\hangtag\framework\ip\core\utils\IPUtilsTest.class
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-ip\src\test\java\cn\hangtag\framework\ip\core\utils\AreaUtilsTest.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-ip\src\test\java\cn\hangtag\framework\ip\core\utils\IPUtilsTest.java
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ public class TenantSecurityWebFilter extends ApiRequestFilter {
|
|||
}
|
||||
|
||||
// 如果非允许忽略租户的 URL,则校验租户是否合法
|
||||
if (false) {
|
||||
if (!isIgnoreUrl(request)) {
|
||||
// 2. 如果请求未带租户的编号,不允许访问。
|
||||
if (tenantId == null) {
|
||||
log.error("[doFilterInternal][URL({}/{}) 未传递租户编号]", request.getRequestURI(), request.getMethod());
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "hangtag.tenant",
|
||||
"type": "cn.hangtag.framework.tenant.config.TenantProperties",
|
||||
"sourceType": "cn.hangtag.framework.tenant.config.TenantProperties"
|
||||
}
|
||||
],
|
||||
"properties": [
|
||||
{
|
||||
"name": "hangtag.tenant.enable",
|
||||
"type": "java.lang.Boolean",
|
||||
"description": "是否开启",
|
||||
"sourceType": "cn.hangtag.framework.tenant.config.TenantProperties"
|
||||
},
|
||||
{
|
||||
"name": "hangtag.tenant.ignore-tables",
|
||||
"type": "java.util.Set<java.lang.String>",
|
||||
"description": "需要忽略多租户的表 即默认所有表都开启多租户的功能,所以记得添加对应的 tenant_id 字段哟",
|
||||
"sourceType": "cn.hangtag.framework.tenant.config.TenantProperties"
|
||||
},
|
||||
{
|
||||
"name": "hangtag.tenant.ignore-urls",
|
||||
"type": "java.util.Set<java.lang.String>",
|
||||
"description": "需要忽略多租户的请求 默认情况下,每个请求需要带上 tenant-id 的请求头。但是,部分请求是无需带上的,例如说短信回调、支付回调等 Open API!",
|
||||
"sourceType": "cn.hangtag.framework.tenant.config.TenantProperties"
|
||||
}
|
||||
],
|
||||
"hints": []
|
||||
}
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
org.springframework.boot.env.EnvironmentPostProcessor=\
|
||||
cn.hangtag.framework.tenant.core.mq.kafka.TenantKafkaEnvironmentPostProcessor
|
||||
|
|
@ -0,0 +1 @@
|
|||
cn.hangtag.framework.tenant.config.HangtagTenantAutoConfiguration
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
artifactId=hangtag-spring-boot-starter-biz-tenant
|
||||
groupId=cn.hangtag
|
||||
version=2.1.0-jdk8-snapshot
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
cn\hangtag\framework\tenant\core\mq\kafka\TenantKafkaEnvironmentPostProcessor.class
|
||||
cn\hangtag\framework\tenant\core\service\TenantFrameworkService.class
|
||||
cn\hangtag\framework\tenant\core\mq\rocketmq\TenantRocketMQInitializer.class
|
||||
cn\hangtag\framework\tenant\core\job\TenantJobAspect.class
|
||||
cn\hangtag\framework\tenant\core\service\TenantFrameworkServiceImpl$1.class
|
||||
META-INF\spring-configuration-metadata.json
|
||||
cn\hangtag\framework\tenant\config\HangtagTenantAutoConfiguration.class
|
||||
cn\hangtag\framework\tenant\core\mq\rocketmq\TenantRocketMQSendMessageHook.class
|
||||
org\springframework\messaging\handler\invocation\InvocableHandlerMethod.class
|
||||
cn\hangtag\framework\tenant\core\db\TenantBaseDO.class
|
||||
cn\hangtag\framework\tenant\core\job\TenantJob.class
|
||||
cn\hangtag\framework\tenant\core\util\TenantUtils.class
|
||||
cn\hangtag\framework\tenant\core\mq\rocketmq\TenantRocketMQConsumeMessageHook.class
|
||||
cn\hangtag\framework\tenant\core\db\TenantDatabaseInterceptor.class
|
||||
cn\hangtag\framework\tenant\core\redis\TenantRedisCacheManager.class
|
||||
cn\hangtag\framework\tenant\core\aop\TenantIgnoreAspect.class
|
||||
cn\hangtag\framework\tenant\core\service\TenantFrameworkServiceImpl$2.class
|
||||
cn\hangtag\framework\tenant\core\mq\rabbitmq\TenantRabbitMQInitializer.class
|
||||
cn\hangtag\framework\tenant\core\service\TenantFrameworkServiceImpl.class
|
||||
cn\hangtag\framework\tenant\core\mq\rabbitmq\TenantRabbitMQMessagePostProcessor.class
|
||||
cn\hangtag\framework\tenant\core\aop\TenantIgnore.class
|
||||
cn\hangtag\framework\tenant\core\web\TenantContextWebFilter.class
|
||||
cn\hangtag\framework\tenant\core\context\TenantContextHolder.class
|
||||
org\springframework\messaging\handler\invocation\InvocableHandlerMethod$AsyncResultMethodParameter.class
|
||||
cn\hangtag\framework\tenant\core\mq\redis\TenantRedisMessageInterceptor.class
|
||||
cn\hangtag\framework\tenant\core\security\TenantSecurityWebFilter.class
|
||||
cn\hangtag\framework\tenant\config\TenantProperties.class
|
||||
cn\hangtag\framework\tenant\core\mq\kafka\TenantKafkaProducerInterceptor.class
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\security\TenantSecurityWebFilter.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\org\springframework\messaging\handler\invocation\InvocableHandlerMethod.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\service\TenantFrameworkService.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\package-info.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\kafka\TenantKafkaProducerInterceptor.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\context\TenantContextHolder.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\service\TenantFrameworkServiceImpl.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\job\TenantJob.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\job\TenantJobAspect.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\rocketmq\TenantRocketMQConsumeMessageHook.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\rocketmq\TenantRocketMQSendMessageHook.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\redis\TenantRedisCacheManager.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\db\TenantBaseDO.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\rabbitmq\TenantRabbitMQMessagePostProcessor.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\util\TenantUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\aop\TenantIgnoreAspect.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\config\HangtagTenantAutoConfiguration.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\config\TenantProperties.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\db\TenantDatabaseInterceptor.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\kafka\TenantKafkaEnvironmentPostProcessor.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\rabbitmq\TenantRabbitMQInitializer.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\redis\TenantRedisMessageInterceptor.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\aop\TenantIgnore.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\mq\rocketmq\TenantRocketMQInitializer.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-biz-tenant\src\main\java\cn\hangtag\framework\tenant\core\web\TenantContextWebFilter.java
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
cn.hangtag.framework.dict.config.HangtagDictAutoConfiguration
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
artifactId=hangtag-spring-boot-starter-excel
|
||||
groupId=cn.hangtag
|
||||
version=2.1.0-jdk8-snapshot
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
cn\hangtag\framework\excel\core\convert\JsonConvert.class
|
||||
cn\hangtag\framework\dict\config\HangtagDictAutoConfiguration.class
|
||||
cn\hangtag\framework\excel\core\convert\AreaConvert.class
|
||||
cn\hangtag\framework\dict\core\DictFrameworkUtils$1.class
|
||||
cn\hangtag\framework\excel\core\handler\SelectSheetWriteHandler.class
|
||||
cn\hangtag\framework\excel\core\annotations\DictFormat.class
|
||||
cn\hangtag\framework\excel\core\convert\MoneyConvert.class
|
||||
cn\hangtag\framework\excel\core\annotations\ExcelColumnSelect.class
|
||||
cn\hangtag\framework\dict\core\DictFrameworkUtils$3.class
|
||||
cn\hangtag\framework\excel\core\function\ExcelColumnSelectFunction.class
|
||||
cn\hangtag\framework\dict\core\DictFrameworkUtils$2.class
|
||||
cn\hangtag\framework\excel\core\convert\DictConvert.class
|
||||
cn\hangtag\framework\dict\core\DictFrameworkUtils.class
|
||||
cn\hangtag\framework\excel\core\util\ExcelUtils.class
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\convert\MoneyConvert.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\dict\package-info.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\annotations\ExcelColumnSelect.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\package-info.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\dict\core\DictFrameworkUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\dict\config\HangtagDictAutoConfiguration.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\util\ExcelUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\annotations\DictFormat.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\function\ExcelColumnSelectFunction.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\convert\JsonConvert.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\handler\SelectSheetWriteHandler.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\convert\DictConvert.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\main\java\cn\hangtag\framework\excel\core\convert\AreaConvert.java
|
||||
|
|
@ -0,0 +1 @@
|
|||
cn\hangtag\framework\dict\core\util\DictFrameworkUtilsTest.class
|
||||
|
|
@ -0,0 +1 @@
|
|||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\test\java\cn\hangtag\framework\dict\core\util\DictFrameworkUtilsTest.java
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
cn.hangtag.framework.quartz.config.HangtagQuartzAutoConfiguration
|
||||
cn.hangtag.framework.quartz.config.HangtagAsyncAutoConfiguration
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
artifactId=hangtag-spring-boot-starter-job
|
||||
groupId=cn.hangtag
|
||||
version=2.1.0-jdk8-snapshot
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
cn\hangtag\framework\quartz\core\enums\JobDataKeyEnum.class
|
||||
cn\hangtag\framework\quartz\config\HangtagQuartzAutoConfiguration.class
|
||||
cn\hangtag\framework\quartz\core\scheduler\SchedulerManager.class
|
||||
cn\hangtag\framework\quartz\config\HangtagAsyncAutoConfiguration$1.class
|
||||
cn\hangtag\framework\quartz\core\service\JobLogFrameworkService.class
|
||||
cn\hangtag\framework\quartz\core\util\CronUtils.class
|
||||
cn\hangtag\framework\quartz\config\HangtagAsyncAutoConfiguration.class
|
||||
cn\hangtag\framework\quartz\core\handler\JobHandler.class
|
||||
cn\hangtag\framework\quartz\core\handler\JobHandlerInvoker.class
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\core\handler\JobHandler.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\core\handler\JobHandlerInvoker.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\core\scheduler\SchedulerManager.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\core\enums\JobDataKeyEnum.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\config\HangtagAsyncAutoConfiguration.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\core\util\CronUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\package-info.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\core\service\JobLogFrameworkService.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-job\src\main\java\cn\hangtag\framework\quartz\config\HangtagQuartzAutoConfiguration.java
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "hangtag.tracer",
|
||||
"type": "cn.hangtag.framework.tracer.config.TracerProperties",
|
||||
"sourceType": "cn.hangtag.framework.tracer.config.TracerProperties"
|
||||
}
|
||||
],
|
||||
"properties": [],
|
||||
"hints": []
|
||||
}
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
cn.hangtag.framework.tracer.config.HangtagTracerAutoConfiguration
|
||||
cn.hangtag.framework.tracer.config.HangtagMetricsAutoConfiguration
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
artifactId=hangtag-spring-boot-starter-monitor
|
||||
groupId=cn.hangtag
|
||||
version=2.1.0-jdk8-snapshot
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
cn\hangtag\framework\tracer\core\filter\TraceFilter.class
|
||||
cn\hangtag\framework\tracer\config\HangtagTracerAutoConfiguration.class
|
||||
cn\hangtag\framework\tracer\core\util\TracerFrameworkUtils.class
|
||||
cn\hangtag\framework\tracer\config\TracerProperties.class
|
||||
cn\hangtag\framework\tracer\config\HangtagMetricsAutoConfiguration.class
|
||||
cn\hangtag\framework\tracer\core\aop\BizTraceAspect.class
|
||||
META-INF\spring-configuration-metadata.json
|
||||
cn\hangtag\framework\tracer\core\annotation\BizTrace.class
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\core\aop\BizTraceAspect.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\package-info.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\core\filter\TraceFilter.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\config\HangtagTracerAutoConfiguration.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\config\HangtagMetricsAutoConfiguration.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\config\TracerProperties.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\core\util\TracerFrameworkUtils.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-monitor\src\main\java\cn\hangtag\framework\tracer\core\annotation\BizTrace.java
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
cn.hangtag.framework.mq.redis.config.HangtagRedisMQProducerAutoConfiguration
|
||||
cn.hangtag.framework.mq.redis.config.HangtagRedisMQConsumerAutoConfiguration
|
||||
cn.hangtag.framework.mq.rabbitmq.config.HangtagRabbitMQAutoConfiguration
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
artifactId=hangtag-spring-boot-starter-mq
|
||||
groupId=cn.hangtag
|
||||
version=2.1.0-jdk8-snapshot
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
cn\hangtag\framework\mq\redis\core\RedisMQTemplate.class
|
||||
cn\hangtag\framework\mq\redis\core\pubsub\AbstractRedisChannelMessageListener.class
|
||||
cn\hangtag\framework\mq\redis\core\stream\AbstractRedisStreamMessage.class
|
||||
cn\hangtag\framework\mq\redis\config\HangtagRedisMQProducerAutoConfiguration.class
|
||||
cn\hangtag\framework\mq\rabbitmq\config\HangtagRabbitMQAutoConfiguration.class
|
||||
cn\hangtag\framework\mq\redis\core\interceptor\RedisMessageInterceptor.class
|
||||
cn\hangtag\framework\mq\redis\core\pubsub\AbstractRedisChannelMessage.class
|
||||
cn\hangtag\framework\mq\redis\core\stream\AbstractRedisStreamMessageListener.class
|
||||
cn\hangtag\framework\mq\redis\config\HangtagRedisMQConsumerAutoConfiguration.class
|
||||
cn\hangtag\framework\mq\redis\core\job\RedisPendingMessageResendJob.class
|
||||
cn\hangtag\framework\mq\redis\core\message\AbstractRedisMessage.class
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\stream\AbstractRedisStreamMessage.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\stream\AbstractRedisStreamMessageListener.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\interceptor\RedisMessageInterceptor.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\package-info.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\RedisMQTemplate.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\package-info.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\pubsub\AbstractRedisChannelMessageListener.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\job\RedisPendingMessageResendJob.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\rabbitmq\package-info.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\rabbitmq\config\HangtagRabbitMQAutoConfiguration.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\rabbitmq\core\package-info.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\pubsub\AbstractRedisChannelMessage.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\config\HangtagRedisMQConsumerAutoConfiguration.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\config\HangtagRedisMQProducerAutoConfiguration.java
|
||||
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-mq\src\main\java\cn\hangtag\framework\mq\redis\core\message\AbstractRedisMessage.java
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
|
|
|
|||
|
|
@ -1,23 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build;
|
||||
|
||||
|
||||
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
public class FilterItem implements Serializable {
|
||||
|
||||
/**
|
||||
* 类型 = > >= < <= != in notIn like likeLef likeRight handler
|
||||
* {@link QueryFilterTypeEnum}
|
||||
*/
|
||||
private String type = QueryFilterTypeEnum.EQ.getValue();
|
||||
|
||||
/**
|
||||
* 条件为 或关系
|
||||
*/
|
||||
private boolean or;
|
||||
|
||||
}
|
||||
|
|
@ -1,85 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build;
|
||||
|
||||
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 过滤条件配置
|
||||
*
|
||||
* @author YuanFeng
|
||||
*/
|
||||
@Data
|
||||
public class FilterItemConfig implements Serializable {
|
||||
|
||||
// 排序字段 多个使用逗号分隔 name asc,createTime desc
|
||||
private String orderBy = ""; // 排序规则 name,createTime desc 这个默认使用 asc
|
||||
private String groupBy = ""; // 分组 name,createTime desc 这个默认使用 asc
|
||||
private Set<String> ignoreFields = new HashSet<>(); // 忽略字段 多个使用逗号分隔 如: userName,age
|
||||
private String dateFields = ""; //声明哪些是 日期字段 避免搜索错误 多个使用逗号分隔 如: createTime,updateTime
|
||||
private String defaultFilterType = QueryFilterTypeEnum.EQ.getValue();
|
||||
// 关键字搜索值,多个使用空格间隔 查询条件 where (name like %张% or name or like %李%) or (code like %张% or code or like %李%)
|
||||
private String keywordSearch; // 关键字搜索值,多个使用空格间隔 如: 张 李
|
||||
private String keywordFields; // 关键字段多个使用逗号 name,code
|
||||
private String easyOption = ""; // 简单配置 多个使用逗号号间隔; 如 name@like,age@> 条件 where like '%?%' and age > ?
|
||||
private Map<String, FilterItem> options; // 条件过滤配置
|
||||
|
||||
|
||||
|
||||
public Set<String> getIgnoreFieldsKeys() {
|
||||
if(ignoreFields == null){
|
||||
ignoreFields = new HashSet<>();
|
||||
}
|
||||
return ignoreFields;
|
||||
}
|
||||
public void setIgnoreFields(String config) {
|
||||
if(QueryConfigUtils.isNotEmpty(config)){
|
||||
List<String> strList = QueryConfigUtils.toStrList(config);
|
||||
getIgnoreFieldsKeys().addAll(strList);
|
||||
}
|
||||
}
|
||||
public String getIgnoreFields(){
|
||||
if(getIgnoreFieldsKeys().isEmpty()){
|
||||
return "";
|
||||
}
|
||||
return String.join(QueryConfigUtils.SPLIT_CHAR, getIgnoreFieldsKeys());
|
||||
}
|
||||
|
||||
public Map<String, FilterItem> getOptions() {
|
||||
if(options == null){
|
||||
options = new HashMap<>();
|
||||
}
|
||||
return options;
|
||||
}
|
||||
|
||||
// @条件(QueryFilterTypeEnum) 多个使用逗号号间隔; 如 name@like,age@> 条件 where like '%?%' and age > ?
|
||||
public void setEasyOption(String options){
|
||||
if (QueryConfigUtils.isNotEmpty(options)) {
|
||||
String[] split = options.split(QueryConfigUtils.SPLIT_CHAR);
|
||||
for (String s : split) {
|
||||
if(QueryConfigUtils.isNotEmpty(s.trim())){
|
||||
String[] split1 = s.trim().split(QueryConfigUtils.SPLIT_CONDITIONS);
|
||||
FilterItem item = new FilterItem();
|
||||
// 简单模式设置条件为都为 and 模式
|
||||
item.setOr(false);
|
||||
item.setType(getDefaultFilterType());
|
||||
if(split1.length == 2){
|
||||
// 获取条件类型
|
||||
QueryFilterTypeEnum byValue = QueryFilterTypeEnum.getByValue(split1[1]);
|
||||
if(byValue != null){
|
||||
item.setType(byValue.getValue());
|
||||
}
|
||||
}
|
||||
if(QueryConfigUtils.isEmpty(getOptions().get(split1[0].trim()))){
|
||||
//没有配置时候才将 简单条件添加到配置中
|
||||
getOptions().put(split1[0].trim(), item);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,105 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 高性能有序Map
|
||||
*
|
||||
* @author YuanFeng
|
||||
* @date 2020/9/14
|
||||
*/
|
||||
public class HighPerformanceOrderedMap<K, V> extends AbstractMap<K, V> {
|
||||
private final Map<K, V> map; // 存储数据的 HashMap
|
||||
private final List<K> order; // 维护插入顺序的 List
|
||||
|
||||
// 构造函数
|
||||
public HighPerformanceOrderedMap() {
|
||||
this.map = new HashMap<>();
|
||||
this.order = new ArrayList<>();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Set<Entry<K, V>> entrySet() {
|
||||
Set<Entry<K, V>> entrySet = new LinkedHashSet<>();
|
||||
for (K key : order) {
|
||||
entrySet.add(new SimpleEntry<>(key, map.get(key)));
|
||||
}
|
||||
return entrySet;
|
||||
}
|
||||
|
||||
/**
|
||||
* 移除第一
|
||||
*
|
||||
* @return {@link K }
|
||||
*/
|
||||
public K removeFirst(){
|
||||
if(!isEmpty()){
|
||||
K k = this.order.get(0);
|
||||
remove(k);
|
||||
return k;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public List<K> keyList(){
|
||||
return order;
|
||||
}
|
||||
@Override
|
||||
public Set<K> keySet(){
|
||||
return new LinkedHashSet<>(order);
|
||||
}
|
||||
@Override
|
||||
public List<V> values(){
|
||||
return new ArrayList<>(map.values());
|
||||
}
|
||||
|
||||
@Override
|
||||
public V put(K key, V value) {
|
||||
if (!map.containsKey(key)) {
|
||||
order.add(key); // 只在新插入时添加顺序
|
||||
}
|
||||
return map.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public V get(Object key) {
|
||||
return map.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public V remove(Object key) {
|
||||
if (map.containsKey(key)) {
|
||||
order.remove(key); // 移除顺序中的键
|
||||
}
|
||||
return map.remove(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsKey(Object key) {
|
||||
return map.containsKey(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsValue(Object value) {
|
||||
return map.containsValue(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size() {
|
||||
return map.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
map.clear();
|
||||
order.clear();
|
||||
}
|
||||
|
||||
// 打印所有键值对
|
||||
public void printEntries() {
|
||||
for (K key : order) {
|
||||
System.out.println(key + ": " + map.get(key));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,446 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build;
|
||||
|
||||
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* mybatisPlus 查询条件构建工具
|
||||
*
|
||||
* @author YuanFeng
|
||||
* @date 2023/5/14
|
||||
*/
|
||||
public class MybatisPlusUtil {
|
||||
|
||||
public static String[] defaultIgnoreFilters = {"pageNo", "pageSize", "PAGE_NO", "PAGE_SIZE", "PAGE_SIZE_NONE"};
|
||||
/**
|
||||
* 弱类型 生成非空值查询 指定转成的实体类型
|
||||
*
|
||||
* @param entity 实体
|
||||
* @param clazz clazz 返回QueryWrapper泛型的类型
|
||||
* @param ignoreField ignore字段
|
||||
* @return {@link QueryWrapper }<{@link T }>
|
||||
*/
|
||||
public static <T> QueryWrapper<T> buildQueryFor(Object entity,
|
||||
Class<T> clazz,
|
||||
String... ignoreField) {
|
||||
return buildQueryFor(null, entity, QueryFilterTypeEnum.EQ, clazz, ignoreField);
|
||||
}
|
||||
|
||||
/**
|
||||
* 弱类型 生成非空值查询 指定转成的实体类型
|
||||
*
|
||||
* @param conditions 条件 @条件(QueryFilterTypeEnum) 多个使用逗号号间隔; 如 name@like,age@> 条件 where like '%?%' and age > ?
|
||||
* @param entity 实体
|
||||
* @param typeEnum 类型列举 没有指定过滤类型时候的默认条件类型
|
||||
* @param clazz clazz 返回QueryWrapper泛型的类型
|
||||
* @param ignoreField ignore字段
|
||||
* @return {@link QueryWrapper }<{@link T }>
|
||||
*/
|
||||
public static <T> QueryWrapper<T> buildQueryFor(String conditions,
|
||||
Object entity,
|
||||
QueryFilterTypeEnum typeEnum,
|
||||
Class<T> clazz,
|
||||
String... ignoreField) {
|
||||
QueryFilterInfo queryFilterInfo = toFilter(conditions, entity, typeEnum, ignoreField);
|
||||
return parseQuery(queryFilterInfo, true, ignoreField);
|
||||
}
|
||||
|
||||
/**
|
||||
* 弱类型 实体转成查询条件
|
||||
* 实体可能是vo 但是查询 为 Db实体的时候使用
|
||||
*
|
||||
* @param conditions 条件 @条件(QueryFilterTypeEnum) 多个使用逗号号间隔; 如 name@like,age@> 条件 where like '%?%' and age > ?
|
||||
* @param entity 实体
|
||||
* @param clazz clazz 返回QueryWrapper泛型的类型
|
||||
* @param ignoreField ignore字段
|
||||
* @return {@link QueryWrapper }<{@link T }>
|
||||
*/
|
||||
public static <T> QueryWrapper<T> buildQueryFor(String conditions,
|
||||
Object entity,
|
||||
Class<T> clazz,
|
||||
String... ignoreField) {
|
||||
return buildQueryFor(conditions, entity, QueryFilterTypeEnum.EQ, clazz, ignoreField);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 弱类型 实体转成查询条件
|
||||
* 实体可能是vo 但是查询 为 Db 实体的时候使用
|
||||
*
|
||||
* @param entity 实体
|
||||
* @param typeEnum 类型列举 没有指定过滤类型时候的默认条件类型
|
||||
* @param clazz clazz 返回QueryWrapper泛型的类型
|
||||
* @param ignoreField ignore字段
|
||||
* @return {@link QueryWrapper }<{@link T }>
|
||||
*/
|
||||
public static <T> QueryWrapper<T> buildQueryFor(Object entity,
|
||||
QueryFilterTypeEnum typeEnum,
|
||||
Class<T> clazz,
|
||||
String... ignoreField) {
|
||||
return buildQueryFor(null, entity, typeEnum, clazz, ignoreField);
|
||||
}
|
||||
|
||||
/**
|
||||
* 实体转成查询条件
|
||||
*
|
||||
* @param entity 实体
|
||||
* @param ignoreField ignore字段
|
||||
* @return {@link QueryWrapper }<{@link T }>
|
||||
*/
|
||||
public static <T> QueryWrapper<T> buildQuery(T entity, String... ignoreField) {
|
||||
return buildQuery(null, entity, QueryFilterTypeEnum.EQ, ignoreField);
|
||||
}
|
||||
|
||||
/**
|
||||
* 实体转成查询条件
|
||||
*
|
||||
* @param conditions 条件
|
||||
* @param entity 实体
|
||||
* @param ignoreField ignore字段
|
||||
* @return {@link QueryWrapper }<{@link T }>
|
||||
*/
|
||||
public static <T> QueryWrapper<T> buildQuery(String conditions, T entity, String... ignoreField) {
|
||||
return buildQuery(conditions, entity, QueryFilterTypeEnum.EQ, ignoreField);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成非空值查询
|
||||
*
|
||||
* @param entity 实体
|
||||
* @param typeEnum 类型列举 没有指定过滤类型时候的默认条件类型
|
||||
* @param ignoreField ignore字段
|
||||
* @return {@link QueryWrapper }<{@link T }>
|
||||
*/
|
||||
public static <T> QueryWrapper<T> buildQuery(T entity, QueryFilterTypeEnum typeEnum, String... ignoreField) {
|
||||
return buildQuery(null, entity, typeEnum, ignoreField);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成非空值查询 根据泛型返回类型
|
||||
*
|
||||
* @param conditions 简单条件 @条件(QueryFilterTypeEnum) 多个使用逗号号间隔; 如 name@like,age@> 条件 where like '%?%' and age > ?
|
||||
* @param entity 实体
|
||||
* @param typeEnum 类型列举 没有指定过滤类型时候的默认条件类型
|
||||
* @param ignoreField ignore字段
|
||||
* @return {@link QueryWrapper }<{@link T }>
|
||||
*/
|
||||
public static <T> QueryWrapper<T> buildQuery(String conditions, T entity, QueryFilterTypeEnum typeEnum, String... ignoreField) {
|
||||
QueryFilterInfo<T> queryFilterInfo = toFilter(conditions, entity, typeEnum, ignoreField);
|
||||
QueryWrapper<T> queryWrapper = parseQuery(queryFilterInfo, true, ignoreField);
|
||||
return queryWrapper;
|
||||
}
|
||||
|
||||
|
||||
public static <E> QueryFilterInfo<E> toFilter(E entity, QueryFilterTypeEnum typeEnum, String... ignoreField) {
|
||||
return toFilter(null, entity, typeEnum, ignoreField);
|
||||
}
|
||||
|
||||
/**
|
||||
* 实体转成 过滤信息对象
|
||||
*
|
||||
* @param conditions 条件 name@like,age@>,code@= 简单配置 字段名称@条件
|
||||
* @param entity 实体
|
||||
* @param typeEnum 类型列举 没有指定过滤类型时候的默认条件类型
|
||||
* @param ignoreField ignore字段
|
||||
* @return {@link QueryFilterInfo }<{@link E }>
|
||||
*/
|
||||
public static <E> QueryFilterInfo<E> toFilter(String conditions, E entity, QueryFilterTypeEnum typeEnum, String... ignoreField) {
|
||||
Set<String> ignoreList = new HashSet<>();
|
||||
if (QueryConfigUtils.isNotEmpty(ignoreField)) {
|
||||
for (String ignoreColumn : ignoreField) {
|
||||
// 忽略字段 类中的字段转成下划线命名
|
||||
ignoreList.add(QueryConfigUtils.humpToLine(ignoreColumn));
|
||||
}
|
||||
}
|
||||
QueryFilterInfo<E> queryFilterInfo = new QueryFilterInfo<E>();
|
||||
queryFilterInfo.easyOptions(conditions);
|
||||
queryFilterInfo.setDefaultFilterType(typeEnum);
|
||||
queryFilterInfo.appendIgnoreFields(ignoreList);
|
||||
handlerEntityField(entity, queryFilterInfo, QueryConfigUtils.getDeclaredFields(entity.getClass()));
|
||||
// 处理父类
|
||||
Class<?> superclass = entity.getClass().getSuperclass();
|
||||
while (superclass != null) {
|
||||
handlerEntityField(entity, queryFilterInfo, QueryConfigUtils.getDeclaredFields(superclass));
|
||||
superclass = superclass.getSuperclass();
|
||||
}
|
||||
return queryFilterInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理实体字段 将 字段转成 查询条件
|
||||
*
|
||||
* @param entity 实体
|
||||
* @param queryFilterInfo 查询过滤器信息
|
||||
* @param declaredFields 声明字段
|
||||
*/
|
||||
private static <T> void handlerEntityField(T entity, QueryFilterInfo<T> queryFilterInfo, Field[] declaredFields) {
|
||||
|
||||
// 字段过滤条件类型
|
||||
Map<String, QueryFilterTypeEnum> filterMap = new HashMap<>();
|
||||
// 取出过滤条件类型
|
||||
Map<String, FilterItem> options = queryFilterInfo.getOptions();
|
||||
// 或者关系条件的字段集合
|
||||
Set<String> orKeys = new HashSet<>();
|
||||
if (QueryConfigUtils.isNotEmpty(options)) {
|
||||
Set<String> keySet = options.keySet();
|
||||
for (String s : keySet) {
|
||||
FilterItem item = options.get(s);
|
||||
|
||||
String type = item.getType();
|
||||
QueryFilterTypeEnum queryFilterTypeEnum = QueryFilterTypeEnum.getByValue(type);
|
||||
// 类中的字段转成下划线命名
|
||||
String field = QueryConfigUtils.humpToLine(s);
|
||||
if (queryFilterTypeEnum != null) {
|
||||
filterMap.put(field, queryFilterTypeEnum);
|
||||
} else {
|
||||
filterMap.put(field, QueryFilterTypeEnum.getByValue(queryFilterInfo.getDefaultFilterType()));
|
||||
}
|
||||
if (item.isOr()) {
|
||||
orKeys.add(field);
|
||||
}
|
||||
}
|
||||
}
|
||||
Set<String> ignoreList = queryFilterInfo.getIgnoreFieldsKeys();
|
||||
for (Field field : declaredFields) {
|
||||
field.setAccessible(true);
|
||||
try {
|
||||
//序列化 字段 属性为空不查询
|
||||
if (QueryConfigUtils.shouldSkipField(field, ignoreList)) {
|
||||
queryFilterInfo.appendIgnoreFields(ignoreList);
|
||||
continue;
|
||||
}
|
||||
String column = QueryConfigUtils.humpToLine(field.getName());
|
||||
//主键 注解TableId
|
||||
TableId tableId = field.getAnnotation(TableId.class);
|
||||
if (tableId != null && field.get(entity) != null) {
|
||||
//主键
|
||||
if (QueryConfigUtils.isNotEmpty(tableId.value())) {
|
||||
column = tableId.value();
|
||||
}
|
||||
} else {
|
||||
//数据库中字段名和实体类属性不一致 注解TableField
|
||||
TableField tableField = field.getAnnotation(TableField.class);
|
||||
if (tableField != null && !tableField.exist()) {
|
||||
// @TableField(exist = false) 不是表中内容 不形成查询条件
|
||||
if (QueryConfigUtils.isNotEmpty(tableField.value())) {
|
||||
column = tableField.value();
|
||||
}
|
||||
ignoreList.add(column);
|
||||
queryFilterInfo.appendIgnoreFields(ignoreList);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// 属性不为null 或 值在过滤条件中
|
||||
if (field.get(entity) != null) {
|
||||
Object inputVal = field.get(entity);
|
||||
Class<?> type = field.getType();
|
||||
Object val;
|
||||
|
||||
// 是否有指定的过滤条件
|
||||
QueryFilterTypeEnum filterTypeEnum = filterMap.get(column);
|
||||
if (filterTypeEnum == null) {
|
||||
filterTypeEnum = QueryFilterTypeEnum.getByValue(queryFilterInfo.getDefaultFilterType());
|
||||
}
|
||||
|
||||
if (QueryConfigUtils.isArr(inputVal)) {
|
||||
val = QueryConfigUtils.objToArray(inputVal, Object.class);
|
||||
} else if (QueryConfigUtils.isList(inputVal)) {
|
||||
val = QueryConfigUtils.objToArray(inputVal, Object.class);
|
||||
} else {
|
||||
val = TypeConverter.convertValue(inputVal, type);
|
||||
if (val == null) {
|
||||
// 没有转换成功
|
||||
val = inputVal.toString();
|
||||
}
|
||||
}
|
||||
queryFilterInfo.build(column, val, filterTypeEnum, orKeys.contains(column));
|
||||
}
|
||||
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 解析为查询条件
|
||||
*
|
||||
* @param queryFilterInfo 查询过滤器信息
|
||||
* @param isToLine 是否转成 下划线命名
|
||||
* @param clazz clazz 返回QueryWrapper泛型的类型
|
||||
* @param ignoreField 忽略字段
|
||||
* @return {@link QueryWrapper }<{@link T }>
|
||||
*/
|
||||
public static <T> QueryWrapper<T> parseQuery(QueryFilterInfo queryFilterInfo, boolean isToLine, Class<T> clazz, String... ignoreField) {
|
||||
QueryWrapper<T> queryWrapper = parseQuery(queryFilterInfo, isToLine, ignoreField);
|
||||
return queryWrapper;
|
||||
}
|
||||
/**
|
||||
* 解析为查询条件
|
||||
*
|
||||
* @param filterInfo 查询过滤器信息
|
||||
* @param isToLine 是否转成 下划线命名
|
||||
* @param ignoreField 忽略字段
|
||||
* @return {@link QueryWrapper }<{@link T }>
|
||||
*/
|
||||
public static <T> QueryWrapper<T> parseQuery(QueryFilterInfo<T> filterInfo, boolean isToLine, String... ignoreField) {
|
||||
|
||||
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
|
||||
|
||||
queryWrapper.and((q) -> {
|
||||
q.eq("1", 1);
|
||||
});
|
||||
String keywordFields = filterInfo.getConfig().getKeywordFields();
|
||||
String keywordSearch = filterInfo.getConfig().getKeywordSearch();
|
||||
if (QueryConfigUtils.isEmpty(filterInfo)) {
|
||||
return queryWrapper;
|
||||
}
|
||||
Map<String, Object> filter = filterInfo.getFilter();
|
||||
Map<String, FilterItem> options = filterInfo.getOptions();
|
||||
String str = filterInfo.getConfig().getOrderBy();
|
||||
Set<String> ignoreFieldsKeys = filterInfo.getIgnoreFieldsKeys();
|
||||
if(QueryConfigUtils.isNotEmpty(ignoreField)){
|
||||
ignoreFieldsKeys.addAll(Arrays.asList(ignoreField));
|
||||
}
|
||||
Set<String> ignoreKeys = new HashSet<>();
|
||||
|
||||
for (String ignoreFieldsKey : ignoreFieldsKeys) {
|
||||
ignoreKeys.add(isToLine ? QueryConfigUtils.humpToLine(ignoreFieldsKey) : ignoreFieldsKey);
|
||||
}
|
||||
if (QueryConfigUtils.isNotEmpty(str)) {
|
||||
String[] split = str.split(QueryConfigUtils.SPLIT_CHAR);
|
||||
for (String s1 : split) {
|
||||
String[] s2 = s1.split(" ");
|
||||
String orderField = s2[0];
|
||||
if (isToLine) {
|
||||
orderField = QueryConfigUtils.humpToLine(orderField);
|
||||
}
|
||||
|
||||
// 说明字段不存在 或者不参与排序
|
||||
if (ignoreKeys.contains(orderField)) {
|
||||
continue;
|
||||
}
|
||||
if (s2.length > 1 && "desc".equalsIgnoreCase(QueryConfigUtils.toStr(s2[1],""))) {
|
||||
queryWrapper.orderByDesc(orderField);
|
||||
} else {
|
||||
queryWrapper.orderByAsc(orderField);
|
||||
}
|
||||
}
|
||||
}
|
||||
// 处理关键字查询
|
||||
if (QueryConfigUtils.isNotEmpty(keywordSearch) && QueryConfigUtils.isNotEmpty(keywordFields)) {
|
||||
String finalKeywordSearch = keywordSearch.trim();
|
||||
if (QueryConfigUtils.isNotEmpty(finalKeywordSearch)) {
|
||||
String[] split = keywordFields.split(QueryConfigUtils.SPLIT_CHAR);
|
||||
queryWrapper.and((c) -> {
|
||||
for (String s : split) {
|
||||
s = isToLine ? QueryConfigUtils.humpToLine(s) : s;
|
||||
// 说明字段不存在 或者不参与搜索
|
||||
if (ignoreKeys.contains(s)) {
|
||||
continue;
|
||||
}
|
||||
// name like '%张%' or name like '%李%' or name like '%王%'
|
||||
// 多个关键字空格间隔
|
||||
String[] keyList = finalKeywordSearch.split(" ");
|
||||
for (String key : keyList) {
|
||||
c.or();
|
||||
// 关键字过滤 key
|
||||
c.like(s, key.trim());
|
||||
}
|
||||
c.or();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 条件查询
|
||||
if (QueryConfigUtils.isNotEmpty(filter)) {
|
||||
Set<String> keySet = options.keySet();
|
||||
// 过滤配置
|
||||
Map<String, FilterItem> filterMap = new HashMap<>();
|
||||
for (String s : keySet) {
|
||||
// 处理驼峰字段
|
||||
filterMap.put(isToLine ? QueryConfigUtils.humpToLine(s) : s, options.get(s));
|
||||
}
|
||||
// 日期字段
|
||||
Set<String> dateSet = new HashSet<>();
|
||||
String dateFields = filterInfo.getConfig().getDateFields();
|
||||
if (QueryConfigUtils.isNotEmpty(dateFields)) {
|
||||
String[] split = dateFields.split(QueryConfigUtils.SPLIT_CHAR);
|
||||
for (String s : split) {
|
||||
if (QueryConfigUtils.isNotEmpty(s.trim())) {
|
||||
dateSet.add(isToLine ? QueryConfigUtils.humpToLine(s.trim()) : s.trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
// 遍历过滤条件
|
||||
Set<String> fieldKey = filter.keySet();
|
||||
for (String objKey : fieldKey) {
|
||||
// 取出过滤的值
|
||||
Object value = filter.get(objKey);
|
||||
|
||||
if (QueryConfigUtils.skipData(value)) {
|
||||
// 跳过数据
|
||||
continue;
|
||||
}
|
||||
String field = isToLine ? QueryConfigUtils.humpToLine(objKey) : objKey;
|
||||
// 说明字段不存在 或者不参与条件查询
|
||||
if (ignoreKeys.contains(field)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
FilterItem item = filterMap.get(field);
|
||||
if (item == null) {
|
||||
//找不到指定的过滤类型 默认过滤类型
|
||||
item = new FilterItem();
|
||||
// 默认过滤类型
|
||||
item.setType(filterInfo.getDefaultFilterType());
|
||||
// 判断是否是数组
|
||||
if (QueryConfigUtils.isArr(value) || QueryConfigUtils.isList(value)) {
|
||||
item.setType(QueryFilterTypeEnum.BETWEEN.getValue());
|
||||
}
|
||||
item.setOr(false);
|
||||
}
|
||||
|
||||
// 判断是否是or
|
||||
if (item.isOr()) {
|
||||
queryWrapper.or();
|
||||
}
|
||||
QueryFilterTypeEnum byValue = QueryFilterTypeEnum.getByValue(item.getType());
|
||||
if(byValue == null){
|
||||
byValue = QueryFilterTypeEnum.EQ;
|
||||
}
|
||||
// 条件处理器
|
||||
queryWrapper = QueryConfigUtils.whereHandler(queryWrapper, byValue, dateSet, field, value);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// 分组
|
||||
List<String> strList = QueryConfigUtils.toStrList(filterInfo.getConfig().getGroupBy());
|
||||
if (QueryConfigUtils.isNotEmpty(strList)) {
|
||||
List<String> strSet = new ArrayList<>();
|
||||
for (String s : strList) {
|
||||
String s1 = isToLine ? QueryConfigUtils.humpToLine(s) : s;
|
||||
if (ignoreKeys.contains(s1)) {
|
||||
continue;
|
||||
}
|
||||
strSet.add(s1);
|
||||
}
|
||||
if (QueryConfigUtils.isNotEmpty(strSet)) {
|
||||
queryWrapper.groupBy(strSet);
|
||||
}
|
||||
}
|
||||
return queryWrapper;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,475 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build;
|
||||
|
||||
import cn.hangtag.framework.mybatis.build.enums.DbTypeEnum;
|
||||
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
|
||||
import cn.hangtag.framework.mybatis.build.where.handler.*;
|
||||
import cn.hangtag.framework.mybatis.build.where.WhereWrapper;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
import java.lang.reflect.Array;
|
||||
import java.lang.reflect.Field;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class QueryConfigUtils {
|
||||
|
||||
private static final Map<String, Function<Object, Boolean>> SKIP_HANDLER = new HashMap<>();
|
||||
|
||||
public static int MAX_LINE_CACHE = 100000;
|
||||
/**
|
||||
* 分隔符
|
||||
*/
|
||||
public static final String SPLIT_CHAR = ",";
|
||||
/**
|
||||
* 分裂条件
|
||||
*/
|
||||
public static final String SPLIT_CONDITIONS = "@";
|
||||
private static final Pattern HUMP_PATTERN = Pattern.compile("[A-Z]");
|
||||
private static DbTypeEnum currentType = DbTypeEnum.MYSQL;
|
||||
|
||||
public static DbTypeEnum getDbType() {
|
||||
return currentType;
|
||||
}
|
||||
|
||||
public static void setDbType(String dbType) {
|
||||
currentType = DbTypeEnum.getDbType(dbType);
|
||||
}
|
||||
|
||||
|
||||
private static final ThreadLocal<String> LOCAL_HANDLER = new ThreadLocal<>();
|
||||
|
||||
/**
|
||||
* 注册一个跳过数据处理方法,名称为key
|
||||
*
|
||||
* @param name 名称
|
||||
* @param handler 处理程序
|
||||
*/
|
||||
public static void registerSkipHandler(String name, Function<Object, Boolean> handler) {
|
||||
SKIP_HANDLER.put(name, handler);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static {
|
||||
// 默认
|
||||
registerSkipHandler("null", (obj) -> {
|
||||
return obj == null || obj.equals("null");
|
||||
});
|
||||
|
||||
resetWrapperHandler();
|
||||
}
|
||||
|
||||
public static void resetWrapperHandler(){
|
||||
|
||||
registerWrapperHandler(new Between2Handler<>());
|
||||
registerWrapperHandler(new BetweenHandler<>());
|
||||
registerWrapperHandler(new EqHandler<>());
|
||||
registerWrapperHandler(new GeHandler<>());
|
||||
registerWrapperHandler(new GtHandler<>());
|
||||
registerWrapperHandler(new InHandler<>());
|
||||
registerWrapperHandler(new InSetHandler<>());
|
||||
registerWrapperHandler(new KeywordHandler<>());
|
||||
registerWrapperHandler(new LeHandler<>());
|
||||
registerWrapperHandler(new LikeHandler<>());
|
||||
registerWrapperHandler(new LikeLeftHandler<>());
|
||||
registerWrapperHandler(new LikeRightHandler<>());
|
||||
registerWrapperHandler(new LtHandler<>());
|
||||
registerWrapperHandler(new NeHandler<>());
|
||||
registerWrapperHandler(new NotInHandler<>());
|
||||
registerWrapperHandler(new NotLikeHandler<>());
|
||||
|
||||
}
|
||||
|
||||
public static void registerWrapperHandler(WhereWrapper<?> whereWrapper) {
|
||||
WrapperHandler.registerWrapperHandler(whereWrapper);
|
||||
}
|
||||
/**
|
||||
* 使用跳过逻辑处理方法名称
|
||||
*
|
||||
* @param name 名称
|
||||
*/
|
||||
public static void useSkipHandler(String name) {
|
||||
// 线程绑定
|
||||
LOCAL_HANDLER.set(name);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private static Function<Object, Boolean> getSkipHandler(String name) {
|
||||
Function<Object, Boolean> function = null;
|
||||
if (name != null) {
|
||||
function = SKIP_HANDLER.get(name);
|
||||
}
|
||||
if (function == null) {
|
||||
// 使用默认
|
||||
return QueryConfigUtils::isEmpty;
|
||||
}
|
||||
return function;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 sql 如 字段为 id1,id2,id3 , 条件如 为 id1
|
||||
* 使用 方法 queryWrapper.apply(MybatisPlusUtil.getIdsToApply(“user_ids"),id)
|
||||
*
|
||||
* @param columnName 列名
|
||||
* @return {@link String }
|
||||
*/
|
||||
public static String getIdsToApply(String columnName) {
|
||||
return getIdsToApply(getDbType(), columnName);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取身份证申请
|
||||
*
|
||||
* @param dbType db类型
|
||||
* @param columnName 列名
|
||||
* @return {@link String }
|
||||
*/
|
||||
public static String getIdsToApply(DbTypeEnum dbType, String columnName) {
|
||||
switch (dbType) {
|
||||
case MYSQL:
|
||||
return "FIND_IN_SET ({0}, " + columnName + ")";
|
||||
case POSTGRE_SQL:
|
||||
return "'{0}' = ANY (string_to_array(" + columnName + ", ','))";
|
||||
default:
|
||||
return "FIND_IN_SET ({0}, " + columnName + ")";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转成下线缓存
|
||||
*/
|
||||
private static final HighPerformanceOrderedMap<String, String> TO_LINE_CACHE = new HighPerformanceOrderedMap<>();
|
||||
|
||||
/**
|
||||
* 驼峰转下划线
|
||||
*
|
||||
* @param str str
|
||||
* @return {@link String}
|
||||
*/
|
||||
public static String humpToLine(String str) {
|
||||
if (isNotEmpty(str)) {
|
||||
String s = TO_LINE_CACHE.get(str);
|
||||
if (isNotEmpty(s)) {
|
||||
return s;
|
||||
}
|
||||
|
||||
str = str.substring(0, 1).toLowerCase() + str.substring(1);
|
||||
Matcher matcher = HUMP_PATTERN.matcher(str);
|
||||
StringBuffer sb = new StringBuffer();
|
||||
while (matcher.find()) {
|
||||
matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
|
||||
}
|
||||
matcher.appendTail(sb);
|
||||
String string = sb.toString();
|
||||
TO_LINE_CACHE.put(str, string);
|
||||
if (TO_LINE_CACHE.size() > MAX_LINE_CACHE) {
|
||||
TO_LINE_CACHE.removeFirst();
|
||||
}
|
||||
return string;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转为骆驼
|
||||
*
|
||||
* @param s S
|
||||
* @return {@link String }
|
||||
*/
|
||||
public static String toCamelCase(String s) {
|
||||
if (isEmpty(s) || !s.contains("_")) {
|
||||
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 == '_') {
|
||||
upperCase = true;
|
||||
} else if (upperCase) {
|
||||
sb.append(Character.toUpperCase(c));
|
||||
upperCase = false;
|
||||
} else {
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static boolean shouldSkipField(Field field, Set<String> ignoreList) {
|
||||
|
||||
if ("serialVersionUID".equals(field.getName())) return true;
|
||||
if (ignoreList.contains(humpToLine(field.getName()))) return true;
|
||||
|
||||
// 过滤字段 只写字段
|
||||
if (field.getAnnotation(JsonProperty.class) != null
|
||||
&& field.getAnnotation(JsonProperty.class).access() == JsonProperty.Access.WRITE_ONLY) {
|
||||
ignoreList.add(humpToLine(field.getName()));
|
||||
return true;
|
||||
}
|
||||
// 在序列化和反序列化时忽略的属性
|
||||
if (field.getAnnotation(JsonIgnore.class) != null) {
|
||||
ignoreList.add(humpToLine(field.getName()));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static final Map<Class<?>, Field[]> fieldCache = new HashMap<>();
|
||||
|
||||
public static Field[] getDeclaredFields(Class<?> clazz) {
|
||||
return fieldCache.computeIfAbsent(clazz, Class::getDeclaredFields);
|
||||
}
|
||||
|
||||
// 去除空白
|
||||
public static List<String> toStrList(String str) {
|
||||
if (isEmpty(str)) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
String[] split = str.split(QueryConfigUtils.SPLIT_CHAR);
|
||||
return Arrays.stream(split).filter(s -> !isEmpty(s)).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static String[] toStrArr(String str) {
|
||||
List<String> strList = toStrList(str);
|
||||
if (isEmpty(strList)) {
|
||||
return null;
|
||||
}
|
||||
return strList.toArray(new String[strList.size()]);
|
||||
}
|
||||
|
||||
public static boolean isNotEmpty(final Object object) {
|
||||
return !isEmpty(object);
|
||||
}
|
||||
|
||||
public static boolean isEmpty(final Object object) {
|
||||
if (object == null) {
|
||||
return true;
|
||||
}
|
||||
if (object instanceof CharSequence) {
|
||||
return ((CharSequence) object).length() == 0;
|
||||
}
|
||||
if (object.getClass().isArray()) {
|
||||
return Array.getLength(object) == 0;
|
||||
}
|
||||
if (object instanceof Collection<?>) {
|
||||
return ((Collection<?>) object).isEmpty();
|
||||
}
|
||||
if (object instanceof Map<?, ?>) {
|
||||
return ((Map<?, ?>) object).isEmpty();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否支持日期搜索的类型 的关键字
|
||||
*
|
||||
* @param input 输入
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean isDateValue(String input) {
|
||||
try {
|
||||
LocalDate.parse(input, DateTimeFormatter.ISO_LOCAL_DATE);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
try {
|
||||
Long.valueOf(input);
|
||||
return true;
|
||||
} catch (Exception e2) {
|
||||
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static String toStr(Object str) {
|
||||
return toStr(str, "");
|
||||
}
|
||||
|
||||
public static String toStr(Object str, String defaultValue) {
|
||||
return null != str ? str.toString() : defaultValue;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 对象到数组
|
||||
*
|
||||
* @param obj obj
|
||||
* @param clazz clazz
|
||||
* @return {@link T[] }
|
||||
*/
|
||||
public static <T> T[] objToArray(Object obj, Class<T> clazz) {
|
||||
if (obj == null) {
|
||||
return (T[]) Array.newInstance(clazz, 0); // 返回空数组
|
||||
}
|
||||
|
||||
if (obj.getClass().isArray()) {
|
||||
return (T[]) obj; // 已经是数组,直接转换
|
||||
}
|
||||
|
||||
if (obj instanceof List<?>) {
|
||||
List<?> list = (List<?>) obj;
|
||||
// 使用传入的类型创建数组
|
||||
return list.toArray((T[]) Array.newInstance(clazz, list.size()));
|
||||
}
|
||||
|
||||
// 单个对象,转换为包含该对象的数组
|
||||
T[] array = (T[]) Array.newInstance(clazz, 1);
|
||||
array[0] = (T) obj;
|
||||
return array;
|
||||
}
|
||||
|
||||
/**
|
||||
* 日期格式
|
||||
*
|
||||
* @param localDateTime 当地日期时间
|
||||
* @return {@link String }
|
||||
*/
|
||||
public static String dateFormat(LocalDateTime localDateTime) {
|
||||
return DateUtil.format(localDateTime, "yyyy-MM-dd HH:mm:ss");
|
||||
}
|
||||
|
||||
/**
|
||||
* // 将对象转换为 List,支持泛型
|
||||
*
|
||||
* @param obj obj
|
||||
* @param clazz clazz
|
||||
* @return {@link List }<{@link T }>
|
||||
*/
|
||||
public static <T> List<T> objToList(Object obj, Class<T> clazz) {
|
||||
if (obj == null) {
|
||||
return new ArrayList<>(); // 返回空 List
|
||||
}
|
||||
|
||||
if (obj.getClass().isArray()) {
|
||||
// 数组转换为 List
|
||||
int length = Array.getLength(obj);
|
||||
List<T> list = new ArrayList<>(length);
|
||||
for (int i = 0; i < length; i++) {
|
||||
list.add((T) Array.get(obj, i));
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
if (obj instanceof List<?>) {
|
||||
return new ArrayList<>((List<T>) obj); // 已经是 List,直接转换
|
||||
}
|
||||
|
||||
// 单个对象,转换为包含该对象的 List
|
||||
return new ArrayList<>(Collections.singletonList((T) obj));
|
||||
}
|
||||
|
||||
/**
|
||||
* 对象是否为数组类型
|
||||
*
|
||||
* @param obj obj
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean isArr(Object obj) {
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
// 检查是否为数组
|
||||
if (obj.getClass().isArray()) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否为List 类型的数据
|
||||
*
|
||||
* @param obj obj
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean isList(Object obj) {
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
// 检查是否为 List
|
||||
if (obj instanceof List) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 字符串添加
|
||||
*
|
||||
* @param str str
|
||||
* @param field 领域
|
||||
* @return {@link String }
|
||||
*/
|
||||
public static String strAdd(String str, String... field) {
|
||||
if (QueryConfigUtils.isNotEmpty(field)) {
|
||||
for (String s : field) {
|
||||
if (QueryConfigUtils.isNotEmpty(s.trim())) {
|
||||
str += (s.trim() + QueryConfigUtils.SPLIT_CHAR);
|
||||
}
|
||||
}
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* 字符串删除
|
||||
*
|
||||
* @param str str
|
||||
* @param keys 键
|
||||
* @return {@link String }
|
||||
*/
|
||||
public static String strRemove(String str, String... keys) {
|
||||
if (QueryConfigUtils.isNotEmpty(keys)) {
|
||||
String[] split = str.split(QueryConfigUtils.SPLIT_CHAR);
|
||||
StringBuilder builder = new StringBuilder();
|
||||
List<String> strList = QueryConfigUtils.toStrList(String.join(QueryConfigUtils.SPLIT_CHAR, keys));
|
||||
for (int i = 0; i < split.length; i++) {
|
||||
if (strList.contains(split[i])) {
|
||||
continue;
|
||||
}
|
||||
builder.append(split[i]).append(QueryConfigUtils.SPLIT_CHAR);
|
||||
}
|
||||
str = builder.toString();
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* 跳过数据处理器
|
||||
*
|
||||
* @param str str
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean skipData(Object str) {
|
||||
return getSkipHandler(LOCAL_HANDLER.get()).apply(str);
|
||||
}
|
||||
|
||||
/**
|
||||
* where 条件处理
|
||||
*
|
||||
* @param value str
|
||||
* @return boolean
|
||||
*/
|
||||
public static <T> QueryWrapper<T> whereHandler(QueryWrapper<T> queryWrapper,
|
||||
QueryFilterTypeEnum type,
|
||||
Set<String> dateField,
|
||||
String filed,
|
||||
Object value) {
|
||||
return WrapperHandler.exeWrapperHandler(queryWrapper, type,dateField, filed, value);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,216 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build;
|
||||
|
||||
|
||||
import cn.hangtag.framework.common.pojo.PageParam;
|
||||
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.*;
|
||||
/*
|
||||
|
||||
前端条件 条件
|
||||
where
|
||||
(userName like '%周%' or nickname like '%周%')
|
||||
and (age > 18)
|
||||
and (userName in ('陈海瑶', '冯雨馨')
|
||||
or nickname like '%杰%')
|
||||
{
|
||||
"pager": {
|
||||
"current": 1,
|
||||
"size": 10
|
||||
},
|
||||
"config": {
|
||||
"keywordSearch": "周",
|
||||
"keywordFields": "userName,nickname",
|
||||
"orderBy": "age desc;name asc",
|
||||
"options": {
|
||||
"age": {
|
||||
"type": ">",
|
||||
"or": false
|
||||
},
|
||||
"userName": {
|
||||
"type": "in",
|
||||
"or": false
|
||||
},
|
||||
"nickname": {
|
||||
"type": "like",
|
||||
"or": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"filter": {
|
||||
"age": 18,
|
||||
"userName": [
|
||||
"陈海瑶",
|
||||
"冯雨馨"
|
||||
],
|
||||
"nickname": "杰"
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
@Data
|
||||
public class QueryFilterInfo<T> implements Serializable {
|
||||
|
||||
private FilterItemConfig config; // 配置
|
||||
private PageParam pager = new PageParam(); // 分页
|
||||
// 查询条件
|
||||
private Map<String, Object> filter = new HighPerformanceOrderedMap<>();
|
||||
|
||||
|
||||
public FilterItemConfig getConfig() {
|
||||
if(config == null){
|
||||
config = new FilterItemConfig();
|
||||
}
|
||||
return config;
|
||||
}
|
||||
|
||||
public String getDefaultFilterType() {
|
||||
return getConfig().getDefaultFilterType();
|
||||
}
|
||||
public Map<String, Object> getFilter() {
|
||||
if (filter == null) {
|
||||
filter = new HighPerformanceOrderedMap<>();
|
||||
}
|
||||
return filter;
|
||||
}
|
||||
// @条件(QueryFilterTypeEnum) 多个使用逗号号间隔; 如 name@like,age@> 条件 where like '%?%' and age > ?
|
||||
public void easyOptions(String options){
|
||||
this.getConfig().setEasyOption(options);
|
||||
}
|
||||
public Map<String, FilterItem> getOptions() {
|
||||
return this.getConfig().getOptions();
|
||||
}
|
||||
|
||||
/**
|
||||
* 建立或
|
||||
*
|
||||
* @param field 字段
|
||||
* @param value 值
|
||||
* @param type 类型
|
||||
* @return {@link FilterItem }
|
||||
*/
|
||||
public FilterItem buildOr(String field, Object value, QueryFilterTypeEnum type) {
|
||||
return buildFilter(field, value, type, true);
|
||||
}
|
||||
public void appendKeywordFields(String ...field){
|
||||
QueryConfigUtils.strAdd(this.getConfig().getKeywordFields(),field);
|
||||
}
|
||||
|
||||
public void delKeywordFields(String... keys){
|
||||
QueryConfigUtils.strRemove(this.getConfig().getKeywordFields(), keys);
|
||||
}
|
||||
|
||||
public void appendDateFields(String ...field){
|
||||
QueryConfigUtils.strAdd(this.getConfig().getDateFields(),field);
|
||||
}
|
||||
|
||||
public void delDateFields(String... keys){
|
||||
QueryConfigUtils.strRemove(this.getConfig().getDateFields(),keys);
|
||||
}
|
||||
|
||||
public void appendGroupBy(String ...field){
|
||||
QueryConfigUtils.strAdd(this.getConfig().getGroupBy(),field);
|
||||
}
|
||||
|
||||
public void delGroupBy(String... keys){
|
||||
QueryConfigUtils.strRemove(this.getConfig().getGroupBy(),keys);
|
||||
}
|
||||
|
||||
public boolean containsIgnoredKeys(String key) {
|
||||
return this.getConfig().getIgnoreFields().contains(key);
|
||||
}
|
||||
|
||||
public Set<String> getIgnoreFieldsKeys(){
|
||||
return this.getConfig().getIgnoreFieldsKeys();
|
||||
}
|
||||
public void appendIgnoreFields(String ...field){
|
||||
Set<String> set = new HashSet<>();
|
||||
if(QueryConfigUtils.isNotEmpty(field)){
|
||||
set.addAll(Arrays.asList(field));
|
||||
}
|
||||
appendIgnoreFields(set);
|
||||
}
|
||||
public void setDefaultFilterType(QueryFilterTypeEnum type){
|
||||
this.getConfig().setDefaultFilterType(type.getValue());
|
||||
}
|
||||
public void appendIgnoreFields(Set<String> field){
|
||||
if(QueryConfigUtils.isNotEmpty(field)){
|
||||
for (String s : field) {
|
||||
if(QueryConfigUtils.isNotEmpty(s.trim())){
|
||||
this.getConfig().getIgnoreFieldsKeys().add(s.trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public void delIgnoreFields(String... keys){
|
||||
if(QueryConfigUtils.isNotEmpty(keys)){
|
||||
for (String key : keys) {
|
||||
this.getConfig().getIgnoreFieldsKeys().remove(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void appendOrderByDesc(String ...field){
|
||||
appendOrderBy("DESC",field);
|
||||
}
|
||||
|
||||
private void appendOrderBy(String type,String ...field){
|
||||
if(QueryConfigUtils.isNotEmpty(field)){
|
||||
StringBuilder builder = new StringBuilder();
|
||||
List<String> strList = QueryConfigUtils.toStrList(this.getConfig().getOrderBy());
|
||||
for (String s : field) {
|
||||
if (QueryConfigUtils.isNotEmpty(s.trim())) {
|
||||
String key = s.trim() + " "+type;
|
||||
if(strList.contains(key)){
|
||||
strList.remove(key);
|
||||
}
|
||||
builder.append(s.trim()).append(" ").append(type).append(",");
|
||||
}
|
||||
}
|
||||
// 移除重复的排序
|
||||
StringBuilder res = new StringBuilder();
|
||||
for (String s : strList) {
|
||||
res.append(s).append(",");
|
||||
}
|
||||
String tmp = res.toString();
|
||||
tmp += builder.toString();
|
||||
this.getConfig().setOrderBy(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
public void appendOrderByAsc(String ...field){
|
||||
appendOrderBy("ASC",field);
|
||||
}
|
||||
public void delOrderBy(String... keys){
|
||||
QueryConfigUtils.strRemove(this.getConfig().getOrderBy(), keys);
|
||||
}
|
||||
/**
|
||||
* 构建
|
||||
*
|
||||
* @param field 字段
|
||||
* @param value 值
|
||||
* @param type 类型
|
||||
* @return {@link FilterItem }
|
||||
*/
|
||||
public FilterItem build(String field, Object value, QueryFilterTypeEnum type) {
|
||||
return build(field, value, type, false);
|
||||
}
|
||||
public FilterItem build(String field, Object value, QueryFilterTypeEnum type, boolean isOr) {
|
||||
return buildFilter(field, value, type, isOr);
|
||||
}
|
||||
|
||||
private FilterItem buildFilter(String field, Object value, QueryFilterTypeEnum type, boolean isOr) {
|
||||
filter.put(field, value);
|
||||
FilterItem item = new FilterItem();
|
||||
item.setOr(isOr);
|
||||
item.setType(type.getValue());
|
||||
this.getConfig().getOptions().put(field, item);
|
||||
return item;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* 类型 取值转换器
|
||||
*
|
||||
* @author YuanFeng
|
||||
* @date 2024/10/16
|
||||
*/
|
||||
public class TypeConverter {
|
||||
|
||||
// 用于存储类型和其对应的转换逻辑
|
||||
private static final Map<Class<?>, Function<Object, Object>> converters = new HashMap<>();
|
||||
|
||||
// 注册类型转换器
|
||||
public static <T> void registerConverter(Class<T> type, Function<T, Object> converter) {
|
||||
converters.put(type, (Function<Object, Object>) converter);
|
||||
}
|
||||
|
||||
// 根据类型进行转换
|
||||
public static Object convertValue(Object inputVal, Class<?> targetType) {
|
||||
Function<Object, Object> converter = converters.get(targetType);
|
||||
if (converter == null) {
|
||||
// 如果没有注册转换器,返回原始值
|
||||
return null;
|
||||
}
|
||||
// 如果有对应类型的转换器,执行转换
|
||||
return converter.apply(inputVal);
|
||||
}
|
||||
|
||||
static {
|
||||
rest();
|
||||
}
|
||||
public static void rest(){
|
||||
restLocalDateTime();
|
||||
restDate();
|
||||
restString();
|
||||
restLong();
|
||||
restDouble();
|
||||
restInteger();
|
||||
restBoolean();
|
||||
restBigDecimal();
|
||||
restBigInteger();
|
||||
}
|
||||
public static void restLocalDateTime(){
|
||||
// 注册LocalDate的转换器
|
||||
TypeConverter.registerConverter(LocalDateTime.class, inputVal -> {
|
||||
if (inputVal != null) {
|
||||
return QueryConfigUtils.dateFormat(inputVal);
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
public static void restDate(){
|
||||
// 注册Date的转换器
|
||||
TypeConverter.registerConverter(Date.class, inputVal -> {
|
||||
if (inputVal != null) {
|
||||
return DateUtil.formatDate(inputVal);
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
public static void restString(){
|
||||
// 注册字符的转换器
|
||||
TypeConverter.registerConverter(String.class, inputVal -> {
|
||||
return inputVal;
|
||||
});
|
||||
}
|
||||
public static void restLong(){
|
||||
TypeConverter.registerConverter(Long.class, inputVal -> {
|
||||
return inputVal;
|
||||
});
|
||||
}public static void restDouble(){
|
||||
TypeConverter.registerConverter(Double.class, inputVal -> {
|
||||
return inputVal;
|
||||
});
|
||||
}
|
||||
public static void restInteger(){
|
||||
TypeConverter.registerConverter(Integer.class, inputVal -> {
|
||||
return inputVal;
|
||||
});
|
||||
}public static void restBoolean(){
|
||||
TypeConverter.registerConverter(Boolean.class, inputVal -> {
|
||||
return inputVal;
|
||||
});
|
||||
}
|
||||
public static void restBigDecimal() {
|
||||
TypeConverter.registerConverter(BigDecimal.class, inputVal -> {
|
||||
if (inputVal != null) {
|
||||
return new BigDecimal(inputVal.toString()).toString();
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
public static void restBigInteger() {
|
||||
TypeConverter.registerConverter(BigInteger.class, inputVal -> {
|
||||
if (inputVal != null) {
|
||||
return new BigInteger(inputVal.toString());
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build;
|
||||
|
||||
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
|
||||
import cn.hangtag.framework.mybatis.build.where.WhereWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public class WrapperHandler {
|
||||
|
||||
private static final Map<QueryFilterTypeEnum, WhereWrapper<?>> QUERY_WRAPPER_HANDLER = new HashMap<>();
|
||||
|
||||
public static void registerWrapperHandler(WhereWrapper<?> whereWrapper) {
|
||||
if(whereWrapper != null){
|
||||
QUERY_WRAPPER_HANDLER.put(whereWrapper.getType(), whereWrapper);
|
||||
}
|
||||
}
|
||||
|
||||
public static <T> QueryWrapper<T> exeWrapperHandler(QueryWrapper<T> queryWrapper,
|
||||
QueryFilterTypeEnum type,
|
||||
Set<String> dateField,
|
||||
String field, Object value) {
|
||||
if (queryWrapper == null) {
|
||||
queryWrapper = new QueryWrapper<>();
|
||||
}
|
||||
WhereWrapper<?> whereWrapper = QUERY_WRAPPER_HANDLER.get(type);
|
||||
WrapperInfo<T> wrapperInfo = new WrapperInfo<>(queryWrapper, field, value,dateField);
|
||||
if (whereWrapper == null) {
|
||||
//没有找到处理器 使用默认
|
||||
if (QueryConfigUtils.isArr(value)) {
|
||||
Object[] strings = QueryConfigUtils.objToArray(value, Object.class);
|
||||
if (QueryConfigUtils.isNotEmpty(strings)) {
|
||||
return queryWrapper.between(field, strings[0], strings[strings.length - 1]);
|
||||
}
|
||||
|
||||
}
|
||||
if (QueryConfigUtils.isList(value)) {
|
||||
List<Object> list = QueryConfigUtils.objToList(value, Object.class);
|
||||
if (QueryConfigUtils.isNotEmpty(list)) {
|
||||
return queryWrapper.between(field, list.get(0), list.get(list.size() - 1));
|
||||
}
|
||||
}
|
||||
return queryWrapper.eq(field, value);
|
||||
}
|
||||
// 执行
|
||||
return ((WhereWrapper<T>)whereWrapper).handler(wrapperInfo);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 包装信息
|
||||
*
|
||||
* @author YuanFeng
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public class WrapperInfo<T> {
|
||||
|
||||
private QueryWrapper<T> queryWrapper;
|
||||
private String field;
|
||||
private Object value;
|
||||
private Set<String> dateFields;
|
||||
|
||||
public Set<String> getDateFields() {
|
||||
if (dateFields == null) {
|
||||
dateFields = new HashSet<>();
|
||||
}
|
||||
return dateFields;
|
||||
}
|
||||
|
||||
public QueryWrapper<T> getQueryWrapper() {
|
||||
if (queryWrapper == null) {
|
||||
queryWrapper = new QueryWrapper<>();
|
||||
}
|
||||
return queryWrapper;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum DbTypeEnum {
|
||||
|
||||
MYSQL("mysql", "MySql数据库"),
|
||||
MARIADB("mariadb", "MariaDB数据库"),
|
||||
ORACLE("oracle", "Oracle11g及以下数据库(高版本推荐使用ORACLE_NEW)"),
|
||||
ORACLE_12C("oracle12c", "Oracle12c+数据库"),
|
||||
DB2("db2", "DB2数据库"),
|
||||
H2("h2", "H2数据库"),
|
||||
HSQL("hsql", "HSQL数据库"),
|
||||
SQLITE("sqlite", "SQLite数据库"),
|
||||
POSTGRE_SQL("postgresql", "Postgre数据库"),
|
||||
SQL_SERVER2005("sqlserver2005", "SQLServer2005数据库"),
|
||||
SQL_SERVER("sqlserver", "SQLServer数据库"),
|
||||
DM("dm", "达梦数据库"),
|
||||
XU_GU("xugu", "虚谷数据库"),
|
||||
KINGBASE_ES("kingbasees", "人大金仓数据库"),
|
||||
PHOENIX("phoenix", "Phoenix HBase数据库"),
|
||||
GAUSS("zenith", "Gauss 数据库"),
|
||||
CLICK_HOUSE("clickhouse", "clickhouse 数据库"),
|
||||
GBASE("gbase", "南大通用(华库)数据库"),
|
||||
GBASE_8S("gbase-8s", "南大通用数据库 GBase 8s"),
|
||||
GBASE8S_PG("gbase8s-pg", "南大通用数据库 GBase 8s兼容pg"),
|
||||
GBASE_8C("gbase8c", "南大通用数据库 GBase 8c"),
|
||||
SINODB("sinodb", "星瑞格数据库"),
|
||||
OSCAR("oscar", "神通数据库"),
|
||||
SYBASE("sybase", "Sybase ASE 数据库"),
|
||||
OCEAN_BASE("oceanbase", "OceanBase 数据库"),
|
||||
FIREBIRD("Firebird", "Firebird 数据库"),
|
||||
HIGH_GO("highgo", "瀚高数据库"),
|
||||
CUBRID("cubrid", "CUBRID数据库"),
|
||||
SUNDB("sundb", "SUNDB数据库"),
|
||||
SAP_HANA("hana", "SAP_HANA数据库"),
|
||||
IMPALA("impala", "impala数据库"),
|
||||
VERTICA("vertica", "vertica数据库"),
|
||||
XCloud("xcloud", "行云数据库"),
|
||||
REDSHIFT("redshift", "亚马逊redshift数据库"),
|
||||
OPENGAUSS("openGauss", "华为 opengauss 数据库"),
|
||||
TDENGINE("TDengine", "TDengine数据库"),
|
||||
INFORMIX("informix", "Informix数据库"),
|
||||
UXDB("uxdb", "优炫数据库"),
|
||||
LEALONE("lealone", "Lealone数据库"),
|
||||
TRINO("trino", "Trino数据库"),
|
||||
PRESTO("presto", "Presto数据库"),
|
||||
OTHER("other", "其他数据库");
|
||||
|
||||
private final String db;
|
||||
private final String desc;
|
||||
|
||||
public static DbTypeEnum getDbType(String dbType) {
|
||||
DbTypeEnum[] var1 = values();
|
||||
int var2 = var1.length;
|
||||
|
||||
for (int var3 = 0; var3 < var2; ++var3) {
|
||||
DbTypeEnum type = var1[var3];
|
||||
if (type.db.equalsIgnoreCase(dbType)) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum QueryFilterTypeEnum {
|
||||
|
||||
GT("大于", ">"),
|
||||
GE("大于等于", ">="),
|
||||
LT("小于", "<"),
|
||||
LE("小于等于", "<="),
|
||||
NE("不等于", "!="),
|
||||
EQ("等于", "="),
|
||||
IN("在...之内", "in"),
|
||||
NOTIN("不在...之内", "notIn"),
|
||||
BETWEEN("之间", "between"),
|
||||
BETWEEN2("之间", "><"),
|
||||
LIKE("模糊匹配", "like"),
|
||||
NOT_LIKE("模糊匹配", "notLike"),
|
||||
LIKE_LEFT("左模糊匹配", "likeLeft"),
|
||||
LIKE_RIGHT("右模糊匹配", "likeRight"),
|
||||
/**
|
||||
* 查询以逗号分隔的组合字段数据。
|
||||
* 使用条件:FIND_IN_SET({0}, columnName) 进行查询。
|
||||
* 示例:
|
||||
* - 字段值为:数据1: 123,234,345;数据2: 23,456;数据3: 123,567
|
||||
* - 当条件为 23 时,仅匹配包含 23 的数据,即数据2。
|
||||
*/
|
||||
IN_SET("查询以逗号分隔的组合字段数据", "inSet"),
|
||||
KEYWORD("关键字", "keyword")
|
||||
|
||||
;
|
||||
private final String msg;
|
||||
private final String value;
|
||||
public static QueryFilterTypeEnum getByValue(String value){
|
||||
if(value != null && !value.isEmpty()){
|
||||
for( QueryFilterTypeEnum enumItem: QueryFilterTypeEnum.values()) {
|
||||
if (enumItem.getValue().equalsIgnoreCase(value)) {
|
||||
return enumItem;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build.where;
|
||||
|
||||
|
||||
import cn.hangtag.framework.mybatis.build.WrapperInfo;
|
||||
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
|
||||
public interface WhereWrapper<T> {
|
||||
QueryFilterTypeEnum getType();
|
||||
QueryWrapper<T> handler(WrapperInfo<T> wrapperInfo);
|
||||
}
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build.where.handler;
|
||||
|
||||
|
||||
import cn.hangtag.framework.mybatis.build.QueryConfigUtils;
|
||||
import cn.hangtag.framework.mybatis.build.WrapperInfo;
|
||||
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
|
||||
import cn.hangtag.framework.mybatis.build.where.WhereWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class Between2Handler<T> implements WhereWrapper<T> {
|
||||
@Override
|
||||
public QueryFilterTypeEnum getType() {
|
||||
return QueryFilterTypeEnum.BETWEEN2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryWrapper<T> handler(WrapperInfo<T> wrapperInfo) {
|
||||
if (QueryConfigUtils.isArr(wrapperInfo.getValue())) {
|
||||
Object[] strings = QueryConfigUtils.objToArray(wrapperInfo.getValue(), Object.class);
|
||||
wrapperInfo.getQueryWrapper().between(wrapperInfo.getField(), strings[0], strings[strings.length - 1]);
|
||||
} else if (QueryConfigUtils.isList(wrapperInfo.getValue())) {
|
||||
List<Object> list = QueryConfigUtils.objToList(wrapperInfo.getValue(), Object.class);
|
||||
wrapperInfo.getQueryWrapper().between(wrapperInfo.getField(), list.get(0), list.get(list.size() - 1));
|
||||
}
|
||||
return wrapperInfo.getQueryWrapper();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build.where.handler;
|
||||
|
||||
|
||||
import cn.hangtag.framework.mybatis.build.QueryConfigUtils;
|
||||
import cn.hangtag.framework.mybatis.build.WrapperInfo;
|
||||
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
|
||||
import cn.hangtag.framework.mybatis.build.where.WhereWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
|
||||
import java.util.List;
|
||||
public class BetweenHandler<T> implements WhereWrapper<T> {
|
||||
@Override
|
||||
public QueryFilterTypeEnum getType() {
|
||||
return QueryFilterTypeEnum.BETWEEN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryWrapper<T> handler(WrapperInfo<T> wrapperInfo) {
|
||||
if (QueryConfigUtils.isArr(wrapperInfo.getValue())) {
|
||||
Object[] strings = QueryConfigUtils.objToArray(wrapperInfo.getValue(), Object.class);
|
||||
wrapperInfo.getQueryWrapper().between(wrapperInfo.getField(), strings[0], strings[strings.length - 1]);
|
||||
} else if (QueryConfigUtils.isList(wrapperInfo.getValue())) {
|
||||
List<Object> list = QueryConfigUtils.objToList(wrapperInfo.getValue(), Object.class);
|
||||
wrapperInfo.getQueryWrapper().between(wrapperInfo.getField(), list.get(0), list.get(list.size() - 1));
|
||||
}
|
||||
return wrapperInfo.getQueryWrapper();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build.where.handler;
|
||||
|
||||
|
||||
import cn.hangtag.framework.mybatis.build.QueryConfigUtils;
|
||||
import cn.hangtag.framework.mybatis.build.WrapperInfo;
|
||||
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
|
||||
import cn.hangtag.framework.mybatis.build.where.WhereWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
|
||||
import java.util.List;
|
||||
public class EqHandler<T> implements WhereWrapper<T> {
|
||||
@Override
|
||||
public QueryFilterTypeEnum getType() {
|
||||
return QueryFilterTypeEnum.EQ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryWrapper<T> handler(WrapperInfo<T> wrapperInfo) {
|
||||
return wrapperInfo.getQueryWrapper().eq(wrapperInfo.getField(), wrapperInfo.getValue());
|
||||
}
|
||||
}
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
package cn.hangtag.framework.mybatis.build.where.handler;
|
||||
|
||||
|
||||
import cn.hangtag.framework.mybatis.build.WrapperInfo;
|
||||
import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum;
|
||||
import cn.hangtag.framework.mybatis.build.where.WhereWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
|
||||
public class GeHandler<T> implements WhereWrapper<T> {
|
||||
@Override
|
||||
public QueryFilterTypeEnum getType() {
|
||||
return QueryFilterTypeEnum.GE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryWrapper<T> handler(WrapperInfo<T> wrapperInfo) {
|
||||
return wrapperInfo.getQueryWrapper().ge(wrapperInfo.getField(), wrapperInfo.getValue());
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue