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 79d889cf..bff381c4 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 @@ import java.util.List;
* @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 81c596b4..46b01b94 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 class TableDataInfo implements Serializable {
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 00000000..7cf3d5e3
--- /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 d6fe7286..afa4e14f 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 @@ import lombok.Getter;
* 数据源
*
* @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 f626a5e1..9936f676 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/exception/GlobalException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java
index b1fc9c13..080785c9 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java
@@ -49,4 +49,4 @@ public class GlobalException extends RuntimeException {
this.message = message;
return this;
}
-}
\ No newline at end of file
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java
index 15ceb5ef..53f41b3b 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java
@@ -62,4 +62,4 @@ public final class ServiceException extends RuntimeException {
this.detailMessage = detailMessage;
return this;
}
-}
\ No newline at end of file
+}
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 90404854..2345c204 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 ae5f759f..bb4c0376 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 94dbcdd5..99a88805 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 @@ import com.ruoyi.common.exception.base.BaseException;
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 0fab1167..863ba765 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 00000000..96f5425f
--- /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 8bf40d16..0bd4a55b 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 1e27f249..bc38eedd 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/JsonUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java
index b65c23dc..1c01912a 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