【3.7.4 开源代码同步】新增断言异常类和断言工具类,优化JWT工具类,更新文件类型白名单,切换undertow配置,修改多个YAML配置文件
This commit is contained in:
parent
4fb53637aa
commit
9191a8b620
@ -3,7 +3,6 @@
|
|||||||
> JeecgBoot属于平台级产品,每次升级改动较大,目前做不到平滑升级。
|
> JeecgBoot属于平台级产品,每次升级改动较大,目前做不到平滑升级。
|
||||||
|
|
||||||
### 增量升级方案
|
### 增量升级方案
|
||||||
|
|
||||||
#### 1.代码合并
|
#### 1.代码合并
|
||||||
本地通过svn或git做好主干,在分支上做业务开发,jeecg每次版本发布,可以手工覆盖主干的代码,对比合并代码;
|
本地通过svn或git做好主干,在分支上做业务开发,jeecg每次版本发布,可以手工覆盖主干的代码,对比合并代码;
|
||||||
|
|
||||||
@ -12,12 +11,5 @@
|
|||||||
- 其他库请手工执行SQL, 目录: `jeecg-module-system\jeecg-system-start\src\main\resources\flyway\sql\mysql`
|
- 其他库请手工执行SQL, 目录: `jeecg-module-system\jeecg-system-start\src\main\resources\flyway\sql\mysql`
|
||||||
> 注意: 升级sql只提供mysql版本;如果有权限升级, 还需要手工角色授权,退出重新登录才好使。
|
> 注意: 升级sql只提供mysql版本;如果有权限升级, 还需要手工角色授权,退出重新登录才好使。
|
||||||
|
|
||||||
#### 3.其他数据库脚本说明
|
#### 3.兼容问题
|
||||||
原先官方默认提供oracle和SqlServer的脚本,但是维护成本太高,未提供脚本的数据库,可以参考下面的文档自己转
|
|
||||||
https://my.oschina.net/jeecg/blog/4905722
|
|
||||||
(注意:定时任务的表qrtz_*,需要删掉用原始的脚本重新执行一下)
|
|
||||||
quartz-2.2.3-distribution.tar.gz放到百度网盘中,大家自己下载,执行所需数据库脚本
|
|
||||||
https://pan.baidu.com/s/1WrmZdUuAPg3iBwJ-LoHWyg?pwd=8mdz
|
|
||||||
|
|
||||||
#### 4.兼容问题
|
|
||||||
每次发版,会针对不兼容地方重点说明。
|
每次发版,会针对不兼容地方重点说明。
|
@ -49,6 +49,16 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-web</artifactId>
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-undertow</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- websocket -->
|
<!-- websocket -->
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -257,6 +267,12 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.minio</groupId>
|
<groupId>io.minio</groupId>
|
||||||
<artifactId>minio</artifactId>
|
<artifactId>minio</artifactId>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>checker-qual</artifactId>
|
||||||
|
<groupId>org.checkerframework</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 阿里云短信 -->
|
<!-- 阿里云短信 -->
|
||||||
@ -298,7 +314,6 @@
|
|||||||
<groupId>cn.hutool</groupId>
|
<groupId>cn.hutool</groupId>
|
||||||
<artifactId>hutool-crypto</artifactId>
|
<artifactId>hutool-crypto</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- chatgpt -->
|
<!-- chatgpt -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
|
@ -0,0 +1,21 @@
|
|||||||
|
package org.jeecg.common.exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* jeecgboot断言异常
|
||||||
|
* for [QQYUN-10990]AIRAG
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2025/2/14 14:31
|
||||||
|
*/
|
||||||
|
public class JeecgBootAssertException extends JeecgBootException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
|
||||||
|
public JeecgBootAssertException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public JeecgBootAssertException(String message, int errCode) {
|
||||||
|
super(message, errCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -6,6 +6,17 @@ import com.auth0.jwt.algorithms.Algorithm;
|
|||||||
import com.auth0.jwt.exceptions.JWTDecodeException;
|
import com.auth0.jwt.exceptions.JWTDecodeException;
|
||||||
import com.auth0.jwt.interfaces.DecodedJWT;
|
import com.auth0.jwt.interfaces.DecodedJWT;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import javax.servlet.ServletResponse;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.servlet.http.HttpSession;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.SecurityUtils;
|
||||||
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.api.vo.Result;
|
||||||
@ -20,16 +31,6 @@ import org.jeecg.common.util.DateUtils;
|
|||||||
import org.jeecg.common.util.SpringContextUtils;
|
import org.jeecg.common.util.SpringContextUtils;
|
||||||
import org.jeecg.common.util.oConvertUtils;
|
import org.jeecg.common.util.oConvertUtils;
|
||||||
|
|
||||||
import javax.servlet.ServletResponse;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import javax.servlet.http.HttpSession;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author Scott
|
* @Author Scott
|
||||||
* @Date 2018-07-12 14:23
|
* @Date 2018-07-12 14:23
|
||||||
|
@ -0,0 +1,239 @@
|
|||||||
|
package org.jeecg.common.util;
|
||||||
|
|
||||||
|
|
||||||
|
import org.jeecg.common.exception.JeecgBootAssertException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 断言检查工具
|
||||||
|
* for for [QQYUN-10990]AIRAG
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2017-06-22 10:05:56
|
||||||
|
*/
|
||||||
|
public class AssertUtils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确保对象为空,如果不为空抛出异常
|
||||||
|
*
|
||||||
|
* @param msg
|
||||||
|
* @param obj
|
||||||
|
* @throws JeecgBootAssertException
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2017-06-22 10:05:56
|
||||||
|
*/
|
||||||
|
public static void assertEmpty(String msg, Object obj) {
|
||||||
|
if (oConvertUtils.isObjectNotEmpty(obj)) {
|
||||||
|
throw new JeecgBootAssertException(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确保对象不为空,如果为空抛出异常
|
||||||
|
*
|
||||||
|
* @param msg
|
||||||
|
* @param obj
|
||||||
|
* @throws JeecgBootAssertException
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2017-06-22 10:05:56
|
||||||
|
*/
|
||||||
|
public static void assertNotEmpty(String msg, Object obj) {
|
||||||
|
if (oConvertUtils.isObjectEmpty(obj)) {
|
||||||
|
throw new JeecgBootAssertException(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证对象是否相同
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* @param expected
|
||||||
|
* @param actual
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2018/9/12 15:45
|
||||||
|
*/
|
||||||
|
public static void assertEquals(String message, Object expected,
|
||||||
|
Object actual) {
|
||||||
|
if (oConvertUtils.isEqual(expected, actual)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new JeecgBootAssertException(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证不相同
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* @param expected
|
||||||
|
* @param actual
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2018/9/12 15:45
|
||||||
|
*/
|
||||||
|
public static void assertNotEquals(String message, Object expected,
|
||||||
|
Object actual) {
|
||||||
|
if (oConvertUtils.isEqual(expected, actual)) {
|
||||||
|
throw new JeecgBootAssertException(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证是否相等
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* @param expected
|
||||||
|
* @param actual
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2018/9/12 15:45
|
||||||
|
*/
|
||||||
|
public static void assertSame(String message, Object expected,
|
||||||
|
Object actual) {
|
||||||
|
if (expected == actual) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new JeecgBootAssertException(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证不相等
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* @param unexpected
|
||||||
|
* @param actual
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2018/9/12 15:45
|
||||||
|
*/
|
||||||
|
public static void assertNotSame(String message, Object unexpected,
|
||||||
|
Object actual) {
|
||||||
|
if (unexpected == actual) {
|
||||||
|
throw new JeecgBootAssertException(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证是否为真
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* @param condition
|
||||||
|
*/
|
||||||
|
public static void assertTrue(String message, boolean condition) {
|
||||||
|
if (!condition) {
|
||||||
|
throw new JeecgBootAssertException(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证 condition是否为false
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* @param condition
|
||||||
|
*/
|
||||||
|
public static void assertFalse(String message, boolean condition) {
|
||||||
|
assertTrue(message, !condition);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证是否存在
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* @param obj
|
||||||
|
* @param objs
|
||||||
|
* @param <T>
|
||||||
|
* @throws JeecgBootAssertException
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2018/1/31 22:14
|
||||||
|
*/
|
||||||
|
public static <T> void assertIn(String message, T obj, T... objs) {
|
||||||
|
assertNotEmpty(message, obj);
|
||||||
|
assertNotEmpty(message, objs);
|
||||||
|
if (!oConvertUtils.isIn(obj, objs)) {
|
||||||
|
throw new JeecgBootAssertException(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证是否不存在
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* @param obj
|
||||||
|
* @param objs
|
||||||
|
* @param <T>
|
||||||
|
* @throws JeecgBootAssertException
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2018/1/31 22:14
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static <T> void assertNotIn(String message, T obj, T... objs) {
|
||||||
|
assertNotEmpty(message, obj);
|
||||||
|
assertNotEmpty(message, objs);
|
||||||
|
if (oConvertUtils.isIn(obj, objs)) {
|
||||||
|
throw new JeecgBootAssertException(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确保src大于des
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* @param src
|
||||||
|
* @param des
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2018/9/19 15:30
|
||||||
|
*/
|
||||||
|
public static void assertGt(String message, Number src, Number des) {
|
||||||
|
if (oConvertUtils.isGt(src, des)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new JeecgBootAssertException(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确保src大于等于des
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* @param src
|
||||||
|
* @param des
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2018/9/19 15:30
|
||||||
|
*/
|
||||||
|
public static void assertGe(String message, Number src, Number des) {
|
||||||
|
if (oConvertUtils.isGe(src, des)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new JeecgBootAssertException(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确保src小于des
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* @param src
|
||||||
|
* @param des
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2018/9/19 15:30
|
||||||
|
*/
|
||||||
|
public static void assertLt(String message, Number src, Number des) {
|
||||||
|
if (oConvertUtils.isGe(src, des)) {
|
||||||
|
throw new JeecgBootAssertException(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确保src小于等于des
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* @param src
|
||||||
|
* @param des
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2018/9/19 15:30
|
||||||
|
*/
|
||||||
|
public static void assertLe(String message, Number src, Number des) {
|
||||||
|
if (oConvertUtils.isGt(src, des)) {
|
||||||
|
throw new JeecgBootAssertException(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -42,6 +42,7 @@ public class SsrfFileTypeFilter {
|
|||||||
FILE_TYPE_WHITE_LIST.add("pdf");
|
FILE_TYPE_WHITE_LIST.add("pdf");
|
||||||
FILE_TYPE_WHITE_LIST.add("csv");
|
FILE_TYPE_WHITE_LIST.add("csv");
|
||||||
// FILE_TYPE_WHITE_LIST.add("xml");
|
// FILE_TYPE_WHITE_LIST.add("xml");
|
||||||
|
FILE_TYPE_WHITE_LIST.add("md");
|
||||||
|
|
||||||
//音视频文件
|
//音视频文件
|
||||||
FILE_TYPE_WHITE_LIST.add("mp4");
|
FILE_TYPE_WHITE_LIST.add("mp4");
|
||||||
@ -65,6 +66,10 @@ public class SsrfFileTypeFilter {
|
|||||||
FILE_TYPE_WHITE_LIST.add("apk");
|
FILE_TYPE_WHITE_LIST.add("apk");
|
||||||
FILE_TYPE_WHITE_LIST.add("wgt");
|
FILE_TYPE_WHITE_LIST.add("wgt");
|
||||||
|
|
||||||
|
//幻灯片文件后缀
|
||||||
|
FILE_TYPE_WHITE_LIST.add("ppt");
|
||||||
|
FILE_TYPE_WHITE_LIST.add("pptx");
|
||||||
|
|
||||||
//设置禁止文件的头部标记
|
//设置禁止文件的头部标记
|
||||||
FILE_TYPE_MAP.put("3c25402070616765206c", "jsp");
|
FILE_TYPE_MAP.put("3c25402070616765206c", "jsp");
|
||||||
FILE_TYPE_MAP.put("3c3f7068700a0a2f2a2a0a202a205048", "php");
|
FILE_TYPE_MAP.put("3c3f7068700a0a2f2a2a0a202a205048", "php");
|
||||||
|
@ -13,6 +13,7 @@ import javax.servlet.http.HttpServletRequest;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.lang.reflect.Array;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
@ -1028,5 +1029,109 @@ public class oConvertUtils {
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断对象是否为空 <br/>
|
||||||
|
* 支持各种类型的对象
|
||||||
|
* for for [QQYUN-10990]AIRAG
|
||||||
|
* @param obj
|
||||||
|
* @return
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2025/2/13 18:34
|
||||||
|
*/
|
||||||
|
public static boolean isObjectEmpty(Object obj) {
|
||||||
|
if (null == obj) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj instanceof CharSequence) {
|
||||||
|
return isEmpty(obj);
|
||||||
|
} else if (obj instanceof Map) {
|
||||||
|
return ((Map<?, ?>) obj).isEmpty();
|
||||||
|
} else if (obj instanceof Iterable) {
|
||||||
|
return isObjectEmpty(((Iterable<?>) obj).iterator());
|
||||||
|
} else if (obj instanceof Iterator) {
|
||||||
|
return !((Iterator<?>) obj).hasNext();
|
||||||
|
} else if (isArray(obj)) {
|
||||||
|
return 0 == Array.getLength(obj);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* iterator 是否为空
|
||||||
|
* for for [QQYUN-10990]AIRAG
|
||||||
|
* @param iterator Iterator对象
|
||||||
|
* @return 是否为空
|
||||||
|
*/
|
||||||
|
public static boolean isEmptyIterator(Iterator<?> iterator) {
|
||||||
|
return null == iterator || false == iterator.hasNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断对象是否不为空
|
||||||
|
* for for [QQYUN-10990]AIRAG
|
||||||
|
* @param object
|
||||||
|
* @return
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2025/2/13 18:35
|
||||||
|
*/
|
||||||
|
public static boolean isObjectNotEmpty(Object object) {
|
||||||
|
return !isObjectEmpty(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 如果src大于des返回true
|
||||||
|
* for [QQYUN-10990]AIRAG
|
||||||
|
* @param src
|
||||||
|
* @param des
|
||||||
|
* @return
|
||||||
|
* @author: chenrui
|
||||||
|
* @date: 2018/9/19 15:30
|
||||||
|
*/
|
||||||
|
public static boolean isGt(Number src, Number des) {
|
||||||
|
if (null == src || null == des) {
|
||||||
|
throw new IllegalArgumentException("参数不能为空");
|
||||||
|
}
|
||||||
|
if (src.doubleValue() > des.doubleValue()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 如果src大于等于des返回true
|
||||||
|
* for [QQYUN-10990]AIRAG
|
||||||
|
* @param src
|
||||||
|
* @param des
|
||||||
|
* @return
|
||||||
|
* @author: chenrui
|
||||||
|
* @date: 2018/9/19 15:30
|
||||||
|
*/
|
||||||
|
public static boolean isGe(Number src, Number des) {
|
||||||
|
if (null == src || null == des) {
|
||||||
|
throw new IllegalArgumentException("参数不能为空");
|
||||||
|
}
|
||||||
|
if (src.doubleValue() < des.doubleValue()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断是否存在
|
||||||
|
* for [QQYUN-10990]AIRAG
|
||||||
|
* @param obj
|
||||||
|
* @param objs
|
||||||
|
* @param <T>
|
||||||
|
* @return
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2020/9/12 15:50
|
||||||
|
*/
|
||||||
|
public static <T> boolean isIn(T obj, T... objs) {
|
||||||
|
return isIn(obj, objs);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,10 @@ public class JeecgBaseConfig {
|
|||||||
* @TODO 降低使用成本加的默认值,实际以 yml配置 为准
|
* @TODO 降低使用成本加的默认值,实际以 yml配置 为准
|
||||||
*/
|
*/
|
||||||
private String signatureSecret = "dd05f1c54d63749eda95f9fa6d49v442a";
|
private String signatureSecret = "dd05f1c54d63749eda95f9fa6d49v442a";
|
||||||
|
/**
|
||||||
|
* 自定义后台资源前缀,解决表单设计器无法通过前端nginx转发访问
|
||||||
|
*/
|
||||||
|
private String customResourcePrefixPath;
|
||||||
/**
|
/**
|
||||||
* 需要加强校验的接口清单
|
* 需要加强校验的接口清单
|
||||||
*/
|
*/
|
||||||
@ -68,6 +72,14 @@ public class JeecgBaseConfig {
|
|||||||
*/
|
*/
|
||||||
private BaiduApi baiduApi;
|
private BaiduApi baiduApi;
|
||||||
|
|
||||||
|
public String getCustomResourcePrefixPath() {
|
||||||
|
return customResourcePrefixPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCustomResourcePrefixPath(String customResourcePrefixPath) {
|
||||||
|
this.customResourcePrefixPath = customResourcePrefixPath;
|
||||||
|
}
|
||||||
|
|
||||||
public Elasticsearch getElasticsearch() {
|
public Elasticsearch getElasticsearch() {
|
||||||
return elasticsearch;
|
return elasticsearch;
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ import org.springframework.context.annotation.Bean;
|
|||||||
import org.springframework.context.annotation.Conditional;
|
import org.springframework.context.annotation.Conditional;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Primary;
|
import org.springframework.context.annotation.Primary;
|
||||||
|
import org.springframework.http.CacheControl;
|
||||||
import org.springframework.http.converter.HttpMessageConverter;
|
import org.springframework.http.converter.HttpMessageConverter;
|
||||||
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
|
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
|
||||||
import org.springframework.web.cors.CorsConfiguration;
|
import org.springframework.web.cors.CorsConfiguration;
|
||||||
@ -37,6 +38,7 @@ import java.time.LocalDateTime;
|
|||||||
import java.time.LocalTime;
|
import java.time.LocalTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Spring Boot 2.0 解决跨域问题
|
* Spring Boot 2.0 解决跨域问题
|
||||||
@ -67,6 +69,8 @@ public class WebMvcConfiguration implements WebMvcConfigurer {
|
|||||||
.addResourceLocations("file:" + jeecgBaseConfig.getPath().getWebapp() + "//");
|
.addResourceLocations("file:" + jeecgBaseConfig.getPath().getWebapp() + "//");
|
||||||
}
|
}
|
||||||
resourceHandlerRegistration.addResourceLocations(staticLocations.split(","));
|
resourceHandlerRegistration.addResourceLocations(staticLocations.split(","));
|
||||||
|
// 设置缓存控制标头 Cache-Control有效期为30天
|
||||||
|
resourceHandlerRegistration.setCacheControl(CacheControl.maxAge(30, TimeUnit.DAYS));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -60,7 +60,18 @@ public class MybatisPlusSaasConfig {
|
|||||||
TENANT_TABLE.add("sys_category");
|
TENANT_TABLE.add("sys_category");
|
||||||
TENANT_TABLE.add("sys_data_source");
|
TENANT_TABLE.add("sys_data_source");
|
||||||
TENANT_TABLE.add("sys_position");
|
TENANT_TABLE.add("sys_position");
|
||||||
//TENANT_TABLE.add("sys_announcement");
|
//b-2.仪表盘
|
||||||
|
TENANT_TABLE.add("onl_drag_page");
|
||||||
|
TENANT_TABLE.add("onl_drag_dataset_head");
|
||||||
|
TENANT_TABLE.add("jimu_report_data_source");
|
||||||
|
TENANT_TABLE.add("jimu_report");
|
||||||
|
TENANT_TABLE.add("jimu_dict");
|
||||||
|
//b-4.AIRAG
|
||||||
|
TENANT_TABLE.add("airag_app");
|
||||||
|
TENANT_TABLE.add("airag_flow");
|
||||||
|
TENANT_TABLE.add("airag_knowledge");
|
||||||
|
TENANT_TABLE.add("airag_knowledge_doc");
|
||||||
|
TENANT_TABLE.add("airag_model");
|
||||||
}
|
}
|
||||||
|
|
||||||
//2.示例测试
|
//2.示例测试
|
||||||
|
@ -217,6 +217,10 @@ public class ShiroConfig {
|
|||||||
//update-begin---author:chenrui ---date:20241202 for:[issues/7491]运行时间好长,效率慢 ------------
|
//update-begin---author:chenrui ---date:20241202 for:[issues/7491]运行时间好长,效率慢 ------------
|
||||||
registration.addUrlPatterns("/test/ai/chat/send");
|
registration.addUrlPatterns("/test/ai/chat/send");
|
||||||
//update-end---author:chenrui ---date:20241202 for:[issues/7491]运行时间好长,效率慢 ------------
|
//update-end---author:chenrui ---date:20241202 for:[issues/7491]运行时间好长,效率慢 ------------
|
||||||
|
registration.addUrlPatterns("/airag/flow/run");
|
||||||
|
registration.addUrlPatterns("/airag/flow/debug");
|
||||||
|
registration.addUrlPatterns("/airag/chat/send");
|
||||||
|
registration.addUrlPatterns("/airag/app/debug");
|
||||||
//支持异步
|
//支持异步
|
||||||
registration.setAsyncSupported(true);
|
registration.setAsyncSupported(true);
|
||||||
registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC);
|
registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC);
|
||||||
|
@ -91,6 +91,10 @@ public class IgnoreAuthPostProcessor implements InitializingBean {
|
|||||||
if (bases.length > 0) {
|
if (bases.length > 0) {
|
||||||
for (String base : bases) {
|
for (String base : bases) {
|
||||||
for (String uri : uris) {
|
for (String uri : uris) {
|
||||||
|
// 如果uri包含路径占位符, 则需要将其替换为*
|
||||||
|
if (uri.matches(".*\\{.*}.*")) {
|
||||||
|
uri = uri.replaceAll("\\{.*?}", "*");
|
||||||
|
}
|
||||||
urls.add(prefix(base) + prefix(uri));
|
urls.add(prefix(base) + prefix(uri));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package org.jeecg.config.shiro.ignore;
|
package org.jeecg.config.shiro.ignore;
|
||||||
|
|
||||||
|
import org.springframework.util.AntPathMatcher;
|
||||||
|
import org.springframework.util.PathMatcher;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -12,6 +14,7 @@ import java.util.List;
|
|||||||
public class InMemoryIgnoreAuth {
|
public class InMemoryIgnoreAuth {
|
||||||
private static final List<String> IGNORE_AUTH_LIST = new ArrayList<>();
|
private static final List<String> IGNORE_AUTH_LIST = new ArrayList<>();
|
||||||
|
|
||||||
|
private static PathMatcher MATCHER = new AntPathMatcher();
|
||||||
public InMemoryIgnoreAuth() {}
|
public InMemoryIgnoreAuth() {}
|
||||||
|
|
||||||
public static void set(List<String> list) {
|
public static void set(List<String> list) {
|
||||||
@ -28,7 +31,7 @@ public class InMemoryIgnoreAuth {
|
|||||||
|
|
||||||
public static boolean contains(String url) {
|
public static boolean contains(String url) {
|
||||||
for (String ignoreAuth : IGNORE_AUTH_LIST) {
|
for (String ignoreAuth : IGNORE_AUTH_LIST) {
|
||||||
if (url.endsWith(ignoreAuth)) {
|
if(MATCHER.match(ignoreAuth,url)){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,12 @@ public interface IJeecgDemoService extends JeecgService<JeecgDemo> {
|
|||||||
* @return demo对象
|
* @return demo对象
|
||||||
*/
|
*/
|
||||||
public JeecgDemo getByIdCacheable(String id);
|
public JeecgDemo getByIdCacheable(String id);
|
||||||
|
/**
|
||||||
|
* 通过id过去demo数据,先读缓存,在读数据库
|
||||||
|
* @param id 数据库id
|
||||||
|
* @return demo对象
|
||||||
|
*/
|
||||||
|
public JeecgDemo getByIdCacheableTTL(String id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询列表数据 在service中获取数据权限sql信息
|
* 查询列表数据 在service中获取数据权限sql信息
|
||||||
|
@ -71,6 +71,22 @@ public class JeecgDemoServiceImpl extends ServiceImpl<JeecgDemoMapper, JeecgDemo
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Cacheable自定义TTL:#60(单位是秒,目前只支持这一种格式)
|
||||||
|
* 通过注解方式,指定缓存有效期60秒
|
||||||
|
*
|
||||||
|
* 参考博客:https://www.cnblogs.com/h2285409/p/18324396
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Cacheable(cacheNames = "ceshi:redis:ttl#60", key = "#id")
|
||||||
|
public JeecgDemo getByIdCacheableTTL(String id) {
|
||||||
|
JeecgDemo t = jeecgDemoMapper.selectById(id);
|
||||||
|
System.err.println("---未读缓存,读取数据库---");
|
||||||
|
System.err.println(t);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IPage<JeecgDemo> queryListWithPermission(int pageSize,int pageNo) {
|
public IPage<JeecgDemo> queryListWithPermission(int pageSize,int pageNo) {
|
||||||
Page<JeecgDemo> page = new Page<>(pageNo, pageSize);
|
Page<JeecgDemo> page = new Page<>(pageNo, pageSize);
|
||||||
|
@ -26,8 +26,11 @@ public class CodeTemplateInitListener implements ApplicationListener<Application
|
|||||||
@Override
|
@Override
|
||||||
public void onApplicationEvent(ApplicationReadyEvent event) {
|
public void onApplicationEvent(ApplicationReadyEvent event) {
|
||||||
try {
|
try {
|
||||||
log.info(" Init Code Generate Template [ 检测如果是JAR启动环境,Copy模板到config目录 ] ");
|
long startTime = System.currentTimeMillis(); // 记录开始时间
|
||||||
|
log.info(" Init Code Generate Template [ 检测如果是JAR启动,Copy模板到config目录 ] ");
|
||||||
this.initJarConfigCodeGeneratorTemplate();
|
this.initJarConfigCodeGeneratorTemplate();
|
||||||
|
long endTime = System.currentTimeMillis(); // 记录结束时间
|
||||||
|
log.info(" Init Code Generate Template completed in " + (endTime - startTime) + " ms"); // 计算并记录耗时
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -1,33 +1,33 @@
|
|||||||
package org.jeecg.config.init;
|
//package org.jeecg.config.init;
|
||||||
|
//
|
||||||
import org.apache.catalina.Context;
|
//import org.apache.catalina.Context;
|
||||||
import org.apache.tomcat.util.scan.StandardJarScanner;
|
//import org.apache.tomcat.util.scan.StandardJarScanner;
|
||||||
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
|
//import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
|
||||||
import org.springframework.context.annotation.Bean;
|
//import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
//import org.springframework.context.annotation.Configuration;
|
||||||
|
//
|
||||||
/**
|
///**
|
||||||
* @Description: TomcatFactoryConfig
|
// * @Description: TomcatFactoryConfig
|
||||||
* @author: scott
|
// * @author: scott
|
||||||
* @date: 2021年01月25日 11:40
|
// * @date: 2021年01月25日 11:40
|
||||||
*/
|
// */
|
||||||
@Configuration
|
//@Configuration
|
||||||
public class TomcatFactoryConfig {
|
//public class TomcatFactoryConfig {
|
||||||
/**
|
// /**
|
||||||
* tomcat-embed-jasper引用后提示jar找不到的问题
|
// * tomcat-embed-jasper引用后提示jar找不到的问题
|
||||||
*/
|
// */
|
||||||
@Bean
|
// @Bean
|
||||||
public TomcatServletWebServerFactory tomcatFactory() {
|
// public TomcatServletWebServerFactory tomcatFactory() {
|
||||||
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
|
// TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
|
||||||
@Override
|
// @Override
|
||||||
protected void postProcessContext(Context context) {
|
// protected void postProcessContext(Context context) {
|
||||||
((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
|
// ((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
|
||||||
}
|
// }
|
||||||
};
|
// };
|
||||||
factory.addConnectorCustomizers(connector -> {
|
// factory.addConnectorCustomizers(connector -> {
|
||||||
connector.setProperty("relaxedPathChars", "[]{}");
|
// connector.setProperty("relaxedPathChars", "[]{}");
|
||||||
connector.setProperty("relaxedQueryChars", "[]{}");
|
// connector.setProperty("relaxedQueryChars", "[]{}");
|
||||||
});
|
// });
|
||||||
return factory;
|
// return factory;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
@ -88,8 +88,10 @@ public class LoginController {
|
|||||||
}
|
}
|
||||||
String lowerCaseCaptcha = captcha.toLowerCase();
|
String lowerCaseCaptcha = captcha.toLowerCase();
|
||||||
// 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可
|
// 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可
|
||||||
String origin = lowerCaseCaptcha+sysLoginModel.getCheckKey()+jeecgBaseConfig.getSignatureSecret();
|
//update-begin---author:chenrui ---date:20250107 for:[QQYUN-10775]验证码可以复用 #7674------------
|
||||||
String realKey = Md5Util.md5Encode(origin, "utf-8");
|
String keyPrefix = Md5Util.md5Encode(sysLoginModel.getCheckKey()+jeecgBaseConfig.getSignatureSecret(), "utf-8");
|
||||||
|
String realKey = keyPrefix + lowerCaseCaptcha;
|
||||||
|
//update-end---author:chenrui ---date:20250107 for:[QQYUN-10775]验证码可以复用 #7674------------
|
||||||
Object checkCode = redisUtil.get(realKey);
|
Object checkCode = redisUtil.get(realKey);
|
||||||
//当进入登录页时,有一定几率出现验证码错误 #1714
|
//当进入登录页时,有一定几率出现验证码错误 #1714
|
||||||
if(checkCode==null || !checkCode.toString().equals(lowerCaseCaptcha)) {
|
if(checkCode==null || !checkCode.toString().equals(lowerCaseCaptcha)) {
|
||||||
@ -533,10 +535,12 @@ public class LoginController {
|
|||||||
|
|
||||||
//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
|
//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
|
||||||
// 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可
|
// 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可
|
||||||
String origin = lowerCaseCode+key+jeecgBaseConfig.getSignatureSecret();
|
//update-begin---author:chenrui ---date:20250107 for:[QQYUN-10775]验证码可以复用 #7674------------
|
||||||
String realKey = Md5Util.md5Encode(origin, "utf-8");
|
String keyPrefix = Md5Util.md5Encode(key+jeecgBaseConfig.getSignatureSecret(), "utf-8");
|
||||||
|
String realKey = keyPrefix + lowerCaseCode;
|
||||||
//update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
|
//update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
|
||||||
|
redisUtil.removeAll(keyPrefix);
|
||||||
|
//update-end---author:chenrui ---date:20250107 for:[QQYUN-10775]验证码可以复用 #7674------------
|
||||||
redisUtil.set(realKey, lowerCaseCode, 60);
|
redisUtil.set(realKey, lowerCaseCode, 60);
|
||||||
log.info("获取验证码,Redis key = {},checkCode = {}", realKey, code);
|
log.info("获取验证码,Redis key = {},checkCode = {}", realKey, code);
|
||||||
//返回前端
|
//返回前端
|
||||||
|
@ -101,7 +101,13 @@ public class SysRoleController {
|
|||||||
public Result<IPage<SysRole>> queryPageList(SysRole role,
|
public Result<IPage<SysRole>> queryPageList(SysRole role,
|
||||||
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
|
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
|
||||||
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
|
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
|
||||||
|
@RequestParam(name="isMultiTranslate", required = false) Boolean isMultiTranslate,
|
||||||
HttpServletRequest req) {
|
HttpServletRequest req) {
|
||||||
|
//update-begin---author:wangshuai---date:2025-03-26---for:【issues/7948】角色解决根据id查询回显不对---
|
||||||
|
if(null != isMultiTranslate && isMultiTranslate){
|
||||||
|
pageSize = 100;
|
||||||
|
}
|
||||||
|
//update-end---author:wangshuai---date:2025-03-26---for:【issues/7948】角色解决根据id查询回显不对---
|
||||||
Result<IPage<SysRole>> result = new Result<IPage<SysRole>>();
|
Result<IPage<SysRole>> result = new Result<IPage<SysRole>>();
|
||||||
//QueryWrapper<SysRole> queryWrapper = QueryGenerator.initQueryWrapper(role, req.getParameterMap());
|
//QueryWrapper<SysRole> queryWrapper = QueryGenerator.initQueryWrapper(role, req.getParameterMap());
|
||||||
//IPage<SysRole> pageList = sysRoleService.page(page, queryWrapper);
|
//IPage<SysRole> pageList = sysRoleService.page(page, queryWrapper);
|
||||||
|
@ -23,7 +23,11 @@ import org.jeecg.common.util.oConvertUtils;
|
|||||||
import org.jeecg.config.mybatis.MybatisPlusSaasConfig;
|
import org.jeecg.config.mybatis.MybatisPlusSaasConfig;
|
||||||
import org.jeecg.modules.base.service.BaseCommonService;
|
import org.jeecg.modules.base.service.BaseCommonService;
|
||||||
import org.jeecg.modules.system.entity.*;
|
import org.jeecg.modules.system.entity.*;
|
||||||
import org.jeecg.modules.system.service.*;
|
import org.jeecg.modules.system.service.ISysTenantPackService;
|
||||||
|
import org.jeecg.modules.system.service.ISysTenantService;
|
||||||
|
import org.jeecg.modules.system.service.ISysUserService;
|
||||||
|
import org.jeecg.modules.system.service.ISysUserTenantService;
|
||||||
|
import org.jeecg.modules.system.service.ISysDepartService;
|
||||||
import org.jeecg.modules.system.vo.SysUserTenantVo;
|
import org.jeecg.modules.system.vo.SysUserTenantVo;
|
||||||
import org.jeecg.modules.system.vo.tenant.TenantDepartAuthInfo;
|
import org.jeecg.modules.system.vo.tenant.TenantDepartAuthInfo;
|
||||||
import org.jeecg.modules.system.vo.tenant.TenantPackModel;
|
import org.jeecg.modules.system.vo.tenant.TenantPackModel;
|
||||||
|
@ -136,7 +136,7 @@
|
|||||||
|
|
||||||
<!--根据用户id获取用户id和部门名称-->
|
<!--根据用户id获取用户id和部门名称-->
|
||||||
<select id="getUserDepartByTenantUserId" resultType="org.jeecg.modules.system.vo.SysUserDepVo">
|
<select id="getUserDepartByTenantUserId" resultType="org.jeecg.modules.system.vo.SysUserDepVo">
|
||||||
SELECT sd.depart_name, sud.user_id
|
SELECT sd.depart_name, sud.user_id, sd.id as deptId, sd.parent_id
|
||||||
FROM sys_depart sd
|
FROM sys_depart sd
|
||||||
RIGHT JOIN sys_user_depart sud on sd.id = sud.dep_id and sd.del_flag = 0
|
RIGHT JOIN sys_user_depart sud on sd.id = sud.dep_id and sd.del_flag = 0
|
||||||
WHERE sud.user_id IN
|
WHERE sud.user_id IN
|
||||||
|
@ -23,6 +23,20 @@
|
|||||||
</otherwise>
|
</otherwise>
|
||||||
</choose>
|
</choose>
|
||||||
</if>
|
</if>
|
||||||
|
<!--增加id查询 for:【issues/7948】角色解决根据id查询回显不对-->
|
||||||
|
<if test="role.id!='' and role.id!=null">
|
||||||
|
<choose>
|
||||||
|
<when test="role.id.indexOf(',') != -1">
|
||||||
|
AND id in
|
||||||
|
<foreach item="item" index="index" collection="role.id.split(',')" open="(" separator="," close=")">
|
||||||
|
#{item}
|
||||||
|
</foreach>
|
||||||
|
</when>
|
||||||
|
<otherwise>
|
||||||
|
AND id = #{role.id}
|
||||||
|
</otherwise>
|
||||||
|
</choose>
|
||||||
|
</if>
|
||||||
order by create_time desc
|
order by create_time desc
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
@ -43,8 +43,7 @@
|
|||||||
<select id="queryTenantPackUserCount" resultType="org.jeecg.modules.system.vo.tenant.TenantPackUserCount">
|
<select id="queryTenantPackUserCount" resultType="org.jeecg.modules.system.vo.tenant.TenantPackUserCount">
|
||||||
SELECT pack_code, count(*) as user_count FROM sys_tenant_pack a
|
SELECT pack_code, count(*) as user_count FROM sys_tenant_pack a
|
||||||
join sys_tenant_pack_user b on a.id = b.pack_id
|
join sys_tenant_pack_user b on a.id = b.pack_id
|
||||||
join sys_user_tenant sut on a.tenant_id = sut.tenant_id and b.user_id = sut.user_id and sut.status = 1
|
where a.tenant_id = #{tenantId} and b.tenant_id = #{tenantId}
|
||||||
where a.tenant_id = #{tenantId}
|
|
||||||
and a.pack_code in ('superAdmin', 'accountAdmin', 'appAdmin')
|
and a.pack_code in ('superAdmin', 'accountAdmin', 'appAdmin')
|
||||||
and b.status = 1
|
and b.status = 1
|
||||||
group by a.pack_code
|
group by a.pack_code
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package org.jeecg.modules.system.service;
|
package org.jeecg.modules.system.service;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
|
||||||
import org.jeecg.modules.system.entity.SysTenantPack;
|
import org.jeecg.modules.system.entity.SysTenantPack;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import org.jeecg.modules.system.entity.SysTenantPackUser;
|
import org.jeecg.modules.system.entity.SysTenantPackUser;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -26,6 +26,7 @@ import org.jeecg.modules.system.vo.SysCommentVO;
|
|||||||
import org.jeecg.modules.system.vo.UserAvatar;
|
import org.jeecg.modules.system.vo.UserAvatar;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.util.FileCopyUtils;
|
import org.springframework.util.FileCopyUtils;
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package org.jeecg.modules.system.service.impl;
|
package org.jeecg.modules.system.service.impl;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
||||||
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.SecurityUtils;
|
||||||
import org.jeecg.common.constant.SymbolConstant;
|
import org.jeecg.common.constant.SymbolConstant;
|
||||||
import org.jeecg.common.constant.TenantConstant;
|
import org.jeecg.common.constant.TenantConstant;
|
||||||
@ -10,6 +9,7 @@ import org.jeecg.common.util.SpringContextUtils;
|
|||||||
import org.jeecg.common.util.oConvertUtils;
|
import org.jeecg.common.util.oConvertUtils;
|
||||||
import org.jeecg.modules.aop.TenantLog;
|
import org.jeecg.modules.aop.TenantLog;
|
||||||
import org.jeecg.modules.system.entity.SysPackPermission;
|
import org.jeecg.modules.system.entity.SysPackPermission;
|
||||||
|
import org.jeecg.modules.system.entity.SysTenant;
|
||||||
import org.jeecg.modules.system.entity.SysTenantPack;
|
import org.jeecg.modules.system.entity.SysTenantPack;
|
||||||
import org.jeecg.modules.system.entity.SysTenantPackUser;
|
import org.jeecg.modules.system.entity.SysTenantPackUser;
|
||||||
import org.jeecg.modules.system.mapper.SysPackPermissionMapper;
|
import org.jeecg.modules.system.mapper.SysPackPermissionMapper;
|
||||||
@ -20,6 +20,8 @@ import org.jeecg.modules.system.service.ISysTenantPackService;
|
|||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -55,6 +55,7 @@ import org.jeecgframework.poi.excel.entity.ImportParams;
|
|||||||
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
|
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
|
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.cache.annotation.CacheEvict;
|
import org.springframework.cache.annotation.CacheEvict;
|
||||||
import org.springframework.cache.annotation.Cacheable;
|
import org.springframework.cache.annotation.Cacheable;
|
||||||
@ -265,7 +266,13 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||||||
@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
|
@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public boolean deleteUser(String userId) {
|
public boolean deleteUser(String userId) {
|
||||||
//1.删除用户
|
//update-begin---author:wangshuai---date:2024-01-16---for:【QQYUN-7974】admin用户禁止删除---
|
||||||
|
//1.验证当前用户是管理员账号 admin
|
||||||
|
//验证用户是否为管理员
|
||||||
|
this.checkUserAdminRejectDel(userId);
|
||||||
|
//update-end---author:wangshuai---date:2024-01-16---for:【QQYUN-7974】admin用户禁止删除---
|
||||||
|
|
||||||
|
//2.删除用户
|
||||||
this.removeById(userId);
|
this.removeById(userId);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -274,7 +281,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||||||
@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
|
@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public boolean deleteBatchUsers(String userIds) {
|
public boolean deleteBatchUsers(String userIds) {
|
||||||
//1.删除用户
|
//1.验证当前用户是管理员账号 admin
|
||||||
|
this.checkUserAdminRejectDel(userIds);
|
||||||
|
//2.删除用户
|
||||||
this.removeByIds(Arrays.asList(userIds.split(",")));
|
this.removeByIds(Arrays.asList(userIds.split(",")));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -875,7 +884,6 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||||||
SysUserTenant userTenant = new SysUserTenant();
|
SysUserTenant userTenant = new SysUserTenant();
|
||||||
userTenant.setStatus(CommonConstant.USER_TENANT_QUIT);
|
userTenant.setStatus(CommonConstant.USER_TENANT_QUIT);
|
||||||
userTenantMapper.update(userTenant,query);
|
userTenantMapper.update(userTenant,query);
|
||||||
//update-end---author:wangshuai ---date:20230111 for:[QQYUN-3951]租户用户离职重构------------
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -1901,7 +1909,6 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void changePhone(JSONObject json, String username) {
|
public void changePhone(JSONObject json, String username) {
|
||||||
String smscode = json.getString("smscode");
|
String smscode = json.getString("smscode");
|
||||||
@ -1935,7 +1942,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||||||
userMapper.updateById(sysUser);
|
userMapper.updateById(sysUser);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 验证手机号
|
* 验证手机号
|
||||||
*
|
*
|
||||||
@ -1955,7 +1962,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||||||
//验证完成之后清空手机验证码
|
//验证完成之后清空手机验证码
|
||||||
redisUtil.removeAll(phoneKey);
|
redisUtil.removeAll(phoneKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendChangePhoneSms(JSONObject jsonObject, String username, String ipAddress) {
|
public void sendChangePhoneSms(JSONObject jsonObject, String username, String ipAddress) {
|
||||||
String type = jsonObject.getString("type");
|
String type = jsonObject.getString("type");
|
||||||
|
@ -12,4 +12,13 @@ import lombok.Data;
|
|||||||
public class SysUserDepVo {
|
public class SysUserDepVo {
|
||||||
private String userId;
|
private String userId;
|
||||||
private String departName;
|
private String departName;
|
||||||
|
/**
|
||||||
|
* 部门id
|
||||||
|
*/
|
||||||
|
private String deptId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 部门的父级id
|
||||||
|
*/
|
||||||
|
private String parentId;
|
||||||
}
|
}
|
||||||
|
@ -208,7 +208,11 @@
|
|||||||
exportConfig: {
|
exportConfig: {
|
||||||
name: "${tableVo.ftlDescription}",
|
name: "${tableVo.ftlDescription}",
|
||||||
url: getExportUrl,
|
url: getExportUrl,
|
||||||
|
<#if is_range>
|
||||||
|
params: setRangeQuery,
|
||||||
|
<#else>
|
||||||
params: queryParam,
|
params: queryParam,
|
||||||
|
</#if>
|
||||||
},
|
},
|
||||||
importConfig: {
|
importConfig: {
|
||||||
url: getImportUrl,
|
url: getImportUrl,
|
||||||
|
@ -234,7 +234,11 @@
|
|||||||
exportConfig: {
|
exportConfig: {
|
||||||
name:"${tableVo.ftlDescription}",
|
name:"${tableVo.ftlDescription}",
|
||||||
url: getExportUrl,
|
url: getExportUrl,
|
||||||
|
<#if is_range>
|
||||||
|
params: setRangeQuery,
|
||||||
|
<#else>
|
||||||
params: queryParam,
|
params: queryParam,
|
||||||
|
</#if>
|
||||||
},
|
},
|
||||||
importConfig: {
|
importConfig: {
|
||||||
url: getImportUrl,
|
url: getImportUrl,
|
||||||
|
@ -213,7 +213,11 @@
|
|||||||
exportConfig: {
|
exportConfig: {
|
||||||
name:"${tableVo.ftlDescription}",
|
name:"${tableVo.ftlDescription}",
|
||||||
url: getExportUrl,
|
url: getExportUrl,
|
||||||
|
<#if is_range>
|
||||||
|
params: setRangeQuery,
|
||||||
|
<#else>
|
||||||
params: queryParam,
|
params: queryParam,
|
||||||
|
</#if>
|
||||||
},
|
},
|
||||||
importConfig: {
|
importConfig: {
|
||||||
url: getImportUrl,
|
url: getImportUrl,
|
||||||
|
@ -36,7 +36,7 @@ public class FlywayConfig {
|
|||||||
*/
|
*/
|
||||||
@Value("${spring.flyway.enabled:false}")
|
@Value("${spring.flyway.enabled:false}")
|
||||||
private Boolean enabled;
|
private Boolean enabled;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 编码格式,默认UTF-8
|
* 编码格式,默认UTF-8
|
||||||
*/
|
*/
|
||||||
@ -102,7 +102,7 @@ public class FlywayConfig {
|
|||||||
if(!enabled){
|
if(!enabled){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
|
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
|
||||||
Map<String, DataSource> dataSources = ds.getDataSources();
|
Map<String, DataSource> dataSources = ds.getDataSources();
|
||||||
dataSources.forEach((k, v) -> {
|
dataSources.forEach((k, v) -> {
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
server:
|
server:
|
||||||
port: 8080
|
port: 8080
|
||||||
tomcat:
|
undertow:
|
||||||
max-swallow-size: -1
|
# max-http-post-size: 10MB # 平替 tomcat server.tomcat.max-swallow-siz, undertow该值默认为-1
|
||||||
|
worker-threads: 16 # 4核CPU标准配置
|
||||||
|
buffers:
|
||||||
|
websocket: 8192 # WebSocket缓冲 以字节为单位,这里设置为8 KB
|
||||||
|
io: 16384 # IO操作缓冲 以字节为单位,这里设置为16 KB
|
||||||
error:
|
error:
|
||||||
include-exception: true
|
include-exception: true
|
||||||
include-stacktrace: ALWAYS
|
include-stacktrace: ALWAYS
|
||||||
@ -269,11 +273,6 @@ jeecg:
|
|||||||
app-id: ??
|
app-id: ??
|
||||||
api-key: ??
|
api-key: ??
|
||||||
secret-key: ??
|
secret-key: ??
|
||||||
# ElasticSearch 6设置
|
|
||||||
elasticsearch:
|
|
||||||
cluster-name: jeecg-ES
|
|
||||||
cluster-nodes: 127.0.0.1:9200
|
|
||||||
check-enabled: false
|
|
||||||
#cas单点登录
|
#cas单点登录
|
||||||
cas:
|
cas:
|
||||||
prefixUrl: http://cas.example.org:8443/cas
|
prefixUrl: http://cas.example.org:8443/cas
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
server:
|
server:
|
||||||
port: 8080
|
port: 8080
|
||||||
tomcat:
|
undertow:
|
||||||
max-swallow-size: -1
|
# max-http-post-size: 10MB # 平替 tomcat server.tomcat.max-swallow-siz, undertow该值默认为-1
|
||||||
|
worker-threads: 16 # 4核CPU标准配置
|
||||||
|
buffers:
|
||||||
|
websocket: 8192 # WebSocket缓冲 以字节为单位,这里设置为8 KB
|
||||||
|
io: 16384 # IO操作缓冲 以字节为单位,这里设置为16 KB
|
||||||
error:
|
error:
|
||||||
include-exception: true
|
include-exception: true
|
||||||
include-stacktrace: ALWAYS
|
include-stacktrace: ALWAYS
|
||||||
@ -230,11 +234,6 @@ jeecg:
|
|||||||
password:
|
password:
|
||||||
type: STANDALONE
|
type: STANDALONE
|
||||||
enabled: true
|
enabled: true
|
||||||
# ElasticSearch 6设置
|
|
||||||
elasticsearch:
|
|
||||||
cluster-name: jeecg-ES
|
|
||||||
cluster-nodes: 127.0.0.1:9200
|
|
||||||
check-enabled: false
|
|
||||||
#cas单点登录
|
#cas单点登录
|
||||||
cas:
|
cas:
|
||||||
prefixUrl: http://cas.example.org:8443/cas
|
prefixUrl: http://cas.example.org:8443/cas
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
server:
|
server:
|
||||||
port: 8080
|
port: 8080
|
||||||
tomcat:
|
undertow:
|
||||||
max-swallow-size: -1
|
# max-http-post-size: 10MB # 平替 tomcat server.tomcat.max-swallow-siz, undertow该值默认为-1
|
||||||
|
worker-threads: 16 # 4核CPU标准配置
|
||||||
|
buffers:
|
||||||
|
websocket: 8192 # WebSocket缓冲 以字节为单位,这里设置为8 KB
|
||||||
|
io: 16384 # IO操作缓冲 以字节为单位,这里设置为16 KB
|
||||||
error:
|
error:
|
||||||
include-exception: true
|
include-exception: true
|
||||||
include-stacktrace: ALWAYS
|
include-stacktrace: ALWAYS
|
||||||
@ -209,11 +213,6 @@ jeecg:
|
|||||||
secretKey: ??
|
secretKey: ??
|
||||||
endpoint: oss-cn-beijing.aliyuncs.com
|
endpoint: oss-cn-beijing.aliyuncs.com
|
||||||
bucketName: jeecgdev
|
bucketName: jeecgdev
|
||||||
# ElasticSearch 6设置
|
|
||||||
elasticsearch:
|
|
||||||
cluster-name: jeecg-ES
|
|
||||||
cluster-nodes: 127.0.0.1:9200
|
|
||||||
check-enabled: false
|
|
||||||
# 在线预览文件服务器地址配置
|
# 在线预览文件服务器地址配置
|
||||||
file-view-domain: http://fileview.jeecg.com
|
file-view-domain: http://fileview.jeecg.com
|
||||||
# minio文件上传
|
# minio文件上传
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
server:
|
server:
|
||||||
port: 8080
|
port: 8080
|
||||||
tomcat:
|
undertow:
|
||||||
max-swallow-size: -1
|
worker-threads: 16
|
||||||
error:
|
error:
|
||||||
include-exception: true
|
include-exception: true
|
||||||
include-stacktrace: ALWAYS
|
include-stacktrace: ALWAYS
|
||||||
@ -22,7 +22,7 @@ management:
|
|||||||
spring:
|
spring:
|
||||||
flyway:
|
flyway:
|
||||||
# 是否启用flyway
|
# 是否启用flyway
|
||||||
enabled: false
|
enabled: true
|
||||||
# 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库,非常重要!!!
|
# 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库,非常重要!!!
|
||||||
clean-disabled: true
|
clean-disabled: true
|
||||||
servlet:
|
servlet:
|
||||||
@ -230,11 +230,7 @@ jeecg:
|
|||||||
SMS_465391221:
|
SMS_465391221:
|
||||||
# 注册账号短信模板编码
|
# 注册账号短信模板编码
|
||||||
SMS_175430166:
|
SMS_175430166:
|
||||||
# ElasticSearch 设置
|
SMS_461885023:
|
||||||
elasticsearch:
|
|
||||||
cluster-name: jeecg-ES
|
|
||||||
cluster-nodes: 127.0.0.1:9200
|
|
||||||
check-enabled: false
|
|
||||||
# 在线预览文件服务器地址配置
|
# 在线预览文件服务器地址配置
|
||||||
file-view-domain: http://fileview.jeecg.com
|
file-view-domain: http://fileview.jeecg.com
|
||||||
# minio文件上传
|
# minio文件上传
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
server:
|
server:
|
||||||
port: 8080
|
port: 8080
|
||||||
tomcat:
|
undertow:
|
||||||
max-swallow-size: -1
|
worker-threads: 16
|
||||||
error:
|
error:
|
||||||
include-exception: true
|
include-exception: true
|
||||||
include-stacktrace: ALWAYS
|
include-stacktrace: ALWAYS
|
||||||
@ -22,9 +22,9 @@ management:
|
|||||||
spring:
|
spring:
|
||||||
flyway:
|
flyway:
|
||||||
# 是否启用flyway
|
# 是否启用flyway
|
||||||
enabled: false
|
enabled: true
|
||||||
# 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库,非常重要!!!
|
# 迁移sql脚本存放路径
|
||||||
clean-disabled: true
|
locations: classpath:flyway/sql/mysql
|
||||||
servlet:
|
servlet:
|
||||||
multipart:
|
multipart:
|
||||||
max-file-size: 10MB
|
max-file-size: 10MB
|
||||||
@ -270,11 +270,6 @@ jeecg:
|
|||||||
app-id: ??
|
app-id: ??
|
||||||
api-key: ??
|
api-key: ??
|
||||||
secret-key: ??
|
secret-key: ??
|
||||||
# ElasticSearch 设置
|
|
||||||
elasticsearch:
|
|
||||||
cluster-name: jeecg-ES
|
|
||||||
cluster-nodes: 192.168.1.188:9200
|
|
||||||
check-enabled: false
|
|
||||||
#Mybatis输出sql日志
|
#Mybatis输出sql日志
|
||||||
logging:
|
logging:
|
||||||
level:
|
level:
|
||||||
|
@ -1,47 +1,47 @@
|
|||||||
//package org.jeecg;
|
package org.jeecg;
|
||||||
//
|
|
||||||
//import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
//import org.jeecg.common.util.RestUtil;
|
import org.jeecg.common.util.RestUtil;
|
||||||
//import org.springframework.http.HttpHeaders;
|
import org.springframework.http.HttpHeaders;
|
||||||
//import org.springframework.http.HttpMethod;
|
import org.springframework.http.HttpMethod;
|
||||||
//import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
//import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
//
|
|
||||||
///**
|
/**
|
||||||
// * @Description: TODO
|
* @Description: TODO
|
||||||
// * @author: scott
|
* @author: scott
|
||||||
// * @date: 2022年05月10日 14:02
|
* @date: 2022年05月10日 14:02
|
||||||
// */
|
*/
|
||||||
//public class TestMain {
|
public class TestMain {
|
||||||
// public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
// // 请求地址
|
// 请求地址
|
||||||
// String url = "https://api.boot.jeecg.com/sys/user/list";
|
String url = "https://api3.boot.jeecg.com/sys/user/list";
|
||||||
// // 请求 Header (用于传递Token)
|
// 请求 Header (用于传递Token)
|
||||||
// HttpHeaders headers = getHeaders();
|
HttpHeaders headers = getHeaders();
|
||||||
// // 请求方式是 GET 代表获取数据
|
// 请求方式是 GET 代表获取数据
|
||||||
// HttpMethod method = HttpMethod.GET;
|
HttpMethod method = HttpMethod.GET;
|
||||||
//
|
|
||||||
// System.out.println("请求地址:" + url);
|
System.out.println("请求地址:" + url);
|
||||||
// System.out.println("请求方式:" + method);
|
System.out.println("请求方式:" + method);
|
||||||
//
|
|
||||||
// // 利用 RestUtil 请求该url
|
// 利用 RestUtil 请求该url
|
||||||
// ResponseEntity<JSONObject> result = RestUtil.request(url, method, headers, null, null, JSONObject.class);
|
ResponseEntity<JSONObject> result = RestUtil.request(url, method, headers, null, null, JSONObject.class);
|
||||||
// if (result != null && result.getBody() != null) {
|
if (result != null && result.getBody() != null) {
|
||||||
// System.out.println("返回结果:" + result.getBody().toJSONString());
|
System.out.println("返回结果:" + result.getBody().toJSONString());
|
||||||
// } else {
|
} else {
|
||||||
// System.out.println("查询失败");
|
System.out.println("查询失败");
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// private static HttpHeaders getHeaders() {
|
private static HttpHeaders getHeaders() {
|
||||||
// String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.50h-g6INOZRVnznExiawFb1U6PPjcVVA4POeYRA5a5Q";
|
String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.50h-g6INOZRVnznExiawFb1U6PPjcVVA4POeYRA5a5Q";
|
||||||
// System.out.println("请求Token:" + token);
|
System.out.println("请求Token:" + token);
|
||||||
//
|
|
||||||
// HttpHeaders headers = new HttpHeaders();
|
HttpHeaders headers = new HttpHeaders();
|
||||||
// String mediaType = MediaType.APPLICATION_JSON_VALUE;
|
String mediaType = MediaType.APPLICATION_JSON_VALUE;
|
||||||
// headers.setContentType(MediaType.parseMediaType(mediaType));
|
headers.setContentType(MediaType.parseMediaType(mediaType));
|
||||||
// headers.set("Accept", mediaType);
|
headers.set("Accept", mediaType);
|
||||||
// headers.set("X-Access-Token", token);
|
headers.set("X-Access-Token", token);
|
||||||
// return headers;
|
return headers;
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
//}
|
}
|
||||||
|
@ -1,83 +0,0 @@
|
|||||||
package org.jeecg.modules.system.test;
|
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
|
||||||
import org.jeecg.JeecgSystemApplication;
|
|
||||||
import org.jeecg.common.constant.CommonConstant;
|
|
||||||
import org.jeecg.common.system.util.JwtUtil;
|
|
||||||
import org.jeecg.common.util.RedisUtil;
|
|
||||||
import org.jeecg.common.util.RestUtil;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
import org.springframework.http.HttpHeaders;
|
|
||||||
import org.springframework.http.HttpMethod;
|
|
||||||
import org.springframework.http.MediaType;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 系统用户单元测试
|
|
||||||
*/
|
|
||||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = JeecgSystemApplication.class)
|
|
||||||
public class InsertDemoTest {
|
|
||||||
/**
|
|
||||||
* 测试地址:实际使用时替换成你自己的地址
|
|
||||||
*/
|
|
||||||
private final String BASE_URL = "http://localhost:8080/jeecg-boot//test/jeecgDemo/";
|
|
||||||
//测试:用户名和密码
|
|
||||||
private final String USERNAME = "admin";
|
|
||||||
private final String PASSWORD = "123456";
|
|
||||||
@Autowired
|
|
||||||
private RedisUtil redisUtil;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 测试用例:新增
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testAdd() {
|
|
||||||
// 请求地址
|
|
||||||
String url = BASE_URL + "add" ;
|
|
||||||
// 请求 Header (用于传递Token)
|
|
||||||
HttpHeaders headers = this.getHeaders();
|
|
||||||
// 请求方式是 POST 代表提交新增数据
|
|
||||||
HttpMethod method = HttpMethod.POST;
|
|
||||||
|
|
||||||
System.out.println("请求地址:" + url);
|
|
||||||
System.out.println("请求方式:" + method);
|
|
||||||
|
|
||||||
|
|
||||||
for (int i = 0; i < 100; i++) {
|
|
||||||
String name = "李哈哈" + i;
|
|
||||||
JSONObject params = new JSONObject();
|
|
||||||
params.put("name", name);
|
|
||||||
System.out.println("请求参数:" + params.toJSONString());
|
|
||||||
|
|
||||||
// 利用 RestUtil 请求该url
|
|
||||||
ResponseEntity<JSONObject> result = RestUtil.request(url, method, headers, null, params, JSONObject.class);
|
|
||||||
if (result != null && result.getBody() != null) {
|
|
||||||
System.out.println("返回结果:" + result.getBody().toJSONString());
|
|
||||||
} else {
|
|
||||||
System.out.println("查询失败");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private String getToken() {
|
|
||||||
String token = JwtUtil.sign(USERNAME, PASSWORD);
|
|
||||||
redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
|
|
||||||
redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, 60);
|
|
||||||
return token;
|
|
||||||
}
|
|
||||||
|
|
||||||
private HttpHeaders getHeaders() {
|
|
||||||
String token = this.getToken();
|
|
||||||
System.out.println("请求Token:" + token);
|
|
||||||
|
|
||||||
HttpHeaders headers = new HttpHeaders();
|
|
||||||
String mediaType = MediaType.APPLICATION_JSON_VALUE;
|
|
||||||
headers.setContentType(MediaType.parseMediaType(mediaType));
|
|
||||||
headers.set("Accept", mediaType);
|
|
||||||
headers.set("X-Access-Token", token);
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
}
|
|
@ -6,10 +6,9 @@ import org.jeecg.modules.demo.test.entity.JeecgDemo;
|
|||||||
import org.jeecg.modules.demo.test.mapper.JeecgDemoMapper;
|
import org.jeecg.modules.demo.test.mapper.JeecgDemoMapper;
|
||||||
import org.jeecg.modules.demo.test.service.IJeecgDemoService;
|
import org.jeecg.modules.demo.test.service.IJeecgDemoService;
|
||||||
import org.jeecg.modules.system.service.ISysDataLogService;
|
import org.jeecg.modules.system.service.ISysDataLogService;
|
||||||
import org.junit.jupiter.api.Assertions;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -29,7 +28,7 @@ public class SampleTest {
|
|||||||
public void testSelect() {
|
public void testSelect() {
|
||||||
System.out.println(("----- selectAll method test ------"));
|
System.out.println(("----- selectAll method test ------"));
|
||||||
List<JeecgDemo> userList = jeecgDemoMapper.selectList(null);
|
List<JeecgDemo> userList = jeecgDemoMapper.selectList(null);
|
||||||
Assertions.assertEquals(5, userList.size());
|
Assert.isTrue(15==userList.size(),"结果不是5条");
|
||||||
userList.forEach(System.out::println);
|
userList.forEach(System.out::println);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package org.jeecg.modules.system.test;
|
package org.jeecg.modules.system.test;
|
||||||
|
|
||||||
|
import org.aspectj.lang.annotation.Before;
|
||||||
import org.jeecg.JeecgSystemApplication;
|
import org.jeecg.JeecgSystemApplication;
|
||||||
import org.jeecg.common.system.api.ISysBaseAPI;
|
import org.jeecg.common.system.api.ISysBaseAPI;
|
||||||
import org.jeecg.config.JeecgBaseConfig;
|
import org.jeecg.config.JeecgBaseConfig;
|
||||||
@ -8,7 +9,6 @@ import org.junit.jupiter.api.BeforeEach;
|
|||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
import org.springframework.test.context.junit4.SpringRunner;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Description: 系统表白名单测试
|
* @Description: 系统表白名单测试
|
||||||
|
@ -1,175 +0,0 @@
|
|||||||
package org.jeecg.modules.system.test;
|
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
|
||||||
import org.jeecg.JeecgSystemApplication;
|
|
||||||
import org.jeecg.common.constant.CommonConstant;
|
|
||||||
import org.jeecg.common.system.util.JwtUtil;
|
|
||||||
import org.jeecg.common.util.RedisUtil;
|
|
||||||
import org.jeecg.common.util.RestUtil;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
import org.springframework.http.HttpHeaders;
|
|
||||||
import org.springframework.http.HttpMethod;
|
|
||||||
import org.springframework.http.MediaType;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.test.context.junit4.SpringRunner;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 系统用户单元测试
|
|
||||||
*/
|
|
||||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = JeecgSystemApplication.class)
|
|
||||||
public class SysUserTest {
|
|
||||||
/**
|
|
||||||
* 测试地址:实际使用时替换成你自己的地址
|
|
||||||
*/
|
|
||||||
private final String BASE_URL = "http://localhost:8080/jeecg-boot/sys/user/";
|
|
||||||
//测试:用户名和密码
|
|
||||||
private final String USERNAME = "admin";
|
|
||||||
private final String PASSWORD = "123456";
|
|
||||||
@Autowired
|
|
||||||
private RedisUtil redisUtil;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 测试用例:查询记录
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testQuery() {
|
|
||||||
// 请求地址
|
|
||||||
String url = BASE_URL + "list";
|
|
||||||
// 请求 Header (用于传递Token)
|
|
||||||
HttpHeaders headers = this.getHeaders();
|
|
||||||
// 请求方式是 GET 代表获取数据
|
|
||||||
HttpMethod method = HttpMethod.GET;
|
|
||||||
|
|
||||||
System.out.println("请求地址:" + url);
|
|
||||||
System.out.println("请求方式:" + method);
|
|
||||||
|
|
||||||
// 利用 RestUtil 请求该url
|
|
||||||
ResponseEntity<JSONObject> result = RestUtil.request(url, method, headers, null, null, JSONObject.class);
|
|
||||||
if (result != null && result.getBody() != null) {
|
|
||||||
System.out.println("返回结果:" + result.getBody().toJSONString());
|
|
||||||
} else {
|
|
||||||
System.out.println("查询失败");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 测试用例:新增
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testAdd() {
|
|
||||||
// 请求地址
|
|
||||||
String url = BASE_URL + "add" ;
|
|
||||||
// 请求 Header (用于传递Token)
|
|
||||||
HttpHeaders headers = this.getHeaders();
|
|
||||||
// 请求方式是 POST 代表提交新增数据
|
|
||||||
HttpMethod method = HttpMethod.POST;
|
|
||||||
|
|
||||||
System.out.println("请求地址:" + url);
|
|
||||||
System.out.println("请求方式:" + method);
|
|
||||||
|
|
||||||
JSONObject params = new JSONObject();
|
|
||||||
params.put("username", "wangwuTest");
|
|
||||||
params.put("password", "123456");
|
|
||||||
params.put("confirmpassword","123456");
|
|
||||||
params.put("realname", "单元测试");
|
|
||||||
params.put("activitiSync", "1");
|
|
||||||
params.put("userIdentity","1");
|
|
||||||
params.put("workNo","0025");
|
|
||||||
|
|
||||||
System.out.println("请求参数:" + params.toJSONString());
|
|
||||||
|
|
||||||
// 利用 RestUtil 请求该url
|
|
||||||
ResponseEntity<JSONObject> result = RestUtil.request(url, method, headers, null, params, JSONObject.class);
|
|
||||||
if (result != null && result.getBody() != null) {
|
|
||||||
System.out.println("返回结果:" + result.getBody().toJSONString());
|
|
||||||
} else {
|
|
||||||
System.out.println("查询失败");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 测试用例:修改
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testEdit() {
|
|
||||||
// 数据Id
|
|
||||||
String dataId = "1331795062924374018";
|
|
||||||
// 请求地址
|
|
||||||
String url = BASE_URL + "edit";
|
|
||||||
// 请求 Header (用于传递Token)
|
|
||||||
HttpHeaders headers = this.getHeaders();
|
|
||||||
// 请求方式是 PUT 代表提交修改数据
|
|
||||||
HttpMethod method = HttpMethod.PUT;
|
|
||||||
|
|
||||||
System.out.println("请求地址:" + url);
|
|
||||||
System.out.println("请求方式:" + method);
|
|
||||||
|
|
||||||
JSONObject params = new JSONObject();
|
|
||||||
params.put("username", "wangwuTest");
|
|
||||||
params.put("realname", "单元测试1111");
|
|
||||||
params.put("activitiSync", "1");
|
|
||||||
params.put("userIdentity","1");
|
|
||||||
params.put("workNo","0025");
|
|
||||||
params.put("id",dataId);
|
|
||||||
|
|
||||||
System.out.println("请求参数:" + params.toJSONString());
|
|
||||||
|
|
||||||
// 利用 RestUtil 请求该url
|
|
||||||
ResponseEntity<JSONObject> result = RestUtil.request(url, method, headers, null, params, JSONObject.class);
|
|
||||||
if (result != null && result.getBody() != null) {
|
|
||||||
System.out.println("返回结果:" + result.getBody().toJSONString());
|
|
||||||
} else {
|
|
||||||
System.out.println("查询失败");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 测试用例:删除
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testDelete() {
|
|
||||||
// 数据Id
|
|
||||||
String dataId = "1331795062924374018";
|
|
||||||
// 请求地址
|
|
||||||
String url = BASE_URL + "delete" + "?id=" + dataId;
|
|
||||||
// 请求 Header (用于传递Token)
|
|
||||||
HttpHeaders headers = this.getHeaders();
|
|
||||||
// 请求方式是 DELETE 代表删除数据
|
|
||||||
HttpMethod method = HttpMethod.DELETE;
|
|
||||||
|
|
||||||
System.out.println("请求地址:" + url);
|
|
||||||
System.out.println("请求方式:" + method);
|
|
||||||
|
|
||||||
// 利用 RestUtil 请求该url
|
|
||||||
ResponseEntity<JSONObject> result = RestUtil.request(url, method, headers, null, null, JSONObject.class);
|
|
||||||
if (result != null && result.getBody() != null) {
|
|
||||||
System.out.println("返回结果:" + result.getBody().toJSONString());
|
|
||||||
} else {
|
|
||||||
System.out.println("查询失败");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private String getToken() {
|
|
||||||
String token = JwtUtil.sign(USERNAME, PASSWORD);
|
|
||||||
redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
|
|
||||||
redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, 60);
|
|
||||||
return token;
|
|
||||||
}
|
|
||||||
|
|
||||||
private HttpHeaders getHeaders() {
|
|
||||||
String token = this.getToken();
|
|
||||||
System.out.println("请求Token:" + token);
|
|
||||||
|
|
||||||
HttpHeaders headers = new HttpHeaders();
|
|
||||||
String mediaType = MediaType.APPLICATION_JSON_VALUE;
|
|
||||||
headers.setContentType(MediaType.parseMediaType(mediaType));
|
|
||||||
headers.set("Accept", mediaType);
|
|
||||||
headers.set("X-Access-Token", token);
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,6 @@
|
|||||||
package org.jeecg.smallTools;
|
package org.jeecg.smallTools;
|
||||||
|
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2,11 +2,17 @@ package org.jeecg.smallTools;
|
|||||||
|
|
||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.jeecg.common.util.DateUtils;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.LocalTime;
|
||||||
|
import java.time.ZoneId;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 字符串处理测试
|
* 字符串处理测试
|
||||||
@ -37,6 +43,23 @@ public class TestStr {
|
|||||||
System.out.println("length = "+ conditionValueArray.length);
|
System.out.println("length = "+ conditionValueArray.length);
|
||||||
Arrays.stream(conditionValueArray).forEach(System.out::println);
|
Arrays.stream(conditionValueArray).forEach(System.out::println);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getThisDate() {
|
||||||
|
LocalDate d = DateUtils.getLocalDate();
|
||||||
|
System.out.println(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void firstDayOfLastSixMonths() {
|
||||||
|
LocalDate today = LocalDate.now(); // 获取当前日期
|
||||||
|
LocalDate firstDayOfLastSixMonths = today.minusMonths(6).withDayOfMonth(1); // 获取近半年的第一天
|
||||||
|
LocalDateTime firstDateTime = LocalDateTime.of(firstDayOfLastSixMonths, LocalTime.MIN); // 设置时间为当天的最小时间(00:00:00)
|
||||||
|
Date date = Date.from(firstDateTime.atZone(ZoneId.systemDefault()).toInstant()); // 将 LocalDateTime 转换为 Date
|
||||||
|
System.out.println("近半年的第一天的 00:00:00 时间戳:" + date);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testJSONArrayJoin() {
|
public void testJSONArrayJoin() {
|
||||||
@ -67,7 +90,7 @@ public class TestStr {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testSpecialChar() {
|
public void testSpecialChar() {
|
||||||
String str = "Hello, World! 你好!这是一段特殊符号的测试,This is a test string with special characters: @#$%^&*";
|
String str = "Hello, World! 你好!这是一段特殊符号的测试,This is__ a test string with special characters: @#$%^&*";
|
||||||
// 使用正则表达式替换特殊字符
|
// 使用正则表达式替换特殊字符
|
||||||
String replacedStr = str.replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5]", "");
|
String replacedStr = str.replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5]", "");
|
||||||
System.out.println("Replaced String: " + replacedStr);
|
System.out.println("Replaced String: " + replacedStr);
|
||||||
|
@ -9,7 +9,7 @@ import com.alibaba.nacos.api.NacosFactory;
|
|||||||
import com.alibaba.nacos.api.config.ConfigService;
|
import com.alibaba.nacos.api.config.ConfigService;
|
||||||
import com.alibaba.nacos.api.config.listener.Listener;
|
import com.alibaba.nacos.api.config.listener.Listener;
|
||||||
import com.alibaba.nacos.api.exception.NacosException;
|
import com.alibaba.nacos.api.exception.NacosException;
|
||||||
import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.ObjectUtils;
|
import org.apache.commons.lang3.ObjectUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
@ -35,8 +35,8 @@
|
|||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<log4j2.version>2.17.0</log4j2.version>
|
<log4j2.version>2.17.0</log4j2.version>
|
||||||
<dm8.version>8.1.1.49</dm8.version>
|
|
||||||
<nacos.version>2.3.2</nacos.version>
|
<nacos.version>2.3.2</nacos.version>
|
||||||
|
<dm8.version>8.1.1.49</dm8.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
package com.xxl.job.admin.core.old;//package com.xxl.job.admin.core.jobbean;
|
|
||||||
//
|
|
||||||
//import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
|
|
||||||
//import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
|
|
||||||
//import org.quartz.JobExecutionContext;
|
|
||||||
//import org.quartz.JobExecutionException;
|
|
||||||
//import org.quartz.JobKey;
|
|
||||||
//import org.slf4j.Logger;
|
|
||||||
//import org.slf4j.LoggerFactory;
|
|
||||||
//import org.springframework.scheduling.quartz.QuartzJobBean;
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * http job bean
|
|
||||||
// * “@DisallowConcurrentExecution” disable concurrent, thread size can not be only one, better given more
|
|
||||||
// * @author xuxueli 2015-12-17 18:20:34
|
|
||||||
// */
|
|
||||||
////@DisallowConcurrentExecution
|
|
||||||
//public class RemoteHttpJobBean extends QuartzJobBean {
|
|
||||||
// private static Logger logger = LoggerFactory.getLogger(RemoteHttpJobBean.class);
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// protected void executeInternal(JobExecutionContext context)
|
|
||||||
// throws JobExecutionException {
|
|
||||||
//
|
|
||||||
// // load jobId
|
|
||||||
// JobKey jobKey = context.getTrigger().getJobKey();
|
|
||||||
// Integer jobId = Integer.valueOf(jobKey.getName());
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//}
|
|
@ -1,413 +0,0 @@
|
|||||||
package com.xxl.job.admin.core.old;//package com.xxl.job.admin.core.schedule;
|
|
||||||
//
|
|
||||||
//import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
|
|
||||||
//import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
|
|
||||||
//import com.xxl.job.admin.core.model.XxlJobInfo;
|
|
||||||
//import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
|
|
||||||
//import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
|
|
||||||
//import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
|
|
||||||
//import com.xxl.job.admin.core.util.I18nUtil;
|
|
||||||
//import com.xxl.job.core.biz.AdminBiz;
|
|
||||||
//import com.xxl.job.core.biz.ExecutorBiz;
|
|
||||||
//import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
|
|
||||||
//import com.xxl.rpc.remoting.invoker.XxlRpcInvokerFactory;
|
|
||||||
//import com.xxl.rpc.remoting.invoker.call.CallType;
|
|
||||||
//import com.xxl.rpc.remoting.invoker.reference.XxlRpcReferenceBean;
|
|
||||||
//import com.xxl.rpc.remoting.invoker.route.LoadBalance;
|
|
||||||
//import com.xxl.rpc.remoting.net.NetEnum;
|
|
||||||
//import com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler;
|
|
||||||
//import com.xxl.rpc.remoting.provider.XxlRpcProviderFactory;
|
|
||||||
//import com.xxl.rpc.serialize.Serializer;
|
|
||||||
//import org.quartz.*;
|
|
||||||
//import org.quartz.Trigger.TriggerState;
|
|
||||||
//import org.quartz.impl.triggers.CronTriggerImpl;
|
|
||||||
//import org.slf4j.Logger;
|
|
||||||
//import org.slf4j.LoggerFactory;
|
|
||||||
//import org.springframework.util.Assert;
|
|
||||||
//
|
|
||||||
//import javax.servlet.ServletException;
|
|
||||||
//import javax.servlet.http.HttpServletRequest;
|
|
||||||
//import javax.servlet.http.HttpServletResponse;
|
|
||||||
//import java.io.IOException;
|
|
||||||
//import java.util.Date;
|
|
||||||
//import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * base quartz scheduler util
|
|
||||||
// * @author xuxueli 2015-12-19 16:13:53
|
|
||||||
// */
|
|
||||||
//public final class XxlJobDynamicScheduler {
|
|
||||||
// private static final Logger logger = LoggerFactory.getLogger(XxlJobDynamicScheduler_old.class);
|
|
||||||
//
|
|
||||||
// // ---------------------- param ----------------------
|
|
||||||
//
|
|
||||||
// // scheduler
|
|
||||||
// private static Scheduler scheduler;
|
|
||||||
// public void setScheduler(Scheduler scheduler) {
|
|
||||||
// XxlJobDynamicScheduler_old.scheduler = scheduler;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// // ---------------------- init + destroy ----------------------
|
|
||||||
// public void start() throws Exception {
|
|
||||||
// // valid
|
|
||||||
// Assert.notNull(scheduler, "quartz scheduler is null");
|
|
||||||
//
|
|
||||||
// // init i18n
|
|
||||||
// initI18n();
|
|
||||||
//
|
|
||||||
// // admin registry monitor run
|
|
||||||
// JobRegistryMonitorHelper.getInstance().start();
|
|
||||||
//
|
|
||||||
// // admin monitor run
|
|
||||||
// JobFailMonitorHelper.getInstance().start();
|
|
||||||
//
|
|
||||||
// // admin-server
|
|
||||||
// initRpcProvider();
|
|
||||||
//
|
|
||||||
// logger.info(">>>>>>>>> init xxl-job admin success.");
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// public void destroy() throws Exception {
|
|
||||||
// // admin trigger pool stop
|
|
||||||
// JobTriggerPoolHelper.toStop();
|
|
||||||
//
|
|
||||||
// // admin registry stop
|
|
||||||
// JobRegistryMonitorHelper.getInstance().toStop();
|
|
||||||
//
|
|
||||||
// // admin monitor stop
|
|
||||||
// JobFailMonitorHelper.getInstance().toStop();
|
|
||||||
//
|
|
||||||
// // admin-server
|
|
||||||
// stopRpcProvider();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// // ---------------------- I18n ----------------------
|
|
||||||
//
|
|
||||||
// private void initI18n(){
|
|
||||||
// for (ExecutorBlockStrategyEnum item:ExecutorBlockStrategyEnum.values()) {
|
|
||||||
// item.setTitle(I18nUtil.getString("jobconf_block_".concat(item.name())));
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// // ---------------------- admin rpc provider (no server version) ----------------------
|
|
||||||
// private static ServletServerHandler servletServerHandler;
|
|
||||||
// private void initRpcProvider(){
|
|
||||||
// // init
|
|
||||||
// XxlRpcProviderFactory xxlRpcProviderFactory = new XxlRpcProviderFactory();
|
|
||||||
// xxlRpcProviderFactory.initConfig(
|
|
||||||
// NetEnum.NETTY_HTTP,
|
|
||||||
// Serializer.SerializeEnum.HESSIAN.getSerializer(),
|
|
||||||
// null,
|
|
||||||
// 0,
|
|
||||||
// XxlJobAdminConfig.getAdminConfig().getAccessToken(),
|
|
||||||
// null,
|
|
||||||
// null);
|
|
||||||
//
|
|
||||||
// // add services
|
|
||||||
// xxlRpcProviderFactory.addService(AdminBiz.class.getName(), null, XxlJobAdminConfig.getAdminConfig().getAdminBiz());
|
|
||||||
//
|
|
||||||
// // servlet handler
|
|
||||||
// servletServerHandler = new ServletServerHandler(xxlRpcProviderFactory);
|
|
||||||
// }
|
|
||||||
// private void stopRpcProvider() throws Exception {
|
|
||||||
// XxlRpcInvokerFactory.getInstance().stop();
|
|
||||||
// }
|
|
||||||
// public static void invokeAdminService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
|
|
||||||
// servletServerHandler.handle(null, request, response);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// // ---------------------- executor-client ----------------------
|
|
||||||
// private static ConcurrentHashMap<String, ExecutorBiz> executorBizRepository = new ConcurrentHashMap<String, ExecutorBiz>();
|
|
||||||
// public static ExecutorBiz getExecutorBiz(String address) throws Exception {
|
|
||||||
// // valid
|
|
||||||
// if (address==null || address.trim().length()==0) {
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // load-cache
|
|
||||||
// address = address.trim();
|
|
||||||
// ExecutorBiz executorBiz = executorBizRepository.get(address);
|
|
||||||
// if (executorBiz != null) {
|
|
||||||
// return executorBiz;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // set-cache
|
|
||||||
// executorBiz = (ExecutorBiz) new XxlRpcReferenceBean(
|
|
||||||
// NetEnum.NETTY_HTTP,
|
|
||||||
// Serializer.SerializeEnum.HESSIAN.getSerializer(),
|
|
||||||
// CallType.SYNC,
|
|
||||||
// LoadBalance.ROUND,
|
|
||||||
// ExecutorBiz.class,
|
|
||||||
// null,
|
|
||||||
// 5000,
|
|
||||||
// address,
|
|
||||||
// XxlJobAdminConfig.getAdminConfig().getAccessToken(),
|
|
||||||
// null,
|
|
||||||
// null).getObject();
|
|
||||||
//
|
|
||||||
// executorBizRepository.put(address, executorBiz);
|
|
||||||
// return executorBiz;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// // ---------------------- schedule util ----------------------
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * fill job info
|
|
||||||
// *
|
|
||||||
// * @param jobInfo
|
|
||||||
// */
|
|
||||||
// public static void fillJobInfo(XxlJobInfo jobInfo) {
|
|
||||||
//
|
|
||||||
// String name = String.valueOf(jobInfo.getId());
|
|
||||||
//
|
|
||||||
// // trigger key
|
|
||||||
// TriggerKey triggerKey = TriggerKey.triggerKey(name);
|
|
||||||
// try {
|
|
||||||
//
|
|
||||||
// // trigger cron
|
|
||||||
// Trigger trigger = scheduler.getTrigger(triggerKey);
|
|
||||||
// if (trigger!=null && trigger instanceof CronTriggerImpl) {
|
|
||||||
// String cronExpression = ((CronTriggerImpl) trigger).getCronExpression();
|
|
||||||
// jobInfo.setJobCron(cronExpression);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // trigger state
|
|
||||||
// TriggerState triggerState = scheduler.getTriggerState(triggerKey);
|
|
||||||
// if (triggerState!=null) {
|
|
||||||
// jobInfo.setJobStatus(triggerState.name());
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// //JobKey jobKey = new JobKey(jobInfo.getJobName(), String.valueOf(jobInfo.getJobGroup()));
|
|
||||||
// //JobDetail jobDetail = scheduler.getJobDetail(jobKey);
|
|
||||||
// //String jobClass = jobDetail.getJobClass().getName();
|
|
||||||
//
|
|
||||||
// } catch (SchedulerException e) {
|
|
||||||
// logger.error(e.getMessage(), e);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * add trigger + job
|
|
||||||
// *
|
|
||||||
// * @param jobName
|
|
||||||
// * @param cronExpression
|
|
||||||
// * @return
|
|
||||||
// * @throws SchedulerException
|
|
||||||
// */
|
|
||||||
// public static boolean addJob(String jobName, String cronExpression) throws SchedulerException {
|
|
||||||
// // 1、job key
|
|
||||||
// TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
|
|
||||||
// JobKey jobKey = new JobKey(jobName);
|
|
||||||
//
|
|
||||||
// // 2、valid
|
|
||||||
// if (scheduler.checkExists(triggerKey)) {
|
|
||||||
// return true; // PASS
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // 3、corn trigger
|
|
||||||
// CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing(); // withMisfireHandlingInstructionDoNothing 忽略掉调度终止过程中忽略的调度
|
|
||||||
// CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
|
|
||||||
//
|
|
||||||
// // 4、job detail
|
|
||||||
// Class<? extends Job> jobClass_ = RemoteHttpJobBean.class; // Class.forName(jobInfo.getJobClass());
|
|
||||||
// JobDetail jobDetail = JobBuilder.newJob(jobClass_).withIdentity(jobKey).build();
|
|
||||||
//
|
|
||||||
// /*if (jobInfo.getJobData()!=null) {
|
|
||||||
// JobDataMap jobDataMap = jobDetail.getJobDataMap();
|
|
||||||
// jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class));
|
|
||||||
// // JobExecutionContext context.getMergedJobDataMap().get("mailGuid");
|
|
||||||
// }*/
|
|
||||||
//
|
|
||||||
// // 5、schedule job
|
|
||||||
// Date date = scheduler.scheduleJob(jobDetail, cronTrigger);
|
|
||||||
//
|
|
||||||
// logger.info(">>>>>>>>>>> addJob success(quartz), jobDetail:{}, cronTrigger:{}, date:{}", jobDetail, cronTrigger, date);
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * remove trigger + job
|
|
||||||
// *
|
|
||||||
// * @param jobName
|
|
||||||
// * @return
|
|
||||||
// * @throws SchedulerException
|
|
||||||
// */
|
|
||||||
// public static boolean removeJob(String jobName) throws SchedulerException {
|
|
||||||
//
|
|
||||||
// JobKey jobKey = new JobKey(jobName);
|
|
||||||
// scheduler.deleteJob(jobKey);
|
|
||||||
//
|
|
||||||
// /*TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
|
|
||||||
// if (scheduler.checkExists(triggerKey)) {
|
|
||||||
// scheduler.unscheduleJob(triggerKey); // trigger + job
|
|
||||||
// }*/
|
|
||||||
//
|
|
||||||
// logger.info(">>>>>>>>>>> removeJob success(quartz), jobKey:{}", jobKey);
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * updateJobCron
|
|
||||||
// *
|
|
||||||
// * @param jobName
|
|
||||||
// * @param cronExpression
|
|
||||||
// * @return
|
|
||||||
// * @throws SchedulerException
|
|
||||||
// */
|
|
||||||
// public static boolean updateJobCron(String jobName, String cronExpression) throws SchedulerException {
|
|
||||||
//
|
|
||||||
// // 1、job key
|
|
||||||
// TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
|
|
||||||
//
|
|
||||||
// // 2、valid
|
|
||||||
// if (!scheduler.checkExists(triggerKey)) {
|
|
||||||
// return true; // PASS
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// CronTrigger oldTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
|
|
||||||
//
|
|
||||||
// // 3、avoid repeat cron
|
|
||||||
// String oldCron = oldTrigger.getCronExpression();
|
|
||||||
// if (oldCron.equals(cronExpression)){
|
|
||||||
// return true; // PASS
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // 4、new cron trigger
|
|
||||||
// CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
|
|
||||||
// oldTrigger = oldTrigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
|
|
||||||
//
|
|
||||||
// // 5、rescheduleJob
|
|
||||||
// scheduler.rescheduleJob(triggerKey, oldTrigger);
|
|
||||||
//
|
|
||||||
// /*
|
|
||||||
// JobKey jobKey = new JobKey(jobName);
|
|
||||||
//
|
|
||||||
// // old job detail
|
|
||||||
// JobDetail jobDetail = scheduler.getJobDetail(jobKey);
|
|
||||||
//
|
|
||||||
// // new trigger
|
|
||||||
// HashSet<Trigger> triggerSet = new HashSet<Trigger>();
|
|
||||||
// triggerSet.add(cronTrigger);
|
|
||||||
// // cover trigger of job detail
|
|
||||||
// scheduler.scheduleJob(jobDetail, triggerSet, true);*/
|
|
||||||
//
|
|
||||||
// logger.info(">>>>>>>>>>> resumeJob success, JobName:{}", jobName);
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * pause
|
|
||||||
// *
|
|
||||||
// * @param jobName
|
|
||||||
// * @return
|
|
||||||
// * @throws SchedulerException
|
|
||||||
// */
|
|
||||||
// /*public static boolean pauseJob(String jobName) throws SchedulerException {
|
|
||||||
//
|
|
||||||
// TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
|
|
||||||
//
|
|
||||||
// boolean result = false;
|
|
||||||
// if (scheduler.checkExists(triggerKey)) {
|
|
||||||
// scheduler.pauseTrigger(triggerKey);
|
|
||||||
// result = true;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// logger.info(">>>>>>>>>>> pauseJob {}, triggerKey:{}", (result?"success":"fail"),triggerKey);
|
|
||||||
// return result;
|
|
||||||
// }*/
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * resume
|
|
||||||
// *
|
|
||||||
// * @param jobName
|
|
||||||
// * @return
|
|
||||||
// * @throws SchedulerException
|
|
||||||
// */
|
|
||||||
// /*public static boolean resumeJob(String jobName) throws SchedulerException {
|
|
||||||
//
|
|
||||||
// TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
|
|
||||||
//
|
|
||||||
// boolean result = false;
|
|
||||||
// if (scheduler.checkExists(triggerKey)) {
|
|
||||||
// scheduler.resumeTrigger(triggerKey);
|
|
||||||
// result = true;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// logger.info(">>>>>>>>>>> resumeJob {}, triggerKey:{}", (result?"success":"fail"), triggerKey);
|
|
||||||
// return result;
|
|
||||||
// }*/
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * run
|
|
||||||
// *
|
|
||||||
// * @param jobName
|
|
||||||
// * @return
|
|
||||||
// * @throws SchedulerException
|
|
||||||
// */
|
|
||||||
// /*public static boolean triggerJob(String jobName) throws SchedulerException {
|
|
||||||
// // TriggerKey : name + group
|
|
||||||
// JobKey jobKey = new JobKey(jobName);
|
|
||||||
// TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
|
|
||||||
//
|
|
||||||
// boolean result = false;
|
|
||||||
// if (scheduler.checkExists(triggerKey)) {
|
|
||||||
// scheduler.triggerJob(jobKey);
|
|
||||||
// result = true;
|
|
||||||
// logger.info(">>>>>>>>>>> runJob success, jobKey:{}", jobKey);
|
|
||||||
// } else {
|
|
||||||
// logger.info(">>>>>>>>>>> runJob fail, jobKey:{}", jobKey);
|
|
||||||
// }
|
|
||||||
// return result;
|
|
||||||
// }*/
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * finaAllJobList
|
|
||||||
// *
|
|
||||||
// * @return
|
|
||||||
// *//*
|
|
||||||
// @Deprecated
|
|
||||||
// public static List<Map<String, Object>> finaAllJobList(){
|
|
||||||
// List<Map<String, Object>> jobList = new ArrayList<Map<String,Object>>();
|
|
||||||
//
|
|
||||||
// try {
|
|
||||||
// if (scheduler.getJobGroupNames()==null || scheduler.getJobGroupNames().size()==0) {
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
// String groupName = scheduler.getJobGroupNames().get(0);
|
|
||||||
// Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName));
|
|
||||||
// if (jobKeys!=null && jobKeys.size()>0) {
|
|
||||||
// for (JobKey jobKey : jobKeys) {
|
|
||||||
// TriggerKey triggerKey = TriggerKey.triggerKey(jobKey.getName(), Scheduler.DEFAULT_GROUP);
|
|
||||||
// Trigger trigger = scheduler.getTrigger(triggerKey);
|
|
||||||
// JobDetail jobDetail = scheduler.getJobDetail(jobKey);
|
|
||||||
// TriggerState triggerState = scheduler.getTriggerState(triggerKey);
|
|
||||||
// Map<String, Object> jobMap = new HashMap<String, Object>();
|
|
||||||
// jobMap.put("TriggerKey", triggerKey);
|
|
||||||
// jobMap.put("Trigger", trigger);
|
|
||||||
// jobMap.put("JobDetail", jobDetail);
|
|
||||||
// jobMap.put("TriggerState", triggerState);
|
|
||||||
// jobList.add(jobMap);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// } catch (SchedulerException e) {
|
|
||||||
// logger.error(e.getMessage(), e);
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
// return jobList;
|
|
||||||
// }*/
|
|
||||||
//
|
|
||||||
//}
|
|
@ -1,58 +0,0 @@
|
|||||||
package com.xxl.job.admin.core.old;//package com.xxl.job.admin.core.quartz;
|
|
||||||
//
|
|
||||||
//import org.quartz.SchedulerConfigException;
|
|
||||||
//import org.quartz.spi.ThreadPool;
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * single thread pool, for async trigger
|
|
||||||
// *
|
|
||||||
// * @author xuxueli 2019-03-06
|
|
||||||
// */
|
|
||||||
//public class XxlJobThreadPool implements ThreadPool {
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public boolean runInThread(Runnable runnable) {
|
|
||||||
//
|
|
||||||
// // async run
|
|
||||||
// runnable.run();
|
|
||||||
// return true;
|
|
||||||
//
|
|
||||||
// //return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public int blockForAvailableThreads() {
|
|
||||||
// return 1;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void initialize() throws SchedulerConfigException {
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void shutdown(boolean waitForJobsToComplete) {
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public int getPoolSize() {
|
|
||||||
// return 1;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void setInstanceId(String schedInstId) {
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void setInstanceName(String schedName) {
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // support
|
|
||||||
// public void setThreadCount(int count) {
|
|
||||||
// //
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//}
|
|
@ -472,7 +472,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-resources-plugin</artifactId>
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
<version>3.1.0</version>
|
<version>3.1.0</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<nonFilteredFileExtensions>
|
<nonFilteredFileExtensions>
|
||||||
<nonFilteredFileExtension>woff</nonFilteredFileExtension>
|
<nonFilteredFileExtension>woff</nonFilteredFileExtension>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user