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 updateQuartzJob(@Validated(QuartzJob.Update.class) @RequestBody QuartzJob resources){ + // 验证Bean是不是合法的,合法的定时任务 Bean 需要用 @Service 定义 + checkBean(resources.getBeanName()); quartzJobService.update(resources); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -123,4 +128,12 @@ public class QuartzJobController { quartzJobService.delete(ids); return new ResponseEntity<>(HttpStatus.OK); } + + private void checkBean(String beanName){ + // 避免调用攻击者可以从SpringContextHolder获得控制jdbcTemplate类 + // 并使用getDeclaredMethod调用jdbcTemplate的queryForMap函数,执行任意sql命令。 + if(!SpringContextHolder.getAllServiceBeanName().contains(beanName)){ + throw new BadRequestException("非法的 Bean,请重新输入!"); + } + } } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/quartz/utils/ExecutionJob.java b/eladmin-system/src/main/java/me/zhengjie/modules/quartz/utils/ExecutionJob.java index 0b352079..5d298ced 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/quartz/utils/ExecutionJob.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/quartz/utils/ExecutionJob.java @@ -19,6 +19,7 @@ import cn.hutool.extra.template.Template; import cn.hutool.extra.template.TemplateConfig; import cn.hutool.extra.template.TemplateEngine; import cn.hutool.extra.template.TemplateUtil; +import me.zhengjie.config.thread.ThreadPoolExecutorUtil; import me.zhengjie.domain.vo.EmailVo; import me.zhengjie.modules.quartz.domain.QuartzJob; import me.zhengjie.modules.quartz.domain.QuartzLog; @@ -32,7 +33,6 @@ import me.zhengjie.utils.ThrowableUtil; import org.quartz.JobExecutionContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.quartz.QuartzJobBean; import java.util.*; import java.util.concurrent.*; @@ -42,15 +42,15 @@ import java.util.concurrent.*; * @author / * @date 2019-01-07 */ -@Async public class ExecutionJob extends QuartzJobBean { private final Logger logger = LoggerFactory.getLogger(this.getClass()); + // 此处仅供参考,可根据任务执行情况自定义线程池参数 + private final static ExecutorService executor = ThreadPoolExecutorUtil.getPoll("el-quartz-job"); + @Override public void executeInternal(JobExecutionContext context) { - // 创建单个线程 - ExecutorService executor = Executors.newSingleThreadExecutor(); // 获取任务 QuartzJob quartzJob = (QuartzJob) context.getMergedJobDataMap().get(QuartzJob.JOB_KEY); // 获取spring bean @@ -112,7 +112,6 @@ public class ExecutionJob extends QuartzJobBean { } } finally { quartzLogRepository.save(log); - executor.shutdown(); } } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/security/rest/AuthorizationController.java b/eladmin-system/src/main/java/me/zhengjie/modules/security/rest/AuthorizationController.java index 634356d5..a157874f 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/security/rest/AuthorizationController.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/security/rest/AuthorizationController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import me.zhengjie.annotation.Log; import me.zhengjie.annotation.rest.AnonymousDeleteMapping; import me.zhengjie.annotation.rest.AnonymousGetMapping; import me.zhengjie.annotation.rest.AnonymousPostMapping; @@ -70,6 +71,7 @@ public class AuthorizationController { @Resource private LoginProperties loginProperties; + @Log("用户登录") @ApiOperation("登录授权") @AnonymousPostMapping(value = "/login") public ResponseEntity login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception { diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/MenuRepository.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/MenuRepository.java index 0907606f..75fd7ff5 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/MenuRepository.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/MenuRepository.java @@ -49,13 +49,13 @@ public interface MenuRepository extends JpaRepository, JpaSpecificat * @param pid / * @return / */ - List findByPid(long pid); + List findByPidOrderByMenuSort(long pid); /** * 查询顶级菜单 * @return / */ - List findByPidIsNull(); + List findByPidIsNullOrderByMenuSort(); /** * 根据角色ID与菜单类型查询菜单 diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/DataServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/DataServiceImpl.java index f2b3c79d..3bfcdd11 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/DataServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/DataServiceImpl.java @@ -43,7 +43,7 @@ public class DataServiceImpl implements DataService { private final DeptService deptService; /** - * 用户角色改变时需清理缓存 + * 用户角色和用户部门改变时需清理缓存 * @param user / * @return / */ diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MenuServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MenuServiceImpl.java index 229186bd..c1bc4d1f 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MenuServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MenuServiceImpl.java @@ -189,7 +189,7 @@ public class MenuServiceImpl implements MenuService { public Set getChildMenus(List menuList, Set menuSet) { for (Menu menu : menuList) { menuSet.add(menu); - List menus = menuRepository.findByPid(menu.getId()); + List menus = menuRepository.findByPidOrderByMenuSort(menu.getId()); if(menus!=null && menus.size()!=0){ getChildMenus(menus, menuSet); } @@ -213,9 +213,9 @@ public class MenuServiceImpl implements MenuService { public List getMenus(Long pid) { List menus; if(pid != null && !pid.equals(0L)){ - menus = menuRepository.findByPid(pid); + menus = menuRepository.findByPidOrderByMenuSort(pid); } else { - menus = menuRepository.findByPidIsNull(); + menus = menuRepository.findByPidIsNullOrderByMenuSort(); } return menuMapper.toDto(menus); } @@ -223,10 +223,10 @@ public class MenuServiceImpl implements MenuService { @Override public List getSuperior(MenuDto menuDto, List menus) { if(menuDto.getPid() == null){ - menus.addAll(menuRepository.findByPidIsNull()); + menus.addAll(menuRepository.findByPidIsNullOrderByMenuSort()); return menuMapper.toDto(menus); } - menus.addAll(menuRepository.findByPid(menuDto.getPid())); + menus.addAll(menuRepository.findByPidOrderByMenuSort(menuDto.getPid())); return getSuperior(findById(menuDto.getPid()), menus); } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MonitorServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MonitorServiceImpl.java index 7ff2e91b..fd69a222 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MonitorServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MonitorServiceImpl.java @@ -15,9 +15,8 @@ */ package me.zhengjie.modules.system.service.impl; -import cn.hutool.core.date.BetweenFormater; +import cn.hutool.core.date.BetweenFormatter.Level; import cn.hutool.core.date.DateUtil; -import me.zhengjie.exception.BadRequestException; import me.zhengjie.modules.system.service.MonitorService; import me.zhengjie.utils.ElAdminConstant; import me.zhengjie.utils.FileUtil; @@ -149,9 +148,15 @@ public class MonitorServiceImpl implements MonitorService { cpuInfo.put("logic", processor.getLogicalProcessorCount() + "个逻辑CPU"); // CPU信息 long[] prevTicks = processor.getSystemCpuLoadTicks(); - // 等待1秒... - Util.sleep(1000); + // 默认等待300毫秒... + long time = 300; + Util.sleep(time); long[] ticks = processor.getSystemCpuLoadTicks(); + while (Arrays.toString(prevTicks).equals(Arrays.toString(ticks)) && time < 1000){ + time += 25; + Util.sleep(25); + ticks = processor.getSystemCpuLoadTicks(); + } long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()]; long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()]; long sys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()]; @@ -177,7 +182,7 @@ public class MonitorServiceImpl implements MonitorService { long time = ManagementFactory.getRuntimeMXBean().getStartTime(); Date date = new Date(time); // 计算项目运行时间 - String formatBetween = DateUtil.formatBetween(date, new Date(),BetweenFormater.Level.HOUR); + String formatBetween = DateUtil.formatBetween(date, new Date(), Level.HOUR); // 系统信息 systemInfo.put("os", os.toString()); systemInfo.put("day", formatBetween); diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/UserServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/UserServiceImpl.java index 6342d130..867509d3 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/UserServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/UserServiceImpl.java @@ -119,6 +119,10 @@ public class UserServiceImpl implements UserService { redisUtils.del(CacheKey.MENU_USER + resources.getId()); redisUtils.del(CacheKey.ROLE_AUTH + resources.getId()); } + // 修改部门会影响 数据权限 + if (!Objects.equals(resources.getDept(),user.getDept())) { + redisUtils.del(CacheKey.DATA_USER + resources.getId()); + } // 如果用户被禁用,则清除用户登录信息 if(!resources.getEnabled()){ onlineUserService.kickOutForUsername(resources.getUsername()); diff --git a/eladmin-system/src/main/resources/banner.txt b/eladmin-system/src/main/resources/banner.txt index fc2a4370..cc460ce3 100644 --- a/eladmin-system/src/main/resources/banner.txt +++ b/eladmin-system/src/main/resources/banner.txt @@ -5,4 +5,4 @@ | __| | | (_| | (_| | | | | | | | | | | \___|_| \__,_|\__,_|_| |_| |_|_|_| |_| - :: Spring Boot :: (v2.2.10.RELEASE) \ No newline at end of file + :: Spring Boot :: (v2.6.4) \ No newline at end of file diff --git a/eladmin-system/src/main/resources/template/generator/admin/Entity.ftl b/eladmin-system/src/main/resources/template/generator/admin/Entity.ftl index 9d8b1e71..c5cf9c26 100644 --- a/eladmin-system/src/main/resources/template/generator/admin/Entity.ftl +++ b/eladmin-system/src/main/resources/template/generator/admin/Entity.ftl @@ -55,7 +55,7 @@ public class ${className} implements Serializable { @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "${column.columnName}"<#if column.columnKey = 'UNI'>,unique = true<#if column.istNotNull && column.columnKey != 'PRI'>,nullable = false) + @Column(name = "`${column.columnName}`"<#if column.columnKey = 'UNI'>,unique = true<#if column.istNotNull && column.columnKey != 'PRI'>,nullable = false) <#if column.istNotNull && column.columnKey != 'PRI'> <#if column.columnType = 'String'> @NotBlank @@ -82,4 +82,4 @@ public class ${className} implements Serializable { public void copy(${className} source){ BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true)); } -} \ No newline at end of file +} diff --git a/eladmin-system/src/test/java/me/zhengjie/EladminSystemApplicationTests.java b/eladmin-system/src/test/java/me/zhengjie/EladminSystemApplicationTests.java index 45d52120..d3986f0f 100644 --- a/eladmin-system/src/test/java/me/zhengjie/EladminSystemApplicationTests.java +++ b/eladmin-system/src/test/java/me/zhengjie/EladminSystemApplicationTests.java @@ -1,11 +1,8 @@ package me.zhengjie; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class EladminSystemApplicationTests { diff --git a/eladmin-tools/pom.xml b/eladmin-tools/pom.xml index 4bbf9f4c..dbf5e63b 100644 --- a/eladmin-tools/pom.xml +++ b/eladmin-tools/pom.xml @@ -14,8 +14,8 @@ 1.4.7 - [7.2.0, 7.2.99] - 4.9.153.ALL + 7.9.3 + 4.22.57.ALL @@ -47,4 +47,4 @@ ${alipay.version} - \ No newline at end of file + diff --git a/pom.xml b/pom.xml index 1f64d700..14bf38dc 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ org.springframework.boot spring-boot-starter-parent - 2.2.10.RELEASE + 2.6.4 @@ -35,9 +35,9 @@ 1.16 2.9.2 1.2.83 - 1.1.24 - 2.5.0 - 1.3.1.Final + 1.2.8 + 2.11.1 + 1.4.2.Final @@ -80,6 +80,7 @@ + org.apache.commons commons-pool2 @@ -98,37 +99,14 @@ + - io.springfox - springfox-swagger2 - ${swagger.version} - - - io.swagger - swagger-annotations - - - io.swagger - swagger-models - - - - - io.springfox - springfox-swagger-ui - ${swagger.version} - - - io.swagger - swagger-annotations - 1.5.21 - - - io.swagger - swagger-models - 1.5.21 + com.github.xiaoymin + knife4j-spring-boot-starter + 3.0.3 + mysql @@ -144,13 +122,13 @@ + net.dreamlu mica-ip2region - 2.5.6 + 2.6.3 - org.projectlombok @@ -162,12 +140,12 @@ org.apache.poi poi - 3.17 + 5.2.0 org.apache.poi poi-ooxml - 3.17 + 5.2.0 xerces @@ -211,7 +189,7 @@ nl.basjes.parse.useragent yauaa - 5.23 + 6.11