volist = BeanCopyUtils.copyList(result.getRecords(), voClass);
result.setRecordsVo(volist);
return result;
}
+ /**
+ * 翻页查询
+ *
+ * @param page 翻页对象
+ * @param queryWrapper 实体对象封装操作类
+ */
+ public > P pageVo(IPage page, Wrapper queryWrapper) {
+ return getBaseMapper().selectVoPage(page, queryWrapper, voClass);
+ }
+
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PagePlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PagePlus.java
index 79d889cf0..bff381c40 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PagePlus.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PagePlus.java
@@ -16,9 +16,11 @@
* @param 数据库实体
* @param vo实体
* @author Lion Li
+ * @deprecated 3.6.0 删除 请使用 {@link com.ruoyi.common.core.domain.PageQuery#build()}
*/
@Data
@Accessors(chain = true)
+@Deprecated
public class PagePlus implements IPage {
/**
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java
index 81c596b4f..46b01b94d 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java
@@ -1,5 +1,7 @@
package com.ruoyi.common.core.page;
+import cn.hutool.http.HttpStatus;
+import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -57,4 +59,29 @@ public TableDataInfo(List list, long total) {
this.total = total;
}
+ public static TableDataInfo build(IPage page) {
+ TableDataInfo rspData = new TableDataInfo<>();
+ rspData.setCode(HttpStatus.HTTP_OK);
+ rspData.setMsg("查询成功");
+ rspData.setRows(page.getRecords());
+ rspData.setTotal(page.getTotal());
+ return rspData;
+ }
+
+ public static TableDataInfo build(List list) {
+ TableDataInfo rspData = new TableDataInfo<>();
+ rspData.setCode(HttpStatus.HTTP_OK);
+ rspData.setMsg("查询成功");
+ rspData.setRows(list);
+ rspData.setTotal(list.size());
+ return rspData;
+ }
+
+ public static TableDataInfo build() {
+ TableDataInfo rspData = new TableDataInfo<>();
+ rspData.setCode(HttpStatus.HTTP_OK);
+ rspData.setMsg("查询成功");
+ return rspData;
+ }
+
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java
new file mode 100644
index 000000000..7cf3d5e31
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java
@@ -0,0 +1,72 @@
+package com.ruoyi.common.enums;
+
+import com.ruoyi.common.utils.StringUtils;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 数据权限类型
+ *
+ * 语法支持 spel 模板表达式
+ *
+ * 内置数据 user 当前用户 内容参考 SysUser
+ * 如需扩展数据 可使用 {@link com.ruoyi.common.helper.DataPermissionHelper} 操作
+ * 内置服务 sdss 系统数据权限服务 内容参考 SysDataScopeService
+ * 如需扩展更多自定义服务 可以参考 sdss 自行编写
+ *
+ * @author Lion Li
+ * @version 3.5.0
+ */
+@Getter
+@AllArgsConstructor
+public enum DataScopeType {
+
+ /**
+ * 全部数据权限
+ */
+ ALL("1", "", ""),
+
+ /**
+ * 自定数据权限
+ */
+ CUSTOM("2", " #{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} ) ", ""),
+
+ /**
+ * 部门数据权限
+ */
+ DEPT("3", " #{#deptName} = #{#user.deptId} ", ""),
+
+ /**
+ * 部门及以下数据权限
+ */
+ DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} )", ""),
+
+ /**
+ * 仅本人数据权限
+ */
+ SELF("5", " #{#userName} = #{#user.userId} " , " 1 = 0 ");
+
+ private final String code;
+
+ /**
+ * 语法 采用 spel 模板表达式
+ */
+ private final String sqlTemplate;
+
+ /**
+ * 不满足 sqlTemplate 则填充
+ */
+ private final String elseSql;
+
+ public static DataScopeType findCode(String code) {
+ if (StringUtils.isBlank(code)) {
+ return null;
+ }
+ for (DataScopeType type : values()) {
+ if (type.getCode().equals(code)) {
+ return type;
+ }
+ }
+ return null;
+ }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java
index d6fe72864..afa4e14f0 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java
@@ -7,8 +7,10 @@
* 数据源
*
* @author Lion Li
+ * @deprecated 3.6.0 移除
*/
@AllArgsConstructor
+@Deprecated
public enum DataSourceType {
/**
* 主库
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.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 void onException(Exception exception, AnalysisContext context) throws Exc
@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/exception/user/CaptchaException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java
index 90404854c..2345c2045 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java
@@ -9,6 +9,6 @@ public class CaptchaException extends UserException {
private static final long serialVersionUID = 1L;
public CaptchaException() {
- super("user.jcaptcha.error", null);
+ super("user.jcaptcha.error");
}
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java
index ae5f759f0..bb4c0376f 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java
@@ -9,6 +9,6 @@ public class CaptchaExpireException extends UserException {
private static final long serialVersionUID = 1L;
public CaptchaExpireException() {
- super("user.jcaptcha.expire", null);
+ super("user.jcaptcha.expire");
}
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java
index 94dbcdd52..99a888056 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java
@@ -10,7 +10,7 @@
public class UserException extends BaseException {
private static final long serialVersionUID = 1L;
- public UserException(String code, Object[] args) {
+ public UserException(String code, Object... args) {
super("user", code, args, null);
}
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java
index 0fab11678..863ba7658 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java
@@ -9,6 +9,6 @@ public class UserPasswordNotMatchException extends UserException {
private static final long serialVersionUID = 1L;
public UserPasswordNotMatchException() {
- super("user.password.not.match", null);
+ super("user.password.not.match");
}
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataPermissionHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataPermissionHelper.java
new file mode 100644
index 000000000..96f5425f1
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataPermissionHelper.java
@@ -0,0 +1,45 @@
+package com.ruoyi.common.helper;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.common.utils.ServletUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 数据权限助手
+ *
+ * @author Lion Li
+ * @version 3.5.0
+ */
+@SuppressWarnings("unchecked cast")
+public class DataPermissionHelper {
+
+ private static final String DATA_PERMISSION_KEY = "data:permission";
+
+ public static T getVariable(String key) {
+ Map context = getContext();
+ return (T) context.get(key);
+ }
+
+
+
+ public static void setVariable(String key, Object value) {
+ Map context = getContext();
+ context.put(key, value);
+ }
+
+ public static Map getContext() {
+ HttpServletRequest request = ServletUtils.getRequest();
+ Object attribute = request.getAttribute(DATA_PERMISSION_KEY);
+ if (ObjectUtil.isNull(attribute)) {
+ request.setAttribute(DATA_PERMISSION_KEY, new HashMap<>());
+ attribute = request.getAttribute(DATA_PERMISSION_KEY);
+ }
+ if (attribute instanceof Map) {
+ return (Map) attribute;
+ }
+ throw new NullPointerException("data permission context type exception");
+ }
+}
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 @@
*
* @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 @@
@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 static T parseObject(String text, Class clazz) {
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 static T parseObject(byte[] bytes, Class clazz) {
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 static T parseObject(String text, TypeReference typeReference) {
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 static Map parseMap(String text) {
return null;
}
try {
- return objectMapper.readValue(text, new TypeReference