@ -0,0 +1,6 @@ |
|||||
|
#1、搭建框架 |
||||
|
#2、数据库设计 |
||||
|
#3、页面设计 |
||||
|
#4、编写代码 |
||||
|
|
||||
|
|
@ -0,0 +1,28 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
<parent> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-common</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</parent> |
||||
|
<modelVersion>4.0.0</modelVersion> |
||||
|
<artifactId>demo-common-base</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
|
||||
|
<dependencies> |
||||
|
<dependency> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-common-core</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>org.springframework.boot</groupId> |
||||
|
<artifactId>spring-boot-starter-web</artifactId> |
||||
|
</dependency> |
||||
|
|
||||
|
</dependencies> |
||||
|
|
||||
|
|
||||
|
</project> |
@ -0,0 +1,44 @@ |
|||||
|
package com.yxt.demo.common.base.config.handler; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2022/5/13 17:23 |
||||
|
* @Description |
||||
|
*/ |
||||
|
public class CustomException extends Exception { |
||||
|
|
||||
|
private static final long serialVersionUID = 1L; |
||||
|
|
||||
|
|
||||
|
public CustomException() { |
||||
|
super(); |
||||
|
} |
||||
|
|
||||
|
public CustomException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { |
||||
|
super(message, cause, enableSuppression, writableStackTrace); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @param message |
||||
|
* @param cause |
||||
|
*/ |
||||
|
public CustomException(String message, Throwable cause) { |
||||
|
super(message, cause); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @param message |
||||
|
*/ |
||||
|
public CustomException(String message) { |
||||
|
super(message); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @param cause |
||||
|
*/ |
||||
|
public CustomException(Throwable cause) { |
||||
|
super(cause); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,72 @@ |
|||||
|
package com.yxt.demo.common.base.config.utils; |
||||
|
|
||||
|
import org.springframework.beans.BeansException; |
||||
|
import org.springframework.context.ApplicationContext; |
||||
|
import org.springframework.context.ApplicationContextAware; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2022/7/10 14:42 |
||||
|
* @Description |
||||
|
*/ |
||||
|
@Component |
||||
|
public class SpringUtil implements ApplicationContextAware { |
||||
|
|
||||
|
private static ApplicationContext applicationContext; |
||||
|
|
||||
|
@Override |
||||
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { |
||||
|
if (SpringUtil.applicationContext == null) { |
||||
|
SpringUtil.applicationContext = applicationContext; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 获取applicationContext
|
||||
|
public static ApplicationContext getApplicationContext() { |
||||
|
return applicationContext; |
||||
|
} |
||||
|
|
||||
|
// 通过name获取 Bean.
|
||||
|
public static Object getBean(String name) { |
||||
|
return getApplicationContext().getBean(name); |
||||
|
} |
||||
|
|
||||
|
// 通过class获取Bean.
|
||||
|
public static <T> T getBean(Class<T> clazz) { |
||||
|
return getApplicationContext().getBean(clazz); |
||||
|
} |
||||
|
|
||||
|
// 通过name,以及Clazz返回指定的Bean
|
||||
|
public static <T> T getBean(String name, Class<T> clazz) { |
||||
|
return getApplicationContext().getBean(name, clazz); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 通过类型获取Spring容器中的对象 |
||||
|
* |
||||
|
* @param type |
||||
|
* @param <T> |
||||
|
* @return |
||||
|
*/ |
||||
|
public static <T> Map<String, T> getBeansOfType(Class<T> type) { |
||||
|
Map<String, T> beansOfType = getApplicationContext().getBeansOfType(type); |
||||
|
return beansOfType; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 通过类型获取Spring容器中的对象 |
||||
|
* |
||||
|
* @param type |
||||
|
* @param includeNonSingletons |
||||
|
* @param allowEagerInit |
||||
|
* @param <T> |
||||
|
* @return |
||||
|
*/ |
||||
|
public static <T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit) { |
||||
|
Map<String, T> beansOfType = getApplicationContext().getBeansOfType(type, includeNonSingletons, allowEagerInit); |
||||
|
return beansOfType; |
||||
|
} |
||||
|
} |
@ -0,0 +1,72 @@ |
|||||
|
package com.yxt.demo.common.base.config.utils.jackson; |
||||
|
|
||||
|
import com.fasterxml.jackson.core.JsonGenerator; |
||||
|
import com.fasterxml.jackson.databind.JsonSerializer; |
||||
|
import com.fasterxml.jackson.databind.SerializerProvider; |
||||
|
|
||||
|
import java.io.IOException; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2022/5/13 17:15 |
||||
|
* @Description |
||||
|
*/ |
||||
|
public class CustomizeNullJsonSerializer { |
||||
|
|
||||
|
/** |
||||
|
* 处理数组集合类型的null值 |
||||
|
*/ |
||||
|
public static class NullArrayJsonSerializer extends JsonSerializer<Object> { |
||||
|
@Override |
||||
|
public void serialize(Object value, JsonGenerator jsonGenerator, |
||||
|
SerializerProvider serializerProvider) throws IOException { |
||||
|
jsonGenerator.writeStartArray(); |
||||
|
jsonGenerator.writeEndArray(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 处理字符串类型的null值 |
||||
|
*/ |
||||
|
public static class NullStringJsonSerializer extends JsonSerializer<Object> { |
||||
|
@Override |
||||
|
public void serialize(Object value, JsonGenerator jsonGenerator, |
||||
|
SerializerProvider serializerProvider) throws IOException { |
||||
|
jsonGenerator.writeString(""); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 处理数值类型的null值 |
||||
|
*/ |
||||
|
public static class NullNumberJsonSerializer extends JsonSerializer<Object> { |
||||
|
@Override |
||||
|
public void serialize(Object value, JsonGenerator jsonGenerator, |
||||
|
SerializerProvider serializerProvider) throws IOException { |
||||
|
jsonGenerator.writeNumber(0); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 处理boolean类型的null值 |
||||
|
*/ |
||||
|
public static class NullBooleanJsonSerializer extends JsonSerializer<Object> { |
||||
|
@Override |
||||
|
public void serialize(Object value, JsonGenerator jsonGenerator, |
||||
|
SerializerProvider serializerProvider) throws IOException { |
||||
|
jsonGenerator.writeBoolean(false); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 处理实体对象类型的null值 |
||||
|
*/ |
||||
|
/* public static class NullObjectJsonSerializer extends JsonSerializer<Object> { |
||||
|
@Override |
||||
|
public void serialize(Object value, JsonGenerator jsonGenerator, |
||||
|
SerializerProvider serializerProvider) throws IOException { |
||||
|
jsonGenerator.writeStartObject(); |
||||
|
jsonGenerator.writeEndObject(); |
||||
|
} |
||||
|
}*/ |
||||
|
} |
@ -0,0 +1,33 @@ |
|||||
|
package com.yxt.demo.common.base.config.utils.jackson; |
||||
|
|
||||
|
import com.fasterxml.jackson.databind.ObjectMapper; |
||||
|
import com.fasterxml.jackson.databind.SerializerProvider; |
||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import org.springframework.context.annotation.Primary; |
||||
|
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2022/5/13 17:13 |
||||
|
* @Description |
||||
|
*/ |
||||
|
@Configuration |
||||
|
public class JacksonConfig { |
||||
|
|
||||
|
@Bean |
||||
|
@Primary |
||||
|
@ConditionalOnMissingBean(ObjectMapper.class) |
||||
|
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { |
||||
|
ObjectMapper objectMapper = builder.createXmlMapper(false).build(); |
||||
|
/** 为objectMapper注册一个带有SerializerModifier的Factory */ |
||||
|
objectMapper.setSerializerFactory(objectMapper.getSerializerFactory() |
||||
|
.withSerializerModifier(new MyBeanSerializerModifier())); |
||||
|
|
||||
|
SerializerProvider serializerProvider = objectMapper.getSerializerProvider(); |
||||
|
// serializerProvider.setNullValueSerializer(new CustomizeNullJsonSerializer
|
||||
|
// .NullObjectJsonSerializer());
|
||||
|
return objectMapper; |
||||
|
} |
||||
|
} |
@ -0,0 +1,68 @@ |
|||||
|
package com.yxt.demo.common.base.config.utils.jackson; |
||||
|
|
||||
|
import com.fasterxml.jackson.databind.BeanDescription; |
||||
|
import com.fasterxml.jackson.databind.SerializationConfig; |
||||
|
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; |
||||
|
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; |
||||
|
|
||||
|
import java.util.Collection; |
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2022/4/29 18:58 |
||||
|
* @Description |
||||
|
*/ |
||||
|
public class MyBeanSerializerModifier extends BeanSerializerModifier { |
||||
|
|
||||
|
@Override |
||||
|
public List<BeanPropertyWriter> changeProperties(SerializationConfig config, |
||||
|
BeanDescription beanDesc, |
||||
|
List<BeanPropertyWriter> beanProperties) { |
||||
|
// 循环所有的beanPropertyWriter
|
||||
|
for (int i = 0; i < beanProperties.size(); i++) { |
||||
|
BeanPropertyWriter writer = beanProperties.get(i); |
||||
|
// 判断字段的类型,如果是数组或集合则注册nullSerializer
|
||||
|
/* if (isArrayType(writer)) { |
||||
|
// 给writer注册一个自己的nullSerializer
|
||||
|
writer.assignNullSerializer(new CustomizeNullJsonSerializer.NullArrayJsonSerializer()); |
||||
|
}*/ |
||||
|
if (isStringType(writer)) { |
||||
|
writer.assignNullSerializer(new CustomizeNullJsonSerializer.NullStringJsonSerializer()); |
||||
|
} |
||||
|
} |
||||
|
return beanProperties; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 是否是数组 |
||||
|
*/ |
||||
|
private boolean isArrayType(BeanPropertyWriter writer) { |
||||
|
Class<?> clazz = writer.getType().getRawClass(); |
||||
|
return clazz.isArray() || Collection.class.isAssignableFrom(clazz); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 是否是String |
||||
|
*/ |
||||
|
private boolean isStringType(BeanPropertyWriter writer) { |
||||
|
Class<?> clazz = writer.getType().getRawClass(); |
||||
|
return CharSequence.class.isAssignableFrom(clazz) || Character.class.isAssignableFrom(clazz); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 是否是数值类型 |
||||
|
*/ |
||||
|
private boolean isNumberType(BeanPropertyWriter writer) { |
||||
|
Class<?> clazz = writer.getType().getRawClass(); |
||||
|
return Number.class.isAssignableFrom(clazz); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 是否是boolean |
||||
|
*/ |
||||
|
private boolean isBooleanType(BeanPropertyWriter writer) { |
||||
|
Class<?> clazz = writer.getType().getRawClass(); |
||||
|
return clazz.equals(Boolean.class); |
||||
|
} |
||||
|
} |
@ -0,0 +1,17 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
<parent> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-common</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</parent> |
||||
|
<modelVersion>4.0.0</modelVersion> |
||||
|
<artifactId>demo-common-config</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
<dependencies> |
||||
|
|
||||
|
</dependencies> |
||||
|
|
||||
|
</project> |
@ -0,0 +1,5 @@ |
|||||
|
image: |
||||
|
upload: |
||||
|
path: D:\di\upload\files\ |
||||
|
url: |
||||
|
prefix: http://127.0.0.1:7112/upload/files/ |
@ -0,0 +1,29 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
<parent> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-common</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</parent> |
||||
|
<modelVersion>4.0.0</modelVersion> |
||||
|
<artifactId>demo-common-core</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
|
||||
|
<dependencies> |
||||
|
<dependency> |
||||
|
<groupId>cn.hutool</groupId> |
||||
|
<artifactId>hutool-core</artifactId> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>org.projectlombok</groupId> |
||||
|
<artifactId>lombok</artifactId> |
||||
|
<optional>true</optional> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>org.springframework.boot</groupId> |
||||
|
<artifactId>spring-boot-starter-web</artifactId> |
||||
|
</dependency> |
||||
|
</dependencies> |
||||
|
</project> |
@ -0,0 +1,116 @@ |
|||||
|
package com.yxt.demo.common.core.constant; |
||||
|
|
||||
|
/** |
||||
|
* 通用常量信息 |
||||
|
*/ |
||||
|
public class Constants { |
||||
|
/** |
||||
|
* UTF-8 字符集 |
||||
|
*/ |
||||
|
public static final String UTF8 = "UTF-8"; |
||||
|
|
||||
|
/** |
||||
|
* GBK 字符集 |
||||
|
*/ |
||||
|
public static final String GBK = "GBK"; |
||||
|
|
||||
|
/** |
||||
|
* RMI 远程方法调用 |
||||
|
*/ |
||||
|
public static final String LOOKUP_RMI = "rmi://"; |
||||
|
|
||||
|
/** |
||||
|
* LDAP 远程方法调用 |
||||
|
*/ |
||||
|
public static final String LOOKUP_LDAP = "ldap://"; |
||||
|
|
||||
|
/** |
||||
|
* http请求 |
||||
|
*/ |
||||
|
public static final String HTTP = "http://"; |
||||
|
|
||||
|
/** |
||||
|
* https请求 |
||||
|
*/ |
||||
|
public static final String HTTPS = "https://"; |
||||
|
|
||||
|
/** |
||||
|
* 成功标记 |
||||
|
*/ |
||||
|
public static final Integer SUCCESS = 200; |
||||
|
|
||||
|
/** |
||||
|
* 失败标记 |
||||
|
*/ |
||||
|
public static final Integer FAIL = 500; |
||||
|
|
||||
|
/** |
||||
|
* 登录成功 |
||||
|
*/ |
||||
|
public static final String LOGIN_SUCCESS = "Success"; |
||||
|
|
||||
|
/** |
||||
|
* 注销 |
||||
|
*/ |
||||
|
public static final String LOGOUT = "Logout"; |
||||
|
|
||||
|
/** |
||||
|
* 注册 |
||||
|
*/ |
||||
|
public static final String REGISTER = "Register"; |
||||
|
|
||||
|
/** |
||||
|
* 登录失败 |
||||
|
*/ |
||||
|
public static final String LOGIN_FAIL = "Error"; |
||||
|
|
||||
|
/** |
||||
|
* 当前记录起始索引 |
||||
|
*/ |
||||
|
public static final String PAGE_NUM = "pageNum"; |
||||
|
|
||||
|
/** |
||||
|
* 每页显示记录数 |
||||
|
*/ |
||||
|
public static final String PAGE_SIZE = "pageSize"; |
||||
|
|
||||
|
/** |
||||
|
* 排序列 |
||||
|
*/ |
||||
|
public static final String ORDER_BY_COLUMN = "orderByColumn"; |
||||
|
|
||||
|
/** |
||||
|
* 排序的方向 "desc" 或者 "asc". |
||||
|
*/ |
||||
|
public static final String IS_ASC = "isAsc"; |
||||
|
|
||||
|
/** |
||||
|
* 验证码 redis key |
||||
|
*/ |
||||
|
public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; |
||||
|
|
||||
|
/** |
||||
|
* 验证码有效期(分钟) |
||||
|
*/ |
||||
|
public static final long CAPTCHA_EXPIRATION = 2; |
||||
|
|
||||
|
/** |
||||
|
* 令牌有效期(分钟) |
||||
|
*/ |
||||
|
public final static long TOKEN_EXPIRE = 720; |
||||
|
|
||||
|
/** |
||||
|
* 参数管理 cache key |
||||
|
*/ |
||||
|
public static final String SYS_CONFIG_KEY = "sys_config:"; |
||||
|
|
||||
|
/** |
||||
|
* 字典管理 cache key |
||||
|
*/ |
||||
|
public static final String SYS_DICT_KEY = "sys_dict:"; |
||||
|
|
||||
|
/** |
||||
|
* 资源映射路径 前缀 |
||||
|
*/ |
||||
|
public static final String RESOURCE_PREFIX = "/profile"; |
||||
|
} |
@ -0,0 +1,34 @@ |
|||||
|
package com.yxt.demo.common.core.constant; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2022/7/23 22:37 |
||||
|
* @Description |
||||
|
*/ |
||||
|
public enum StatusEnum { |
||||
|
/** |
||||
|
* 状态分类 |
||||
|
*/ |
||||
|
SUCCESS(200, "成功"), |
||||
|
FAIL(500, "失败"), |
||||
|
OVERDUE(5000, "登录状态已过期"); |
||||
|
|
||||
|
private int code; |
||||
|
private String msg; |
||||
|
|
||||
|
public int getCode() { |
||||
|
return code; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public String getMsg() { |
||||
|
return msg; |
||||
|
} |
||||
|
|
||||
|
StatusEnum(int code, String msg) { |
||||
|
this.code = code; |
||||
|
this.msg = msg; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
@ -0,0 +1,127 @@ |
|||||
|
package com.yxt.demo.common.core.domain; |
||||
|
|
||||
|
import com.fasterxml.jackson.annotation.JsonFormat; |
||||
|
import io.swagger.annotations.ApiModelProperty; |
||||
|
|
||||
|
import java.util.Date; |
||||
|
import java.util.UUID; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2021/9/3 16:06 |
||||
|
* @description |
||||
|
*/ |
||||
|
public class BaseEntity extends Entity { |
||||
|
|
||||
|
@ApiModelProperty("字符型编号") |
||||
|
private String sid = UUID.randomUUID().toString(); |
||||
|
|
||||
|
@ApiModelProperty("记录版本,锁") |
||||
|
private Integer lockVersion = 0; |
||||
|
|
||||
|
@ApiModelProperty("记录创建时间") |
||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
||||
|
private Date createTime = new Date(); |
||||
|
|
||||
|
@ApiModelProperty("记录最后修改时间") |
||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
||||
|
private Date modifyTime = new Date(); |
||||
|
|
||||
|
@ApiModelProperty("记录状态值") |
||||
|
private Integer state = 0; |
||||
|
|
||||
|
@ApiModelProperty("记录是否可用,0:可用(默认),1:不可用") |
||||
|
private Integer isEnable = 0; |
||||
|
|
||||
|
@ApiModelProperty("记录是否被删除,0:未删除(默认),1:已经删除") |
||||
|
private Integer isDelete = 0; |
||||
|
|
||||
|
@ApiModelProperty("备注信息") |
||||
|
private String remarks; |
||||
|
|
||||
|
@ApiModelProperty("创建者") |
||||
|
private String createBySid; |
||||
|
|
||||
|
@ApiModelProperty("更新者") |
||||
|
private String updateBySid; |
||||
|
|
||||
|
public String getSid() { |
||||
|
return sid; |
||||
|
} |
||||
|
|
||||
|
public void setSid(String sid) { |
||||
|
this.sid = sid; |
||||
|
} |
||||
|
|
||||
|
public Integer getLockVersion() { |
||||
|
return lockVersion; |
||||
|
} |
||||
|
|
||||
|
public void setLockVersion(Integer lockVersion) { |
||||
|
this.lockVersion = lockVersion; |
||||
|
} |
||||
|
|
||||
|
public Date getCreateTime() { |
||||
|
return createTime; |
||||
|
} |
||||
|
|
||||
|
public void setCreateTime(Date createTime) { |
||||
|
this.createTime = createTime; |
||||
|
} |
||||
|
|
||||
|
public Date getModifyTime() { |
||||
|
return modifyTime; |
||||
|
} |
||||
|
|
||||
|
public void setModifyTime(Date modifyTime) { |
||||
|
this.modifyTime = modifyTime; |
||||
|
} |
||||
|
|
||||
|
public Integer getState() { |
||||
|
return state; |
||||
|
} |
||||
|
|
||||
|
public void setState(Integer state) { |
||||
|
this.state = state; |
||||
|
} |
||||
|
|
||||
|
public Integer getIsEnable() { |
||||
|
return isEnable; |
||||
|
} |
||||
|
|
||||
|
public void setIsEnable(Integer isEnable) { |
||||
|
this.isEnable = isEnable; |
||||
|
} |
||||
|
|
||||
|
public Integer getIsDelete() { |
||||
|
return isDelete; |
||||
|
} |
||||
|
|
||||
|
public void setIsDelete(Integer isDelete) { |
||||
|
this.isDelete = isDelete; |
||||
|
} |
||||
|
|
||||
|
public String getRemarks() { |
||||
|
return remarks; |
||||
|
} |
||||
|
|
||||
|
public void setRemarks(String remarks) { |
||||
|
this.remarks = remarks; |
||||
|
} |
||||
|
|
||||
|
public String getCreateBySid() { |
||||
|
return createBySid; |
||||
|
} |
||||
|
|
||||
|
public void setCreateBySid(String createBySid) { |
||||
|
this.createBySid = createBySid; |
||||
|
} |
||||
|
|
||||
|
public String getUpdateBySid() { |
||||
|
return updateBySid; |
||||
|
} |
||||
|
|
||||
|
public void setUpdateBySid(String updateBySid) { |
||||
|
this.updateBySid = updateBySid; |
||||
|
} |
||||
|
} |
@ -0,0 +1,55 @@ |
|||||
|
package com.yxt.demo.common.core.domain; |
||||
|
|
||||
|
import io.swagger.annotations.ApiModelProperty; |
||||
|
|
||||
|
import java.io.Serializable; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2021/9/3 16:06 |
||||
|
* @description |
||||
|
*/ |
||||
|
public class Entity implements Serializable { |
||||
|
|
||||
|
@ApiModelProperty("ID,唯一编号") |
||||
|
private Integer id; |
||||
|
|
||||
|
@ApiModelProperty("ID值的字符串形式") |
||||
|
public String getIdStr() { |
||||
|
if (null == id) { |
||||
|
return ""; |
||||
|
} |
||||
|
return "" + id; |
||||
|
} |
||||
|
|
||||
|
public Integer getId() { |
||||
|
return id; |
||||
|
} |
||||
|
|
||||
|
public void setId(Integer id) { |
||||
|
this.id = id; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String toString() { |
||||
|
return "ClassName:" + getClass().getName() + ";id:" + getId(); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public int hashCode() { |
||||
|
int id2 = Long.hashCode(getId()); |
||||
|
return super.hashCode() + id2; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean equals(Object obj) { |
||||
|
if (this == obj) { |
||||
|
return true; |
||||
|
} |
||||
|
if (!(obj instanceof Entity)) { |
||||
|
return false; |
||||
|
} |
||||
|
Entity entity = (Entity) obj; |
||||
|
return this.getId().equals(entity.getId()); |
||||
|
} |
||||
|
} |
@ -0,0 +1,8 @@ |
|||||
|
package com.yxt.demo.common.core.dto; |
||||
|
|
||||
|
|
||||
|
import com.yxt.demo.common.core.vo.Vo; |
||||
|
|
||||
|
public interface Dto extends Vo { |
||||
|
|
||||
|
} |
@ -0,0 +1,77 @@ |
|||||
|
package com.yxt.demo.common.core.query; |
||||
|
|
||||
|
import io.swagger.annotations.ApiModelProperty; |
||||
|
|
||||
|
import java.io.Serializable; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2021/9/3 16:41 |
||||
|
* @description |
||||
|
*/ |
||||
|
|
||||
|
public class PagerQuery<T extends Query> implements Serializable { |
||||
|
|
||||
|
@ApiModelProperty(value = "当前页号", example = "1") |
||||
|
private long current = 1L; |
||||
|
|
||||
|
@ApiModelProperty(value = "每页记录数", example = "10") |
||||
|
private long size = 10L; |
||||
|
|
||||
|
@ApiModelProperty(value = "标识符") |
||||
|
private Integer identifier; |
||||
|
|
||||
|
@ApiModelProperty("查询条件的项") |
||||
|
private T params; |
||||
|
|
||||
|
public PagerQuery() { |
||||
|
} |
||||
|
|
||||
|
public PagerQuery(long current) { |
||||
|
this.current = current; |
||||
|
} |
||||
|
|
||||
|
public PagerQuery(long current, long size) { |
||||
|
this.size = size; |
||||
|
this.current = current; |
||||
|
} |
||||
|
|
||||
|
public long getSize() { |
||||
|
return size; |
||||
|
} |
||||
|
|
||||
|
public PagerQuery setSize(long size) { |
||||
|
this.size = size; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public long getCurrent() { |
||||
|
return current; |
||||
|
} |
||||
|
|
||||
|
public PagerQuery setCurrent(long current) { |
||||
|
this.current = current; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public T getParams() { |
||||
|
return params; |
||||
|
} |
||||
|
|
||||
|
public PagerQuery setParams(T params) { |
||||
|
this.params = params; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public Integer getIdentifier() { |
||||
|
return identifier; |
||||
|
} |
||||
|
|
||||
|
public void setIdentifier(Integer identifier) { |
||||
|
this.identifier = identifier; |
||||
|
} |
||||
|
|
||||
|
public void fromPagerQuery(PagerQuery s_query) { |
||||
|
this.setCurrent(s_query.getCurrent()).setSize(s_query.getSize()).setParams(params.fromMap(s_query.getParams().toMap())); |
||||
|
} |
||||
|
} |
@ -0,0 +1,12 @@ |
|||||
|
package com.yxt.demo.common.core.query; |
||||
|
|
||||
|
import com.yxt.demo.common.core.vo.Vo; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2021/9/3 16:41 |
||||
|
* @description |
||||
|
*/ |
||||
|
|
||||
|
public interface Query extends Vo { |
||||
|
} |
@ -0,0 +1,141 @@ |
|||||
|
package com.yxt.demo.common.core.result; |
||||
|
|
||||
|
import com.yxt.demo.common.core.constant.Constants; |
||||
|
import com.yxt.demo.common.core.constant.StatusEnum; |
||||
|
|
||||
|
import java.io.Serializable; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2021/8/23 16:42 |
||||
|
* @Description 返回结果 |
||||
|
*/ |
||||
|
public class ResultBean<T> implements Serializable { |
||||
|
|
||||
|
private static final long serialVersionUID = 1L; |
||||
|
|
||||
|
/** |
||||
|
* 成功 |
||||
|
*/ |
||||
|
public static final int SUCCESS = Constants.SUCCESS; |
||||
|
|
||||
|
/** |
||||
|
* 失败 |
||||
|
*/ |
||||
|
public static final int FAIL = Constants.FAIL; |
||||
|
|
||||
|
private int code; |
||||
|
|
||||
|
private String msg; |
||||
|
|
||||
|
private T data; |
||||
|
private Boolean success; |
||||
|
|
||||
|
public ResultBean() { |
||||
|
} |
||||
|
|
||||
|
public ResultBean(boolean success) { |
||||
|
this.success = success; |
||||
|
} |
||||
|
|
||||
|
public ResultBean(boolean success, String msg) { |
||||
|
this.success = success; |
||||
|
this.msg = msg; |
||||
|
} |
||||
|
|
||||
|
public ResultBean(boolean success, String msg, int code) { |
||||
|
this.success = success; |
||||
|
this.msg = msg; |
||||
|
this.code = code; |
||||
|
} |
||||
|
|
||||
|
public ResultBean(T data) { |
||||
|
this.success = true; |
||||
|
this.data = data; |
||||
|
} |
||||
|
|
||||
|
public ResultBean(int code, T data) { |
||||
|
this.success = true; |
||||
|
this.code = code; |
||||
|
this.data = data; |
||||
|
} |
||||
|
|
||||
|
public ResultBean(int code, String msg, T data) { |
||||
|
this.success = true; |
||||
|
this.code = code; |
||||
|
this.msg = msg; |
||||
|
this.data = data; |
||||
|
} |
||||
|
|
||||
|
public boolean getSuccess() { |
||||
|
return success; |
||||
|
} |
||||
|
|
||||
|
public ResultBean<T> setSuccess(boolean success) { |
||||
|
this.success = success; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public String getMsg() { |
||||
|
return msg; |
||||
|
} |
||||
|
|
||||
|
public ResultBean<T> setMsg(String msg) { |
||||
|
this.msg = msg; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public int getCode() { |
||||
|
return code; |
||||
|
} |
||||
|
|
||||
|
public ResultBean<T> setCode(int code) { |
||||
|
this.code = code; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public T getData() { |
||||
|
return data; |
||||
|
} |
||||
|
|
||||
|
public ResultBean<T> setData(T data) { |
||||
|
this.data = data; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 1.类实例化的非静态方法调用 2.类不实例化的静态方法调用 |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
public ResultBean<T> success() { |
||||
|
this.setSuccess(true); |
||||
|
this.setCode(StatusEnum.SUCCESS.getCode()); |
||||
|
this.setMsg("操作成功!"); |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public ResultBean<T> fail() { |
||||
|
this.setSuccess(false); |
||||
|
this.setCode(StatusEnum.FAIL.getCode()); |
||||
|
this.setMsg("操作失败!"); |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public static <T> ResultBean<T> fireSuccess() { |
||||
|
ResultBean<T> rb = new ResultBean<T>(); |
||||
|
rb.setSuccess(true); |
||||
|
rb.setCode(StatusEnum.SUCCESS.getCode()); |
||||
|
rb.setMsg("操作成功!"); |
||||
|
return rb; |
||||
|
} |
||||
|
|
||||
|
public static <T> ResultBean<T> fireFail() { |
||||
|
ResultBean<T> rb = new ResultBean<T>(); |
||||
|
rb.setSuccess(false); |
||||
|
rb.setCode(StatusEnum.FAIL.getCode()); |
||||
|
rb.setMsg("操作失败!"); |
||||
|
return rb; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,100 @@ |
|||||
|
package com.yxt.demo.common.core.vo; |
||||
|
|
||||
|
import io.swagger.annotations.ApiModel; |
||||
|
import io.swagger.annotations.ApiModelProperty; |
||||
|
|
||||
|
import java.io.Serializable; |
||||
|
import java.util.Collections; |
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2021/9/3 16:24 |
||||
|
* @description |
||||
|
*/ |
||||
|
@ApiModel(description = "返回的分页结果") |
||||
|
public class PagerVo<T> implements Serializable { |
||||
|
|
||||
|
@ApiModelProperty("总页数") |
||||
|
private long pages = 1L; |
||||
|
@ApiModelProperty("总记录数") |
||||
|
private long total = 0L; |
||||
|
@ApiModelProperty("每页记录数") |
||||
|
private long size = 15L; |
||||
|
@ApiModelProperty("当前页号") |
||||
|
private long current = 1L; |
||||
|
@ApiModelProperty(value = "标识符") |
||||
|
private Integer identifier; |
||||
|
|
||||
|
@ApiModelProperty("当前页的数据") |
||||
|
private List<T> records = Collections.emptyList(); |
||||
|
|
||||
|
public PagerVo() { |
||||
|
this.pages = 1L; |
||||
|
this.total = 0L; |
||||
|
this.size = 10L; |
||||
|
this.current = 1L; |
||||
|
this.records = Collections.emptyList(); |
||||
|
} |
||||
|
|
||||
|
public PagerVo(long current) { |
||||
|
this.pages = 1L; |
||||
|
this.total = 0L; |
||||
|
this.size = 10L; |
||||
|
this.current = current; |
||||
|
this.records = Collections.emptyList(); |
||||
|
} |
||||
|
|
||||
|
public long getPages() { |
||||
|
return pages; |
||||
|
} |
||||
|
|
||||
|
public PagerVo<T> setPages(long pages) { |
||||
|
this.pages = pages; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public long getTotal() { |
||||
|
return total; |
||||
|
} |
||||
|
|
||||
|
public PagerVo<T> setTotal(long total) { |
||||
|
this.total = total; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public long getSize() { |
||||
|
return size; |
||||
|
} |
||||
|
|
||||
|
public PagerVo<T> setSize(long size) { |
||||
|
this.size = size; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public long getCurrent() { |
||||
|
return current; |
||||
|
} |
||||
|
|
||||
|
public PagerVo<T> setCurrent(long current) { |
||||
|
this.current = current; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public List<T> getRecords() { |
||||
|
return records; |
||||
|
} |
||||
|
|
||||
|
public PagerVo<T> setRecords(List<T> records) { |
||||
|
this.records = records; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public Integer getIdentifier() { |
||||
|
return identifier; |
||||
|
} |
||||
|
|
||||
|
public void setIdentifier(Integer identifier) { |
||||
|
this.identifier = identifier; |
||||
|
} |
||||
|
} |
@ -0,0 +1,28 @@ |
|||||
|
package com.yxt.demo.common.core.vo; |
||||
|
|
||||
|
import cn.hutool.core.bean.BeanUtil; |
||||
|
import com.yxt.demo.common.core.domain.Entity; |
||||
|
|
||||
|
import java.io.Serializable; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2021/9/3 16:21 |
||||
|
* @description |
||||
|
*/ |
||||
|
|
||||
|
public interface Vo extends Serializable { |
||||
|
|
||||
|
default Map<String, Object> toMap() { |
||||
|
return BeanUtil.beanToMap(this); |
||||
|
} |
||||
|
|
||||
|
default <V extends Vo> V fromMap(Map<String, Object> map) { |
||||
|
return (V) BeanUtil.fillBeanWithMap(map, this, false); |
||||
|
} |
||||
|
|
||||
|
default <E extends Entity> void fromEntity(E e) { |
||||
|
BeanUtil.copyProperties(e, this); |
||||
|
} |
||||
|
} |
@ -0,0 +1,31 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
<parent> |
||||
|
<artifactId>demo-common</artifactId> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<version>0.0.1</version> |
||||
|
</parent> |
||||
|
<modelVersion>4.0.0</modelVersion> |
||||
|
<artifactId>demo-common-jdbc</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
|
||||
|
<dependencies> |
||||
|
<dependency> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-common-core</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>com.baomidou</groupId> |
||||
|
<artifactId>mybatis-plus-boot-starter</artifactId> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>mysql</groupId> |
||||
|
<artifactId>mysql-connector-java</artifactId> |
||||
|
<scope>runtime</scope> |
||||
|
</dependency> |
||||
|
|
||||
|
</dependencies> |
||||
|
</project> |
@ -0,0 +1,23 @@ |
|||||
|
package com.yxt.demo.common.jdbc.config; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.annotation.DbType; |
||||
|
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; |
||||
|
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2021/9/4 0:40 |
||||
|
* @description |
||||
|
*/ |
||||
|
@Configuration |
||||
|
public class MybatisPlusConfig { |
||||
|
|
||||
|
@Bean |
||||
|
public MybatisPlusInterceptor paginationInterceptor() { |
||||
|
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); |
||||
|
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); |
||||
|
return interceptor; |
||||
|
} |
||||
|
} |
@ -0,0 +1,15 @@ |
|||||
|
package com.yxt.demo.common.jdbc.service; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||
|
|
||||
|
public class MybatisBaseService<M extends BaseMapper<T>, T> extends ServiceImpl<M, T> { |
||||
|
|
||||
|
|
||||
|
public T fetchBySid(String sid) { |
||||
|
QueryWrapper<T> qw = new QueryWrapper<>(); |
||||
|
qw.eq("sid", sid); |
||||
|
return baseMapper.selectOne(qw); |
||||
|
} |
||||
|
} |
@ -0,0 +1,35 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
<parent> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-common</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</parent> |
||||
|
<modelVersion>4.0.0</modelVersion> |
||||
|
<artifactId>demo-common-redis</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
<dependencies> |
||||
|
<!--引入redis--> |
||||
|
<dependency> |
||||
|
<groupId>org.springframework.boot</groupId> |
||||
|
<artifactId>spring-boot-starter-data-redis</artifactId> |
||||
|
<exclusions> |
||||
|
<exclusion> |
||||
|
<groupId>io.lettuce</groupId> |
||||
|
<artifactId>lettuce-core</artifactId> |
||||
|
</exclusion> |
||||
|
</exclusions> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>redis.clients</groupId> |
||||
|
<artifactId>jedis</artifactId> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>com.fasterxml.jackson.core</groupId> |
||||
|
<artifactId>jackson-databind</artifactId> |
||||
|
</dependency> |
||||
|
</dependencies> |
||||
|
|
||||
|
</project> |
@ -0,0 +1,104 @@ |
|||||
|
package com.yxt.demo.common.redis.configure; |
||||
|
|
||||
|
import com.fasterxml.jackson.annotation.JsonAutoDetect; |
||||
|
import com.fasterxml.jackson.annotation.PropertyAccessor; |
||||
|
import com.fasterxml.jackson.databind.ObjectMapper; |
||||
|
import org.springframework.beans.factory.annotation.Value; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.data.redis.connection.RedisConnectionFactory; |
||||
|
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; |
||||
|
import org.springframework.data.redis.core.RedisTemplate; |
||||
|
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; |
||||
|
import org.springframework.data.redis.serializer.StringRedisSerializer; |
||||
|
import redis.clients.jedis.JedisPoolConfig; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2021/10/10 12:21 |
||||
|
* @description |
||||
|
*/ |
||||
|
|
||||
|
public class RedisConfig { |
||||
|
|
||||
|
@Value("${spring.redis.host}") |
||||
|
private String host; |
||||
|
|
||||
|
@Value("${spring.redis.password}") |
||||
|
private String password; |
||||
|
|
||||
|
@Value("${spring.redis.port}") |
||||
|
private int port; |
||||
|
|
||||
|
@Value("${spring.redis.timeout}") |
||||
|
private int timeout; |
||||
|
|
||||
|
@Value("${spring.redis.jedis.pool.max-active}") |
||||
|
private int redisPoolMaxActive; |
||||
|
|
||||
|
@Value("${spring.redis.jedis.pool.max-wait}") |
||||
|
private int redisPoolMaxWait; |
||||
|
|
||||
|
@Value("${spring.redis.jedis.pool.max-idle}") |
||||
|
private int redisPoolMaxIdle; |
||||
|
|
||||
|
@Value("${spring.redis.jedis.pool.min-idle}") |
||||
|
private int redisPoolMinIdle; |
||||
|
@Value("${spring.redis.database}") |
||||
|
private int database; |
||||
|
|
||||
|
@Bean |
||||
|
public JedisPoolConfig getJedisPoolConfig() { |
||||
|
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); |
||||
|
//最大空闲数
|
||||
|
jedisPoolConfig.setMaxIdle(redisPoolMaxIdle); |
||||
|
//最小空闲数
|
||||
|
jedisPoolConfig.setMinIdle(redisPoolMinIdle); |
||||
|
//最大建立连接等待时间
|
||||
|
jedisPoolConfig.setMaxWaitMillis(redisPoolMaxWait); |
||||
|
//连接池的最大数据库连接数
|
||||
|
jedisPoolConfig.setMaxTotal(redisPoolMaxActive); |
||||
|
// jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password);
|
||||
|
return jedisPoolConfig; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
@Bean |
||||
|
public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) { |
||||
|
|
||||
|
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig); |
||||
|
jedisConnectionFactory.setDatabase(database); |
||||
|
//IP地址
|
||||
|
jedisConnectionFactory.setHostName(host); |
||||
|
//如果redis设置有密码
|
||||
|
jedisConnectionFactory.setPassword(password); |
||||
|
//端口号
|
||||
|
jedisConnectionFactory.setPort(port); |
||||
|
//客户端超时时间单位是毫秒
|
||||
|
jedisConnectionFactory.setTimeout(timeout); |
||||
|
// jedisConnectionFactory.afterPropertiesSet(); //记得添加这行!
|
||||
|
return jedisConnectionFactory; |
||||
|
} |
||||
|
|
||||
|
@Bean |
||||
|
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { |
||||
|
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); |
||||
|
redisTemplate.setConnectionFactory(redisConnectionFactory); |
||||
|
// 使用Jackson2JsonRedisSerialize 替换默认序列化
|
||||
|
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); |
||||
|
ObjectMapper om = new ObjectMapper(); |
||||
|
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); |
||||
|
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); |
||||
|
jackson2JsonRedisSerializer.setObjectMapper(om); |
||||
|
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); |
||||
|
// key采用String的序列化方式
|
||||
|
redisTemplate.setKeySerializer(stringRedisSerializer); |
||||
|
// hash的key也采用String的序列化方式
|
||||
|
redisTemplate.setHashKeySerializer(stringRedisSerializer); |
||||
|
// value序列化方式采用jackson
|
||||
|
redisTemplate.setValueSerializer(stringRedisSerializer); |
||||
|
// hash的value序列化方式采用jackson
|
||||
|
redisTemplate.setHashValueSerializer(stringRedisSerializer); |
||||
|
redisTemplate.afterPropertiesSet(); |
||||
|
return redisTemplate; |
||||
|
} |
||||
|
} |
@ -0,0 +1,295 @@ |
|||||
|
package com.yxt.demo.common.redis.service; |
||||
|
|
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.dao.DataAccessException; |
||||
|
import org.springframework.data.redis.connection.RedisConnection; |
||||
|
import org.springframework.data.redis.connection.RedisStringCommands; |
||||
|
import org.springframework.data.redis.core.*; |
||||
|
import org.springframework.data.redis.core.types.Expiration; |
||||
|
import org.springframework.data.redis.serializer.RedisSerializer; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
|
||||
|
import java.io.Serializable; |
||||
|
import java.util.List; |
||||
|
import java.util.Set; |
||||
|
import java.util.concurrent.TimeUnit; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2021/10/10 13:10 |
||||
|
* @description |
||||
|
*/ |
||||
|
@Service |
||||
|
public class RedisService { |
||||
|
|
||||
|
@Autowired |
||||
|
private RedisTemplate redisTemplate; |
||||
|
|
||||
|
/** |
||||
|
* 字符串类型:根据key设置value值,如果key中的value存在,那么返回false |
||||
|
* |
||||
|
* @param key |
||||
|
* @param value |
||||
|
* @return |
||||
|
*/ |
||||
|
public Boolean setnx(final String key, final String value, final long expration, final TimeUnit timeUnit) { |
||||
|
return (Boolean) redisTemplate.execute(new RedisCallback<Boolean>() { |
||||
|
@Override |
||||
|
public Boolean doInRedis(RedisConnection redisConnection) throws DataAccessException { |
||||
|
RedisSerializer<String> redisSerializer = redisTemplate.getStringSerializer(); |
||||
|
byte[] keys = redisSerializer.serialize(key); |
||||
|
byte[] values = redisSerializer.serialize(value); |
||||
|
return redisConnection.set(keys, values, Expiration.from(expration, timeUnit), RedisStringCommands.SetOption.SET_IF_ABSENT); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 写入缓存 |
||||
|
* |
||||
|
* @param key |
||||
|
* @param value |
||||
|
* @return |
||||
|
*/ |
||||
|
public boolean set(final String key, final String value) { |
||||
|
|
||||
|
boolean result = (boolean) redisTemplate.execute(new RedisCallback<Boolean>() { |
||||
|
@Override |
||||
|
public Boolean doInRedis(RedisConnection connection) throws DataAccessException { |
||||
|
RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); |
||||
|
connection.set(serializer.serialize(key), serializer.serialize(value)); |
||||
|
return true; |
||||
|
} |
||||
|
}); |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 写入缓存设置时效时间 |
||||
|
* |
||||
|
* @param key |
||||
|
* @param value |
||||
|
* @return |
||||
|
*/ |
||||
|
public boolean set(final String key, Object value, Long expireTime) { |
||||
|
boolean result = false; |
||||
|
try { |
||||
|
ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); |
||||
|
operations.set(key, value); |
||||
|
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS); |
||||
|
result = true; |
||||
|
} catch (Exception e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
public boolean expire(String key, long expire) { |
||||
|
return redisTemplate.expire(key, expire, TimeUnit.SECONDS); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 读取缓存 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public String get(final String key) { |
||||
|
String result = (String) redisTemplate.execute(new RedisCallback<String>() { |
||||
|
@Override |
||||
|
public String doInRedis(RedisConnection connection) throws DataAccessException { |
||||
|
RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); |
||||
|
byte[] value = connection.get(serializer.serialize(key)); |
||||
|
return serializer.deserialize(value); |
||||
|
} |
||||
|
}); |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 正则获取key集合 |
||||
|
* |
||||
|
* @param pattern |
||||
|
* @return |
||||
|
*/ |
||||
|
public Set<String> keys(String pattern) { |
||||
|
Set<String> keys = redisTemplate.keys(pattern); |
||||
|
return keys; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 批量删除对应的value |
||||
|
* |
||||
|
* @param keys |
||||
|
*/ |
||||
|
public void remove(final String... keys) { |
||||
|
for (String key : keys) { |
||||
|
remove(key); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 批量删除key |
||||
|
* |
||||
|
* @param pattern |
||||
|
*/ |
||||
|
public void removePattern(final String pattern) { |
||||
|
Set<Serializable> keys = redisTemplate.keys(pattern); |
||||
|
if (keys.size() > 0) { |
||||
|
redisTemplate.delete(keys); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
public Long remove(final String key) { |
||||
|
return (Long) redisTemplate.execute(new RedisCallback<Long>() { |
||||
|
@Override |
||||
|
public Long doInRedis(RedisConnection redisConnection) throws DataAccessException { |
||||
|
RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); |
||||
|
byte[] keys = serializer.serialize(key); |
||||
|
return redisConnection.del(keys); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 判断缓存中是否有对应的value |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public boolean exists(final String key) { |
||||
|
return redisTemplate.hasKey(key); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 哈希 添加 |
||||
|
* |
||||
|
* @param key |
||||
|
* @param hashKey |
||||
|
* @param value |
||||
|
*/ |
||||
|
public void hmSet(String key, Object hashKey, Object value) { |
||||
|
HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); |
||||
|
hash.put(key, hashKey, value); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 哈希获取数据 |
||||
|
* |
||||
|
* @param key |
||||
|
* @param hashKey |
||||
|
* @return |
||||
|
*/ |
||||
|
public String hmGet(String key, Object hashKey) { |
||||
|
HashOperations<String, String, String> hash = redisTemplate.opsForHash(); |
||||
|
return hash.get(key, hashKey); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取哈希 keys |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public Set<String> hmGetKeys(String key) { |
||||
|
HashOperations<String, String, String> hash = redisTemplate.opsForHash(); |
||||
|
return hash.keys(key); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 删除集合中的key |
||||
|
* |
||||
|
* @param key |
||||
|
* @param hashKey |
||||
|
*/ |
||||
|
public void hmDelete(String key, Object hashKey) { |
||||
|
HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); |
||||
|
hash.delete(key, hashKey); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 列表添加 |
||||
|
* |
||||
|
* @param k |
||||
|
* @param v |
||||
|
*/ |
||||
|
public void lPush(String k, Object v) { |
||||
|
ListOperations<String, Object> list = redisTemplate.opsForList(); |
||||
|
list.rightPush(k, v); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 列表获取 |
||||
|
* |
||||
|
* @param k |
||||
|
* @param l |
||||
|
* @param l1 |
||||
|
* @return |
||||
|
*/ |
||||
|
public List<Object> lRange(String k, long l, long l1) { |
||||
|
ListOperations<String, Object> list = redisTemplate.opsForList(); |
||||
|
return list.range(k, l, l1); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 集合添加 |
||||
|
* |
||||
|
* @param key |
||||
|
* @param value |
||||
|
*/ |
||||
|
public void add(String key, Object value) { |
||||
|
SetOperations<String, Object> set = redisTemplate.opsForSet(); |
||||
|
set.add(key, value); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 集合获取 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public Set<Object> setMembers(String key) { |
||||
|
SetOperations<String, Object> set = redisTemplate.opsForSet(); |
||||
|
return set.members(key); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 有序集合添加 |
||||
|
* |
||||
|
* @param key |
||||
|
* @param value |
||||
|
* @param scoure |
||||
|
*/ |
||||
|
public void zAdd(String key, Object value, double scoure) { |
||||
|
ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); |
||||
|
zset.add(key, value, scoure); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 有序集合获取 |
||||
|
* |
||||
|
* @param key |
||||
|
* @param scoure |
||||
|
* @param scoure1 |
||||
|
* @return |
||||
|
*/ |
||||
|
public Set<Object> rangeByScore(String key, double scoure, double scoure1) { |
||||
|
ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); |
||||
|
return zset.rangeByScore(key, scoure, scoure1); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 实现命令:TTL key 以秒为单位,返回给定key的剩余生存时间 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public long ttl(String key) { |
||||
|
return redisTemplate.getExpire(key); |
||||
|
} |
||||
|
} |
@ -0,0 +1,54 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
<parent> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-common</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</parent> |
||||
|
<modelVersion>4.0.0</modelVersion> |
||||
|
<artifactId>demo-common-utils</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
|
||||
|
<dependencies> |
||||
|
<dependency> |
||||
|
<groupId>org.springframework.boot</groupId> |
||||
|
<artifactId>spring-boot-starter-web</artifactId> |
||||
|
</dependency> |
||||
|
<!--okhttp--> |
||||
|
<dependency> |
||||
|
<groupId>com.squareup.okhttp3</groupId> |
||||
|
<artifactId>okhttp</artifactId> |
||||
|
</dependency> |
||||
|
<!--jwt--> |
||||
|
<dependency> |
||||
|
<groupId>io.jsonwebtoken</groupId> |
||||
|
<artifactId>jjwt</artifactId> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>com.alibaba</groupId> |
||||
|
<artifactId>fastjson</artifactId> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>commons-beanutils</groupId> |
||||
|
<artifactId>commons-beanutils</artifactId> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>org.projectlombok</groupId> |
||||
|
<artifactId>lombok</artifactId> |
||||
|
<optional>true</optional> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>cn.hutool</groupId> |
||||
|
<artifactId>hutool-all</artifactId> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>org.apache.commons</groupId> |
||||
|
<artifactId>commons-lang3</artifactId> |
||||
|
</dependency> |
||||
|
|
||||
|
</dependencies> |
||||
|
|
||||
|
|
||||
|
</project> |
@ -0,0 +1,97 @@ |
|||||
|
package com.yxt.demo.common.utils; |
||||
|
|
||||
|
import java.util.ArrayList; |
||||
|
import java.util.HashMap; |
||||
|
import java.util.List; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2022/2/9 21:52 |
||||
|
* @Description 工具类 |
||||
|
*/ |
||||
|
public class BeanUtils { |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 获取String 类型 |
||||
|
* |
||||
|
* @param map |
||||
|
* @param keyName 键值对中键名称 |
||||
|
* @param defaultValue 默认值 |
||||
|
* @return |
||||
|
*/ |
||||
|
public static String getString(Map<String, Object> map, String keyName, String defaultValue) { |
||||
|
if (map == null) { |
||||
|
return defaultValue; |
||||
|
} |
||||
|
if (map.containsKey(keyName)) { |
||||
|
Object o = map.get(keyName); |
||||
|
if (o instanceof String) { |
||||
|
return (String) o; |
||||
|
} else { |
||||
|
return defaultValue; |
||||
|
} |
||||
|
} else { |
||||
|
return defaultValue; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 获取Integer
|
||||
|
public static Integer getInteger(Map<String, Object> map, String keyName) { |
||||
|
if (map == null) { |
||||
|
return -1; |
||||
|
} |
||||
|
if (map.containsKey(keyName)) { |
||||
|
Object o = map.get(keyName); |
||||
|
if (o instanceof Integer) { |
||||
|
return (int) o; |
||||
|
} else { |
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
return -1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
//获取map类型
|
||||
|
public static Map<String, Object> getMap(Map<String, Object> map, String keyName) { |
||||
|
if (map == null) { |
||||
|
return new HashMap<>(); |
||||
|
} |
||||
|
if (map.containsKey(keyName)) { |
||||
|
Object o = map.get(keyName); |
||||
|
if (o instanceof Map) { |
||||
|
return (Map) o; |
||||
|
} else { |
||||
|
return new HashMap<>(); |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
return new HashMap<>(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 获取List类型
|
||||
|
public static List<Map<String, Object>> getListData(Map<String, Object> map, String keyName) { |
||||
|
List<Map<String, Object>> list = new ArrayList<>(); |
||||
|
if (map == null) { |
||||
|
return list; |
||||
|
} |
||||
|
if (map.containsKey(keyName)) { |
||||
|
Object o = map.get(keyName); |
||||
|
if (o instanceof List) { |
||||
|
for (int i = 0; i < ((List) o).size(); i++) { |
||||
|
Object o1 = ((List) o).get(i); |
||||
|
if (o1 instanceof Map) { |
||||
|
list.add((Map) o1); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return list; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
@ -0,0 +1,60 @@ |
|||||
|
package com.yxt.demo.common.utils; |
||||
|
|
||||
|
import org.apache.commons.lang3.StringUtils; |
||||
|
|
||||
|
import javax.validation.ConstraintViolation; |
||||
|
import javax.validation.Validation; |
||||
|
import javax.validation.Validator; |
||||
|
import java.util.List; |
||||
|
import java.util.Set; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2022/6/21 0:03 |
||||
|
* @Description 校验参数工具 |
||||
|
*/ |
||||
|
public class ValidationUtil { |
||||
|
|
||||
|
public final static Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 验证单个实体 |
||||
|
* |
||||
|
* @param t 参数 |
||||
|
* @param <T> 类型 |
||||
|
* @return 验证结果 |
||||
|
*/ |
||||
|
public static <T> String validateOne(T t) { |
||||
|
Set<ConstraintViolation<T>> validateResult = validator.validate(t); |
||||
|
if (validateResult != null && validateResult.size() != 0) { |
||||
|
StringBuilder sb = new StringBuilder(); |
||||
|
for (ConstraintViolation<T> valid : validateResult) { |
||||
|
sb.append(valid.getPropertyPath().toString()).append(StringUtils.SPACE).append(valid.getMessage()) |
||||
|
.append(","); |
||||
|
} |
||||
|
return sb.toString(); |
||||
|
} |
||||
|
|
||||
|
return StringUtils.EMPTY; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 验证多个实体 |
||||
|
* |
||||
|
* @param ts 参数 |
||||
|
* @param <T> 类型 |
||||
|
* @return 验证结果 |
||||
|
*/ |
||||
|
public static <T> String validateMutil(List<T> ts) { |
||||
|
StringBuilder sb = new StringBuilder(); |
||||
|
for (int index = 0; index < ts.size(); ++index) { |
||||
|
String validateOneResult = validateOne(ts.get(index)); |
||||
|
if (!StringUtils.isBlank(validateOneResult)) { |
||||
|
sb.append("index[" + index + "]:").append(validateOneResult).append(";"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return sb.toString(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,12 @@ |
|||||
|
package com.yxt.demo.common.utils.allutils; |
||||
|
|
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2022/7/23 23:59 |
||||
|
* @Description |
||||
|
*/ |
||||
|
@Slf4j |
||||
|
public class RegexpUtils { |
||||
|
} |
@ -0,0 +1,11 @@ |
|||||
|
package com.yxt.demo.common.utils.captcha; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2021/11/6 21:58 |
||||
|
* @Description |
||||
|
*/ |
||||
|
public class ImageUtils { |
||||
|
|
||||
|
|
||||
|
} |
@ -0,0 +1,197 @@ |
|||||
|
package com.yxt.demo.common.utils.convert; |
||||
|
|
||||
|
import org.apache.commons.lang3.StringUtils; |
||||
|
|
||||
|
import java.util.Collection; |
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2022/7/23 23:38 |
||||
|
* @Description |
||||
|
*/ |
||||
|
public class StringUtil extends StringUtils { |
||||
|
|
||||
|
/** |
||||
|
* 空字符串 |
||||
|
*/ |
||||
|
private static final String NULLSTR = ""; |
||||
|
|
||||
|
/** |
||||
|
* 下划线 |
||||
|
*/ |
||||
|
private static final char SEPARATOR = '_'; |
||||
|
|
||||
|
/** |
||||
|
* 星号 |
||||
|
*/ |
||||
|
private static final String START = "*"; |
||||
|
|
||||
|
/** |
||||
|
* * 判断一个Collection是否为空, 包含List,Set,Queue |
||||
|
* |
||||
|
* @param coll 要判断的Collection |
||||
|
* @return true:为空 false:非空 |
||||
|
*/ |
||||
|
public static boolean isEmpty(Collection<?> coll) { |
||||
|
return isNull(coll) || coll.isEmpty(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* * 判断一个对象是否为空 |
||||
|
* |
||||
|
* @param object Object |
||||
|
* @return true:为空 false:非空 |
||||
|
*/ |
||||
|
public static boolean isNull(Object object) { |
||||
|
return object == null; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 |
||||
|
* |
||||
|
* @param str 指定字符串 |
||||
|
* @param strs 需要检查的字符串数组 |
||||
|
* @return 是否匹配 |
||||
|
*/ |
||||
|
public static boolean matchesTwo(String str, List<String> strs) { |
||||
|
if (isEmpty(str) || isEmpty(strs)) { |
||||
|
return false; |
||||
|
} |
||||
|
for (String testStr : strs) { |
||||
|
if (matchesTwo(str, testStr)) { |
||||
|
return true; |
||||
|
} |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public static boolean matches(String str, List<String> strs) { |
||||
|
if (isEmpty(str) || isEmpty(strs)) { |
||||
|
return false; |
||||
|
} |
||||
|
for (String testStr : strs) { |
||||
|
if (matches(str, testStr)) { |
||||
|
return true; |
||||
|
} |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public static boolean matches(String str, String pattern) { |
||||
|
if (isEmpty(pattern) || isEmpty(str)) { |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
pattern = pattern.replaceAll("\\s*", ""); // 替换空格
|
||||
|
int beginOffset = 0; // pattern截取开始位置
|
||||
|
int formerStarOffset = -1; // 前星号的偏移位置
|
||||
|
int latterStarOffset = -1; // 后星号的偏移位置
|
||||
|
|
||||
|
String remainingURI = str; |
||||
|
String prefixPattern = ""; |
||||
|
String suffixPattern = ""; |
||||
|
|
||||
|
boolean result = false; |
||||
|
do { |
||||
|
formerStarOffset = indexOf(pattern, START, beginOffset); |
||||
|
prefixPattern = substring(pattern, beginOffset, formerStarOffset > -1 ? formerStarOffset : pattern.length()); |
||||
|
|
||||
|
// 匹配前缀Pattern
|
||||
|
result = remainingURI.equals(prefixPattern); |
||||
|
// 已经没有星号,直接返回
|
||||
|
if (formerStarOffset == -1) { |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
// 匹配失败,直接返回
|
||||
|
if (!result) { |
||||
|
return false; |
||||
|
} |
||||
|
if (!isEmpty(prefixPattern)) { |
||||
|
remainingURI = substringAfter(str, prefixPattern); |
||||
|
} |
||||
|
|
||||
|
// 匹配后缀Pattern
|
||||
|
latterStarOffset = indexOf(pattern, START, formerStarOffset + 1); |
||||
|
suffixPattern = substring(pattern, formerStarOffset + 1, latterStarOffset > -1 ? latterStarOffset : pattern.length()); |
||||
|
|
||||
|
result = remainingURI.equals(suffixPattern); |
||||
|
// 匹配失败,直接返回
|
||||
|
if (!result) { |
||||
|
return false; |
||||
|
} |
||||
|
if (!isEmpty(suffixPattern)) { |
||||
|
remainingURI = substringAfter(str, suffixPattern); |
||||
|
} |
||||
|
|
||||
|
// 移动指针
|
||||
|
beginOffset = latterStarOffset + 1; |
||||
|
|
||||
|
} |
||||
|
while (!isEmpty(suffixPattern) && !isEmpty(remainingURI)); |
||||
|
|
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 查找指定字符串是否匹配 |
||||
|
* |
||||
|
* @param str 指定字符串 |
||||
|
* @param pattern 需要检查的字符串 |
||||
|
* @return 是否匹配 |
||||
|
*/ |
||||
|
public static boolean matchesTwo(String str, String pattern) { |
||||
|
if (isEmpty(pattern) || isEmpty(str)) { |
||||
|
return false; |
||||
|
} |
||||
|
pattern = pattern.replaceAll("\\s*", ""); // 替换空格
|
||||
|
int beginOffset = 0; // pattern截取开始位置
|
||||
|
int formerStarOffset = -1; // 前星号的偏移位置
|
||||
|
int latterStarOffset = -1; // 后星号的偏移位置
|
||||
|
|
||||
|
String remainingURI = str; |
||||
|
String prefixPattern = ""; |
||||
|
String suffixPattern = ""; |
||||
|
|
||||
|
boolean result = false; |
||||
|
do { |
||||
|
formerStarOffset = indexOf(pattern, START, beginOffset); |
||||
|
prefixPattern = substring(pattern, beginOffset, formerStarOffset > -1 ? formerStarOffset : pattern.length()); |
||||
|
|
||||
|
// 匹配前缀Pattern
|
||||
|
result = remainingURI.contains(prefixPattern); |
||||
|
// 已经没有星号,直接返回
|
||||
|
if (formerStarOffset == -1) { |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
// 匹配失败,直接返回
|
||||
|
if (!result) { |
||||
|
return false; |
||||
|
} |
||||
|
if (!isEmpty(prefixPattern)) { |
||||
|
remainingURI = substringAfter(str, prefixPattern); |
||||
|
} |
||||
|
|
||||
|
// 匹配后缀Pattern
|
||||
|
latterStarOffset = indexOf(pattern, START, formerStarOffset + 1); |
||||
|
suffixPattern = substring(pattern, formerStarOffset + 1, latterStarOffset > -1 ? latterStarOffset : pattern.length()); |
||||
|
|
||||
|
result = remainingURI.contains(suffixPattern); |
||||
|
// 匹配失败,直接返回
|
||||
|
if (!result) { |
||||
|
return false; |
||||
|
} |
||||
|
if (!isEmpty(suffixPattern)) { |
||||
|
remainingURI = substringAfter(str, suffixPattern); |
||||
|
} |
||||
|
|
||||
|
// 移动指针
|
||||
|
beginOffset = latterStarOffset + 1; |
||||
|
} |
||||
|
while (!isEmpty(suffixPattern) && !isEmpty(remainingURI)); |
||||
|
return true; |
||||
|
} |
||||
|
} |
@ -0,0 +1,84 @@ |
|||||
|
package com.yxt.demo.common.utils.date; |
||||
|
|
||||
|
import java.text.SimpleDateFormat; |
||||
|
import java.util.Date; |
||||
|
import java.util.Locale; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2021/11/7 11:58 |
||||
|
* @Description 关于日期处理工具类 |
||||
|
*/ |
||||
|
public class DateUtils { |
||||
|
|
||||
|
public static void main(String[] args) throws Exception { |
||||
|
//时间格式字符串转换成Date类型
|
||||
|
Date date = dateStrConvertDateCst("2021-11-07 12:28:20", "yyyy-MM-dd HH:mm:ss"); |
||||
|
//获取两个时间间隔的x天x小时x分钟
|
||||
|
System.out.println(getDatePoor(date, new Date())); |
||||
|
//将Date类型转换成字符串类型
|
||||
|
System.out.println(dateConvertStr(new Date(), "yyyy-MM-dd HH:mm:ss")); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取两个时间间隔的x天x小时x分钟 |
||||
|
* |
||||
|
* @param endDate 结尾时间 |
||||
|
* @param nowDate 当前时间 |
||||
|
* @return |
||||
|
*/ |
||||
|
public static String getDatePoor(Date endDate, Date nowDate) { |
||||
|
long nd = 1000 * 24 * 60 * 60; |
||||
|
long nh = 1000 * 60 * 60; |
||||
|
long nm = 1000 * 60; |
||||
|
long ns = 1000; |
||||
|
// 获得两个时间的毫秒时间差异
|
||||
|
long diff = endDate.getTime() - nowDate.getTime(); |
||||
|
// 计算差多少天
|
||||
|
long day = diff / nd; |
||||
|
// 计算差多少小时
|
||||
|
long hour = diff % nd / nh; |
||||
|
// 计算差多少分钟
|
||||
|
long min = diff % nd % nh / nm; |
||||
|
// 计算差多少秒
|
||||
|
long s = diff % nd % nh % nm / ns; |
||||
|
// 输出结果
|
||||
|
return day + "天" + hour + "小时" + min + "分钟" + s + "秒"; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 时间格式字符串转换成Date类型 |
||||
|
* |
||||
|
* @param date 时间字符串 |
||||
|
* @param format 如:yyyy-MM-dd HH:mm:ss |
||||
|
* @return |
||||
|
*/ |
||||
|
public static Date dateStrConvertDateCst(String date, String format) { |
||||
|
try { |
||||
|
SimpleDateFormat simpledateformat = new SimpleDateFormat(format, |
||||
|
Locale.US); |
||||
|
Date newDate = simpledateformat.parse(date); |
||||
|
return newDate; |
||||
|
} catch (Exception e) { |
||||
|
e.printStackTrace(); |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 将Date类型转换成字符串类型 |
||||
|
* |
||||
|
* @param date 时间 |
||||
|
* @param format 格式 |
||||
|
* @return |
||||
|
*/ |
||||
|
public static String dateConvertStr(Date date, String format) { |
||||
|
return (date == null) ? null : new SimpleDateFormat(format) |
||||
|
.format(date); |
||||
|
} |
||||
|
|
||||
|
public static final String parseDateToStr(final String format, final Date date) { |
||||
|
return new SimpleDateFormat(format).format(date); |
||||
|
} |
||||
|
} |
@ -0,0 +1,77 @@ |
|||||
|
package com.yxt.demo.common.utils.date; |
||||
|
|
||||
|
import java.time.LocalDate; |
||||
|
import java.time.LocalDateTime; |
||||
|
import java.time.ZoneId; |
||||
|
import java.time.format.DateTimeFormatter; |
||||
|
import java.util.Date; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2021/11/6 22:52 |
||||
|
* @Description java 8 日期工具类再封装 |
||||
|
*/ |
||||
|
public class LocalDateUtils { |
||||
|
|
||||
|
/** |
||||
|
* 比较第一个日期是否小于第二个日期 |
||||
|
* |
||||
|
* @param firstDate 第一个日期 |
||||
|
* @param secondDate 第二个日期 |
||||
|
* @return true-小于;false-大于 |
||||
|
*/ |
||||
|
public static boolean localDateIsBefore(LocalDate firstDate, LocalDate secondDate) { |
||||
|
return firstDate.isBefore(secondDate); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 比较第一个日期是否大于第二个日期 |
||||
|
* |
||||
|
* @param firstDate 第一个日期 |
||||
|
* @param secondDate 第二个日期 |
||||
|
* @return true-大于;false-不大于 |
||||
|
*/ |
||||
|
public static boolean localDateIsAfter(LocalDate firstDate, LocalDate secondDate) { |
||||
|
return firstDate.isAfter(secondDate); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 比较两个日期是否相等 |
||||
|
* |
||||
|
* @param firstDate 第一个日期 |
||||
|
* @param secondDate 第二个日期 |
||||
|
* @return true-相等;false-不相等 |
||||
|
*/ |
||||
|
public static boolean localDateIsEqual(LocalDate firstDate, LocalDate secondDate) { |
||||
|
return firstDate.isEqual(secondDate); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 字符串转换datetime |
||||
|
* |
||||
|
* @param dateTime |
||||
|
* @return yyyy-MM-dd HH:mm:ss |
||||
|
*/ |
||||
|
public static Date stringCoverDateTime(String dateTime) { |
||||
|
LocalDateTime startDateTime = |
||||
|
LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); |
||||
|
Date LocalDateTimeToDate = Date.from(startDateTime.atZone(ZoneId.systemDefault()).toInstant()); |
||||
|
return LocalDateTimeToDate; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 字符串转换date |
||||
|
* |
||||
|
* @param dateTime |
||||
|
* @return yyyy-MM-dd |
||||
|
*/ |
||||
|
public static Date stringCoverDate(String dateTime) { |
||||
|
LocalDateTime startDateTime = |
||||
|
LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd")); |
||||
|
Date LocalDateTimeToDate = Date.from(startDateTime.atZone(ZoneId.systemDefault()).toInstant()); |
||||
|
return LocalDateTimeToDate; |
||||
|
} |
||||
|
} |
@ -0,0 +1,345 @@ |
|||||
|
package com.yxt.demo.common.utils.http; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSON; |
||||
|
import okhttp3.*; |
||||
|
|
||||
|
import javax.net.ssl.SSLContext; |
||||
|
import javax.net.ssl.SSLSocketFactory; |
||||
|
import javax.net.ssl.TrustManager; |
||||
|
import javax.net.ssl.X509TrustManager; |
||||
|
import java.io.IOException; |
||||
|
import java.net.URLEncoder; |
||||
|
import java.security.SecureRandom; |
||||
|
import java.security.cert.X509Certificate; |
||||
|
import java.util.LinkedHashMap; |
||||
|
import java.util.Map; |
||||
|
import java.util.concurrent.Semaphore; |
||||
|
import java.util.concurrent.TimeUnit; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2021/11/5 20:57 |
||||
|
* @Description 封装OkHttp3工具类 |
||||
|
*/ |
||||
|
public class OkHttpUtils { |
||||
|
|
||||
|
private static volatile OkHttpClient okHttpClient = null; |
||||
|
private static volatile Semaphore semaphore = null; |
||||
|
private Map<String, String> headerMap; |
||||
|
private Map<String, String> paramMap; |
||||
|
private String url; |
||||
|
private Request.Builder request; |
||||
|
|
||||
|
/** |
||||
|
* 初始化okHttpClient,并且允许https访问 |
||||
|
*/ |
||||
|
private OkHttpUtils() { |
||||
|
if (okHttpClient == null) { |
||||
|
synchronized (OkHttpUtils.class) { |
||||
|
if (okHttpClient == null) { |
||||
|
TrustManager[] trustManagers = buildTrustManagers(); |
||||
|
okHttpClient = new OkHttpClient.Builder() |
||||
|
.connectTimeout(15, TimeUnit.SECONDS) |
||||
|
.writeTimeout(20, TimeUnit.SECONDS) |
||||
|
.readTimeout(20, TimeUnit.SECONDS) |
||||
|
.sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0]) |
||||
|
.hostnameVerifier((hostName, session) -> true) |
||||
|
.retryOnConnectionFailure(true) |
||||
|
.build(); |
||||
|
addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 用于异步请求时,控制访问线程数,返回结果 |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
private static Semaphore getSemaphoreInstance() { |
||||
|
//只能1个线程同时访问
|
||||
|
synchronized (OkHttpUtils.class) { |
||||
|
if (semaphore == null) { |
||||
|
semaphore = new Semaphore(0); |
||||
|
} |
||||
|
} |
||||
|
return semaphore; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 创建OkHttpUtils |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
public static OkHttpUtils builder() { |
||||
|
return new OkHttpUtils(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 添加url |
||||
|
* |
||||
|
* @param url |
||||
|
* @return |
||||
|
*/ |
||||
|
public OkHttpUtils url(String url) { |
||||
|
this.url = url; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 添加参数 |
||||
|
* |
||||
|
* @param key 参数名 |
||||
|
* @param value 参数值 |
||||
|
* @return |
||||
|
*/ |
||||
|
public OkHttpUtils addParam(String key, String value) { |
||||
|
if (paramMap == null) { |
||||
|
paramMap = new LinkedHashMap<>(16); |
||||
|
} |
||||
|
paramMap.put(key, value); |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 添加请求头 |
||||
|
* |
||||
|
* @param key 参数名 |
||||
|
* @param value 参数值 |
||||
|
* @return |
||||
|
*/ |
||||
|
public OkHttpUtils addHeader(String key, String value) { |
||||
|
if (headerMap == null) { |
||||
|
headerMap = new LinkedHashMap<>(16); |
||||
|
} |
||||
|
headerMap.put(key, value); |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 初始化get方法 |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
public OkHttpUtils get() { |
||||
|
request = new Request.Builder().get(); |
||||
|
StringBuilder urlBuilder = new StringBuilder(url); |
||||
|
if (paramMap != null) { |
||||
|
urlBuilder.append("?"); |
||||
|
try { |
||||
|
for (Map.Entry<String, String> entry : paramMap.entrySet()) { |
||||
|
urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")). |
||||
|
append("="). |
||||
|
append(URLEncoder.encode(entry.getValue(), "utf-8")). |
||||
|
append("&"); |
||||
|
} |
||||
|
} catch (Exception e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
urlBuilder.deleteCharAt(urlBuilder.length() - 1); |
||||
|
} |
||||
|
request.url(urlBuilder.toString()); |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 初始化post方法 |
||||
|
* |
||||
|
* @param isJsonPost true等于json的方式提交数据,类似postman里post方法的raw |
||||
|
* false等于普通的表单提交 |
||||
|
* @return |
||||
|
*/ |
||||
|
public OkHttpUtils post(boolean isJsonPost) { |
||||
|
RequestBody requestBody; |
||||
|
if (isJsonPost) { |
||||
|
String json = ""; |
||||
|
if (paramMap != null) { |
||||
|
json = JSON.toJSONString(paramMap); |
||||
|
} |
||||
|
requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json); |
||||
|
} else { |
||||
|
FormBody.Builder formBody = new FormBody.Builder(); |
||||
|
if (paramMap != null) { |
||||
|
paramMap.forEach(formBody::add); |
||||
|
} |
||||
|
requestBody = formBody.build(); |
||||
|
} |
||||
|
request = new Request.Builder().post(requestBody).url(url); |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 同步请求 |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
public String sync() { |
||||
|
setHeader(request); |
||||
|
try { |
||||
|
Response response = okHttpClient.newCall(request.build()).execute(); |
||||
|
assert response.body() != null; |
||||
|
return response.body().string(); |
||||
|
} catch (IOException e) { |
||||
|
e.printStackTrace(); |
||||
|
return "请求失败:" + e.getMessage(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 异步请求,有返回值 |
||||
|
*/ |
||||
|
public String async() { |
||||
|
StringBuilder buffer = new StringBuilder(""); |
||||
|
setHeader(request); |
||||
|
okHttpClient.newCall(request.build()).enqueue(new Callback() { |
||||
|
@Override |
||||
|
public void onFailure(Call call, IOException e) { |
||||
|
buffer.append("请求出错:").append(e.getMessage()); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void onResponse(Call call, Response response) throws IOException { |
||||
|
assert response.body() != null; |
||||
|
buffer.append(response.body().string()); |
||||
|
getSemaphoreInstance().release(); |
||||
|
} |
||||
|
}); |
||||
|
try { |
||||
|
getSemaphoreInstance().acquire(); |
||||
|
} catch (InterruptedException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
return buffer.toString(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 异步请求,带有接口回调 |
||||
|
* |
||||
|
* @param callBack |
||||
|
*/ |
||||
|
public void async(ICallBack callBack) { |
||||
|
setHeader(request); |
||||
|
okHttpClient.newCall(request.build()).enqueue(new Callback() { |
||||
|
@Override |
||||
|
public void onFailure(Call call, IOException e) { |
||||
|
callBack.onFailure(call, e.getMessage()); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void onResponse(Call call, Response response) throws IOException { |
||||
|
assert response.body() != null; |
||||
|
callBack.onSuccessful(call, response.body().string()); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 为request添加请求头 |
||||
|
* |
||||
|
* @param request |
||||
|
*/ |
||||
|
private void setHeader(Request.Builder request) { |
||||
|
if (headerMap != null) { |
||||
|
try { |
||||
|
for (Map.Entry<String, String> entry : headerMap.entrySet()) { |
||||
|
request.addHeader(entry.getKey(), entry.getValue()); |
||||
|
} |
||||
|
} catch (Exception e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 生成安全套接字工厂,用于https请求的证书跳过 |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustAllCerts) { |
||||
|
SSLSocketFactory ssfFactory = null; |
||||
|
try { |
||||
|
SSLContext sc = SSLContext.getInstance("SSL"); |
||||
|
sc.init(null, trustAllCerts, new SecureRandom()); |
||||
|
ssfFactory = sc.getSocketFactory(); |
||||
|
} catch (Exception e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
return ssfFactory; |
||||
|
} |
||||
|
|
||||
|
private static TrustManager[] buildTrustManagers() { |
||||
|
return new TrustManager[]{ |
||||
|
new X509TrustManager() { |
||||
|
@Override |
||||
|
public void checkClientTrusted(X509Certificate[] chain, String authType) { |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void checkServerTrusted(X509Certificate[] chain, String authType) { |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public X509Certificate[] getAcceptedIssuers() { |
||||
|
return new X509Certificate[]{}; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 自定义一个接口回调 |
||||
|
*/ |
||||
|
public interface ICallBack { |
||||
|
void onSuccessful(Call call, String data); |
||||
|
|
||||
|
void onFailure(Call call, String errorMsg); |
||||
|
} |
||||
|
|
||||
|
/*****************************使用教程************************************************************/ |
||||
|
|
||||
|
public static void main(String[] args) { |
||||
|
// get请求,方法顺序按照这种方式,切记选择post/get一定要放在倒数第二,同步或者异步倒数第一,才会正确执行
|
||||
|
OkHttpUtils.builder().url("请求地址,http/https都可以") |
||||
|
// 有参数的话添加参数,可多个
|
||||
|
.addParam("参数名", "参数值") |
||||
|
.addParam("参数名", "参数值") |
||||
|
// 也可以添加多个
|
||||
|
.addHeader("Content-Type", "application/json; charset=utf-8") |
||||
|
.get() |
||||
|
// 可选择是同步请求还是异步请求
|
||||
|
//.async();
|
||||
|
.sync(); |
||||
|
|
||||
|
// post请求,分为两种,一种是普通表单提交,一种是json提交
|
||||
|
OkHttpUtils.builder().url("请求地址,http/https都可以") |
||||
|
// 有参数的话添加参数,可多个
|
||||
|
.addParam("参数名", "参数值") |
||||
|
.addParam("参数名", "参数值") |
||||
|
// 也可以添加多个
|
||||
|
.addHeader("Content-Type", "application/json; charset=utf-8") |
||||
|
// 如果是true的话,会类似于postman中post提交方式的raw,用json的方式提交,不是表单
|
||||
|
// 如果是false的话传统的表单提交
|
||||
|
.post(true) |
||||
|
.sync(); |
||||
|
|
||||
|
// 选择异步有两个方法,一个是带回调接口,一个是直接返回结果
|
||||
|
OkHttpUtils.builder().url("") |
||||
|
.post(false) |
||||
|
.async(); |
||||
|
|
||||
|
OkHttpUtils.builder().url("").post(false).async(new ICallBack() { |
||||
|
@Override |
||||
|
public void onSuccessful(Call call, String data) { |
||||
|
// 请求成功后的处理
|
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void onFailure(Call call, String errorMsg) { |
||||
|
// 请求失败后的处理
|
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,85 @@ |
|||||
|
package com.yxt.demo.common.utils.jwt; |
||||
|
|
||||
|
import io.jsonwebtoken.Jwts; |
||||
|
import io.jsonwebtoken.SignatureAlgorithm; |
||||
|
|
||||
|
import java.util.Date; |
||||
|
import java.util.HashMap; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2021/11/6 22:55 |
||||
|
* @Description |
||||
|
*/ |
||||
|
public class JwtUtils { |
||||
|
|
||||
|
/** |
||||
|
* 签名密钥(高度保密) |
||||
|
*/ |
||||
|
private static final String SECRET = "qYYjXt7s1C*nEC%9RCwQGFA$YwPr$Jrj"; |
||||
|
/** |
||||
|
* 签名算法 |
||||
|
*/ |
||||
|
private static final SignatureAlgorithm SIGNATURE_ALGORITHM = SignatureAlgorithm.HS512; |
||||
|
/** |
||||
|
* token前缀 |
||||
|
*/ |
||||
|
private static final String TOKEN_PREFIX = "Bearer "; |
||||
|
/** |
||||
|
* 有效期:1天 |
||||
|
*/ |
||||
|
private static final Long TIME = 24 * 3600 * 1000L; |
||||
|
|
||||
|
/** |
||||
|
* 生成JWT token |
||||
|
* |
||||
|
* @param map 传入数据 |
||||
|
* @return |
||||
|
*/ |
||||
|
public static String sign(Map<String, Object> map) { |
||||
|
Date now = new Date(System.currentTimeMillis()); |
||||
|
String jwt = Jwts.builder() |
||||
|
// 设置自定义数据
|
||||
|
.setClaims(map) |
||||
|
// 设置签发时间
|
||||
|
.setIssuedAt(now) |
||||
|
// 设置过期时间
|
||||
|
.setExpiration(new Date(now.getTime() + TIME)) |
||||
|
.signWith(SIGNATURE_ALGORITHM, SECRET) |
||||
|
.compact(); |
||||
|
return TOKEN_PREFIX + jwt; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 验证JWT token并返回数据。当验证失败时,抛出异常 |
||||
|
* |
||||
|
* @param token token |
||||
|
* @return |
||||
|
*/ |
||||
|
public static Map unSign(String token) { |
||||
|
try { |
||||
|
return Jwts.parser() |
||||
|
.setSigningKey(SECRET) |
||||
|
.parseClaimsJws(token.replace(TOKEN_PREFIX, "")) |
||||
|
.getBody(); |
||||
|
} catch (Exception e) { |
||||
|
throw new IllegalStateException("Token验证失败:" + e.getMessage()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static void main(String[] args) { |
||||
|
/* Map<String, Object> map = new HashMap<>(); |
||||
|
map.put("userName", "admin"); |
||||
|
map.put("userId", "001"); |
||||
|
String token = JwtUtils.sign(map, 3600_000); |
||||
|
System.out.println(JwtUtils.unSign(token));*/ |
||||
|
Map<String, Object> map = new HashMap<>(); |
||||
|
map.put("userSid", "123456788"); |
||||
|
map.put("userName", "你好"); |
||||
|
// sign(map);
|
||||
|
// System.out.println(sign(map));
|
||||
|
Map<String,Object> map1 = unSign("Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyU2lkIjoiMTIzNDU2Nzg4IiwidXNlck5hbWUiOiLkvaDlpb0iLCJleHAiOjE2MzYyOTk0NTgsImlhdCI6MTYzNjIxMzA1OH0.iuyZznSCm0QYneqfck_zc3fpg57YsAdG8k2aLrDY_4NZJwJdVxE7supqLtfEvTC5O0EhG590ShhRsVoU-rbSrA"); |
||||
|
System.out.println(map1); |
||||
|
} |
||||
|
} |
@ -0,0 +1,35 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
<parent> |
||||
|
<groupId>com.yxt</groupId> |
||||
|
<artifactId>demo</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</parent> |
||||
|
<modelVersion>4.0.0</modelVersion> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-common</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
<modules> |
||||
|
<module>demo-common-redis</module> |
||||
|
<module>demo-common-config</module> |
||||
|
<module>demo-common-utils</module> |
||||
|
<module>demo-common-core</module> |
||||
|
<module>demo-common-base</module> |
||||
|
<module>demo-common-jdbc</module> |
||||
|
</modules> |
||||
|
<packaging>pom</packaging> |
||||
|
<name>di-common</name> |
||||
|
<description>框架的公共项目,存放项目中用到的基础类、公共类及工具类。各项目根据需要引用对应子项目</description> |
||||
|
<dependencies> |
||||
|
<!--knife4j--> |
||||
|
<dependency> |
||||
|
<groupId>com.github.xiaoymin</groupId> |
||||
|
<artifactId>knife4j-spring-boot-starter</artifactId> |
||||
|
</dependency> |
||||
|
|
||||
|
</dependencies> |
||||
|
|
||||
|
|
||||
|
</project> |
@ -0,0 +1,89 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
<parent> |
||||
|
<groupId>com.yxt</groupId> |
||||
|
<artifactId>demo</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</parent> |
||||
|
<modelVersion>4.0.0</modelVersion> |
||||
|
|
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-gateway</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
|
||||
|
<dependencies> |
||||
|
<dependency> |
||||
|
<groupId>org.springframework.cloud</groupId> |
||||
|
<artifactId>spring-cloud-starter-gateway</artifactId> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>com.alibaba.cloud</groupId> |
||||
|
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>org.projectlombok</groupId> |
||||
|
<artifactId>lombok</artifactId> |
||||
|
<optional>true</optional> |
||||
|
</dependency> |
||||
|
|
||||
|
<dependency> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-common-utils</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
<exclusions> |
||||
|
<exclusion> |
||||
|
<groupId>org.springframework.boot</groupId> |
||||
|
<artifactId>spring-boot-starter-web</artifactId> |
||||
|
</exclusion> |
||||
|
</exclusions> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-common-core</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
<exclusions> |
||||
|
<exclusion> |
||||
|
<groupId>org.springframework.boot</groupId> |
||||
|
<artifactId>spring-boot-starter-web</artifactId> |
||||
|
</exclusion> |
||||
|
</exclusions> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-common-redis</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</dependency> |
||||
|
|
||||
|
|
||||
|
|
||||
|
</dependencies> |
||||
|
|
||||
|
<build> |
||||
|
<plugins> |
||||
|
<plugin> |
||||
|
<groupId>org.springframework.boot</groupId> |
||||
|
<artifactId>spring-boot-maven-plugin</artifactId> |
||||
|
<version>2.5.6</version> |
||||
|
<executions> |
||||
|
<execution> |
||||
|
<goals> |
||||
|
<goal>repackage</goal> |
||||
|
</goals> |
||||
|
</execution> |
||||
|
</executions> |
||||
|
</plugin> |
||||
|
</plugins> |
||||
|
<resources> |
||||
|
<resource> |
||||
|
<directory>src/main/resources</directory> |
||||
|
<includes> |
||||
|
<include>**/*.yml</include> |
||||
|
</includes> |
||||
|
<filtering>false</filtering> |
||||
|
</resource> |
||||
|
</resources> |
||||
|
</build> |
||||
|
|
||||
|
</project> |
@ -0,0 +1,128 @@ |
|||||
|
package com.yxt.demo.gateway; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSON; |
||||
|
import com.yxt.demo.common.core.constant.StatusEnum; |
||||
|
import com.yxt.demo.common.core.result.ResultBean; |
||||
|
import com.yxt.demo.common.redis.service.RedisService; |
||||
|
import com.yxt.demo.common.utils.convert.StringUtil; |
||||
|
import com.yxt.demo.gateway.config.CacheConstants; |
||||
|
import com.yxt.demo.gateway.config.IgnoreWhiteProperties; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.cloud.gateway.filter.GatewayFilterChain; |
||||
|
import org.springframework.cloud.gateway.filter.GlobalFilter; |
||||
|
import org.springframework.core.Ordered; |
||||
|
import org.springframework.core.io.buffer.DataBufferFactory; |
||||
|
import org.springframework.http.HttpStatus; |
||||
|
import org.springframework.http.MediaType; |
||||
|
import org.springframework.http.server.reactive.ServerHttpRequest; |
||||
|
import org.springframework.http.server.reactive.ServerHttpResponse; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
import org.springframework.web.server.ServerWebExchange; |
||||
|
import reactor.core.publisher.Mono; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2020/12/2 9:52 |
||||
|
* @description 网关鉴权 |
||||
|
* 1.某些接口不需要不进行登录验证,如登录,注册,获取验证码等接口。(uri白名单) |
||||
|
* 2.某些接口需要登录验证,但是不需要刷新token有效时间,如客户端轮询请求的接口。 |
||||
|
* 3.特定场景下IP黑、白名单。 |
||||
|
* 4.处于安全考虑的接口流量控制。 |
||||
|
*/ |
||||
|
@Component |
||||
|
@Slf4j |
||||
|
public class AuthFilter implements GlobalFilter, Ordered { |
||||
|
|
||||
|
/** |
||||
|
* 过期时间设置为4小时 |
||||
|
*/ |
||||
|
private final static long EXPIRE_TIME = CacheConstants.TOKEN_EXPIRE * 60; |
||||
|
private final static long EXPIRE_TIME_APP = CacheConstants.TOKEN_EXPIRE_APP * 60; |
||||
|
private final static String APP = "App"; |
||||
|
|
||||
|
|
||||
|
// 排除过滤的 uri 地址,nacos自行添加
|
||||
|
@Autowired |
||||
|
private IgnoreWhiteProperties ignoreWhite; |
||||
|
@Autowired |
||||
|
private RedisService redisUtil; |
||||
|
/* |
||||
|
redis中数据存储结构为两个键值对 |
||||
|
键为用户ID,值为用户token,可以通过用户ID查询用户token,实现立刻失效用户token功能。 |
||||
|
键为用户token,值为用户数据,实现token有效性,用户数据缓存功能。 |
||||
|
*/ |
||||
|
|
||||
|
@Override |
||||
|
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { |
||||
|
String url = exchange.getRequest().getURI().getPath(); |
||||
|
//1.uri白名单。 跳过不需要验证的路径
|
||||
|
if (StringUtil.matches(url, ignoreWhite.getWhites())) { |
||||
|
return chain.filter(exchange); |
||||
|
} else if (StringUtil.matchesTwo(url, ignoreWhite.getWhitesTwo())) { |
||||
|
return chain.filter(exchange); |
||||
|
} |
||||
|
//2.验证有无令牌。 从请求的header中获取token
|
||||
|
String token = getToken(exchange.getRequest()); |
||||
|
if (StringUtil.isBlank(token)) { |
||||
|
return setUnauthorizedResponse(exchange, "令牌不能为空"); |
||||
|
} |
||||
|
//3.验证token是否有效。(a.验证token是否合法 b.验证token是否过期)
|
||||
|
//从redis缓存中获取key对应的内容
|
||||
|
String userName = redisUtil.get(token); |
||||
|
|
||||
|
if (StringUtil.isBlank(userName)) { |
||||
|
return setUnauthorizedResponse(exchange, "登录状态已过期"); |
||||
|
} |
||||
|
//验签:需要验证token中的签名是否与用户sid一致,后台用密钥+userSid+token除签名以外的内容,重新生成签名,与token中的签名进行比较
|
||||
|
|
||||
|
//刷新token过期日期
|
||||
|
if (token.contains(APP)) { |
||||
|
redisUtil.expire(token, EXPIRE_TIME_APP); |
||||
|
} else { |
||||
|
redisUtil.expire(token, EXPIRE_TIME); |
||||
|
} |
||||
|
|
||||
|
// 在请求中增加用户信息
|
||||
|
ServerHttpRequest mutableReq = exchange.getRequest().mutate() |
||||
|
.header(CacheConstants.DETAILS_USERNAME, userName).build(); |
||||
|
ServerWebExchange mutableExchange = exchange.mutate().request(mutableReq).build(); |
||||
|
return chain.filter(mutableExchange); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 鉴权异常处理 |
||||
|
* |
||||
|
* @param exchange |
||||
|
* @param msg |
||||
|
* @return |
||||
|
*/ |
||||
|
private Mono<Void> setUnauthorizedResponse(ServerWebExchange exchange, String msg) { |
||||
|
ResultBean resultBean = ResultBean.fireFail(); |
||||
|
ServerHttpResponse response = exchange.getResponse(); |
||||
|
response.getHeaders().setContentType(MediaType.APPLICATION_JSON); |
||||
|
response.setStatusCode(HttpStatus.OK); |
||||
|
|
||||
|
log.error("[鉴权异常处理]请求路径:{}", exchange.getRequest().getPath()); |
||||
|
|
||||
|
return response.writeWith(Mono.fromSupplier(() -> { |
||||
|
DataBufferFactory bufferFactory = response.bufferFactory(); |
||||
|
log.error(msg); |
||||
|
return bufferFactory.wrap(JSON.toJSONBytes(resultBean.setCode(StatusEnum.OVERDUE.getCode()).setMsg(msg))); |
||||
|
})); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取请求token |
||||
|
*/ |
||||
|
private String getToken(ServerHttpRequest request) { |
||||
|
String token = request.getHeaders().getFirst(CacheConstants.HEADER); |
||||
|
return token; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public int getOrder() { |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,28 @@ |
|||||
|
package com.yxt.demo.gateway; |
||||
|
|
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.boot.SpringApplication; |
||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication; |
||||
|
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; |
||||
|
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; |
||||
|
|
||||
|
import java.time.LocalDate; |
||||
|
import java.time.LocalTime; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2020/8/28 14:11 |
||||
|
* @description 网关 |
||||
|
*/ |
||||
|
@EnableDiscoveryClient |
||||
|
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}, |
||||
|
scanBasePackages = {"com.yxt.demo"}) |
||||
|
@Slf4j |
||||
|
public class DemoGatewayApplication { |
||||
|
|
||||
|
public static void main(String[] args) { |
||||
|
SpringApplication.run(DemoGatewayApplication.class, args); |
||||
|
log.info("------" + LocalDate.now(), LocalTime.now() + "------"); |
||||
|
log.info("(♥◠‿◠)ノ゙ 网关模块启动成功 ლ(´ڡ`ლ)゙ \n"); |
||||
|
} |
||||
|
} |
@ -0,0 +1,107 @@ |
|||||
|
package com.yxt.demo.gateway; |
||||
|
|
||||
|
|
||||
|
import com.fasterxml.jackson.annotation.JsonAutoDetect; |
||||
|
import com.fasterxml.jackson.annotation.PropertyAccessor; |
||||
|
import com.fasterxml.jackson.databind.ObjectMapper; |
||||
|
import org.springframework.beans.factory.annotation.Value; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import org.springframework.data.redis.connection.RedisConnectionFactory; |
||||
|
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; |
||||
|
import org.springframework.data.redis.core.RedisTemplate; |
||||
|
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; |
||||
|
import org.springframework.data.redis.serializer.StringRedisSerializer; |
||||
|
import redis.clients.jedis.JedisPoolConfig; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2020/9/18 19:37 |
||||
|
* @description |
||||
|
*/ |
||||
|
@Configuration |
||||
|
public class RedisConfig { |
||||
|
|
||||
|
@Value("${spring.redis.host}") |
||||
|
private String host; |
||||
|
|
||||
|
@Value("${spring.redis.password}") |
||||
|
private String password; |
||||
|
|
||||
|
@Value("${spring.redis.port}") |
||||
|
private int port; |
||||
|
|
||||
|
@Value("${spring.redis.timeout}") |
||||
|
private int timeout; |
||||
|
|
||||
|
@Value("${spring.redis.jedis.pool.max-active}") |
||||
|
private int redisPoolMaxActive; |
||||
|
|
||||
|
@Value("${spring.redis.jedis.pool.max-wait}") |
||||
|
private int redisPoolMaxWait; |
||||
|
|
||||
|
@Value("${spring.redis.jedis.pool.max-idle}") |
||||
|
private int redisPoolMaxIdle; |
||||
|
|
||||
|
@Value("${spring.redis.jedis.pool.min-idle}") |
||||
|
private int redisPoolMinIdle; |
||||
|
@Value("${spring.redis.database}") |
||||
|
private int database; |
||||
|
|
||||
|
@Bean |
||||
|
public JedisPoolConfig getJedisPoolConfig() { |
||||
|
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); |
||||
|
//最大空闲数
|
||||
|
jedisPoolConfig.setMaxIdle(redisPoolMaxIdle); |
||||
|
//最小空闲数
|
||||
|
jedisPoolConfig.setMinIdle(redisPoolMinIdle); |
||||
|
//最大建立连接等待时间
|
||||
|
jedisPoolConfig.setMaxWaitMillis(redisPoolMaxWait); |
||||
|
//连接池的最大数据库连接数
|
||||
|
jedisPoolConfig.setMaxTotal(redisPoolMaxActive); |
||||
|
return jedisPoolConfig; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
@Bean |
||||
|
public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) { |
||||
|
|
||||
|
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig); |
||||
|
jedisConnectionFactory.setDatabase(database); |
||||
|
//IP地址
|
||||
|
jedisConnectionFactory.setHostName(host); |
||||
|
//如果redis设置有密码
|
||||
|
jedisConnectionFactory.setPassword(password); |
||||
|
//端口号
|
||||
|
jedisConnectionFactory.setPort(port); |
||||
|
//客户端超时时间单位是毫秒
|
||||
|
jedisConnectionFactory.setTimeout(timeout); |
||||
|
// jedisConnectionFactory.afterPropertiesSet(); //记得添加这行!
|
||||
|
return jedisConnectionFactory; |
||||
|
} |
||||
|
|
||||
|
@Bean |
||||
|
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { |
||||
|
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); |
||||
|
redisTemplate.setConnectionFactory(redisConnectionFactory); |
||||
|
// 使用Jackson2JsonRedisSerialize 替换默认序列化
|
||||
|
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); |
||||
|
ObjectMapper om = new ObjectMapper(); |
||||
|
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); |
||||
|
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); |
||||
|
jackson2JsonRedisSerializer.setObjectMapper(om); |
||||
|
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); |
||||
|
// key采用String的序列化方式
|
||||
|
//redisTemplate.setKeySerializer(new StringRedisSerializer());
|
||||
|
redisTemplate.setKeySerializer(stringRedisSerializer); |
||||
|
// hash的key也采用String的序列化方式
|
||||
|
redisTemplate.setHashKeySerializer(stringRedisSerializer); |
||||
|
// value序列化方式采用jackson
|
||||
|
// redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
|
||||
|
redisTemplate.setValueSerializer(stringRedisSerializer); |
||||
|
// hash的value序列化方式采用jackson
|
||||
|
redisTemplate.setHashValueSerializer(stringRedisSerializer); |
||||
|
redisTemplate.afterPropertiesSet(); |
||||
|
return redisTemplate; |
||||
|
} |
||||
|
} |
@ -0,0 +1,300 @@ |
|||||
|
package com.yxt.demo.gateway; |
||||
|
|
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.dao.DataAccessException; |
||||
|
import org.springframework.data.redis.connection.RedisConnection; |
||||
|
import org.springframework.data.redis.connection.RedisStringCommands; |
||||
|
import org.springframework.data.redis.core.*; |
||||
|
import org.springframework.data.redis.core.types.Expiration; |
||||
|
import org.springframework.data.redis.serializer.RedisSerializer; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
|
||||
|
import java.io.Serializable; |
||||
|
import java.util.List; |
||||
|
import java.util.Set; |
||||
|
import java.util.concurrent.TimeUnit; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2020/9/9 17:35 |
||||
|
* @description redis工具类 |
||||
|
*/ |
||||
|
@Service |
||||
|
public class RedisUtil { |
||||
|
|
||||
|
@Autowired |
||||
|
private RedisTemplate redisTemplate; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 字符串类型:根据key设置value值,如果key中的value存在,那么返回false |
||||
|
* |
||||
|
* @param key |
||||
|
* @param value |
||||
|
* @return |
||||
|
*/ |
||||
|
public Boolean setnx(final String key, final String value, final long expration, final TimeUnit timeUnit) { |
||||
|
return (Boolean) redisTemplate.execute(new RedisCallback<Boolean>() { |
||||
|
@Override |
||||
|
public Boolean doInRedis(RedisConnection redisConnection) throws DataAccessException { |
||||
|
RedisSerializer<String> redisSerializer = redisTemplate.getStringSerializer(); |
||||
|
byte keys[] = redisSerializer.serialize(key); |
||||
|
byte values[] = redisSerializer.serialize(value); |
||||
|
return redisConnection.set(keys, values, Expiration.from(expration, timeUnit), RedisStringCommands.SetOption.SET_IF_ABSENT); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 写入缓存 |
||||
|
* |
||||
|
* @param key |
||||
|
* @param value |
||||
|
* @return |
||||
|
*/ |
||||
|
public boolean set(final String key, final String value) { |
||||
|
|
||||
|
boolean result = (boolean) redisTemplate.execute(new RedisCallback<Boolean>() { |
||||
|
@Override |
||||
|
public Boolean doInRedis(RedisConnection connection) throws DataAccessException { |
||||
|
RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); |
||||
|
connection.set(serializer.serialize(key), serializer.serialize(value)); |
||||
|
return true; |
||||
|
} |
||||
|
}); |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 写入缓存设置时效时间 |
||||
|
* |
||||
|
* @param key |
||||
|
* @param value |
||||
|
* @return |
||||
|
*/ |
||||
|
public boolean set(final String key, Object value, Long expireTime) { |
||||
|
boolean result = false; |
||||
|
try { |
||||
|
ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); |
||||
|
operations.set(key, value); |
||||
|
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS); |
||||
|
result = true; |
||||
|
} catch (Exception e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
return result; |
||||
|
} |
||||
|
/** |
||||
|
* 刷新缓存到期时间 |
||||
|
* @param key |
||||
|
* @param expire |
||||
|
* @return |
||||
|
*/ |
||||
|
public boolean expire(String key, long expire) { |
||||
|
return redisTemplate.expire(key, expire, TimeUnit.SECONDS); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 读取缓存 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public String get(final String key) { |
||||
|
String result = (String) redisTemplate.execute(new RedisCallback<String>() { |
||||
|
@Override |
||||
|
public String doInRedis(RedisConnection connection) throws DataAccessException { |
||||
|
RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); |
||||
|
byte[] value = connection.get(serializer.serialize(key)); |
||||
|
return serializer.deserialize(value); |
||||
|
} |
||||
|
}); |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 正则获取key集合 |
||||
|
* |
||||
|
* @param pattern |
||||
|
* @return |
||||
|
*/ |
||||
|
public Set<String> keys(String pattern) { |
||||
|
Set<String> keys = redisTemplate.keys(pattern); |
||||
|
return keys; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 批量删除对应的value |
||||
|
* |
||||
|
* @param keys |
||||
|
*/ |
||||
|
public void remove(final String... keys) { |
||||
|
for (String key : keys) { |
||||
|
remove(key); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 批量删除key |
||||
|
* |
||||
|
* @param pattern |
||||
|
*/ |
||||
|
public void removePattern(final String pattern) { |
||||
|
Set<Serializable> keys = redisTemplate.keys(pattern); |
||||
|
if (keys.size() > 0) { |
||||
|
redisTemplate.delete(keys); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
public Long remove(final String key) { |
||||
|
return (Long) redisTemplate.execute(new RedisCallback<Long>() { |
||||
|
@Override |
||||
|
public Long doInRedis(RedisConnection redisConnection) throws DataAccessException { |
||||
|
RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); |
||||
|
byte keys[] = serializer.serialize(key); |
||||
|
return redisConnection.del(keys); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 判断缓存中是否有对应的value |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public boolean exists(final String key) { |
||||
|
return redisTemplate.hasKey(key); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 哈希 添加 |
||||
|
* |
||||
|
* @param key |
||||
|
* @param hashKey |
||||
|
* @param value |
||||
|
*/ |
||||
|
public void hmSet(String key, Object hashKey, Object value) { |
||||
|
HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); |
||||
|
hash.put(key, hashKey, value); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 哈希获取数据 |
||||
|
* |
||||
|
* @param key |
||||
|
* @param hashKey |
||||
|
* @return |
||||
|
*/ |
||||
|
public String hmGet(String key, Object hashKey) { |
||||
|
HashOperations<String, String, String> hash = redisTemplate.opsForHash(); |
||||
|
return hash.get(key, hashKey); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取哈希 keys |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public Set<String> hmGetKeys(String key) { |
||||
|
HashOperations<String, String, String> hash = redisTemplate.opsForHash(); |
||||
|
return hash.keys(key); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 删除集合中的key |
||||
|
* |
||||
|
* @param key |
||||
|
* @param hashKey |
||||
|
*/ |
||||
|
public void hmDelete(String key, Object hashKey) { |
||||
|
HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); |
||||
|
hash.delete(key, hashKey); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 列表添加 |
||||
|
* |
||||
|
* @param k |
||||
|
* @param v |
||||
|
*/ |
||||
|
public void lPush(String k, Object v) { |
||||
|
ListOperations<String, Object> list = redisTemplate.opsForList(); |
||||
|
list.rightPush(k, v); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 列表获取 |
||||
|
* |
||||
|
* @param k |
||||
|
* @param l |
||||
|
* @param l1 |
||||
|
* @return |
||||
|
*/ |
||||
|
public List<Object> lRange(String k, long l, long l1) { |
||||
|
ListOperations<String, Object> list = redisTemplate.opsForList(); |
||||
|
return list.range(k, l, l1); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 集合添加 |
||||
|
* |
||||
|
* @param key |
||||
|
* @param value |
||||
|
*/ |
||||
|
public void add(String key, Object value) { |
||||
|
SetOperations<String, Object> set = redisTemplate.opsForSet(); |
||||
|
set.add(key, value); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 集合获取 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public Set<Object> setMembers(String key) { |
||||
|
SetOperations<String, Object> set = redisTemplate.opsForSet(); |
||||
|
return set.members(key); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 有序集合添加 |
||||
|
* |
||||
|
* @param key |
||||
|
* @param value |
||||
|
* @param scoure |
||||
|
*/ |
||||
|
public void zAdd(String key, Object value, double scoure) { |
||||
|
ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); |
||||
|
zset.add(key, value, scoure); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 有序集合获取 |
||||
|
* |
||||
|
* @param key |
||||
|
* @param scoure |
||||
|
* @param scoure1 |
||||
|
* @return |
||||
|
*/ |
||||
|
public Set<Object> rangeByScore(String key, double scoure, double scoure1) { |
||||
|
ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); |
||||
|
return zset.rangeByScore(key, scoure, scoure1); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 实现命令:TTL key 以秒为单位,返回给定key的剩余生存时间 |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public long ttl(String key) { |
||||
|
return redisTemplate.getExpire(key); |
||||
|
} |
||||
|
} |
@ -0,0 +1,31 @@ |
|||||
|
package com.yxt.demo.gateway.config; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2020/12/2 9:58 |
||||
|
* @description 缓存的key 常量 |
||||
|
*/ |
||||
|
|
||||
|
public class CacheConstants { |
||||
|
|
||||
|
/** |
||||
|
* 令牌自定义标识 |
||||
|
*/ |
||||
|
public static final String HEADER = "token"; |
||||
|
|
||||
|
/** |
||||
|
* 令牌前缀 |
||||
|
*/ |
||||
|
public static final String TOKEN_PREFIX = "Bearer "; |
||||
|
|
||||
|
/** |
||||
|
* 用户名字段 |
||||
|
*/ |
||||
|
public static final String DETAILS_USERNAME = "userName"; |
||||
|
|
||||
|
/** |
||||
|
* 令牌有效期(分钟) |
||||
|
*/ |
||||
|
public final static long TOKEN_EXPIRE = 4*60; |
||||
|
public final static long TOKEN_EXPIRE_APP = 15*24*60; |
||||
|
} |
@ -0,0 +1,42 @@ |
|||||
|
package com.yxt.demo.gateway.config; |
||||
|
|
||||
|
import org.springframework.boot.context.properties.ConfigurationProperties; |
||||
|
import org.springframework.cloud.context.config.annotation.RefreshScope; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
|
||||
|
import java.util.ArrayList; |
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2020/12/2 9:54 |
||||
|
* @description 放行白名单配置 |
||||
|
*/ |
||||
|
@Configuration |
||||
|
@RefreshScope |
||||
|
@ConfigurationProperties(prefix = "ignore") |
||||
|
public class IgnoreWhiteProperties { |
||||
|
|
||||
|
/** |
||||
|
* 放行白名单配置,网关不校验此处的白名单 |
||||
|
*/ |
||||
|
private List<String> whites = new ArrayList<>(); |
||||
|
|
||||
|
public List<String> getWhites() { |
||||
|
return whites; |
||||
|
} |
||||
|
|
||||
|
public void setWhites(List<String> whites) { |
||||
|
this.whites = whites; |
||||
|
} |
||||
|
|
||||
|
private List<String> whitesTwo = new ArrayList<>(); |
||||
|
|
||||
|
public List<String> getWhitesTwo() { |
||||
|
return whitesTwo; |
||||
|
} |
||||
|
|
||||
|
public void setWhitesTwo(List<String> whitesTwo) { |
||||
|
this.whitesTwo = whitesTwo; |
||||
|
} |
||||
|
} |
@ -0,0 +1,58 @@ |
|||||
|
package com.yxt.demo.gateway.config.swagger; |
||||
|
|
||||
|
import lombok.AllArgsConstructor; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.cloud.gateway.config.GatewayProperties; |
||||
|
import org.springframework.cloud.gateway.route.RouteLocator; |
||||
|
import org.springframework.cloud.gateway.support.NameUtils; |
||||
|
import org.springframework.context.annotation.Primary; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
import springfox.documentation.swagger.web.SwaggerResource; |
||||
|
import springfox.documentation.swagger.web.SwaggerResourcesProvider; |
||||
|
|
||||
|
import java.util.ArrayList; |
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2022/11/5 22:58 |
||||
|
* @Description |
||||
|
*/ |
||||
|
@Slf4j |
||||
|
@Component |
||||
|
@Primary |
||||
|
@AllArgsConstructor |
||||
|
public class SwaggerConfig implements SwaggerResourcesProvider { |
||||
|
/** |
||||
|
* 路由加载器 |
||||
|
*/ |
||||
|
private final RouteLocator routeLocator; |
||||
|
private final GatewayProperties gatewayProperties; |
||||
|
|
||||
|
@Override |
||||
|
public List<SwaggerResource> get() { |
||||
|
List<SwaggerResource> resources = new ArrayList<>(); |
||||
|
List<String> routes = new ArrayList<>(); |
||||
|
//获取所有路由的ID
|
||||
|
routeLocator.getRoutes().subscribe(route -> routes.add(route.getId())); |
||||
|
//过滤出配置文件中定义的路由->过滤出Path Route Predicate->根据路径拼接成api-docs路径->生成SwaggerResource
|
||||
|
gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())).forEach(route -> { |
||||
|
route.getPredicates().stream() |
||||
|
.filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName())) |
||||
|
.forEach(predicateDefinition -> resources.add(swaggerResource(route.getId(), |
||||
|
predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0") |
||||
|
.replace("**", "v2/api-docs")))); |
||||
|
}); |
||||
|
|
||||
|
return resources; |
||||
|
} |
||||
|
|
||||
|
private SwaggerResource swaggerResource(String name, String location) { |
||||
|
log.info("name:{},location:{}", name, location); |
||||
|
SwaggerResource swaggerResource = new SwaggerResource(); |
||||
|
swaggerResource.setName(name); |
||||
|
swaggerResource.setLocation(location); |
||||
|
swaggerResource.setSwaggerVersion("2.0"); |
||||
|
return swaggerResource; |
||||
|
} |
||||
|
} |
@ -0,0 +1,63 @@ |
|||||
|
package com.yxt.demo.gateway.config.swagger; |
||||
|
|
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.http.HttpStatus; |
||||
|
import org.springframework.http.ResponseEntity; |
||||
|
import org.springframework.web.bind.annotation.GetMapping; |
||||
|
import org.springframework.web.bind.annotation.RestController; |
||||
|
import reactor.core.publisher.Mono; |
||||
|
import springfox.documentation.swagger.web.SecurityConfiguration; |
||||
|
import springfox.documentation.swagger.web.SecurityConfigurationBuilder; |
||||
|
import springfox.documentation.swagger.web.UiConfiguration; |
||||
|
import springfox.documentation.swagger.web.UiConfigurationBuilder; |
||||
|
|
||||
|
import java.util.Optional; |
||||
|
|
||||
|
/** |
||||
|
* @Author dimengzhe |
||||
|
* @Date 2022/11/5 23:03 |
||||
|
* @Description |
||||
|
*/ |
||||
|
|
||||
|
@RestController |
||||
|
public class SwaggerHandler { |
||||
|
|
||||
|
@Autowired(required = false) |
||||
|
private SecurityConfiguration securityConfiguration; |
||||
|
|
||||
|
@Autowired(required = false) |
||||
|
private UiConfiguration uiConfiguration; |
||||
|
|
||||
|
private final SwaggerConfig swaggerResources; |
||||
|
|
||||
|
@Autowired |
||||
|
public SwaggerHandler(SwaggerConfig swaggerResources) { |
||||
|
this.swaggerResources = swaggerResources; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Swagger安全配置,支持oauth和apiKey设置 |
||||
|
*/ |
||||
|
@GetMapping("/swagger-resources/configuration/security") |
||||
|
public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() { |
||||
|
return Mono.just(new ResponseEntity<>( |
||||
|
Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK)); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Swagger UI配置 |
||||
|
*/ |
||||
|
@GetMapping("/swagger-resources/configuration/ui") |
||||
|
public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() { |
||||
|
return Mono.just(new ResponseEntity<>( |
||||
|
Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK)); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Swagger资源配置,微服务中这各个服务的api-docs信息 |
||||
|
*/ |
||||
|
@GetMapping("/swagger-resources") |
||||
|
public Mono<ResponseEntity> swaggerResources() { |
||||
|
return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK))); |
||||
|
} |
||||
|
} |
@ -0,0 +1,19 @@ |
|||||
|
spring: |
||||
|
resources: |
||||
|
static-locations: file:D://anrui |
||||
|
cloud: |
||||
|
nacos: |
||||
|
discovery: |
||||
|
server-addr: 127.0.0.1:8848 |
||||
|
redis: |
||||
|
database: 3 # Redis数据库索引(默认为0) |
||||
|
host: 127.0.0.1 |
||||
|
jedis: |
||||
|
pool: |
||||
|
max-active: -1 #连接池最大连接数(使用负值表示没有限制) |
||||
|
max-idle: 8 #连接池中的最大空闲连接 |
||||
|
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) |
||||
|
min-idle: 0 # 连接池中的最小空闲连接 |
||||
|
password: 123456 |
||||
|
port: 6379 |
||||
|
timeout: 0 # 连接超时时间(毫秒) |
@ -0,0 +1,19 @@ |
|||||
|
spring: |
||||
|
resources: |
||||
|
static-locations: file:D://anrui |
||||
|
cloud: |
||||
|
nacos: |
||||
|
discovery: |
||||
|
server-addr: 127.0.0.1:8848 |
||||
|
redis: |
||||
|
database: 3 # Redis数据库索引(默认为0) |
||||
|
host: 127.0.0.1 |
||||
|
jedis: |
||||
|
pool: |
||||
|
max-active: -1 #连接池最大连接数(使用负值表示没有限制) |
||||
|
max-idle: 8 #连接池中的最大空闲连接 |
||||
|
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) |
||||
|
min-idle: 0 # 连接池中的最小空闲连接 |
||||
|
password: 123456 |
||||
|
port: 6379 |
||||
|
timeout: 0 # 连接超时时间(毫秒) |
@ -0,0 +1,19 @@ |
|||||
|
spring: |
||||
|
resources: |
||||
|
static-locations: file:/home/lzh/docker_data/nginx/html/anrui-system-ui |
||||
|
cloud: |
||||
|
nacos: |
||||
|
discovery: |
||||
|
server-addr: 172.18.0.5:8848 |
||||
|
redis: |
||||
|
database: 3 # Redis数据库索引(默认为0) |
||||
|
host: 172.18.0.7 |
||||
|
jedis: |
||||
|
pool: |
||||
|
max-active: -1 #连接池最大连接数(使用负值表示没有限制) |
||||
|
max-idle: 8 #连接池中的最大空闲连接 |
||||
|
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) |
||||
|
min-idle: 0 # 连接池中的最小空闲连接 |
||||
|
password: |
||||
|
port: 6379 |
||||
|
timeout: 0 # 连接超时时间(毫秒) |
@ -0,0 +1,91 @@ |
|||||
|
hystrix: |
||||
|
command: |
||||
|
default: |
||||
|
execution: |
||||
|
isolation: |
||||
|
strategy: SEMAPHORE |
||||
|
thread: |
||||
|
timeoutInMilliseconds: 300000 |
||||
|
server: |
||||
|
port: 8111 |
||||
|
spring: |
||||
|
application: |
||||
|
name: gateway-server |
||||
|
profiles: |
||||
|
active: devv |
||||
|
cloud: |
||||
|
gateway: |
||||
|
routes: |
||||
|
- id: demo-system |
||||
|
predicates: |
||||
|
- Path= /system/** |
||||
|
uri: lb://demo-system |
||||
|
filters: |
||||
|
- StripPrefix=1 |
||||
|
|
||||
|
ignore: |
||||
|
whites: |
||||
|
- /portal/v1/regions/treeList |
||||
|
- /portal/v1/sysuser/reGetPwd #忘记密码 |
||||
|
- /portal/v1/sysuser/login #pc端登录 |
||||
|
- |
||||
|
- /portal/v1/sysuser/loginByNoVeriCode #登录无验证码 |
||||
|
- /portal/v1/sysuser/signOut #pc 退出登录 |
||||
|
- /portal/v1/sysuser/save #pc端登录 |
||||
|
- /portal/v1/captcha/clickWord #验证码 |
||||
|
|
||||
|
- /portal/v1/appuser/login #app端登录 |
||||
|
- /portal/v1/appuser/sendVerificationCodeForApp #app端验证码 |
||||
|
- /portal/v1/appuser/checkResetPwdCode #app端验证找回密码的验证码 |
||||
|
- /portal/v1/appuser/resetPwd #app端重置密码(找回密码) |
||||
|
- /portal/v1/appversion/save #更新app框架 |
||||
|
- /portal/v1/appsubsetversion/save #更新app子应用(新增) |
||||
|
- /portal/v1/appsubsetversion/update #更新app子应用(更新) |
||||
|
- /portal/v1/appversion/selectNewAppVersion #获取最新版本 |
||||
|
- /portal/v1/wxuser/sendMessageCode #客户端注册获取验证码 |
||||
|
- /portal/v1/wxuser/registsUser #客户端注册 |
||||
|
- /portal/v1/wxuser/login #客户端登录 |
||||
|
- /portal/file/getImgBase64 |
||||
|
- /portal/v1/wxuser/checkResetPwdCode #客户端端验证找回密码的验证码 |
||||
|
- /portal/v1/wxuser/resetPwd #修改密码 |
||||
|
- /portal/v1/sysstaffinfo/searchAppContactsList #通讯录搜索 |
||||
|
- /base/v1/basevehiclebrand/selectAppListByManufacturerSid # 查询品牌 |
||||
|
|
||||
|
- /portal/file/upload #上传文件 |
||||
|
- /crm/v1/crmcustomer/getsCard #证件扫描 |
||||
|
- /crm/v1/crmcustomertemp/getCustomerTempListByUserSid #获取客户列表 |
||||
|
- /base/v1/baseaffiliatcompanyappendix/uploadImage #挂靠公司附件上传 |
||||
|
- /base/v1/basedistributorappendix/upload #经销商备案资料 |
||||
|
- /base/v1/basefinbank/listPage #查询资方 |
||||
|
|
||||
|
# 数据字典 |
||||
|
- /portal/v1/dictcommons/typeValues # 获取下拉框 |
||||
|
# 手机批量上传 |
||||
|
- /base/file/batchUploadImage |
||||
|
- /portal/file/batchUploadImage |
||||
|
- /terminal/autoservice/v1/getVins/{modelSid}/{configSid} #获取车架号 |
||||
|
# 手机端根据使用orgSid查询生产厂商列表 |
||||
|
- /base/v1/basemanufacturer/selectAppListByOrgSid |
||||
|
# 查询中介单位 |
||||
|
- /base/v1/basedistributor/getAppDistributorList |
||||
|
# 查询挂靠单位 |
||||
|
- /base/v1/baseaffiliatcompany/getAppAffiliatList |
||||
|
|
||||
|
# 省市县 |
||||
|
- /portal/v1/regions/getProvince |
||||
|
- /portal/v1/regions/getCity |
||||
|
- /portal/v1/regions/getCounty |
||||
|
- /portal/v1/wxuser/test |
||||
|
- /portal/v1/appuser/updateAppId #解绑用户的appId |
||||
|
|
||||
|
|
||||
|
whitesTwo: #包含所有 |
||||
|
###swagger相关开始 |
||||
|
- /doc.html |
||||
|
- /webjars/** |
||||
|
- /swagger-resources |
||||
|
- /v2/** |
||||
|
- /favicon.ico |
||||
|
- /upload/** |
||||
|
###swagger相关结束 |
||||
|
|
@ -0,0 +1,32 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
|
||||
|
|
||||
|
<parent> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-system</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</parent> |
||||
|
<modelVersion>4.0.0</modelVersion> |
||||
|
|
||||
|
<artifactId>demo-system-api</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
|
||||
|
|
||||
|
|
||||
|
<dependencies> |
||||
|
<dependency> |
||||
|
<groupId>org.springframework.cloud</groupId> |
||||
|
<artifactId>spring-cloud-starter-openfeign</artifactId> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>com.yxt.di</groupId> |
||||
|
<artifactId>di-common-core</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</dependency> |
||||
|
</dependencies> |
||||
|
|
||||
|
|
||||
|
</project> |
@ -0,0 +1,267 @@ |
|||||
|
package com.yxt.anrui.portal.config; |
||||
|
|
||||
|
import io.swagger.annotations.ApiModelProperty; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2021/7/1 10:23 |
||||
|
* @description 常量值管理 |
||||
|
*/ |
||||
|
public class DictCommonType { |
||||
|
|
||||
|
//客户端获取手机验证码redis前缀定义
|
||||
|
public static final String WX_REGIST = "wx-regist-";//注册获取验证码
|
||||
|
public static final String WX_LOGIN = "wx-login-";//登录获取验证码
|
||||
|
public static final String WX_FORGET = "wx-forget-";//忘记密码获取验证码
|
||||
|
public static final String WX_UPDATE = "wx-update-";//忘记密码获取验证码
|
||||
|
public static final String WX_NEW = "wx-new-";//新手机号获取验证码
|
||||
|
|
||||
|
/*供应厂商相关*/ |
||||
|
@ApiModelProperty(value = "供应商分类") |
||||
|
public static final String SUPPLIER_TYPE = "supplierType";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "供应类别") |
||||
|
public static final String SUPPLY_TYPE = "supplyType";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "供应商分组") |
||||
|
public static final String SUPPLIE_RGROUP = "supplierGroup";//数据字典已添加
|
||||
|
|
||||
|
/*供应厂商财务信息相关*/ |
||||
|
@ApiModelProperty(value = "结算币种") |
||||
|
public static final String SETTLEMENT_CURRENCY = "settlementCurrency";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "结算方式") |
||||
|
public static final String SETTLEMENT_WAY = "settlementWay";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "税分类") |
||||
|
public static final String TAX_CLASSIFICATION = "taxClassification";//数据字典已添加
|
||||
|
/*基础信息品牌相关*/ |
||||
|
@ApiModelProperty(value = "品牌类型") |
||||
|
public static final String BRAND_TYPE = "brandType";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "职级(岗位)") |
||||
|
public static final String POSTLEVEL = "postLevel"; |
||||
|
|
||||
|
/*车型、车型配置、车辆信息相关*/ |
||||
|
@ApiModelProperty(value = "车辆类型") |
||||
|
public static final String VEHICLE_TYPE = "vehicleType";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "排放标准") |
||||
|
public static final String EMISSION_STANDARD = "emissionStandard";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "产品线") |
||||
|
public static final String PRODUCT_LINE = "productLine";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "后桥") |
||||
|
public static final String REAR_AXLE = "rearAxle";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "速比") |
||||
|
public static final String SPEED_RATIO = "speedRatio";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "系别") |
||||
|
private static final String SERIES = "series";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "车辆功能") |
||||
|
private static final String VEHICLE_FUNCTION = "vehicleFunction";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "细分市场") |
||||
|
private static final String MARKETSEGMENTS = "marketSegments";//数据字典已添加
|
||||
|
|
||||
|
@ApiModelProperty(value = "车身颜色") |
||||
|
public static final String BODYCOLOR = "bodyColor"; |
||||
|
@ApiModelProperty(value = "缓速器") |
||||
|
public static final String SLOWMACHINE = "slowMachine"; |
||||
|
@ApiModelProperty(value = "后视镜") |
||||
|
public static final String REARVIEWMIRROR = "rearViewMirror"; |
||||
|
@ApiModelProperty(value = "轮胎") |
||||
|
public static final String TIRESIZE = "tireSize"; |
||||
|
@ApiModelProperty(value = "驾驶室") |
||||
|
public static final String SPECIFICATION = "specification"; |
||||
|
@ApiModelProperty(value = "后桥速比") |
||||
|
public static final String REARAXLERATIO = "rearAxleRatio"; |
||||
|
@ApiModelProperty(value = "轮毂材质") |
||||
|
public static final String HUBMATERIAL = "hubMaterial"; |
||||
|
@ApiModelProperty(value = "悬架") |
||||
|
public static final String SUSPENSION = "suspension"; |
||||
|
@ApiModelProperty(value = "座椅") |
||||
|
public static final String SEAT = "seat"; |
||||
|
@ApiModelProperty(value = "鞍座") |
||||
|
public static final String SADDLE = "saddle"; |
||||
|
@ApiModelProperty(value = "轴距") |
||||
|
public static final String WHEELBASE = "wheelbase"; |
||||
|
@ApiModelProperty(value = "保险杠") |
||||
|
public static final String BUMPER = "bumper"; |
||||
|
@ApiModelProperty(value = "配置包") |
||||
|
public static final String CONFIGURINGBAO = "configuringBao"; |
||||
|
@ApiModelProperty(value = "独立热源") |
||||
|
public static final String INDEPENDENTSOURCES = "independentSources"; |
||||
|
@ApiModelProperty(value = "燃料箱") |
||||
|
public static final String FUELTANK = "fuelTank"; |
||||
|
@ApiModelProperty(value = "有无:1有0无") |
||||
|
public static final String WHETHER = "whether"; |
||||
|
|
||||
|
@ApiModelProperty(value = "车辆状态") |
||||
|
public static final String VEHICLE_STATE = "vehicleState"; |
||||
|
@ApiModelProperty(value = "车辆状态(车辆台账)") |
||||
|
public static final String VEHICLE_LEDGER_STATE = "vehicleLedgerState"; |
||||
|
@ApiModelProperty(value = "驱动") |
||||
|
public static final String DRIVER = "driver"; |
||||
|
@ApiModelProperty(value = "马力") |
||||
|
public static final String HORSEPOWER = "horsepower"; |
||||
|
@ApiModelProperty(value = "锁定状态") |
||||
|
public static final String LOCKED_STATE = "lockedState"; |
||||
|
@ApiModelProperty(value = "预计订金日期") |
||||
|
public static final String RESERVE_DEPOSIT_DATE = "reserveDepositDate"; |
||||
|
|
||||
|
|
||||
|
@ApiModelProperty(value = "贷款主体类型") |
||||
|
public static final String LOANTYPE = "loanType"; |
||||
|
@ApiModelProperty(value = "打包项目") |
||||
|
public static final String PACKAGINGPROJECT = "packagingProject"; |
||||
|
@ApiModelProperty(value = "融资项目(比打包项目多一个“配件”)") |
||||
|
public static final String PACKAGINGPROJECTFIN = "packagingProjectFin"; |
||||
|
@ApiModelProperty(value = "变速箱") |
||||
|
public static final String GEARBOX = "gearbox"; |
||||
|
@ApiModelProperty(value = "燃料种类") |
||||
|
public static final String FUELTYPE = "fuelType"; |
||||
|
@ApiModelProperty(value = "版本(车辆需求)") |
||||
|
public static final String VEHICLEVERSION = "vehicleVersion"; |
||||
|
@ApiModelProperty(value = "采购形式") |
||||
|
public static final String PURCHASINGFORM = "purchasingForm"; |
||||
|
/*经销商相关*/ |
||||
|
@ApiModelProperty(value = "经销商分类") |
||||
|
public static final String DISTRIBUTOR_CLASSIFICATION = "distributorClassification";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "经销商类型") |
||||
|
public static final String DISTRIBUTOR_TYPE = "distributorType";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "经销商等级") |
||||
|
public static final String DISTRIBUTOR_LEVEL = "distributorLevel";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "企业性质") |
||||
|
public static final String ENTERPRISE_NATURE = "enterpriseNature";//数据字典已添加
|
||||
|
@ApiModelProperty(value = "登记状态") |
||||
|
public static final String REGIST_STATE = "registState"; |
||||
|
@ApiModelProperty(value = "注册资本单位") |
||||
|
public static final String REGISTEREDCAPITAL_ORG = "registeredCapitalOrg"; |
||||
|
@ApiModelProperty(value = "项目类型") |
||||
|
public static final String PROJECT_TYPE = "projectType"; |
||||
|
/*经销商相关结束*/ |
||||
|
|
||||
|
|
||||
|
@ApiModelProperty(value = "合格证情况:0001虚拟 ,002正式") |
||||
|
public static final String CERTIFICATE_SITUATION = "certificateSituation"; |
||||
|
@ApiModelProperty(value = "客户类型:1个人2企业") |
||||
|
public static final String CUSTOMER_TYPE = "customerType"; |
||||
|
@ApiModelProperty(value = "登记注册号类型") |
||||
|
public static final String REGIST_NUM_TYPE = "registNumType"; |
||||
|
@ApiModelProperty(value = "现居住状况") |
||||
|
public static final String CURRENT_LIVE_STATE = "currentlivestate"; |
||||
|
@ApiModelProperty(value = "教育程度") |
||||
|
public static final String EDUCATION_DEGREE = "educationdegree"; |
||||
|
@ApiModelProperty(value = "雇员类型") |
||||
|
public static final String EMPLOYEE_TYPE = "employeetype"; |
||||
|
@ApiModelProperty(value = "证件类型") |
||||
|
public static final String DOCUMENT_TYPE = "documenttype"; |
||||
|
@ApiModelProperty(value = "行业类别") |
||||
|
public static final String INDUSTRY_TYPE = "industrytype"; |
||||
|
@ApiModelProperty(value = "经济类型") |
||||
|
public static final String ECONOMIC_TYPE = "economictype"; |
||||
|
@ApiModelProperty(value = "组织机构类别") |
||||
|
public static final String ORGANIZATION_TYPE = "organizationtype"; |
||||
|
@ApiModelProperty(value = "组织机构类别细分") |
||||
|
public static final String ORGANIZATION_TYPE_DETAILS = "organizationtypedetails"; |
||||
|
|
||||
|
@ApiModelProperty(value = "是或否") |
||||
|
public static final String IS_TRUE = "isTrue"; |
||||
|
@ApiModelProperty(value = "准驾车型") |
||||
|
public static final String CAR_TYPE = "carType"; |
||||
|
|
||||
|
@ApiModelProperty(value = "与客户关系") |
||||
|
public static final String RELATION_SHIP = "relationship"; |
||||
|
@ApiModelProperty(value = "现工作单位性质") |
||||
|
public static final String ORG_NATURE = "orgNature"; |
||||
|
@ApiModelProperty(value = "主要收入来源") |
||||
|
public static final String INCOME_SOURCE = "incomeSource"; |
||||
|
@ApiModelProperty(value = "职位") |
||||
|
public static final String POSITION = "position"; |
||||
|
@ApiModelProperty(value = "经销商类型") |
||||
|
public static final String DEALERS_TYPE = "dealersType"; |
||||
|
@ApiModelProperty(value = "附件类型") |
||||
|
public static final String ATTACH_TYPE = "attachType"; |
||||
|
@ApiModelProperty(value = "信用记录") |
||||
|
public static final String CREDIT_RECORD = "creditRecord"; |
||||
|
@ApiModelProperty(value = "拟租赁形式l") |
||||
|
public static final String PLANS_TO_LEASE = "plansToLease"; |
||||
|
@ApiModelProperty(value = "去返程货物") |
||||
|
public static final String GO_GOODS = "goGoods"; |
||||
|
@ApiModelProperty(value = "经营业务范围") |
||||
|
public static final String BUSINESSSCOPE = "businessScope"; |
||||
|
/* 客户信息相关*/ |
||||
|
@ApiModelProperty(value = "客户分类") |
||||
|
public static final String CUSTOMER_CLASS = "customerClass"; |
||||
|
@ApiModelProperty(value = "客户来源") |
||||
|
public static final String CUSTOMER_SOURCE = "customerSource"; |
||||
|
@ApiModelProperty(value = "客户等级") |
||||
|
public static final String CUSTOMER_LEVEL = "customerLevel"; |
||||
|
@ApiModelProperty(value = "来访方式") |
||||
|
public static final String VISIT_WAY = "visitWay"; |
||||
|
@ApiModelProperty(value = "跟进状态") |
||||
|
public static final String FOLLOW_STATE = "followState"; |
||||
|
@ApiModelProperty(value = "提醒日期(天)") |
||||
|
public static final String REMIND_DAY = "remindDay"; |
||||
|
@ApiModelProperty(value = "承运货物类型") |
||||
|
public static final String CONSIGNMENT_TYPE = "consignmentType"; |
||||
|
@ApiModelProperty(value = "承运货物(暂为假数据)") |
||||
|
public static final String CONSIGNMENT = "consignment"; |
||||
|
@ApiModelProperty(value = "购车方式") |
||||
|
public static final String PURCHASETYPE = "purchaseType"; |
||||
|
@ApiModelProperty(value = "提车方式") |
||||
|
public static final String SALETYPE = "saleType"; |
||||
|
/* 车辆订单 */ |
||||
|
@ApiModelProperty(value = "单据类型") |
||||
|
public static final String BILLSTYPE = "billsType"; |
||||
|
@ApiModelProperty(value = "合同类型") |
||||
|
public static final String CONTRACTTYPE = "contractType"; |
||||
|
|
||||
|
@ApiModelProperty(value = "主车优惠类型") |
||||
|
public static final String DISCOUNTTYPE = "discountType"; |
||||
|
@ApiModelProperty(value = "还款方式") |
||||
|
public static final String MODEOFREPAY = "modeOfRePay"; |
||||
|
@ApiModelProperty(value = "保证金方式") |
||||
|
public static final String BONDMETHOD = "bondMethod"; |
||||
|
@ApiModelProperty(value = "业务类型") |
||||
|
public static final String BUSINESSTYPE = "businessType"; |
||||
|
@ApiModelProperty(value = "开户银行") |
||||
|
public static final String BANK = "bank"; |
||||
|
@ApiModelProperty(value = "账户类型") |
||||
|
public static final String ACCOUNTTYPE = "accountType"; |
||||
|
@ApiModelProperty(value = "运输货物") |
||||
|
public static final String TRANSPORTCARGO = "transportCargo"; |
||||
|
@ApiModelProperty(value = "结账周期") |
||||
|
public static final String CHECKOUTCYCLE = "checkoutCycle"; |
||||
|
@ApiModelProperty(value = "虚拟订单类型") |
||||
|
public static final String DEPOSITBILLTYPE = "depositBillType"; |
||||
|
@ApiModelProperty(value = "付款方式") |
||||
|
public static final String PAYMENTTYPE = "paymentType"; |
||||
|
|
||||
|
/* 物料相关 */ |
||||
|
@ApiModelProperty(value = "物料分组") |
||||
|
public static final String MATERIAL_GROUP = "materialGroup"; |
||||
|
@ApiModelProperty(value = "物料属性") |
||||
|
public static final String MATERIAL_PROPERTIES = "materialProperties"; |
||||
|
@ApiModelProperty(value = "存货类别") |
||||
|
public static final String STOCK_TYPE = "stockType"; |
||||
|
@ApiModelProperty(value = "基本单位") |
||||
|
public static final String BASIC_UNIT = "basicUnit"; |
||||
|
|
||||
|
/* 合同相关 */ |
||||
|
@ApiModelProperty(value = "人员类型") |
||||
|
public static final String PERSONNEL_TYPE = "personnelType"; |
||||
|
|
||||
|
/* 开票申请单相关 */ |
||||
|
@ApiModelProperty(value = "开票性质") |
||||
|
public static final String INVOICING_NATURE = "invoicingNature"; |
||||
|
|
||||
|
/*员工信息管理相关*/ |
||||
|
@ApiModelProperty(value = "婚姻状况") |
||||
|
public static final String MARITAL_STATUS = "maritalstatus"; |
||||
|
@ApiModelProperty(value = "民族") |
||||
|
public static final String NATIONAL = "national"; |
||||
|
@ApiModelProperty(value = "性别") |
||||
|
public static final String SEX = "sex"; |
||||
|
@ApiModelProperty(value = "政治面貌") |
||||
|
public static final String POLITICAL = "political"; |
||||
|
|
||||
|
|
||||
|
/*资料清单相关*/ |
||||
|
@ApiModelProperty(value = "资料类别") |
||||
|
public static final String DATA_TYPE = "dataType"; |
||||
|
@ApiModelProperty(value = "文件格式") |
||||
|
public static final String FILE_TYPE = "fileType"; |
||||
|
} |
@ -0,0 +1,84 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
|
||||
|
<parent> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-system</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</parent> |
||||
|
<modelVersion>4.0.0</modelVersion> |
||||
|
|
||||
|
<artifactId>demo-system-biz</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
|
||||
|
<dependencies> |
||||
|
<dependency> |
||||
|
<artifactId>demo-system-api</artifactId> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<version>0.0.1</version> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>com.alibaba.cloud</groupId> |
||||
|
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-common-config</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-common-base</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-common-redis</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<artifactId>demo-common-jdbc</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</dependency> |
||||
|
|
||||
|
|
||||
|
</dependencies> |
||||
|
|
||||
|
<build> |
||||
|
<plugins> |
||||
|
<plugin> |
||||
|
<groupId>org.springframework.boot</groupId> |
||||
|
<artifactId>spring-boot-maven-plugin</artifactId> |
||||
|
<version>2.5.6</version> |
||||
|
<executions> |
||||
|
<execution> |
||||
|
<goals> |
||||
|
<goal>repackage</goal> |
||||
|
</goals> |
||||
|
</execution> |
||||
|
</executions> |
||||
|
</plugin> |
||||
|
</plugins> |
||||
|
<resources> |
||||
|
<resource> |
||||
|
<directory>src/main/java</directory> |
||||
|
<includes> |
||||
|
<include>**/*Mapper.xml</include> |
||||
|
</includes> |
||||
|
</resource> |
||||
|
<resource> |
||||
|
<directory>src/main/resources</directory> |
||||
|
<includes> |
||||
|
<include>**/*.*</include> |
||||
|
</includes> |
||||
|
<filtering>false</filtering> |
||||
|
</resource> |
||||
|
</resources> |
||||
|
|
||||
|
</build> |
||||
|
|
||||
|
|
||||
|
</project> |
@ -0,0 +1,23 @@ |
|||||
|
package com.yxt.anrui.portal; |
||||
|
|
||||
|
|
||||
|
import org.springframework.boot.SpringApplication; |
||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication; |
||||
|
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; |
||||
|
import org.springframework.cloud.openfeign.EnableFeignClients; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
*/ |
||||
|
@SpringBootApplication(scanBasePackages = { |
||||
|
"com.yxt.common.base.config", |
||||
|
"com.yxt.demo.system" |
||||
|
}) |
||||
|
@EnableDiscoveryClient |
||||
|
@EnableFeignClients(basePackages = {}) |
||||
|
public class SystemApplication { |
||||
|
|
||||
|
public static void main(String[] args) { |
||||
|
SpringApplication.run(SystemApplication.class, args); |
||||
|
} |
||||
|
} |
@ -0,0 +1,35 @@ |
|||||
|
package com.yxt.demo.system.config; |
||||
|
|
||||
|
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import springfox.documentation.builders.ApiInfoBuilder; |
||||
|
import springfox.documentation.builders.PathSelectors; |
||||
|
import springfox.documentation.builders.RequestHandlerSelectors; |
||||
|
import springfox.documentation.service.ApiInfo; |
||||
|
import springfox.documentation.spi.DocumentationType; |
||||
|
import springfox.documentation.spring.web.plugins.Docket; |
||||
|
import springfox.documentation.swagger2.annotations.EnableSwagger2; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2020/9/9 16:42 |
||||
|
* @description |
||||
|
*/ |
||||
|
@Configuration |
||||
|
@EnableSwagger2 |
||||
|
@EnableKnife4j |
||||
|
public class Swagger2Config { |
||||
|
@Bean |
||||
|
public Docket createRestApi() { |
||||
|
return new Docket(DocumentationType.SWAGGER_2) |
||||
|
.apiInfo(apiInfo()).select() |
||||
|
.apis(RequestHandlerSelectors.basePackage("com.yxt.demo.system")) |
||||
|
.paths(PathSelectors.any()).build(); |
||||
|
} |
||||
|
|
||||
|
private ApiInfo apiInfo() { |
||||
|
return new ApiInfoBuilder().title("demo/系统管理").description("系统管理接口").version("1.0") |
||||
|
.build(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,36 @@ |
|||||
|
spring: |
||||
|
datasource: |
||||
|
hikari: |
||||
|
max-lifetime: 30000 |
||||
|
driver-class-name: com.mysql.cj.jdbc.Driver |
||||
|
url: jdbc:mysql://127.0.0.1:3306/demo_system?serverTimezone=GMT%2B8&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true |
||||
|
username: root |
||||
|
password: root |
||||
|
cloud: |
||||
|
nacos: |
||||
|
discovery: |
||||
|
server-addr: 127.0.0.1:8848 |
||||
|
redis: |
||||
|
database: 3 # Redis数据库索引(默认为0) |
||||
|
host: 127.0.0.1 |
||||
|
jedis: |
||||
|
pool: |
||||
|
max-active: -1 #连接池最大连接数(使用负值表示没有限制) |
||||
|
max-idle: 8 #连接池中的最大空闲连接 |
||||
|
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) |
||||
|
min-idle: 0 # 连接池中的最小空闲连接 |
||||
|
password: 123456 |
||||
|
port: 6379 |
||||
|
timeout: 0 # 连接超时时间(毫秒) |
||||
|
|
||||
|
image: |
||||
|
upload: |
||||
|
path: D:\\demo\\upload\\ |
||||
|
url: |
||||
|
prefix: http://127.0.0.1:8111/upload/ |
||||
|
login: |
||||
|
path: D:\\images\\pic-click |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
@ -0,0 +1,30 @@ |
|||||
|
spring: |
||||
|
datasource: |
||||
|
driver-class-name: com.mysql.cj.jdbc.Driver |
||||
|
url: jdbc:mysql://127.0.0.1:3306/demo_system?serverTimezone=GMT%2B8&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8 |
||||
|
username: root |
||||
|
password: root |
||||
|
cloud: |
||||
|
nacos: |
||||
|
discovery: |
||||
|
server-addr: 127.0.0.1:8848 |
||||
|
redis: |
||||
|
database: 3 # Redis数据库索引(默认为0) |
||||
|
host: 127.0.0.1 |
||||
|
jedis: |
||||
|
pool: |
||||
|
max-active: -1 #连接池最大连接数(使用负值表示没有限制) |
||||
|
max-idle: 8 #连接池中的最大空闲连接 |
||||
|
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) |
||||
|
min-idle: 0 # 连接池中的最小空闲连接 |
||||
|
password: 123456 |
||||
|
port: 6379 |
||||
|
timeout: 0 # 连接超时时间(毫秒) |
||||
|
|
||||
|
image: |
||||
|
upload: |
||||
|
path: D:\demo\upload\ |
||||
|
url: |
||||
|
prefix: http://127.0.0.1:8111/upload/ |
||||
|
login: |
||||
|
path: D:\images\pic-click |
@ -0,0 +1,31 @@ |
|||||
|
spring: |
||||
|
datasource: |
||||
|
driver-class-name: com.mysql.cj.jdbc.Driver |
||||
|
url: jdbc:mysql://127.0.0.1:3306/demo_system?serverTimezone=GMT%2B8&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true |
||||
|
username: root |
||||
|
password: root |
||||
|
cloud: |
||||
|
nacos: |
||||
|
discovery: |
||||
|
server-addr: 127.0.0.1:8848 |
||||
|
redis: |
||||
|
database: 3 # Redis数据库索引(默认为0) |
||||
|
host: 127.0.0.1 |
||||
|
jedis: |
||||
|
pool: |
||||
|
max-active: -1 #连接池最大连接数(使用负值表示没有限制) |
||||
|
max-idle: 8 #连接池中的最大空闲连接 |
||||
|
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) |
||||
|
min-idle: 0 # 连接池中的最小空闲连接 |
||||
|
password: |
||||
|
port: 6379 |
||||
|
timeout: 0 # 连接超时时间(毫秒) |
||||
|
|
||||
|
image: |
||||
|
upload: |
||||
|
path: D:\demo\upload\ |
||||
|
url: |
||||
|
prefix: http://127.0.0.1:8111/upload/ |
||||
|
login: |
||||
|
path: D:\images\pic-click |
||||
|
|
@ -0,0 +1,62 @@ |
|||||
|
spring: |
||||
|
application: |
||||
|
name: demo-system |
||||
|
profiles: |
||||
|
active: devv |
||||
|
messages: |
||||
|
# 国际化资源文件路径 |
||||
|
basename: i18n/messages |
||||
|
servlet: |
||||
|
#上传文件 |
||||
|
multipart: |
||||
|
max-file-size: 50MB |
||||
|
max-request-size: 100MB |
||||
|
devtools: |
||||
|
restart: |
||||
|
# 热部署开关 |
||||
|
enabled: true |
||||
|
mvc: |
||||
|
async: |
||||
|
request-timeout: 20000 |
||||
|
|
||||
|
|
||||
|
|
||||
|
server: |
||||
|
port: 7003 |
||||
|
max-http-header-size: 102400 |
||||
|
tomcat: |
||||
|
max-http-form-post-size: -1 |
||||
|
#mybatis |
||||
|
mybatis-plus: |
||||
|
# 配置mapper的扫描,找到所有的mapper.xml映射文件 |
||||
|
mapper-locations: classpath*:**Mapper.xml |
||||
|
global-config: |
||||
|
refresh: true |
||||
|
db-config: |
||||
|
#定义生成ID的类型 |
||||
|
id-type: Auto |
||||
|
db-type: mysql |
||||
|
configuration: |
||||
|
map-underscore-to-camel-case: false |
||||
|
cache-enabled: true |
||||
|
call-setters-on-nulls: true |
||||
|
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl |
||||
|
|
||||
|
#hystrix的超时时间 |
||||
|
hystrix: |
||||
|
command: |
||||
|
default: |
||||
|
execution: |
||||
|
timeout: |
||||
|
enabled: true |
||||
|
isolation: |
||||
|
thread: |
||||
|
timeoutInMilliseconds: 30000 |
||||
|
#ribbon的超时时间 |
||||
|
ribbon: |
||||
|
ReadTimeout: 30000 |
||||
|
ConnectTimeout: 30000 |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
@ -0,0 +1,13 @@ |
|||||
|
,----.. ____ |
||||
|
/ / \ ,' , `. |
||||
|
| : : ,---. ,-+-,.' _ | ,---. ,---, |
||||
|
. | ;. / ' ,'\ ,-+-. ; , || ' ,'\ ,-+-. / | |
||||
|
. ; /--` / / | ,--.'|' | || ,---. / / | ,--.'|' | |
||||
|
; | ; . ; ,. :| | ,', | |,/ \ . ; ,. :| | ,"' | |
||||
|
| : | ' | |: :| | / | |--'/ / | ' | |: :| | / | | |
||||
|
. | '___' | .; :| : | | , . ' / | ' | .; :| | | | | |
||||
|
' ; : .'| : || : | |/ ' ; /| | : || | | |/ |
||||
|
' | '/ :\ \ / | | |`-' ' | / | \ \ / | | |--' |
||||
|
| : / `----' | ;/ | : | `----' | |/ |
||||
|
\ \ .' '---' \ \ / '---' |
||||
|
`---` `----' |
After Width: | Height: | Size: 62 KiB |
After Width: | Height: | Size: 73 KiB |
After Width: | Height: | Size: 62 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 86 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 69 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 62 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 67 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 62 KiB |
After Width: | Height: | Size: 73 KiB |
After Width: | Height: | Size: 62 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 86 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 69 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 62 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 67 KiB |
@ -0,0 +1,50 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<configuration> |
||||
|
|
||||
|
<property name="log.base" value="logs/demo_system" /> |
||||
|
|
||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> |
||||
|
<encoder> |
||||
|
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 : |
||||
|
|%blue(%thread) 线程 如 :DiscoveryClient-CacheRefreshExecutor-0--> |
||||
|
<!--<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>--> |
||||
|
<pattern>%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%green(%logger:%line) |%blue(%msg%n) |
||||
|
</pattern> |
||||
|
<!--<charset>UTF-8</charset> --> |
||||
|
</encoder> |
||||
|
</appender> |
||||
|
|
||||
|
<!-- 彩色日志 --> |
||||
|
<!-- 彩色日志依赖的渲染类 --> |
||||
|
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /> |
||||
|
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /> |
||||
|
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /> |
||||
|
<!-- 彩色日志格式 --> |
||||
|
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> |
||||
|
|
||||
|
<appender name="FILEOUT" |
||||
|
class="ch.qos.logback.core.rolling.RollingFileAppender"> |
||||
|
<file>${log.base}.log</file> |
||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
||||
|
<fileNamePattern>${log.base}.%d{yyyyMMdd}.%i.log.zip |
||||
|
</fileNamePattern> |
||||
|
<!-- 当文件大小超过10MB时触发滚动 --> |
||||
|
<timeBasedFileNamingAndTriggeringPolicy |
||||
|
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> |
||||
|
<maxFileSize>1MB</maxFileSize> |
||||
|
</timeBasedFileNamingAndTriggeringPolicy> |
||||
|
</rollingPolicy> |
||||
|
<encoder> |
||||
|
<!--<pattern>%date [%thread] %-5level %logger{35} - %msg%n</pattern>--> |
||||
|
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} |
||||
|
-%msg%n</Pattern> |
||||
|
<!--<charset>UTF-8</charset> --> |
||||
|
</encoder> |
||||
|
</appender> |
||||
|
|
||||
|
<root level="INFO"> |
||||
|
<appender-ref ref="STDOUT" /> |
||||
|
<appender-ref ref="FILEOUT" /> |
||||
|
</root> |
||||
|
|
||||
|
</configuration> |
@ -0,0 +1,10 @@ |
|||||
|
package com.yxt.demo.system.test; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2021/7/1 16:11 |
||||
|
* @description |
||||
|
*/ |
||||
|
|
||||
|
public class TestOneController { |
||||
|
} |
@ -0,0 +1,40 @@ |
|||||
|
package com.yxt.demo.system.test.controller; |
||||
|
|
||||
|
import cn.hutool.core.codec.Base64; |
||||
|
import com.yxt.demo.system.test.entity.TestDemo; |
||||
|
import lombok.Data; |
||||
|
import org.springframework.stereotype.Controller; |
||||
|
import org.springframework.web.bind.annotation.GetMapping; |
||||
|
import org.springframework.web.bind.annotation.PostMapping; |
||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||
|
import org.springframework.web.bind.annotation.ResponseBody; |
||||
|
|
||||
|
import javax.crypto.Mac; |
||||
|
import javax.crypto.spec.SecretKeySpec; |
||||
|
import java.io.BufferedReader; |
||||
|
import java.io.DataOutputStream; |
||||
|
import java.io.InputStreamReader; |
||||
|
import java.io.UnsupportedEncodingException; |
||||
|
import java.net.HttpURLConnection; |
||||
|
import java.net.URL; |
||||
|
import java.net.URLEncoder; |
||||
|
import java.security.InvalidKeyException; |
||||
|
import java.security.Key; |
||||
|
import java.security.NoSuchAlgorithmException; |
||||
|
import java.text.SimpleDateFormat; |
||||
|
import java.util.*; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2021/7/1 13:49 |
||||
|
* @description 测试OCR扫描 |
||||
|
*/ |
||||
|
@Controller |
||||
|
@RequestMapping("/test") |
||||
|
public class TestController { |
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
@ -0,0 +1,21 @@ |
|||||
|
package com.yxt.demo.system.test.entity; |
||||
|
|
||||
|
import io.swagger.annotations.ApiModelProperty; |
||||
|
import lombok.Data; |
||||
|
|
||||
|
/** |
||||
|
* @author dimengzhe |
||||
|
* @date 2021/10/19 16:03 |
||||
|
* @description |
||||
|
*/ |
||||
|
@Data |
||||
|
public class TestDemo { |
||||
|
|
||||
|
@ApiModelProperty(value = "身份证号") |
||||
|
private String idcard; |
||||
|
@ApiModelProperty(value = "手机号码") |
||||
|
private String mobile; |
||||
|
|
||||
|
@ApiModelProperty(value = "姓名") |
||||
|
private String name; |
||||
|
} |
@ -0,0 +1,35 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
|
||||
|
|
||||
|
<modelVersion>4.0.0</modelVersion> |
||||
|
<artifactId>demo-system</artifactId> |
||||
|
<modules> |
||||
|
<module>demo-system-api</module> |
||||
|
<module>demo-system-biz</module> |
||||
|
</modules> |
||||
|
<groupId>com.yxt.demo</groupId> |
||||
|
<version>0.0.1</version> |
||||
|
|
||||
|
<packaging>pom</packaging> |
||||
|
<description>系统管理</description> |
||||
|
|
||||
|
<parent> |
||||
|
<groupId>com.yxt</groupId> |
||||
|
<artifactId>demo</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
</parent> |
||||
|
|
||||
|
<dependencies> |
||||
|
<dependency> |
||||
|
<groupId>org.projectlombok</groupId> |
||||
|
<artifactId>lombok</artifactId> |
||||
|
</dependency> |
||||
|
|
||||
|
|
||||
|
</dependencies> |
||||
|
|
||||
|
|
||||
|
</project> |
@ -0,0 +1,199 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
<modelVersion>4.0.0</modelVersion> |
||||
|
|
||||
|
<groupId>com.yxt</groupId> |
||||
|
<artifactId>demo</artifactId> |
||||
|
<version>0.0.1</version> |
||||
|
<modules> |
||||
|
<module>demo-gateway</module> |
||||
|
<module>demo-system</module> |
||||
|
<module>demo-common</module> |
||||
|
</modules> |
||||
|
<packaging>pom</packaging> |
||||
|
<description>测试</description> |
||||
|
<properties> |
||||
|
<!-- 使用的JAVA版本号 --> |
||||
|
<java.version>8</java.version> |
||||
|
<!-- 项目构建编码 --> |
||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
||||
|
<!-- 项目输出编码 --> |
||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |
||||
|
<maven.compiler.source>8</maven.compiler.source> |
||||
|
<maven.compiler.target>8</maven.compiler.target> |
||||
|
|
||||
|
<!-- Spring相关组件 --> |
||||
|
<!-- SpringBoot 依赖配置 --> |
||||
|
<spring-boot.version>2.2.9.RELEASE</spring-boot.version> |
||||
|
<!-- SpringCloud 微服务 --> |
||||
|
<spring-cloud.version>Hoxton.SR6</spring-cloud.version> |
||||
|
<!-- SpringCloud Alibaba 微服务 --> |
||||
|
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version> |
||||
|
<!-- nacos客户端 --> |
||||
|
<nacos.version>1.3.0</nacos.version> |
||||
|
<redis.version>2.2.9.RELEASE</redis.version> |
||||
|
<jedis.version>3.1.0</jedis.version> |
||||
|
<knife4j-Swagger>2.0.5</knife4j-Swagger> |
||||
|
<!--Token生成与解析 --> |
||||
|
<jjwt.version>0.9.1</jjwt.version> |
||||
|
<!-- JSON 解析器和生成器 --> |
||||
|
<fastjson.version>1.2.73</fastjson.version> |
||||
|
<!--Bean工具 --> |
||||
|
<commons.beanutils.version>1.9.3</commons.beanutils.version> |
||||
|
<!-- Hutool组件 --> |
||||
|
<hutool.version>5.4.0</hutool.version> |
||||
|
<mybatis-plus.version>3.4.0</mybatis-plus.version> |
||||
|
<seata.version>1.4.2</seata.version> |
||||
|
|
||||
|
|
||||
|
</properties> |
||||
|
|
||||
|
<!-- 依赖声明 --> |
||||
|
<dependencyManagement> |
||||
|
<dependencies> |
||||
|
<!-- SpringCloud 微服务 --> |
||||
|
<dependency> |
||||
|
<groupId>org.springframework.cloud</groupId> |
||||
|
<artifactId>spring-cloud-dependencies</artifactId> |
||||
|
<version>${spring-cloud.version}</version> |
||||
|
<type>pom</type> |
||||
|
<scope>import</scope> |
||||
|
</dependency> |
||||
|
<!-- SpringCloud Alibaba 微服务 --> |
||||
|
<dependency> |
||||
|
<groupId>com.alibaba.cloud</groupId> |
||||
|
<artifactId>spring-cloud-alibaba-dependencies</artifactId> |
||||
|
<version>${spring-cloud-alibaba.version}</version> |
||||
|
<type>pom</type> |
||||
|
<scope>import</scope> |
||||
|
</dependency> |
||||
|
<!-- Alibaba Nacos 配置 --> |
||||
|
<dependency> |
||||
|
<groupId>com.alibaba.nacos</groupId> |
||||
|
<artifactId>nacos-client</artifactId> |
||||
|
<version>${nacos.version}</version> |
||||
|
</dependency> |
||||
|
<!-- SpringBoot 依赖配置 --> |
||||
|
<dependency> |
||||
|
<groupId>org.springframework.boot</groupId> |
||||
|
<artifactId>spring-boot-dependencies</artifactId> |
||||
|
<version>${spring-boot.version}</version> |
||||
|
<type>pom</type> |
||||
|
<scope>import</scope> |
||||
|
</dependency> |
||||
|
|
||||
|
<!--Redis配置--> |
||||
|
<dependency> |
||||
|
<groupId>org.springframework.boot</groupId> |
||||
|
<artifactId>spring-boot-starter-data-redis</artifactId> |
||||
|
<version>${redis.version}</version> |
||||
|
<exclusions> |
||||
|
<exclusion> |
||||
|
<groupId>io.lettuce</groupId> |
||||
|
<artifactId>lettuce-core</artifactId> |
||||
|
</exclusion> |
||||
|
</exclusions> |
||||
|
</dependency> |
||||
|
<!--Jedis配置--> |
||||
|
<dependency> |
||||
|
<groupId>redis.clients</groupId> |
||||
|
<artifactId>jedis</artifactId> |
||||
|
<version>${jedis.version}</version> |
||||
|
</dependency> |
||||
|
|
||||
|
<!-- Swagger 依赖配置 --> |
||||
|
<dependency> |
||||
|
<groupId>com.github.xiaoymin</groupId> |
||||
|
<artifactId>knife4j-dependencies</artifactId> |
||||
|
<version>${knife4j-Swagger}</version> |
||||
|
<type>pom</type> |
||||
|
<scope>import</scope> |
||||
|
</dependency> |
||||
|
|
||||
|
<!--Token生成与解析 --> |
||||
|
<dependency> |
||||
|
<groupId>io.jsonwebtoken</groupId> |
||||
|
<artifactId>jjwt</artifactId> |
||||
|
<version>${jjwt.version}</version> |
||||
|
</dependency> |
||||
|
<!-- JSON 解析器和生成器 --> |
||||
|
<dependency> |
||||
|
<groupId>com.alibaba</groupId> |
||||
|
<artifactId>fastjson</artifactId> |
||||
|
<version>${fastjson.version}</version> |
||||
|
</dependency> |
||||
|
<!--Bean工具 --> |
||||
|
<dependency> |
||||
|
<groupId>commons-beanutils</groupId> |
||||
|
<artifactId>commons-beanutils</artifactId> |
||||
|
<version>${commons.beanutils.version}</version> |
||||
|
</dependency> |
||||
|
<!-- hutool所有模块 --> |
||||
|
<dependency> |
||||
|
<groupId>cn.hutool</groupId> |
||||
|
<artifactId>hutool-all</artifactId> |
||||
|
<version>${hutool.version}</version> |
||||
|
</dependency> |
||||
|
<!-- hutool 核心,包括Bean操作、日期、各种Util等 --> |
||||
|
<dependency> |
||||
|
<groupId>cn.hutool</groupId> |
||||
|
<artifactId>hutool-core</artifactId> |
||||
|
<version>${hutool.version}</version> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>com.baomidou</groupId> |
||||
|
<artifactId>mybatis-plus-boot-starter</artifactId> |
||||
|
<version>${mybatis-plus.version}</version> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>com.baomidou</groupId> |
||||
|
<artifactId>mybatis-plus-annotation</artifactId> |
||||
|
<version>${mybatis-plus.version}</version> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>io.seata</groupId> |
||||
|
<artifactId>seata-spring-boot-starter</artifactId> |
||||
|
<!--seata starter 采用1.4.2版本--> |
||||
|
<version>${seata.version}</version> |
||||
|
</dependency> |
||||
|
</dependencies> |
||||
|
</dependencyManagement> |
||||
|
|
||||
|
<repositories> |
||||
|
<repository> |
||||
|
<id>aliyun-central</id> |
||||
|
<url>https://maven.aliyun.com/repository/central</url> |
||||
|
</repository> |
||||
|
<repository> |
||||
|
<id>aliyun-public</id> |
||||
|
<url>https://maven.aliyun.com/repository/public</url> |
||||
|
</repository> |
||||
|
<repository> |
||||
|
<id>aliyun-google</id> |
||||
|
<url>https://maven.aliyun.com/repository/google</url> |
||||
|
</repository> |
||||
|
<repository> |
||||
|
<id>aliyun-spring</id> |
||||
|
<url>https://maven.aliyun.com/repository/spring</url> |
||||
|
</repository> |
||||
|
</repositories> |
||||
|
<pluginRepositories> |
||||
|
<pluginRepository> |
||||
|
<id>aliyun-central</id> |
||||
|
<url>https://maven.aliyun.com/repository/central</url> |
||||
|
</pluginRepository> |
||||
|
<pluginRepository> |
||||
|
<id>aliyun-public</id> |
||||
|
<url>https://maven.aliyun.com/repository/public</url> |
||||
|
</pluginRepository> |
||||
|
<pluginRepository> |
||||
|
<id>aliyun-google</id> |
||||
|
<url>https://maven.aliyun.com/repository/google</url> |
||||
|
</pluginRepository> |
||||
|
<pluginRepository> |
||||
|
<id>aliyun-spring</id> |
||||
|
<url>https://maven.aliyun.com/repository/spring</url> |
||||
|
</pluginRepository> |
||||
|
</pluginRepositories> |
||||
|
</project> |