Compare commits

..

2 Commits
dev ... main

Author SHA1 Message Date
Mrking 1ee3ba0aad Merge branch 'main' of https://git.yfgame.vip/r/hangtag
# Conflicts:
#	.gitignore
2024-07-22 21:27:14 +08:00
Mrking e956c901e0 提交20240722 2024-07-22 21:24:33 +08:00
3262 changed files with 130900 additions and 190217 deletions

View File

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

76
.gitignore vendored
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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, "数据重复,操作失败");
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 退出时进行删除

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,3 @@
artifactId=hangtag-common
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

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

View File

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

View File

@ -0,0 +1,2 @@
cn\hangtag\framework\common\util\collection\CollectionUtilsTest.class
cn\hangtag\framework\common\util\collection\CollectionUtilsTest$Dog.class

View File

@ -0,0 +1 @@
D:\workspace\hangtag\hangtag-framework\hangtag-common\src\test\java\cn\hangtag\framework\common\util\collection\CollectionUtilsTest.java

View File

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

View File

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

View File

@ -0,0 +1,2 @@
cn.hangtag.framework.datapermission.config.HangtagDataPermissionAutoConfiguration
cn.hangtag.framework.datapermission.config.HangtagDeptDataPermissionAutoConfiguration

View File

@ -0,0 +1,3 @@
artifactId=hangtag-spring-boot-starter-biz-data-permission
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,3 @@
artifactId=hangtag-spring-boot-starter-biz-ip
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

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

View File

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

View File

@ -0,0 +1,2 @@
cn\hangtag\framework\ip\core\utils\AreaUtilsTest.class
cn\hangtag\framework\ip\core\utils\IPUtilsTest.class

View File

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

View File

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

View File

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

View File

@ -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": []
}

View File

@ -0,0 +1,2 @@
org.springframework.boot.env.EnvironmentPostProcessor=\
cn.hangtag.framework.tenant.core.mq.kafka.TenantKafkaEnvironmentPostProcessor

View File

@ -0,0 +1 @@
cn.hangtag.framework.tenant.config.HangtagTenantAutoConfiguration

View File

@ -0,0 +1,3 @@
artifactId=hangtag-spring-boot-starter-biz-tenant
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

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

View File

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

View File

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

View File

@ -0,0 +1 @@
cn.hangtag.framework.dict.config.HangtagDictAutoConfiguration

View File

@ -0,0 +1,3 @@
artifactId=hangtag-spring-boot-starter-excel
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

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

View File

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

View File

@ -0,0 +1 @@
cn\hangtag\framework\dict\core\util\DictFrameworkUtilsTest.class

View File

@ -0,0 +1 @@
D:\workspace\hangtag\hangtag-framework\hangtag-spring-boot-starter-excel\src\test\java\cn\hangtag\framework\dict\core\util\DictFrameworkUtilsTest.java

View File

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

View File

@ -0,0 +1,2 @@
cn.hangtag.framework.quartz.config.HangtagQuartzAutoConfiguration
cn.hangtag.framework.quartz.config.HangtagAsyncAutoConfiguration

View File

@ -0,0 +1,3 @@
artifactId=hangtag-spring-boot-starter-job
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

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

View File

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

View File

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

View File

@ -0,0 +1,11 @@
{
"groups": [
{
"name": "hangtag.tracer",
"type": "cn.hangtag.framework.tracer.config.TracerProperties",
"sourceType": "cn.hangtag.framework.tracer.config.TracerProperties"
}
],
"properties": [],
"hints": []
}

View File

@ -0,0 +1,2 @@
cn.hangtag.framework.tracer.config.HangtagTracerAutoConfiguration
cn.hangtag.framework.tracer.config.HangtagMetricsAutoConfiguration

View File

@ -0,0 +1,3 @@
artifactId=hangtag-spring-boot-starter-monitor
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,3 @@
artifactId=hangtag-spring-boot-starter-mq
groupId=cn.hangtag
version=2.1.0-jdk8-snapshot

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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