diff --git a/eladmin-common/pom.xml b/eladmin-common/pom.xml
index 2150b4b7..a349edd4 100644
--- a/eladmin-common/pom.xml
+++ b/eladmin-common/pom.xml
@@ -9,7 +9,7 @@
4.0.0
- 5.3.4
+ 5.7.22
eladmin-common
diff --git a/eladmin-common/src/main/java/me/zhengjie/config/SwaggerConfig.java b/eladmin-common/src/main/java/me/zhengjie/config/SwaggerConfig.java
index 50343bcb..6d267746 100644
--- a/eladmin-common/src/main/java/me/zhengjie/config/SwaggerConfig.java
+++ b/eladmin-common/src/main/java/me/zhengjie/config/SwaggerConfig.java
@@ -15,8 +15,8 @@
*/
package me.zhengjie.config;
+import cn.hutool.core.collection.CollUtil;
import com.fasterxml.classmate.TypeResolver;
-import com.google.common.base.Predicates;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -29,14 +29,18 @@ import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.schema.AlternateTypeRule;
import springfox.documentation.schema.AlternateTypeRuleConvention;
-import springfox.documentation.service.*;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.ApiKey;
+import springfox.documentation.service.AuthorizationScope;
+import springfox.documentation.service.SecurityReference;
+import springfox.documentation.service.SecurityScheme;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
import java.util.ArrayList;
import java.util.List;
-import static com.google.common.collect.Lists.newArrayList;
import static springfox.documentation.schema.AlternateTypeRules.newRule;
/**
@@ -62,7 +66,7 @@ public class SwaggerConfig {
.pathMapping("/")
.apiInfo(apiInfo())
.select()
- .paths(Predicates.not(PathSelectors.regex("/error.*")))
+ .paths(PathSelectors.regex("^(?!/error).*"))
.paths(PathSelectors.any())
.build()
//添加登陆认证
@@ -98,7 +102,7 @@ public class SwaggerConfig {
private SecurityContext getContextByPath() {
return SecurityContext.builder()
.securityReferences(defaultAuth())
- .forPaths(PathSelectors.regex("^(?!/auth).*$"))
+ .operationSelector(o->o.requestMappingPattern().matches("^(?!/auth).*$"))
.build();
}
@@ -128,7 +132,7 @@ class SwaggerDataConfig {
@Override
public List rules() {
- return newArrayList(newRule(resolver.resolve(Pageable.class), resolver.resolve(Page.class)));
+ return CollUtil.newArrayList(newRule(resolver.resolve(Pageable.class), resolver.resolve(Page.class)));
}
};
}
diff --git a/eladmin-common/src/main/java/me/zhengjie/utils/SpringContextHolder.java b/eladmin-common/src/main/java/me/zhengjie/utils/SpringContextHolder.java
index d5a50bcf..41ead386 100644
--- a/eladmin-common/src/main/java/me/zhengjie/utils/SpringContextHolder.java
+++ b/eladmin-common/src/main/java/me/zhengjie/utils/SpringContextHolder.java
@@ -21,7 +21,9 @@ import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Service;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
/**
@@ -142,4 +144,13 @@ public class SpringContextHolder implements ApplicationContextAware, DisposableB
}
SpringContextHolder.addCallback = false;
}
+
+ /**
+ * 获取 @Service 的所有 bean 名称
+ * @return /
+ */
+ public static List getAllServiceBeanName() {
+ return new ArrayList<>(Arrays.asList(applicationContext
+ .getBeanNamesForAnnotation(Service.class)));
+ }
}
diff --git a/eladmin-common/src/main/java/me/zhengjie/utils/ValidationUtil.java b/eladmin-common/src/main/java/me/zhengjie/utils/ValidationUtil.java
index 57a4913d..e561762b 100644
--- a/eladmin-common/src/main/java/me/zhengjie/utils/ValidationUtil.java
+++ b/eladmin-common/src/main/java/me/zhengjie/utils/ValidationUtil.java
@@ -15,16 +15,17 @@
*/
package me.zhengjie.utils;
+import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.ObjectUtil;
import me.zhengjie.exception.BadRequestException;
-import org.hibernate.validator.internal.constraintvalidators.hv.EmailValidator;
/**
* 验证工具
+ *
* @author Zheng Jie
* @date 2018-11-23
*/
-public class ValidationUtil{
+public class ValidationUtil {
/**
* 验证空
@@ -36,10 +37,10 @@ public class ValidationUtil{
}
}
- /**
- * 验证是否为邮箱
- */
- public static boolean isEmail(String email) {
- return new EmailValidator().isValid(email, null);
- }
+ /**
+ * 验证是否为邮箱
+ */
+ public static boolean isEmail(String email) {
+ return Validator.isEmail(email);
+ }
}
diff --git a/eladmin-common/src/test/java/me/zhengjie/utils/DateUtilsTest.java b/eladmin-common/src/test/java/me/zhengjie/utils/DateUtilsTest.java
index 4f28ed37..dfe01e09 100644
--- a/eladmin-common/src/test/java/me/zhengjie/utils/DateUtilsTest.java
+++ b/eladmin-common/src/test/java/me/zhengjie/utils/DateUtilsTest.java
@@ -1,6 +1,6 @@
package me.zhengjie.utils;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
import java.time.LocalDateTime;
import java.util.Date;
diff --git a/eladmin-common/src/test/java/me/zhengjie/utils/EncryptUtilsTest.java b/eladmin-common/src/test/java/me/zhengjie/utils/EncryptUtilsTest.java
index f909d9db..3ec73752 100644
--- a/eladmin-common/src/test/java/me/zhengjie/utils/EncryptUtilsTest.java
+++ b/eladmin-common/src/test/java/me/zhengjie/utils/EncryptUtilsTest.java
@@ -1,8 +1,9 @@
package me.zhengjie.utils;
-import org.junit.Test;
-import static org.junit.Assert.*;
+import org.junit.jupiter.api.Test;
+
import static me.zhengjie.utils.EncryptUtils.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
public class EncryptUtilsTest {
diff --git a/eladmin-common/src/test/java/me/zhengjie/utils/FileUtilTest.java b/eladmin-common/src/test/java/me/zhengjie/utils/FileUtilTest.java
index f069c158..48e06bd7 100644
--- a/eladmin-common/src/test/java/me/zhengjie/utils/FileUtilTest.java
+++ b/eladmin-common/src/test/java/me/zhengjie/utils/FileUtilTest.java
@@ -1,10 +1,10 @@
package me.zhengjie.utils;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
import org.springframework.mock.web.MockMultipartFile;
-import static org.junit.Assert.*;
import static me.zhengjie.utils.FileUtil.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
public class FileUtilTest {
diff --git a/eladmin-common/src/test/java/me/zhengjie/utils/StringUtilsTest.java b/eladmin-common/src/test/java/me/zhengjie/utils/StringUtilsTest.java
index 12e875a8..ffb2cf88 100644
--- a/eladmin-common/src/test/java/me/zhengjie/utils/StringUtilsTest.java
+++ b/eladmin-common/src/test/java/me/zhengjie/utils/StringUtilsTest.java
@@ -1,13 +1,18 @@
package me.zhengjie.utils;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.Date;
-import static me.zhengjie.utils.StringUtils.*;
-import static org.junit.Assert.*;
+import static me.zhengjie.utils.StringUtils.getIp;
+import static me.zhengjie.utils.StringUtils.getWeekDay;
+import static me.zhengjie.utils.StringUtils.toCamelCase;
+import static me.zhengjie.utils.StringUtils.toCapitalizeCamelCase;
+import static me.zhengjie.utils.StringUtils.toUnderScoreCase;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
public class StringUtilsTest {
@@ -40,4 +45,4 @@ public class StringUtilsTest {
public void testGetIP() {
assertEquals("127.0.0.1", getIp(new MockHttpServletRequest()));
}
-}
\ No newline at end of file
+}
diff --git a/eladmin-generator/pom.xml b/eladmin-generator/pom.xml
index 52cdcfbe..96089616 100644
--- a/eladmin-generator/pom.xml
+++ b/eladmin-generator/pom.xml
@@ -13,7 +13,7 @@
代码生成模块
- 1.9
+ 1.10
diff --git a/eladmin-generator/src/main/java/me/zhengjie/utils/GenUtil.java b/eladmin-generator/src/main/java/me/zhengjie/utils/GenUtil.java
index 4e510d79..e7a6b786 100644
--- a/eladmin-generator/src/main/java/me/zhengjie/utils/GenUtil.java
+++ b/eladmin-generator/src/main/java/me/zhengjie/utils/GenUtil.java
@@ -288,7 +288,8 @@ public class GenUtil {
// 主键存在字典
if (StringUtils.isNotBlank(column.getDictName())) {
genMap.put("hasDict", true);
- dicts.add(column.getDictName());
+ if(!dicts.contains(column.getDictName()))
+ dicts.add(column.getDictName());
}
// 存储字段类型
diff --git a/eladmin-logging/src/main/java/me/zhengjie/service/impl/LogServiceImpl.java b/eladmin-logging/src/main/java/me/zhengjie/service/impl/LogServiceImpl.java
index ecc6efb8..729a7930 100644
--- a/eladmin-logging/src/main/java/me/zhengjie/service/impl/LogServiceImpl.java
+++ b/eladmin-logging/src/main/java/me/zhengjie/service/impl/LogServiceImpl.java
@@ -17,6 +17,7 @@ package me.zhengjie.service.impl;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.RequiredArgsConstructor;
import me.zhengjie.domain.Log;
@@ -94,6 +95,12 @@ public class LogServiceImpl implements LogService {
log.setMethod(methodName);
log.setUsername(username);
log.setParams(getParameter(method, joinPoint.getArgs()));
+ // 记录登录用户,隐藏密码信息
+ if(log.getDescription().equals("用户登录")){
+ JSONObject obj = JSONUtil.parseObj(log.getParams());
+ log.setUsername(obj.get("username").toString());
+ log.setParams(JSONUtil.toJsonStr(Dict.create().set("username", log.getUsername())));
+ }
log.setBrowser(browser);
logRepository.save(log);
}
diff --git a/eladmin-system/pom.xml b/eladmin-system/pom.xml
index 46d81786..fc36c5c5 100644
--- a/eladmin-system/pom.xml
+++ b/eladmin-system/pom.xml
@@ -13,7 +13,7 @@
核心模块
- 0.11.1
+ 0.11.2
5.8.0
@@ -84,7 +84,7 @@
com.github.oshi
oshi-core
- 5.7.1
+ 6.1.4
diff --git a/eladmin-system/src/main/java/me/zhengjie/config/ConfigurerAdapter.java b/eladmin-system/src/main/java/me/zhengjie/config/ConfigurerAdapter.java
index dca5b94b..a0093d68 100644
--- a/eladmin-system/src/main/java/me/zhengjie/config/ConfigurerAdapter.java
+++ b/eladmin-system/src/main/java/me/zhengjie/config/ConfigurerAdapter.java
@@ -54,7 +54,7 @@ public class ConfigurerAdapter implements WebMvcConfigurer {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
- config.addAllowedOrigin("*");
+ config.addAllowedOriginPattern("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
diff --git a/eladmin-system/src/main/java/me/zhengjie/config/thread/AsyncTaskExecutePool.java b/eladmin-system/src/main/java/me/zhengjie/config/thread/AsyncTaskExecutePool.java
index bf6bb1d9..0893439c 100644
--- a/eladmin-system/src/main/java/me/zhengjie/config/thread/AsyncTaskExecutePool.java
+++ b/eladmin-system/src/main/java/me/zhengjie/config/thread/AsyncTaskExecutePool.java
@@ -51,8 +51,8 @@ public class AsyncTaskExecutePool implements AsyncConfigurer {
executor.setQueueCapacity(AsyncTaskProperties.queueCapacity);
//活跃时间
executor.setKeepAliveSeconds(AsyncTaskProperties.keepAliveSeconds);
- //线程名字前缀
- executor.setThreadNamePrefix("el-async-");
+ //线程工厂
+ executor.setThreadFactory(new TheadFactoryName("el-async"));
// setRejectedExecutionHandler:当pool已经达到max size的时候,如何处理新任务
// CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
diff --git a/eladmin-system/src/main/java/me/zhengjie/config/thread/TheadFactoryName.java b/eladmin-system/src/main/java/me/zhengjie/config/thread/TheadFactoryName.java
index 4cc8ae91..be227fd5 100644
--- a/eladmin-system/src/main/java/me/zhengjie/config/thread/TheadFactoryName.java
+++ b/eladmin-system/src/main/java/me/zhengjie/config/thread/TheadFactoryName.java
@@ -15,8 +15,8 @@
*/
package me.zhengjie.config.thread;
+import me.zhengjie.utils.StringUtils;
import org.springframework.stereotype.Component;
-
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
@@ -33,24 +33,25 @@ public class TheadFactoryName implements ThreadFactory {
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
+ private final static String DEF_NAME = "el-pool-";
+
public TheadFactoryName() {
- this("el-pool");
+ this(DEF_NAME);
}
- private TheadFactoryName(String name){
+ public TheadFactoryName(String name){
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
//此时namePrefix就是 name + 第几个用这个工厂创建线程池的
- this.namePrefix = name +
- POOL_NUMBER.getAndIncrement();
+ this.namePrefix = (StringUtils.isNotBlank(name) ? name : DEF_NAME) + "-" + POOL_NUMBER.getAndIncrement();
}
@Override
public Thread newThread(Runnable r) {
- //此时线程的名字 就是 namePrefix + -thread- + 这个线程池中第几个执行的线程
+ //此时线程的名字 就是 namePrefix + -exec- + 这个线程池中第几个执行的线程
Thread t = new Thread(group, r,
- namePrefix + "-thread-"+threadNumber.getAndIncrement(),
+ namePrefix + "-exec-"+threadNumber.getAndIncrement(),
0);
if (t.isDaemon()) {
t.setDaemon(false);
diff --git a/eladmin-system/src/main/java/me/zhengjie/config/thread/ThreadPoolExecutorUtil.java b/eladmin-system/src/main/java/me/zhengjie/config/thread/ThreadPoolExecutorUtil.java
index 8e04aa2b..dc93fe51 100644
--- a/eladmin-system/src/main/java/me/zhengjie/config/thread/ThreadPoolExecutorUtil.java
+++ b/eladmin-system/src/main/java/me/zhengjie/config/thread/ThreadPoolExecutorUtil.java
@@ -16,6 +16,7 @@
package me.zhengjie.config.thread;
import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -26,14 +27,20 @@ import java.util.concurrent.TimeUnit;
*/
public class ThreadPoolExecutorUtil {
- public static ThreadPoolExecutor getPoll(){
+ public static ExecutorService getPoll(){
+ return getPoll(null);
+ }
+
+ public static ExecutorService getPoll(String threadName){
return new ThreadPoolExecutor(
AsyncTaskProperties.corePoolSize,
AsyncTaskProperties.maxPoolSize,
AsyncTaskProperties.keepAliveSeconds,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(AsyncTaskProperties.queueCapacity),
- new TheadFactoryName()
+ new TheadFactoryName(threadName),
+ // 队列与线程池中线程都满了时使用调用者所在的线程来执行
+ new ThreadPoolExecutor.CallerRunsPolicy()
);
}
}
diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/quartz/rest/QuartzJobController.java b/eladmin-system/src/main/java/me/zhengjie/modules/quartz/rest/QuartzJobController.java
index 31613572..0ffee652 100644
--- a/eladmin-system/src/main/java/me/zhengjie/modules/quartz/rest/QuartzJobController.java
+++ b/eladmin-system/src/main/java/me/zhengjie/modules/quartz/rest/QuartzJobController.java
@@ -24,6 +24,7 @@ import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.quartz.domain.QuartzJob;
import me.zhengjie.modules.quartz.service.QuartzJobService;
import me.zhengjie.modules.quartz.service.dto.JobQueryCriteria;
+import me.zhengjie.utils.SpringContextHolder;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@@ -84,6 +85,8 @@ public class QuartzJobController {
if (resources.getId() != null) {
throw new BadRequestException("A new "+ ENTITY_NAME +" cannot already have an ID");
}
+ // 验证Bean是不是合法的,合法的定时任务 Bean 需要用 @Service 定义
+ checkBean(resources.getBeanName());
quartzJobService.create(resources);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@@ -93,6 +96,8 @@ public class QuartzJobController {
@PutMapping
@PreAuthorize("@el.check('timing:edit')")
public ResponseEntity