diff --git a/README.md b/README.md index 7004f0e50..f58204078 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,6 @@ [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.5-blue.svg)]() [![JDK-8+](https://img.shields.io/badge/JDK-8-green.svg)]() [![JDK-11](https://img.shields.io/badge/JDK-11-green.svg)]() -[![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]() > RuoYi-Vue-Plus 是基于 RuoYi-Vue 针对 `分布式集群` 场景升级(不兼容原框架) @@ -22,7 +21,7 @@ | 原框架 | RuoYi-Vue | [RuoYi-Vue官网](http://ruoyi.vip/) | 定期同步需要的功能 | | 前端开发框架 | Vue、Element UI | [Element UI官网](https://element.eleme.cn/#/zh-CN) | | | 后端开发框架 | SpringBoot | [SpringBoot官网](https://spring.io/projects/spring-boot/#learn) | | -| 容器框架 | Undertow | [Undertow官网](https://undertow.io/) | 基于 Netty 的高性能容器 | +| 容器框架 | Undertow | [Undertow官网](https://undertow.io/) | 基于 XNIO 的高性能容器 | | 权限认证框架 | Spring Security、Jwt | [SpringSecurity官网](https://spring.io/projects/spring-security#learn) | 支持多终端认证系统 | | 关系数据库 | MySQL | [MySQL官网](https://dev.mysql.com/) | 适配 8.X 最低 5.7 | | 缓存数据库 | Redis | [Redis官网](https://redis.io/) | 适配 6.X 最低 4.X | diff --git a/pom.xml b/pom.xml index e96836a09..0dd48a3b3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,7 @@ 1.5.22 4.1.2 2.2.11 + 3.3.0 2.3 3.4.3.4 3.9.1 @@ -33,7 +34,7 @@ 3.16.4 2.2.1 3.4.1 - 1.3.4 + 1.3.5 2.3.0 @@ -114,6 +115,12 @@ + + cglib + cglib + ${cglib.version} + + org.apache.velocity @@ -196,29 +203,13 @@ com.yomahub - tlog-spring-boot-configuration + tlog-web-spring-boot-starter ${tlog.version} com.yomahub - tlog-webroot - ${tlog.version} - - - javassist - org.javassist - - - guava - com.google.guava - - - - - - com.yomahub - tlog-xxl-job + tlog-xxljob-spring-boot-starter ${tlog.version} diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index f7ef6339d..abaf6d610 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -120,11 +120,11 @@ security: - /*/api-docs # druid 监控配置 - /druid/** + # 用户放行 + permit-all: # actuator 监控配置 - /actuator - /actuator/** - # 用户放行 - permit-all: # 重复提交 repeat-submit: diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 68db4ccba..2111510a7 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -64,6 +64,11 @@ easyexcel + + cglib + cglib + + org.yaml @@ -135,16 +140,6 @@ lock4j-redisson-spring-boot-starter - - com.yomahub - tlog-spring-boot-configuration - - - - com.yomahub - tlog-webroot - - diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java index 30d074b75..8efc9f7a0 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java @@ -1,5 +1,6 @@ package com.ruoyi.common.core.domain.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.core.domain.TreeEntity; @@ -65,6 +66,7 @@ public class SysMenu extends TreeEntity { * 路由参数 */ @ApiModelProperty(value = "路由参数") + @TableField("`query`") private String query; /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java index 815791bf0..6b373ffcb 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java @@ -1,6 +1,5 @@ package com.ruoyi.common.core.mybatisplus.core; -import cn.hutool.core.bean.copier.CopyOptions; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.IService; @@ -23,14 +22,9 @@ public interface IServicePlus extends IService { /** * @param id 主键id - * @param copyOptions copy条件 * @return V对象 */ - V getVoById(Serializable id, CopyOptions copyOptions); - - default V getVoById(Serializable id) { - return getVoById(id, new CopyOptions()); - } + V getVoById(Serializable id); /** * @param convertor 自定义转换器 @@ -41,14 +35,9 @@ public interface IServicePlus extends IService { /** * @param idList id列表 - * @param copyOptions copy条件 * @return V对象 */ - List listVoByIds(Collection idList, CopyOptions copyOptions); - - default List listVoByIds(Collection idList) { - return listVoByIds(idList, new CopyOptions()); - } + List listVoByIds(Collection idList); /** * @param convertor 自定义转换器 @@ -64,14 +53,9 @@ public interface IServicePlus extends IService { /** * @param columnMap 表字段 map 对象 - * @param copyOptions copy条件 * @return V对象 */ - List listVoByMap(Map columnMap, CopyOptions copyOptions); - - default List listVoByMap(Map columnMap) { - return listVoByMap(columnMap, new CopyOptions()); - } + List listVoByMap(Map columnMap); /** * @param convertor 自定义转换器 @@ -87,14 +71,9 @@ public interface IServicePlus extends IService { /** * @param queryWrapper 查询条件 - * @param copyOptions copy条件 * @return V对象 */ - V getVoOne(Wrapper queryWrapper, CopyOptions copyOptions); - - default V getVoOne(Wrapper queryWrapper) { - return getVoOne(queryWrapper, new CopyOptions()); - } + V getVoOne(Wrapper queryWrapper); /** * @param convertor 自定义转换器 @@ -105,14 +84,9 @@ public interface IServicePlus extends IService { /** * @param queryWrapper 查询条件 - * @param copyOptions copy条件 * @return V对象 */ - List listVo(Wrapper queryWrapper, CopyOptions copyOptions); - - default List listVo(Wrapper queryWrapper) { - return listVo(queryWrapper, new CopyOptions()); - } + List listVo(Wrapper queryWrapper); /** * @param convertor 自定义转换器 @@ -139,14 +113,9 @@ public interface IServicePlus extends IService { /** * @param page 分页对象 * @param queryWrapper 查询条件 - * @param copyOptions copy条件 * @return V对象 */ - PagePlus pageVo(PagePlus page, Wrapper queryWrapper, CopyOptions copyOptions); - - default PagePlus pageVo(PagePlus page, Wrapper queryWrapper) { - return pageVo(page, queryWrapper, new CopyOptions()); - } + PagePlus pageVo(PagePlus page, Wrapper queryWrapper); /** * @param convertor 自定义转换器 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java index e9c1f191e..4de5b326d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java @@ -1,6 +1,5 @@ package com.ruoyi.common.core.mybatisplus.core; -import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; @@ -165,9 +164,9 @@ public class ServicePlusImpl, T, V> extends ServiceI * @param id 主键ID */ @Override - public V getVoById(Serializable id, CopyOptions copyOptions) { + public V getVoById(Serializable id) { T t = getBaseMapper().selectById(id); - return BeanCopyUtils.oneCopy(t, copyOptions, voClass); + return BeanCopyUtils.copy(t, voClass); } /** @@ -176,12 +175,12 @@ public class ServicePlusImpl, T, V> extends ServiceI * @param idList 主键ID列表 */ @Override - public List listVoByIds(Collection idList, CopyOptions copyOptions) { + public List listVoByIds(Collection idList) { List list = getBaseMapper().selectBatchIds(idList); if (list == null) { return null; } - return BeanCopyUtils.listCopy(list, copyOptions, voClass); + return BeanCopyUtils.copyList(list, voClass); } /** @@ -190,12 +189,12 @@ public class ServicePlusImpl, T, V> extends ServiceI * @param columnMap 表字段 map 对象 */ @Override - public List listVoByMap(Map columnMap, CopyOptions copyOptions) { + public List listVoByMap(Map columnMap) { List list = getBaseMapper().selectByMap(columnMap); if (list == null) { return null; } - return BeanCopyUtils.listCopy(list, copyOptions, voClass); + return BeanCopyUtils.copyList(list, voClass); } /** @@ -205,9 +204,9 @@ public class ServicePlusImpl, T, V> extends ServiceI * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} */ @Override - public V getVoOne(Wrapper queryWrapper, CopyOptions copyOptions) { + public V getVoOne(Wrapper queryWrapper) { T t = getOne(queryWrapper, true); - return BeanCopyUtils.oneCopy(t, copyOptions, voClass); + return BeanCopyUtils.copy(t, voClass); } /** @@ -216,12 +215,12 @@ public class ServicePlusImpl, T, V> extends ServiceI * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} */ @Override - public List listVo(Wrapper queryWrapper, CopyOptions copyOptions) { + public List listVo(Wrapper queryWrapper) { List list = getBaseMapper().selectList(queryWrapper); if (list == null) { return null; } - return BeanCopyUtils.listCopy(list, copyOptions, voClass); + return BeanCopyUtils.copyList(list, voClass); } /** @@ -231,9 +230,9 @@ public class ServicePlusImpl, T, V> extends ServiceI * @param queryWrapper 实体对象封装操作类 */ @Override - public PagePlus pageVo(PagePlus page, Wrapper queryWrapper, CopyOptions copyOptions) { + public PagePlus pageVo(PagePlus page, Wrapper queryWrapper) { PagePlus result = getBaseMapper().selectPage(page, queryWrapper); - List volist = BeanCopyUtils.listCopy(result.getRecords(), copyOptions, voClass); + List volist = BeanCopyUtils.copyList(result.getRecords(), voClass); result.setRecordsVo(volist); return result; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java b/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java index f626a5e11..9936f6762 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java @@ -5,7 +5,7 @@ import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.exception.ExcelAnalysisException; import com.alibaba.excel.exception.ExcelDataConvertException; -import com.alibaba.fastjson.JSON; +import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.ValidatorUtils; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -84,7 +84,7 @@ public class DefaultExcelListener extends AnalysisEventListener implements @Override public void invokeHeadMap(Map headMap, AnalysisContext context) { this.headMap = headMap; - log.debug("解析到一条表头数据: {}", JSON.toJSONString(headMap)); + log.debug("解析到一条表头数据: {}", JsonUtils.toJsonString(headMap)); } @Override diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java index 8bf40d16a..0bd4a55b9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java @@ -1,66 +1,120 @@ package com.ruoyi.common.utils; -import cn.hutool.core.bean.copier.BeanCopier; -import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; +import cn.hutool.extra.cglib.CglibUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; /** - * bean深拷贝工具 + * bean深拷贝工具(基于 cglib 性能优异) * * @author Lion Li */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class BeanCopyUtils { /** * 单对象基于class创建拷贝 * - * @param source 数据来源实体 - * @param copyOptions copy条件 - * @param desc 描述对象 转换后的对象 + * @param source 数据来源实体 + * @param desc 描述对象 转换后的对象 * @return desc */ - public static V oneCopy(T source, CopyOptions copyOptions, Class desc) { - V v = ReflectUtil.newInstanceIfPossible(desc); - return oneCopy(source, copyOptions, v); + public static V copy(T source, Class desc) { + if (ObjectUtil.isNull(source)) { + return null; + } + if (ObjectUtil.isNull(desc)) { + return null; + } + return CglibUtil.copy(source, desc); } /** * 单对象基于对象创建拷贝 * - * @param source 数据来源实体 - * @param copyOptions copy条件 - * @param desc 转换后的对象 + * @param source 数据来源实体 + * @param desc 转换后的对象 * @return desc */ - public static V oneCopy(T source, CopyOptions copyOptions, V desc) { + public static V copy(T source, V desc) { if (ObjectUtil.isNull(source)) { return null; } - return BeanCopier.create(source, desc, copyOptions).copy(); + if (ObjectUtil.isNull(desc)) { + return null; + } + CglibUtil.copy(source, desc); + return desc; } /** * 列表对象基于class创建拷贝 * - * @param sourceList 数据来源实体列表 - * @param copyOptions copy条件 - * @param desc 描述对象 转换后的对象 + * @param sourceList 数据来源实体列表 + * @param desc 描述对象 转换后的对象 * @return desc */ - public static List listCopy(List sourceList, CopyOptions copyOptions, Class desc) { + public static List copyList(List sourceList, Class desc) { if (ObjectUtil.isNull(sourceList)) { return null; } if (CollUtil.isEmpty(sourceList)) { return CollUtil.newArrayList(); } - return sourceList.stream() - .map(source -> oneCopy(source, copyOptions, desc)) - .collect(Collectors.toList()); + return CglibUtil.copyList(sourceList, () -> ReflectUtil.newInstanceIfPossible(desc)); + } + + /** + * bean拷贝到map + * + * @param bean 数据来源实体 + * @return map对象 + */ + public static Map copyToMap(T bean) { + if (ObjectUtil.isNull(bean)) { + return null; + } + return CglibUtil.toMap(bean); + } + + /** + * map拷贝到bean + * + * @param map 数据来源 + * @param beanClass bean类 + * @return bean对象 + */ + public static T mapToBean(Map map, Class beanClass) { + if (MapUtil.isEmpty(map)) { + return null; + } + if (ObjectUtil.isNull(beanClass)) { + return null; + } + return CglibUtil.toBean(map, beanClass); + } + + /** + * map拷贝到bean + * + * @param map 数据来源 + * @param bean bean对象 + * @return bean对象 + */ + public static T mapToBean(Map map, T bean) { + if (MapUtil.isEmpty(map)) { + return null; + } + if (ObjectUtil.isNull(bean)) { + return null; + } + return CglibUtil.fillBean(map, bean); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java index 1e27f2494..bc38eedd5 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java @@ -1,5 +1,7 @@ package com.ruoyi.common.utils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import org.apache.commons.lang3.time.DateFormatUtils; import java.lang.management.ManagementFactory; @@ -12,6 +14,7 @@ import java.util.Date; * * @author ruoyi */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class DateUtils extends org.apache.commons.lang3.time.DateUtils { public static String YYYY = "yyyy"; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java deleted file mode 100644 index 3309da14e..000000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.ruoyi.common.utils; - -import cn.hutool.core.collection.CollUtil; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.entity.SysDictData; - -import java.util.Collection; -import java.util.List; - -/** - * 字典工具类 - * - * @author ruoyi - * @deprecated 3.5.0 版本删除 迁移至 {@link com.ruoyi.common.core.service.DictService} - */ -@Deprecated -public class DictUtils { - - /** - * 分隔符 - */ - public static final String SEPARATOR = ","; - - /** - * 设置字典缓存 - * - * @param key 参数键 - * @param dictDatas 字典数据列表 - */ - public static void setDictCache(String key, List dictDatas) { - RedisUtils.setCacheObject(getCacheKey(key), dictDatas); - } - - /** - * 获取字典缓存 - * - * @param key 参数键 - * @return dictDatas 字典数据列表 - */ - public static List getDictCache(String key) { - List dictDatas = RedisUtils.getCacheObject(getCacheKey(key)); - if (StringUtils.isNotNull(dictDatas)) { - return dictDatas; - } - return null; - } - - /** - * 根据字典类型和字典值获取字典标签 - * - * @param dictType 字典类型 - * @param dictValue 字典值 - * @return 字典标签 - */ - public static String getDictLabel(String dictType, String dictValue) { - return getDictLabel(dictType, dictValue, SEPARATOR); - } - - /** - * 根据字典类型和字典标签获取字典值 - * - * @param dictType 字典类型 - * @param dictLabel 字典标签 - * @return 字典值 - */ - public static String getDictValue(String dictType, String dictLabel) { - return getDictValue(dictType, dictLabel, SEPARATOR); - } - - /** - * 根据字典类型和字典值获取字典标签 - * - * @param dictType 字典类型 - * @param dictValue 字典值 - * @param separator 分隔符 - * @return 字典标签 - */ - public static String getDictLabel(String dictType, String dictValue, String separator) { - StringBuilder propertyString = new StringBuilder(); - List datas = getDictCache(dictType); - - if (StringUtils.containsAny(dictValue, separator) && CollUtil.isNotEmpty(datas)) { - for (SysDictData dict : datas) { - for (String value : dictValue.split(separator)) { - if (value.equals(dict.getDictValue())) { - propertyString.append(dict.getDictLabel() + separator); - break; - } - } - } - } else { - for (SysDictData dict : datas) { - if (dictValue.equals(dict.getDictValue())) { - return dict.getDictLabel(); - } - } - } - return StringUtils.stripEnd(propertyString.toString(), separator); - } - - /** - * 根据字典类型和字典标签获取字典值 - * - * @param dictType 字典类型 - * @param dictLabel 字典标签 - * @param separator 分隔符 - * @return 字典值 - */ - public static String getDictValue(String dictType, String dictLabel, String separator) { - StringBuilder propertyString = new StringBuilder(); - List datas = getDictCache(dictType); - - if (StringUtils.containsAny(dictLabel, separator) && CollUtil.isNotEmpty(datas)) { - for (SysDictData dict : datas) { - for (String label : dictLabel.split(separator)) { - if (label.equals(dict.getDictLabel())) { - propertyString.append(dict.getDictValue() + separator); - break; - } - } - } - } else { - for (SysDictData dict : datas) { - if (dictLabel.equals(dict.getDictLabel())) { - return dict.getDictValue(); - } - } - } - return StringUtils.stripEnd(propertyString.toString(), separator); - } - - /** - * 删除指定字典缓存 - * - * @param key 字典键 - */ - public static void removeDictCache(String key) { - RedisUtils.deleteObject(getCacheKey(key)); - } - - /** - * 清空字典缓存 - */ - public static void clearDictCache() { - Collection keys = RedisUtils.keys(Constants.SYS_DICT_KEY + "*"); - RedisUtils.deleteObject(keys); - } - - /** - * 设置cache key - * - * @param configKey 参数键 - * @return 缓存键key - */ - public static String getCacheKey(String configKey) { - return Constants.SYS_DICT_KEY + configKey; - } -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java index b65c23dc8..1c01912a3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java @@ -21,14 +21,18 @@ import java.util.Map; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class JsonUtils { - private static ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class); + private static final ObjectMapper OBJECT_MAPPER = SpringUtils.getBean(ObjectMapper.class); + + public static ObjectMapper getObjectMapper() { + return OBJECT_MAPPER; + } public static String toJsonString(Object object) { if (StringUtils.isNull(object)) { return null; } try { - return objectMapper.writeValueAsString(object); + return OBJECT_MAPPER.writeValueAsString(object); } catch (JsonProcessingException e) { throw new RuntimeException(e); } @@ -39,7 +43,7 @@ public class JsonUtils { return null; } try { - return objectMapper.readValue(text, clazz); + return OBJECT_MAPPER.readValue(text, clazz); } catch (IOException e) { throw new RuntimeException(e); } @@ -50,7 +54,7 @@ public class JsonUtils { return null; } try { - return objectMapper.readValue(bytes, clazz); + return OBJECT_MAPPER.readValue(bytes, clazz); } catch (IOException e) { throw new RuntimeException(e); } @@ -61,7 +65,7 @@ public class JsonUtils { return null; } try { - return objectMapper.readValue(text, typeReference); + return OBJECT_MAPPER.readValue(text, typeReference); } catch (IOException e) { throw new RuntimeException(e); } @@ -72,7 +76,7 @@ public class JsonUtils { return null; } try { - return objectMapper.readValue(text, new TypeReference>() { + return OBJECT_MAPPER.readValue(text, new TypeReference>() { }); } catch (IOException e) { throw new RuntimeException(e); @@ -84,7 +88,7 @@ public class JsonUtils { return new ArrayList<>(); } try { - return objectMapper.readValue(text, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)); + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz)); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java index 039eb2435..c9c091d6f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java @@ -1,15 +1,21 @@ package com.ruoyi.common.utils; import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; /** * 获取i18n资源文件 * - * @author ruoyi + * @author Lion Li */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class MessageUtils { + + private static final MessageSource MESSAGE_SOURCE = SpringUtils.getBean(MessageSource.class); + /** * 根据消息键和参数 获取消息 委托给spring messageSource * @@ -18,7 +24,6 @@ public class MessageUtils { * @return 获取国际化翻译值 */ public static String message(String code, Object... args) { - MessageSource messageSource = SpringUtils.getBean(MessageSource.class); - return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); + return MESSAGE_SOURCE.getMessage(code, args, LocaleContextHolder.getLocale()); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java index 4b3dd9b91..16a5a24f7 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java @@ -8,6 +8,8 @@ import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.PagePlus; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.sql.SqlUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import java.util.List; @@ -16,6 +18,7 @@ import java.util.List; * * @author Lion Li */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class PageUtils { /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java index 7f4d2cace..0ccbe0fa5 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java @@ -1,6 +1,6 @@ package com.ruoyi.common.utils; -import com.google.common.collect.Lists; +import cn.hutool.core.collection.IterUtil; import com.ruoyi.common.utils.spring.SpringUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -23,7 +23,7 @@ import java.util.function.Consumer; @SuppressWarnings(value = {"unchecked", "rawtypes"}) public class RedisUtils { - private static RedissonClient client = SpringUtils.getBean(RedissonClient.class); + private static final RedissonClient CLIENT = SpringUtils.getBean(RedissonClient.class); /** * 限流 @@ -35,7 +35,7 @@ public class RedisUtils { * @return -1 表示失败 */ public static long rateLimiter(String key, RateType rateType, int rate, int rateInterval) { - RRateLimiter rateLimiter = client.getRateLimiter(key); + RRateLimiter rateLimiter = CLIENT.getRateLimiter(key); rateLimiter.trySetRate(rateType, rate, rateInterval, RateIntervalUnit.SECONDS); if (rateLimiter.tryAcquire()) { return rateLimiter.availablePermits(); @@ -45,10 +45,10 @@ public class RedisUtils { } /** - * 获取实例id + * 获取客户端实例 */ - public static String getClientId() { - return client.getId(); + public static RedissonClient getClient() { + return CLIENT; } /** @@ -59,13 +59,13 @@ public class RedisUtils { * @param consumer 自定义处理 */ public static void publish(String channelKey, T msg, Consumer consumer) { - RTopic topic = client.getTopic(channelKey); + RTopic topic = CLIENT.getTopic(channelKey); topic.publish(msg); consumer.accept(msg); } public static void publish(String channelKey, T msg) { - RTopic topic = client.getTopic(channelKey); + RTopic topic = CLIENT.getTopic(channelKey); topic.publish(msg); } @@ -77,7 +77,7 @@ public class RedisUtils { * @param consumer 自定义处理 */ public static void subscribe(String channelKey, Class clazz, Consumer consumer) { - RTopic topic = client.getTopic(channelKey); + RTopic topic = CLIENT.getTopic(channelKey); topic.addListener(clazz, (channel, msg) -> consumer.accept(msg)); } @@ -94,13 +94,13 @@ public class RedisUtils { /** * 缓存基本的对象,保留当前对象 TTL 有效期 * - * @param key 缓存的键值 - * @param value 缓存的值 + * @param key 缓存的键值 + * @param value 缓存的值 * @param isSaveTtl 是否保留TTL有效期(例如: set之前ttl剩余90 set之后还是为90) * @since Redis 6.X 以上使用 setAndKeepTTL 兼容 5.X 方案 */ public static void setCacheObject(final String key, final T value, final boolean isSaveTtl) { - RBucket bucket = client.getBucket(key); + RBucket bucket = CLIENT.getBucket(key); if (isSaveTtl) { try { bucket.setAndKeepTTL(value); @@ -123,11 +123,24 @@ public class RedisUtils { * @param timeUnit 时间颗粒度 */ public static void setCacheObject(final String key, final T value, final long timeout, final TimeUnit timeUnit) { - RBucket result = client.getBucket(key); + RBucket result = CLIENT.getBucket(key); result.set(value); result.expire(timeout, timeUnit); } + /** + * 注册对象监听器 + * + * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 + * + * @param key 缓存的键值 + * @param listener 监听器配置 + */ + public static void addObjectListener(final String key, final ObjectListener listener) { + RBucket result = CLIENT.getBucket(key); + result.addListener(listener); + } + /** * 设置有效时间 * @@ -148,7 +161,7 @@ public class RedisUtils { * @return true=设置成功;false=设置失败 */ public static boolean expire(final String key, final long timeout, final TimeUnit unit) { - RBucket rBucket = client.getBucket(key); + RBucket rBucket = CLIENT.getBucket(key); return rBucket.expire(timeout, unit); } @@ -159,7 +172,7 @@ public class RedisUtils { * @return 缓存键值对应的数据 */ public static T getCacheObject(final String key) { - RBucket rBucket = client.getBucket(key); + RBucket rBucket = CLIENT.getBucket(key); return rBucket.get(); } @@ -170,29 +183,26 @@ public class RedisUtils { * @return 剩余存活时间 */ public static long getTimeToLive(final String key) { - RBucket rBucket = client.getBucket(key); + RBucket rBucket = CLIENT.getBucket(key); return rBucket.remainTimeToLive(); } /** * 删除单个对象 * - * @param key + * @param key 缓存的键值 */ public static boolean deleteObject(final String key) { - return client.getBucket(key).delete(); + return CLIENT.getBucket(key).delete(); } - /* */ - /** * 删除集合对象 * * @param collection 多个对象 - * @return */ public static void deleteObject(final Collection collection) { - RBatch batch = client.createBatch(); + RBatch batch = CLIENT.createBatch(); collection.forEach(t -> { batch.getBucket(t.toString()).deleteAsync(); }); @@ -207,10 +217,23 @@ public class RedisUtils { * @return 缓存的对象 */ public static boolean setCacheList(final String key, final List dataList) { - RList rList = client.getList(key); + RList rList = CLIENT.getList(key); return rList.addAll(dataList); } + /** + * 注册List监听器 + * + * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 + * + * @param key 缓存的键值 + * @param listener 监听器配置 + */ + public static void addListListener(final String key, final ObjectListener listener) { + RList rList = CLIENT.getList(key); + rList.addListener(listener); + } + /** * 获得缓存的list对象 * @@ -218,7 +241,7 @@ public class RedisUtils { * @return 缓存键值对应的数据 */ public static List getCacheList(final String key) { - RList rList = client.getList(key); + RList rList = CLIENT.getList(key); return rList.readAll(); } @@ -230,42 +253,68 @@ public class RedisUtils { * @return 缓存数据的对象 */ public static boolean setCacheSet(final String key, final Set dataSet) { - RSet rSet = client.getSet(key); + RSet rSet = CLIENT.getSet(key); return rSet.addAll(dataSet); } + /** + * 注册Set监听器 + * + * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 + * + * @param key 缓存的键值 + * @param listener 监听器配置 + */ + public static void addSetListener(final String key, final ObjectListener listener) { + RSet rSet = CLIENT.getSet(key); + rSet.addListener(listener); + } + /** * 获得缓存的set * - * @param key - * @return + * @param key 缓存的key + * @return set对象 */ public static Set getCacheSet(final String key) { - RSet rSet = client.getSet(key); + RSet rSet = CLIENT.getSet(key); return rSet.readAll(); } /** * 缓存Map * - * @param key - * @param dataMap + * @param key 缓存的键值 + * @param dataMap 缓存的数据 */ public static void setCacheMap(final String key, final Map dataMap) { if (dataMap != null) { - RMap rMap = client.getMap(key); + RMap rMap = CLIENT.getMap(key); rMap.putAll(dataMap); } } + /** + * 注册Map监听器 + * + * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 + * + * @param key 缓存的键值 + * @param listener 监听器配置 + */ + public static void addMapListener(final String key, final ObjectListener listener) { + RMap rMap = CLIENT.getMap(key); + rMap.addListener(listener); + } + /** * 获得缓存的Map * - * @param key - * @return + * @param key 缓存的键值 + * @return map对象 */ public static Map getCacheMap(final String key) { - RMap rMap = client.getMap(key); + RMap rMap = CLIENT.getMap(key); return rMap.getAll(rMap.keySet()); } @@ -277,7 +326,7 @@ public class RedisUtils { * @param value 值 */ public static void setCacheMapValue(final String key, final String hKey, final T value) { - RMap rMap = client.getMap(key); + RMap rMap = CLIENT.getMap(key); rMap.put(hKey, value); } @@ -289,7 +338,7 @@ public class RedisUtils { * @return Hash中的对象 */ public static T getCacheMapValue(final String key, final String hKey) { - RMap rMap = client.getMap(key); + RMap rMap = CLIENT.getMap(key); return rMap.get(hKey); } @@ -301,7 +350,7 @@ public class RedisUtils { * @return Hash中的对象 */ public static T delCacheMapValue(final String key, final String hKey) { - RMap rMap = client.getMap(key); + RMap rMap = CLIENT.getMap(key); return rMap.remove(hKey); } @@ -313,7 +362,7 @@ public class RedisUtils { * @return Hash对象集合 */ public static Map getMultiCacheMapValue(final String key, final Set hKeys) { - RMap rMap = client.getMap(key); + RMap rMap = CLIENT.getMap(key); return rMap.getAll(hKeys); } @@ -324,7 +373,7 @@ public class RedisUtils { * @return 对象列表 */ public static Collection keys(final String pattern) { - Iterable iterable = client.getKeys().getKeysByPattern(pattern); - return Lists.newArrayList(iterable); + Iterable iterable = CLIENT.getKeys().getKeysByPattern(pattern); + return IterUtil.toList(iterable); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java index 91a40ec12..43cb8fe17 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java @@ -3,6 +3,8 @@ package com.ruoyi.common.utils; import cn.hutool.http.HttpStatus; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.ServiceException; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -12,6 +14,7 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; * * @author ruoyi */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class SecurityUtils { /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java index 1e1db3749..5babaeb30 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java @@ -3,6 +3,8 @@ package com.ruoyi.common.utils; import cn.hutool.core.convert.Convert; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.http.HttpStatus; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import org.springframework.http.MediaType; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; @@ -19,6 +21,7 @@ import java.nio.charset.StandardCharsets; * * @author ruoyi */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class ServletUtils extends ServletUtil { /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java index 12fc4db9b..f96c1e5a5 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -7,6 +7,8 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import java.util.*; @@ -15,6 +17,7 @@ import java.util.*; * * @author Lion Li */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class StringUtils extends org.apache.commons.lang3.StringUtils { /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java index 5be9582ad..1952929dd 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java @@ -1,7 +1,8 @@ package com.ruoyi.common.utils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; import java.util.concurrent.*; @@ -10,8 +11,9 @@ import java.util.concurrent.*; * * @author ruoyi */ +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class Threads { - private static final Logger logger = LoggerFactory.getLogger(Threads.class); /** * sleep等待,单位为毫秒 @@ -38,7 +40,7 @@ public class Threads { if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { pool.shutdownNow(); if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { - logger.info("Pool did not terminate"); + log.info("Pool did not terminate"); } } } catch (InterruptedException ie) { @@ -67,7 +69,7 @@ public class Threads { } } if (t != null) { - logger.error(t.getMessage(), t); + log.error(t.getMessage(), t); } } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeBuildUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeBuildUtils.java index a8380a287..7d2541062 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeBuildUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeBuildUtils.java @@ -4,6 +4,8 @@ import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.TreeNodeConfig; import cn.hutool.core.lang.tree.TreeUtil; import cn.hutool.core.lang.tree.parser.NodeParser; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import java.util.List; @@ -12,6 +14,7 @@ import java.util.List; * * @author Lion Li */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class TreeBuildUtils extends TreeUtil { /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java index c28cf80fa..e26e7846c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java @@ -1,5 +1,8 @@ package com.ruoyi.common.utils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import javax.validation.Validation; @@ -11,6 +14,7 @@ import java.util.Set; * * @author Lion Li */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class ValidatorUtils { private static final Validator VALID = Validation.buildDefaultValidatorFactory().getValidator(); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java index ff56a2a70..5118d5169 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java @@ -1,6 +1,8 @@ package com.ruoyi.common.utils.file; import cn.hutool.core.io.FileUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import javax.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; @@ -12,6 +14,7 @@ import java.nio.charset.StandardCharsets; * * @author Lion Li */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class FileUtils extends FileUtil { /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java index 808cc8d5c..b519226bb 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java @@ -7,6 +7,8 @@ import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.StringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import java.util.Map; @@ -17,6 +19,7 @@ import java.util.Map; * @author Lion Li */ @Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class AddressUtils { // IP地址查询 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index 6c5dc5fc8..36dc67fa1 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -9,6 +9,8 @@ import com.ruoyi.common.excel.ExcelListener; import com.ruoyi.common.excel.ExcelResult; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; @@ -21,6 +23,7 @@ import java.util.List; * * @author Lion Li */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class ExcelUtil { /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java index 07ac943c3..0e0d7e7f5 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java @@ -2,6 +2,8 @@ package com.ruoyi.common.utils.reflect; import cn.hutool.core.util.ReflectUtil; import com.ruoyi.common.utils.StringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import java.lang.reflect.Method; @@ -11,6 +13,7 @@ import java.lang.reflect.Method; * @author Lion Li */ @SuppressWarnings("rawtypes") +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class ReflectUtils extends ReflectUtil { private static final String SETTER_PREFIX = "set"; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java index 8121e0253..eabe6ad95 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java @@ -2,17 +2,20 @@ package com.ruoyi.common.utils.sql; import com.ruoyi.common.exception.UtilException; import com.ruoyi.common.utils.StringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; /** * sql操作工具类 * * @author ruoyi */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class SqlUtil { /** * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) */ - public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; + public static final String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; /** * 检查字符,防止注入绕过 diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java index 7335e2f25..04a0fdef0 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java @@ -2,7 +2,6 @@ package com.ruoyi.monitor.admin.config; import de.codecentric.boot.admin.server.config.AdminServerProperties; import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @@ -15,7 +14,6 @@ import org.springframework.security.web.authentication.SavedRequestAwareAuthenti */ @Configuration @EnableWebSecurity -@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, proxyTargetClass = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { private final String adminContextPath; @@ -34,8 +32,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { //授予对所有静态资产和登录页面的公共访问权限。 .antMatchers(adminContextPath + "/assets/**").permitAll() .antMatchers(adminContextPath + "/login").permitAll() - .antMatchers("/actuator").anonymous() - .antMatchers("/actuator/**").anonymous() + .antMatchers("/actuator").permitAll() + .antMatchers("/actuator/**").permitAll() //必须对每个其他请求进行身份验证 .anyRequest().authenticated().and() //配置登录和注销 diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index d5466af29..a368e5e26 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -63,6 +63,11 @@ ruoyi-common + + com.yomahub + tlog-web-spring-boot-starter + + diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/Interceptor/PlusWebInvokeTimeInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/Interceptor/PlusWebInvokeTimeInterceptor.java index e2120bf00..a82fb65c6 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/Interceptor/PlusWebInvokeTimeInterceptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/Interceptor/PlusWebInvokeTimeInterceptor.java @@ -35,14 +35,14 @@ public class PlusWebInvokeTimeInterceptor extends AbsTLogWebHandlerMethodInterce // 打印请求参数 if (isJsonRequest(request)) { String jsonParam = new RequestWrapper(request).getBodyString(); - log.info("[PLUS]开始请求 => URL[{}],参数类型[json],参数:[{}]", url, jsonParam); + log.debug("[PLUS]开始请求 => URL[{}],参数类型[json],参数:[{}]", url, jsonParam); } else { Map parameterMap = request.getParameterMap(); if (MapUtil.isNotEmpty(parameterMap)) { String parameters = JsonUtils.toJsonString(parameterMap); - log.info("[PLUS]开始请求 => URL[{}],参数类型[param],参数:[{}]", url, parameters); + log.debug("[PLUS]开始请求 => URL[{}],参数类型[param],参数:[{}]", url, parameters); } else { - log.info("[PLUS]开始请求 => URL[{}],无参数", url); + log.debug("[PLUS]开始请求 => URL[{}],无参数", url); } } @@ -63,7 +63,7 @@ public class PlusWebInvokeTimeInterceptor extends AbsTLogWebHandlerMethodInterce if (TLogContext.enableInvokeTimePrint()) { StopWatch stopWatch = invokeTimeTL.get(); stopWatch.stop(); - log.info("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime()); + log.debug("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime()); invokeTimeTL.remove(); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java index 40cedcaff..7392d833e 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java @@ -8,15 +8,12 @@ import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.service.UserService; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.reflect.ReflectUtils; import com.ruoyi.common.utils.spring.SpringUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; -import java.util.Map; - /** * 数据过滤处理 * @@ -137,9 +134,6 @@ public class DataScopeAspect { if (params instanceof BaseEntity) { BaseEntity baseEntity = (BaseEntity) params; baseEntity.getParams().put(DATA_SCOPE, sql); - } else { - Map invoke = ReflectUtils.invokeGetter(params, "params"); - invoke.put(DATA_SCOPE, sql); } } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java index df4d9c877..ce3de2bea 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java @@ -54,7 +54,7 @@ public class RateLimiterAspect { stringBuffer.append(ServletUtils.getClientIP()).append("-"); } else if (rateLimiter.limitType() == LimitType.CLUSTER){ // 获取客户端实例id - stringBuffer.append(RedisUtils.getClientId()).append("-"); + stringBuffer.append(RedisUtils.getClient().getId()).append("-"); } MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/TLogConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/TLogConfig.java index c1665d9b0..5ae55add2 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/TLogConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/TLogConfig.java @@ -1,13 +1,8 @@ package com.ruoyi.framework.config; -import com.yomahub.tlog.core.aop.AspectLogAop; -import com.yomahub.tlog.spring.TLogPropertyInit; -import com.yomahub.tlog.spring.TLogSpringAware; -import com.yomahub.tlog.springboot.property.TLogProperty; -import org.springframework.context.annotation.Bean; +import com.yomahub.tlog.springboot.TLogWebAutoConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.core.annotation.Order; /** * 整合 TLog 框架配置 @@ -15,29 +10,9 @@ import org.springframework.core.annotation.Order; * @author Lion Li * @since 3.3.0 */ -@Order(-999) @Configuration -@Import(TLogProperty.class) +// 排除 web 自动配置 自定义实现 +@EnableAutoConfiguration(exclude = TLogWebAutoConfiguration.class) public class TLogConfig { - @Bean - public TLogPropertyInit tLogPropertyInit(TLogProperty tLogProperty) { - TLogPropertyInit tLogPropertyInit = new TLogPropertyInit(); - tLogPropertyInit.setPattern(tLogProperty.getPattern()); - tLogPropertyInit.setEnableInvokeTimePrint(tLogProperty.enableInvokeTimePrint()); - tLogPropertyInit.setIdGenerator(tLogProperty.getIdGenerator()); - tLogPropertyInit.setMdcEnable(tLogProperty.getMdcEnable()); - return tLogPropertyInit; - } - - @Bean - public TLogSpringAware tLogSpringAware(){ - return new TLogSpringAware(); - } - - @Bean - public AspectLogAop aspectLogAop() { - return new AspectLogAop(); - } - } diff --git a/ruoyi-job/pom.xml b/ruoyi-job/pom.xml index a87b3efe9..3c13d3555 100644 --- a/ruoyi-job/pom.xml +++ b/ruoyi-job/pom.xml @@ -31,7 +31,7 @@ com.yomahub - tlog-xxl-job + tlog-xxljob-spring-boot-starter diff --git a/ruoyi-job/src/main/java/com/ruoyi/job/config/XxlJobConfig.java b/ruoyi-job/src/main/java/com/ruoyi/job/config/XxlJobConfig.java index 2df063e36..e051ff0d4 100644 --- a/ruoyi-job/src/main/java/com/ruoyi/job/config/XxlJobConfig.java +++ b/ruoyi-job/src/main/java/com/ruoyi/job/config/XxlJobConfig.java @@ -2,7 +2,6 @@ package com.ruoyi.job.config; import com.ruoyi.job.config.properties.XxlJobProperties; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; -import com.yomahub.tlog.springboot.lifecircle.TLogXxljobEnhanceInit; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -40,9 +39,4 @@ public class XxlJobConfig { return xxlJobSpringExecutor; } - @Bean - public TLogXxljobEnhanceInit tLogXxljobEnhanceInit(){ - return new TLogXxljobEnhanceInit(); - } - -} \ No newline at end of file +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index 5e3fcc596..be9999424 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -1,7 +1,6 @@ package com.ruoyi.system.service.impl; -import cn.hutool.core.text.StrJoiner; -import cn.hutool.core.text.StrPool; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -31,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** * 用户 业务层处理 @@ -129,8 +129,10 @@ public class SysUserServiceImpl extends ServicePlusImpl list = roleMapper.selectRolesByUserName(userName); - String idsStr = StrJoiner.of(StrPool.COMMA).append(list, (role) -> { return role.getRoleName(); }).toString(); - return idsStr; + if (CollUtil.isEmpty(list)) { + return StringUtils.EMPTY; + } + return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(",")); } /** @@ -142,8 +144,10 @@ public class SysUserServiceImpl extends ServicePlusImpl list = postMapper.selectPostsByUserName(userName); - String idsStr = StrJoiner.of(StrPool.COMMA).append(list, (post) -> { return post.getPostName(); }).toString(); - return idsStr; + if (CollUtil.isEmpty(list)) { + return StringUtils.EMPTY; + } + return list.stream().map(SysPost::getPostName).collect(Collectors.joining(",")); } /** diff --git a/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml index bfb543673..d441c73af 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -27,33 +27,13 @@ - - select menu_id, - menu_name, - parent_id, - order_num, - path, - component, - query, - is_frame, - is_cache, - menu_type, - visible, - status, - ifnull(perms, '') as perms, - icon, - create_time - from sys_menu - - -