Browse Source

提交代码

master
xyiege 4 years ago
parent
commit
e654c65606
  1. 5
      README.md
  2. 11
      pom.xml
  3. 4
      src/main/java/cn/chjyj/szwh/utils/ApiTokenUtils.java
  4. 93
      src/main/java/cn/chjyj/szwh/utils/AssertUtil.java
  5. 46
      src/main/java/cn/chjyj/szwh/utils/DataUtil.java
  6. 17
      src/main/java/cn/chjyj/szwh/utils/DownloadZip.java
  7. 146
      src/main/java/cn/chjyj/szwh/utils/FormatLogSqlUtil.java
  8. 12
      src/main/java/cn/chjyj/szwh/utils/IPUtil.java
  9. 123
      src/main/java/cn/chjyj/szwh/utils/JwtRsaUtil.java
  10. 19
      szwh.iml

5
README.md

@ -16,6 +16,11 @@
$ java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC xxx-1.0.0.jar $ java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC xxx-1.0.0.jar
``` ```
参考token:
```text
eyJhbGciOiJIUzUxMiJ9.eyJhdWQiOiJCRDg0REQ0MkE3MjM0QjA1QjBDNUQxMTYxNjEzMkFDNCIsImp0aSI6IjhjMTJiMTljMzIyMTQ5ZmY5MGFlNzZiMmQ4MDcwZTFjIiwiYWNjb3VudElkIjoiYWRtaW4iLCJhY2NvdW50TmFtZSI6Iui2hee6p-euoeeQhuWRmCIsIm1lbnVQZXJtaXNzaW9uIjpbIm1fMDAyIiwibV8wMDMiLCJtXzAwNCIsIm1fMDA1IiwibV8wMDYiXSwiaWF0IjoxNjU2NDcwNDM3fQ.-B70_NiCmrDaXRiAB93RwY7jXFq1viCrh95YThVLfhjUWYvq8nHkPpOe8f9sxPx0v2trtWqdsgUc1G4nGhCKaw
```
开发文档: 开发文档:
1、 1、
[https://note.youdao.com/ynoteshare/index.html?id=9ef8862bd0473eaf23762b0af7afe9a4&type=note&_time=1648957656888](第三方接入统一用户登录平台) [https://note.youdao.com/ynoteshare/index.html?id=9ef8862bd0473eaf23762b0af7afe9a4&type=note&_time=1648957656888](第三方接入统一用户登录平台)

11
pom.xml

@ -26,6 +26,10 @@
<artifactId>mybatis-spring-boot-starter</artifactId> <artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version> <version>2.2.2</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
@ -48,6 +52,13 @@
<groupId>ch.qos.logback</groupId> <groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId> <artifactId>logback-classic</artifactId>
</dependency> </dependency>
<!-- 分页组件 PageInfo-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
<!--common 类--> <!--common 类-->
<dependency> <dependency>
<groupId>commons-codec</groupId> <groupId>commons-codec</groupId>

4
src/main/java/cn/chjyj/szwh/utils/ApiTokenUtils.java

@ -1,6 +1,5 @@
package cn.chjyj.szwh.utils; package cn.chjyj.szwh.utils;
import com.google.common.collect.Maps;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.SignatureAlgorithm;
@ -13,6 +12,7 @@ import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec; import java.security.spec.X509EncodedKeySpec;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
@ -31,7 +31,7 @@ public class ApiTokenUtils {
*/ */
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
String issuer = "test"; String issuer = "test";
Map<String, String> stringStringMap = Maps.newHashMap(); Map<String, String> stringStringMap = new HashMap<>();
String cloudhub_token = getToken( String cloudhub_token = getToken(
issuer, //从天朗获取 issuer, //从天朗获取
stringStringMap.get("private_key"), //从天朗获取 stringStringMap.get("private_key"), //从天朗获取

93
src/main/java/cn/chjyj/szwh/utils/AssertUtil.java

@ -1,93 +0,0 @@
package cn.chjyj.szwh.utils;
import cn.pelerin.wh.transaction.model.exception.ServiceException;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.List;
/**
* 断言 - 中断往下操作, 直接返回到前端
*
* @author xie.xinquan
* @create 2021/5/13 11:21
* @company 深圳亿起融网络科技有限公司
*/
@Component
public class AssertUtil {
private static final String defaultNullMsg = "参数为空";
public static void haveLength(String str, String msg) {
if (StringUtils.isEmpty(str)) {
throw new ServiceException(msg);
}
}
/**
* 校验前端传过来的数据
*
* @param t
* @param list
* @param msg
* @param <T>
*/
public static <T> void dataNotNull(T t, List<T> list, String msg) {
if (t instanceof String && StringUtils.isEmpty((String) t) && CollectionUtils.isEmpty(list)) {
throw new ServiceException(msg);
}
if (t == null && CollectionUtils.isEmpty(list)) {
throw new ServiceException(msg);
}
}
public static void collectionNotNull(Collection collection, String msg) {
if (CollectionUtils.isEmpty(collection)) {
throw new ServiceException(msg);
}
}
public static void notNull(Object obj) {
notNull(obj, defaultNullMsg);
}
public static void notNull(Object obj, String msg) {
if (obj == null) {
throw new ServiceException(msg);
}
}
public static void notNull(Object obj, String... fieldNames) {
notNull(defaultNullMsg, obj, fieldNames);
}
/**
* 校验字段是否为空
*
* @param msg
* @param obj
* @param fieldNames
*/
public static void notNull(String msg, Object obj, String... fieldNames) {
notNull(obj, msg);
if (ArrayUtils.isEmpty(fieldNames)) {
throw new ServiceException(msg);
}
for (String fieldName : fieldNames) {
Field field = ReflectionUtils.findField(obj.getClass(), fieldName);
notNull(field, msg);
field.setAccessible(true);
Object value = ReflectionUtils.getField(field, obj);
if (field.getType().isAssignableFrom(String.class)) {
haveLength((String) value, msg);
} else {
notNull(value, msg);
}
}
}
}

46
src/main/java/cn/chjyj/szwh/utils/DataUtil.java

@ -1,46 +0,0 @@
package cn.chjyj.szwh.utils;
import com.google.common.collect.Lists;
import org.springframework.util.ObjectUtils;
import java.util.List;
/**
* @author xie.xinquan
* @create 2021/1/11 14:17
* @company 深圳亿起融网络科技有限公司
*/
public class DataUtil {
/**
* 将大集合分批成多个子集 -- 设置默认值
*/
public static <E> List<List<E>> bigSetSplit(List<E> list){
return bigSetSplit(list, null);
}
/**
* 将大集合分批成多个子集
*/
public static <E> List<List<E>> bigSetSplit(List<E> list, Integer batchCount){
if (ObjectUtils.isEmpty(list)){
return Lists.newArrayList();
}
List<List<E>> result = Lists.newArrayList();
// 每批commit的个数
batchCount = batchCount == null || batchCount <= 0 ? 100 : batchCount;
//循环次数
int cycleTimes = list.size() % batchCount == 0 ? list.size() / batchCount : list.size() / batchCount + 1;
for (int i = 0; i < cycleTimes; i++){
int startIndex = i * batchCount;
int endIndex = (i+1) * batchCount;
endIndex = endIndex > list.size() ? list.size() : endIndex;
result.add(list.subList(startIndex, endIndex));
}
return result;
}
}

17
src/main/java/cn/chjyj/szwh/utils/DownloadZip.java

@ -1,9 +1,9 @@
package cn.chjyj.szwh.utils; package cn.chjyj.szwh.utils;
import lombok.Cleanup;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*; import java.io.*;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
@ -11,12 +11,10 @@ import java.net.URL;
import java.net.URLConnection; import java.net.URLConnection;
/** /**
* @author xie.xinquan * zip 文件压缩包下载
* @create 2022/6/13 14:57
* @company 深圳亿起融网络科技有限公司
*/ */
@Slf4j
public class DownloadZip { public class DownloadZip {
private static Logger log =LoggerFactory.getLogger(DownloadZip.class);
public static boolean download(String urlString, String filename) { public static boolean download(String urlString, String filename) {
try { try {
@ -25,17 +23,20 @@ public class DownloadZip {
// 打开连接 // 打开连接
URLConnection con = url.openConnection(); URLConnection con = url.openConnection();
// 输入流 // 输入流
@Cleanup InputStream is = con.getInputStream(); InputStream is = con.getInputStream();
// 1K的数据缓冲 // 1K的数据缓冲
byte[] bs = new byte[1024]; byte[] bs = new byte[1024];
// 读取到的数据长度 // 读取到的数据长度
int len; int len;
// 输出的文件流 // 输出的文件流
@Cleanup OutputStream os = new FileOutputStream(filename); OutputStream os = new FileOutputStream(filename);
// 开始读取 // 开始读取
while ((len = is.read(bs)) != -1) { while ((len = is.read(bs)) != -1) {
os.write(bs, 0, len); os.write(bs, 0, len);
} }
//关闭流
os.close();
is.close();
} catch (Exception e) { } catch (Exception e) {
return false; return false;
} }

146
src/main/java/cn/chjyj/szwh/utils/FormatLogSqlUtil.java

@ -1,146 +0,0 @@
package cn.chjyj.szwh.utils;
import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.SQLUtils;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
/**
* @author xie.xinquan
* @create 2022/6/15 10:15
* @company 深圳亿起融网络科技有限公司
*/
public class FormatLogSqlUtil {
private static final String phpLogFilePath = "D:\\project\\wh_php\\runtime\\admin\\log\\202206\\";
public static void main(String[] args) throws IOException, InterruptedException {
File file = new File(phpLogFilePath);
File[] files = file.listFiles();
File lastFile = Stream.of(files).max(Comparator.comparing(o -> o.lastModified())).get();
long l = lastFile.lastModified();
List<String> list = FileUtils.readLines(lastFile, "utf-8");
int size = list.size();
while (true) {
TimeUnit.SECONDS.sleep(1);
if (lastFile.lastModified() > l) {
l = lastFile.lastModified();
list = FileUtils.readLines(lastFile, "utf-8");
List<String> data = list.subList(size, list.size());
size = list.size();
for (String str : data) {
str = StringUtils.substringAfter(str, " ");
str = StringUtils.substringBeforeLast(str, "[");
try {
String format = SQLUtils.format(str, DbType.mysql);
if (StringUtils.isNotEmpty(format)) {
System.out.println("...........start...............");
System.out.println(format);
// 执行SQL
execSql(str);
System.out.println("............end................");
}
}catch (Exception e) {
System.out.println("格式化出错:" + e.getMessage());
}
}
}
}
}
private static Connection connection ;
private static void setConnection() throws IOException, ClassNotFoundException, SQLException {
Properties properties = new Properties();
{
InputStream resourceAsStream = FormatLogSqlUtil.class.getClassLoader().getResourceAsStream("application.properties");
properties.load(resourceAsStream);
resourceAsStream.close();
}
String dev = MapUtils.getString(properties, "spring.profiles.active", "dev");
{
Properties prop = new Properties();
InputStream resourceAsStream = FormatLogSqlUtil.class.getClassLoader().getResourceAsStream(String.format("application-%s.properties", dev));
prop.load(resourceAsStream);
resourceAsStream.close();
for (Map.Entry<Object, Object> entry : prop.entrySet()) {
properties.put(entry.getKey(), entry.getValue());
}
}
Class.forName(properties.getProperty("spring.datasource.driverClassName"));
connection = DriverManager.getConnection(properties.getProperty("spring.datasource.url"), properties.getProperty("spring.datasource.username"), properties.getProperty("spring.datasource.password"));
}
private static void execSql(String sql) throws SQLException, IOException, ClassNotFoundException {
if (connection == null) {
setConnection();
}
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
System.out.println("...执行sql start...");
ResultSetMetaData metaData = resultSet.getMetaData();
List<List<String>> execdata = new ArrayList<>();
int columnCount = metaData.getColumnCount();
{
int i = 0;
List<String> data = new ArrayList<>();
while (++i <= columnCount) {
data.add(metaData.getColumnName(i));
}
execdata.add(data);
}
while (resultSet.next()) {
int i = 0;
List<String> data = new ArrayList<>();
while (++i <= columnCount) {
data.add(resultSet.getString(i));
}
execdata.add(data);
}
int[] max = new int[execdata.get(0).size()];
for (List<String> list : execdata) {
for (int i = 0; i < list.size(); i++) {
String s = list.get(i) == null ? "null" : list.get(i);
max[i] = Math.max(max[i], charLen(s));
}
}
for (List<String> list : execdata) {
for (int i = 0; i < list.size(); i++) {
String s = list.get(i) == null ? "null" : list.get(i);
while (s.length() < max[i]) s += ' ';
list.set(i, s);
}
System.out.println(StringUtils.join(list, " "));
}
System.out.println("...执行sql end...");
}
private static int charLen(String str) {
double len = 0;
for (char c : str.toCharArray()) {
if (isChineseChar(c)) {
len += 1.66;
}else {
len += 1;
}
}
return (int) len;
}
public static boolean isChineseChar(char c) {
return String.valueOf(c).matches("[\u4e00-\u9fa5]");
}
}

12
src/main/java/cn/chjyj/szwh/utils/IPUtil.java

@ -1,21 +1,19 @@
package cn.chjyj.szwh.utils; package cn.chjyj.szwh.utils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
/** /**
* 描述: * IP地址工具
*
* @author dong.jun
* @create 2022-03-11 18:31
* @company 深圳亿起融网络科技有限公司
*/ */
@Slf4j
public class IPUtil { public class IPUtil {
private static Logger log = LoggerFactory.getLogger(IPUtil.class);
private static final String IP_UTILS_FLAG = ","; private static final String IP_UTILS_FLAG = ",";
private static final String UNKNOWN = "unknown"; private static final String UNKNOWN = "unknown";
private static final String LOCALHOST_IP = "0:0:0:0:0:0:0:1"; private static final String LOCALHOST_IP = "0:0:0:0:0:0:0:1";

123
src/main/java/cn/chjyj/szwh/utils/JwtRsaUtil.java

@ -1,123 +0,0 @@
package cn.chjyj.szwh.utils;
import cn.pelerin.wh.transaction.auth.entity.Cert;
import cn.pelerin.wh.transaction.auth.mapper.CertMapper;
import cn.pelerin.wh.transaction.constant.CertTypeConst;
import cn.pelerin.wh.transaction.model.base.SysLogin;
import com.auth0.jwt.JWT;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.google.common.collect.Maps;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.impl.TextCodec;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.tomcat.util.codec.binary.Base64;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.File;
import java.util.Map;
import java.util.Objects;
/**
* @author luo.laiyong
* @date Created in 2019/6/5 11:20
* @company 深圳亿起融网络科技有限公司
* @modified By
*/
@Slf4j
@Component
public class JwtRsaUtil {
@Resource
private CertMapper certMapper;
private static CertMapper initCertMapper;
@PostConstruct
public void beforeInit() {
initCertMapper = certMapper;
}
private static Claims parseJWT(String token, String signKey) {
SecretKey key = generalKey(signKey); //签名秘钥,和生成的签名的秘钥一模一样
Claims claims = Jwts.parser() //得到DefaultJwtParser
.setSigningKey(key) //设置签名的秘钥
.parseClaimsJws(token).getBody();//设置需要解析的jwt
return claims;
}
public static SysLogin getUserFromToken(String token) {
try {
DecodedJWT decodedJWT = JWT.decode(token);
if (!ObjectUtils.isEmpty(decodedJWT.getClaims())) {
SysLogin sysLoginInfo = new SysLogin();
sysLoginInfo.setIat(decodedJWT.getClaim("iat").asInt());
sysLoginInfo.setMenuPermission(decodedJWT.getClaim("menuPermission").asList(String.class));
sysLoginInfo.setAccountId(decodedJWT.getClaim("accountId").asString());
sysLoginInfo.setAccountName(decodedJWT.getClaim("accountName").asString());
sysLoginInfo.setAud(decodedJWT.getClaim("aud").asString());
sysLoginInfo.setJti(decodedJWT.getClaim("jti").asString());
return sysLoginInfo;
}
} catch (Exception e) {
log.error("DecodedJWT error", e);
}
return null;
}
public static SecretKey generalKey(String signKey) {
byte[] encodedKey = Base64.decodeBase64(signKey);//本地的密码解码
SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, SignatureAlgorithm.HS256.getValue());// 根据给定的字节数组使用AES加密算法构造一个密钥,使用 encodedKey中的始于且包含 0 到前 leng 个字节这是当然是所有。(后面的文章中马上回推出讲解Java加密和解密的一些算法)
return key;
}
@SneakyThrows
public static void main(String[] args) {
//String signKey = "KHXT0V7NVLOFPS9BZ88R5VLIH5COPULV";
String token = "eyJhbGciOiJIUzUxMiJ9.eyJhdWQiOiJCRDg0REQ0MkE3MjM0QjA1QjBDNUQxMTYxNjEzMkFDNCIsImp0aSI6IjcyMDgyMWZiMjNiNTQ4YjZhMmMxNGNlYjYxMjEzYWI0IiwiYWNjb3VudElkIjoiYWRtaW4iLCJhY2NvdW50TmFtZSI6Iui2hee6p-euoeeQhuWRmCIsIm1lbnVQZXJtaXNzaW9uIjpbIm1fMDAyIiwibV8wMDMiLCJtXzAwNCIsIm1fMDA1IiwibV8wMDYiXSwiaWF0IjoxNjU1MDk5NjU2fQ.pmXSrvjSJjTFB22QyTp3q7ZlzFwcqlHVYI-qCPlc1zfeQa6Spn_AJdAT-VkLyXPbaKUaovroUvZ_ay5vug5Aow";
getUserFromToken(token);
////Claims claims = parseJWT(token, signKey);
//String str = Base64Util.encode(signKey);
//Claims claims = Jwts.parser() //得到DefaultJwtParser
// .setSigningKey(str) //设置签名的秘钥
// .parseClaimsJws(token).getBody();
//System.out.println(claims);
DecodedJWT decodedJWT = JWT.decode(token);
String json = TextCodec.BASE64URL.decodeToString("eyJhdWQiOiJCRDg0REQ0MkE3MjM0QjA1QjBDNUQxMTYxNjEzMkFDNCIsImp0aSI6IjcyMDgyMWZiMjNiNTQ4YjZhMmMxNGNlYjYxMjEzYWI0IiwiYWNjb3VudElkIjoiYWRtaW4iLCJhY2NvdW50TmFtZSI6Iui2hee6p-euoeeQhuWRmCIsIm1lbnVQZXJtaXNzaW9uIjpbIm1fMDAyIiwibV8wMDMiLCJtXzAwNCIsIm1fMDA1IiwibV8wMDYiXSwiaWF0IjoxNjU1MDk5NjU2fQ");
System.out.println(json);
}
/**
* 调用其他系统时需要生成token写入header
*
* @param type
* @return
*/
public static String createSign(String type) {
Cert cert = initCertMapper.selectOneByStatusAndType(0, type);
//读取私钥
String privateFilePath = System.getProperty("user.dir") + cert.getPrivateKey();
String token = "";
try {
String privateKey = FileUtils.readFileToString(new File(privateFilePath));
privateKey = privateKey.replaceAll("\\-*BEGIN.*KEY\\-*", "").replaceAll("\\-*END.*KEY\\-*", "");
if (Objects.equals(CertTypeConst.USER_REAL, type)) {
Map<String, Object> claims = Maps.newHashMap();
claims.put("aud", "BD84DD42A7234B05B0C5D11616132AC4");
token = ApiTokenUtils.getToken(cert.getToken(), privateKey, 5 * 60 * 1000L, claims);
} else {
token = ApiTokenUtils.getToken(cert.getToken(), privateKey, 5 * 60 * 1000L);
}
} catch (Exception e) {
log.error("createSign error", e);
}
return token;
}
}

19
szwh.iml

@ -51,10 +51,25 @@
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.6.8" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.6.8" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:4.0.3" level="project" /> <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:4.0.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.3.20" level="project" /> <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.3.20" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.3.20" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.2.2" level="project" /> <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.2.2" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.9" level="project" /> <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.9" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.7" level="project" /> <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.7" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.6.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.6.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.6.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.6.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.3.20" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.3.20" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.3.20" level="project" />
<orderEntry type="library" name="Maven: io.lettuce:lettuce-core:6.1.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.77.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.77.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.77.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.77.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.77.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.77.Final" level="project" />
<orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.4.18" level="project" />
<orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework.boot:spring-boot-devtools:2.6.8" level="project" /> <orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework.boot:spring-boot-devtools:2.6.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.6.8" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.6.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.6.8" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.6.8" level="project" />
@ -92,6 +107,8 @@
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.11" level="project" /> <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.11" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.11" level="project" /> <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.11" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.36" level="project" /> <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.36" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.3.0" level="project" />
<orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:4.2" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.9" level="project" /> <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.9" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" /> <orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" />
<orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" /> <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />

Loading…
Cancel
Save