implements Serializable {
private static final long serialVersionUID = 1L;
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java
deleted file mode 100644
index e637f4731..000000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.ruoyi.common.core.service;
-
-import com.ruoyi.common.core.domain.entity.SysUser;
-
-/**
- * 通用 用户业务
- *
- * @author Lion Li
- */
-public interface UserService {
-
- /**
- * 通过用户名查询用户
- *
- * @param userName 用户名
- * @return 用户对象信息
- */
- SysUser selectUserByUserName(String userName);
-
- /**
- * 通过用户ID查询用户
- *
- * @param userId 用户ID
- * @return 用户对象信息
- */
- SysUser selectUserById(Long userId);
-
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataBaseType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataBaseType.java
new file mode 100644
index 000000000..5d0f05ad7
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataBaseType.java
@@ -0,0 +1,49 @@
+package com.ruoyi.common.enums;
+
+import com.ruoyi.common.utils.StringUtils;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 数据库类型
+ *
+ * @author Lion Li
+ */
+@Getter
+@AllArgsConstructor
+public enum DataBaseType {
+
+ /**
+ * MySQL
+ */
+ MY_SQL("MySQL"),
+
+ /**
+ * Oracle
+ */
+ ORACLE("Oracle"),
+
+ /**
+ * PostgreSQL
+ */
+ POSTGRE_SQL("PostgreSQL"),
+
+ /**
+ * SQL Server
+ */
+ SQL_SERVER("Microsoft SQL Server");
+
+ private final String type;
+
+ public static DataBaseType find(String databaseProductName) {
+ if (StringUtils.isBlank(databaseProductName)) {
+ return null;
+ }
+ for (DataBaseType type : values()) {
+ if (type.getType().equals(databaseProductName)) {
+ return type;
+ }
+ }
+ return null;
+ }
+}
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
index 58bc76140..64324652b 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java
@@ -9,7 +9,7 @@ import lombok.Getter;
*
* 语法支持 spel 模板表达式
*
- * 内置数据 user 当前用户 内容参考 SysUser
+ * 内置数据 user 当前用户 内容参考 LoginUser
* 如需扩展数据 可使用 {@link com.ruoyi.common.helper.DataPermissionHelper} 操作
* 内置服务 sdss 系统数据权限服务 内容参考 SysDataScopeService
* 如需扩展更多自定义服务 可以参考 sdss 自行编写
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java
new file mode 100644
index 000000000..196035629
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java
@@ -0,0 +1,72 @@
+package com.ruoyi.common.helper;
+
+import cn.hutool.core.convert.Convert;
+import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
+import com.ruoyi.common.enums.DataBaseType;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.spring.SpringUtils;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.SQLException;
+
+/**
+ * 数据库助手
+ *
+ * @author Lion Li
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class DataBaseHelper {
+
+ private static final DynamicRoutingDataSource DS = SpringUtils.getBean(DynamicRoutingDataSource.class);
+
+ /**
+ * 获取当前数据库类型
+ */
+ public static DataBaseType getDataBaseType() {
+ DataSource dataSource = DS.determineDataSource();
+ try (Connection conn = dataSource.getConnection()) {
+ DatabaseMetaData metaData = conn.getMetaData();
+ String databaseProductName = metaData.getDatabaseProductName();
+ return DataBaseType.find(databaseProductName);
+ } catch (SQLException e) {
+ throw new ServiceException(e.getMessage());
+ }
+ }
+
+ public static boolean isMySql() {
+ return DataBaseType.MY_SQL == getDataBaseType();
+ }
+
+ public static boolean isOracle() {
+ return DataBaseType.ORACLE == getDataBaseType();
+ }
+
+ public static boolean isPostgerSql() {
+ return DataBaseType.POSTGRE_SQL == getDataBaseType();
+ }
+
+ public static boolean isSqlServer() {
+ return DataBaseType.SQL_SERVER == getDataBaseType();
+ }
+
+ public static String findInSet(Object var1, String var2) {
+ DataBaseType dataBasyType = getDataBaseType();
+ String var = Convert.toStr(var1);
+ if (dataBasyType == DataBaseType.SQL_SERVER) {
+ // charindex(',100,' , ',0,100,101,') <> 0
+ return "charindex('," + var + ",' , ','+" + var2 + "+',') <> 0";
+ } else if (dataBasyType == DataBaseType.POSTGRE_SQL) {
+ // (select position(',100,' in ',0,100,101,')) <> 0
+ return "(select position('," + var + ",' in ','||" + var2 + "||',')) <> 0";
+ } else if (dataBasyType == DataBaseType.ORACLE) {
+ // instr(',0,100,101,' , ',100,') <> 0
+ return "instr(','||" + var2 + "||',' , '," + var + ",') <> 0";
+ }
+ // find_in_set(100 , '0,100,101')
+ return "find_in_set(" + var + " , " + var2 + ") <> 0";
+ }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java
index 66b5854af..7875c5630 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java
@@ -2,6 +2,7 @@ package com.ruoyi.common.helper;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.DeviceType;
import com.ruoyi.common.enums.UserType;
@@ -12,7 +13,13 @@ import lombok.NoArgsConstructor;
/**
* 登录鉴权助手
- * 为适配多端登录而封装
+ *
+ * user_type 为 用户类型 同一个用户表 可以有多种用户类型 例如 pc,app
+ * deivce 为 设备类型 同一个用户类型 可以有 多种设备类型 例如 web,ios
+ * 可以组成 用户类型与设备类型多对多的 权限灵活控制
+ *
+ * 多用户体系 针对 多种用户类型 但权限控制不一致
+ * 可以组成 多用户类型表与多设备类型 分别控制权限
*
* @author Lion Li
*/
@@ -26,22 +33,23 @@ public class LoginHelper {
/**
* 登录系统
- * 针对两套用户体系
*
* @param loginUser 登录用户信息
*/
public static void login(LoginUser loginUser) {
+ LOGIN_CACHE.set(loginUser);
StpUtil.login(loginUser.getLoginId());
setLoginUser(loginUser);
}
/**
* 登录系统 基于 设备类型
- * 针对一套用户体系
+ * 针对相同用户体系不同设备
*
* @param loginUser 登录用户信息
*/
public static void loginByDevice(LoginUser loginUser, DeviceType deviceType) {
+ LOGIN_CACHE.set(loginUser);
StpUtil.login(loginUser.getLoginId(), deviceType.getDevice());
setLoginUser(loginUser);
}
@@ -51,7 +59,6 @@ public class LoginHelper {
*/
public static void setLoginUser(LoginUser loginUser) {
StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser);
- LOGIN_CACHE.set(loginUser);
}
/**
@@ -117,4 +124,18 @@ public class LoginHelper {
return UserType.getUserType(loginId);
}
+ /**
+ * 是否为管理员
+ *
+ * @param userId 用户ID
+ * @return 结果
+ */
+ public static boolean isAdmin(Long userId) {
+ return UserConstants.ADMIN_ID.equals(userId);
+ }
+
+ public static boolean isAdmin() {
+ return isAdmin(getUserId());
+ }
+
}
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 0bd4a55b9..23ace00f9 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
@@ -13,6 +13,10 @@ import java.util.Map;
/**
* bean深拷贝工具(基于 cglib 性能优异)
+ *
+ * 重点 cglib 不支持 拷贝到链式对象
+ * 例如: 源对象 拷贝到 目标(链式对象)
+ * 请区分好`浅拷贝`和`深拷贝`再做使用
*
* @author Lion Li
*/
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 9d1a14cd1..e3cb9c56a 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
@@ -7,6 +7,11 @@ import org.apache.commons.lang3.time.DateFormatUtils;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
import java.util.Date;
/**
@@ -116,6 +121,14 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
return new Date(time);
}
+ /**
+ * 计算相差天数
+ */
+ public static int differentDaysByMillisecond(Date date1, Date date2)
+ {
+ return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
+ }
+
/**
* 计算两个时间差
*/
@@ -136,4 +149,21 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
// long sec = diff % nd % nh % nm / ns;
return day + "天" + hour + "小时" + min + "分钟";
}
+
+ /**
+ * 增加 LocalDateTime ==> Date
+ */
+ public static Date toDate(LocalDateTime temporalAccessor) {
+ ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
+ return Date.from(zdt.toInstant());
+ }
+
+ /**
+ * 增加 LocalDate ==> Date
+ */
+ public static Date toDate(LocalDate temporalAccessor) {
+ LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
+ ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
+ return Date.from(zdt.toInstant());
+ }
}
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 11004be86..446bf1b00 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
@@ -1,5 +1,6 @@
package com.ruoyi.common.utils;
+import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -12,7 +13,6 @@ import lombok.NoArgsConstructor;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
/**
* JSON 工具类
@@ -72,13 +72,23 @@ public class JsonUtils {
}
}
- public static Map parseMap(String text) {
+ public static Dict parseMap(String text) {
if (StringUtils.isBlank(text)) {
return null;
}
try {
- return OBJECT_MAPPER.readValue(text, new TypeReference