postIds);
+
}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java
index 72178a7b6..88cdbbc72 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java
@@ -3,16 +3,15 @@ package org.dromara.common.core.utils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.time.DateFormatUtils;
+import org.dromara.common.core.enums.FormatsType;
+import org.dromara.common.core.exception.ServiceException;
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.time.*;
import java.util.Date;
+import java.util.concurrent.TimeUnit;
/**
* 时间工具类
@@ -21,86 +20,137 @@ import java.util.Date;
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
-
- public static final String YYYY = "yyyy";
-
- public static final String YYYY_MM = "yyyy-MM";
-
- public static final String YYYY_MM_DD = "yyyy-MM-dd";
-
- public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
-
- public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
-
private static final String[] PARSE_PATTERNS = {
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
/**
- * 获取当前Date型日期
+ * 获取当前日期和时间
*
- * @return Date() 当前日期
+ * @return 当前日期和时间的 Date 对象表示
*/
public static Date getNowDate() {
return new Date();
}
/**
- * 获取当前日期, 默认格式为yyyy-MM-dd
+ * 获取当前日期的字符串表示,格式为YYYY-MM-DD
*
- * @return String
+ * @return 当前日期的字符串表示
*/
public static String getDate() {
- return dateTimeNow(YYYY_MM_DD);
+ return dateTimeNow(FormatsType.YYYY_MM_DD);
}
+ /**
+ * 获取当前日期的字符串表示,格式为yyyyMMdd
+ *
+ * @return 当前日期的字符串表示
+ */
+ public static String getCurrentDate() {
+ return DateFormatUtils.format(new Date(), FormatsType.YYYYMMDD.getTimeFormat());
+ }
+
+ /**
+ * 获取当前日期的路径格式字符串,格式为"yyyy/MM/dd"
+ *
+ * @return 当前日期的路径格式字符串
+ */
+ public static String datePath() {
+ Date now = new Date();
+ return DateFormatUtils.format(now, FormatsType.YYYY_MM_DD_SLASH.getTimeFormat());
+ }
+
+ /**
+ * 获取当前时间的字符串表示,格式为YYYY-MM-DD HH:MM:SS
+ *
+ * @return 当前时间的字符串表示
+ */
public static String getTime() {
- return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
+ return dateTimeNow(FormatsType.YYYY_MM_DD_HH_MM_SS);
}
+ /**
+ * 获取当前时间的字符串表示,格式为 "HH:MM:SS"
+ *
+ * @return 当前时间的字符串表示,格式为 "HH:MM:SS"
+ */
+ public static String getTimeWithHourMinuteSecond() {
+ return dateTimeNow(FormatsType.HH_MM_SS);
+ }
+
+ /**
+ * 获取当前日期和时间的字符串表示,格式为YYYYMMDDHHMMSS
+ *
+ * @return 当前日期和时间的字符串表示
+ */
public static String dateTimeNow() {
- return dateTimeNow(YYYYMMDDHHMMSS);
+ return dateTimeNow(FormatsType.YYYYMMDDHHMMSS);
}
- public static String dateTimeNow(final String format) {
+ /**
+ * 获取当前日期和时间的指定格式的字符串表示
+ *
+ * @param format 日期时间格式,例如"YYYY-MM-DD HH:MM:SS"
+ * @return 当前日期和时间的字符串表示
+ */
+ public static String dateTimeNow(final FormatsType format) {
return parseDateToStr(format, new Date());
}
- public static String dateTime(final Date date) {
- return parseDateToStr(YYYY_MM_DD, date);
+ /**
+ * 将指定日期格式化为 YYYY-MM-DD 格式的字符串
+ *
+ * @param date 要格式化的日期对象
+ * @return 格式化后的日期字符串
+ */
+ public static String formatDate(final Date date) {
+ return parseDateToStr(FormatsType.YYYY_MM_DD, date);
}
- public static String parseDateToStr(final String format, final Date date) {
- return new SimpleDateFormat(format).format(date);
+ /**
+ * 将指定日期格式化为 YYYY-MM-DD HH:MM:SS 格式的字符串
+ *
+ * @param date 要格式化的日期对象
+ * @return 格式化后的日期时间字符串
+ */
+ public static String formatDateTime(final Date date) {
+ return parseDateToStr(FormatsType.YYYY_MM_DD_HH_MM_SS, date);
}
- public static Date dateTime(final String format, final String ts) {
+ /**
+ * 将指定日期按照指定格式进行格式化
+ *
+ * @param format 要使用的日期时间格式,例如"YYYY-MM-DD HH:MM:SS"
+ * @param date 要格式化的日期对象
+ * @return 格式化后的日期时间字符串
+ */
+ public static String parseDateToStr(final FormatsType format, final Date date) {
+ return new SimpleDateFormat(format.getTimeFormat()).format(date);
+ }
+
+ /**
+ * 将指定格式的日期时间字符串转换为 Date 对象
+ *
+ * @param format 要解析的日期时间格式,例如"YYYY-MM-DD HH:MM:SS"
+ * @param ts 要解析的日期时间字符串
+ * @return 解析后的 Date 对象
+ * @throws RuntimeException 如果解析过程中发生异常
+ */
+ public static Date parseDateTime(final FormatsType format, final String ts) {
try {
- return new SimpleDateFormat(format).parse(ts);
+ return new SimpleDateFormat(format.getTimeFormat()).parse(ts);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
- * 日期路径 即年/月/日 如2018/08/08
- */
- public static String datePath() {
- Date now = new Date();
- return DateFormatUtils.format(now, "yyyy/MM/dd");
- }
-
- /**
- * 日期路径 即年/月/日 如20180808
- */
- public static String dateTime() {
- Date now = new Date();
- return DateFormatUtils.format(now, "yyyyMMdd");
- }
-
- /**
- * 日期型字符串转化为日期 格式
+ * 将对象转换为日期对象
+ *
+ * @param str 要转换的对象,通常是字符串
+ * @return 转换后的日期对象,如果转换失败或输入为null,则返回null
*/
public static Date parseDate(Object str) {
if (str == null) {
@@ -115,6 +165,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
/**
* 获取服务器启动时间
+ *
+ * @return 服务器启动时间的 Date 对象表示
*/
public static Date getServerStartDate() {
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
@@ -122,35 +174,66 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
}
/**
- * 计算相差天数
+ * 计算两个日期之间的天数差(以毫秒为单位)
+ *
+ * @param date1 第一个日期
+ * @param date2 第二个日期
+ * @return 两个日期之间的天数差的绝对值
*/
public static int differentDaysByMillisecond(Date date1, Date date2) {
return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
}
/**
- * 计算两个时间差
+ * 计算两个日期之间的时间差,并以天、小时和分钟的格式返回
+ *
+ * @param endDate 结束日期
+ * @param nowDate 当前日期
+ * @return 表示时间差的字符串,格式为"天 小时 分钟"
*/
public static String getDatePoor(Date endDate, Date nowDate) {
- long nd = 1000 * 24 * 60 * 60;
- long nh = 1000 * 60 * 60;
- long nm = 1000 * 60;
- // long ns = 1000;
- // 获得两个时间的毫秒时间差异
- long diff = endDate.getTime() - nowDate.getTime();
- // 计算差多少天
- long day = diff / nd;
- // 计算差多少小时
- long hour = diff % nd / nh;
- // 计算差多少分钟
- long min = diff % nd % nh / nm;
- // 计算差多少秒//输出结果
- // long sec = diff % nd % nh % nm / ns;
- return day + "天" + hour + "小时" + min + "分钟";
+ long diffInMillis = endDate.getTime() - nowDate.getTime();
+ long day = TimeUnit.MILLISECONDS.toDays(diffInMillis);
+ long hour = TimeUnit.MILLISECONDS.toHours(diffInMillis) % 24;
+ long min = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60;
+ return String.format("%d天 %d小时 %d分钟", day, hour, min);
}
/**
- * 增加 LocalDateTime ==> Date
+ * 计算两个时间点的差值(天、小时、分钟、秒),当值为0时不显示该单位
+ *
+ * @param endDate 结束时间
+ * @param nowDate 当前时间
+ * @return 时间差字符串,格式为 "x天 x小时 x分钟 x秒",若为 0 则不显示
+ */
+ public static String getTimeDifference(Date endDate, Date nowDate) {
+ long diffInMillis = endDate.getTime() - nowDate.getTime();
+ long day = TimeUnit.MILLISECONDS.toDays(diffInMillis);
+ long hour = TimeUnit.MILLISECONDS.toHours(diffInMillis) % 24;
+ long min = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60;
+ long sec = TimeUnit.MILLISECONDS.toSeconds(diffInMillis) % 60;
+ // 构建时间差字符串,条件是值不为0才显示
+ StringBuilder result = new StringBuilder();
+ if (day > 0) {
+ result.append(String.format("%d天 ", day));
+ }
+ if (hour > 0) {
+ result.append(String.format("%d小时 ", hour));
+ }
+ if (min > 0) {
+ result.append(String.format("%d分钟 ", min));
+ }
+ if (sec > 0) {
+ result.append(String.format("%d秒", sec));
+ }
+ return result.length() > 0 ? result.toString().trim() : "0秒";
+ }
+
+ /**
+ * 将 LocalDateTime 对象转换为 Date 对象
+ *
+ * @param temporalAccessor 要转换的 LocalDateTime 对象
+ * @return 转换后的 Date 对象
*/
public static Date toDate(LocalDateTime temporalAccessor) {
ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
@@ -158,11 +241,46 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
}
/**
- * 增加 LocalDate ==> Date
+ * 将 LocalDate 对象转换为 Date 对象
+ *
+ * @param temporalAccessor 要转换的 LocalDate 对象
+ * @return 转换后的 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());
}
+
+ /**
+ * 校验日期范围
+ *
+ * @param startDate 开始日期
+ * @param endDate 结束日期
+ * @param maxValue 最大时间跨度的限制值
+ * @param unit 时间跨度的单位,可选择 "DAYS"、"HOURS" 或 "MINUTES"
+ */
+ public static void validateDateRange(Date startDate, Date endDate, int maxValue, TimeUnit unit) {
+ // 校验结束日期不能早于开始日期
+ if (endDate.before(startDate)) {
+ throw new ServiceException("结束日期不能早于开始日期");
+ }
+
+ // 计算时间跨度
+ long diffInMillis = endDate.getTime() - startDate.getTime();
+
+ // 根据单位转换时间跨度
+ long diff = switch (unit) {
+ case DAYS -> TimeUnit.MILLISECONDS.toDays(diffInMillis);
+ case HOURS -> TimeUnit.MILLISECONDS.toHours(diffInMillis);
+ case MINUTES -> TimeUnit.MILLISECONDS.toMinutes(diffInMillis);
+ default -> throw new IllegalArgumentException("不支持的时间单位");
+ };
+
+ // 校验时间跨度不超过最大限制
+ if (diff > maxValue) {
+ throw new ServiceException("最大时间跨度为 " + maxValue + " " + unit.toString().toLowerCase());
+ }
+ }
+
}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/Threads.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/Threads.java
index ae6cfa322..82ea5caf1 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/Threads.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/Threads.java
@@ -14,18 +14,6 @@ import java.util.concurrent.*;
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Threads {
-
- /**
- * sleep等待,单位为毫秒
- */
- public static void sleep(long milliseconds) {
- try {
- Thread.sleep(milliseconds);
- } catch (InterruptedException e) {
- return;
- }
- }
-
/**
* 停止线程池
* 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务.
diff --git a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/properties/MailProperties.java b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/properties/MailProperties.java
index d0e78a2ca..e44aa3da3 100644
--- a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/properties/MailProperties.java
+++ b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/properties/MailProperties.java
@@ -43,7 +43,13 @@ public class MailProperties {
private String pass;
/**
- * 发送方,遵循RFC-822标准
+ * 发送方,遵循RFC-822标准
+ * 发件人可以是以下形式:
+ *
+ *
+ * 1. user@xxx.xx
+ * 2. name <user@xxx.xx>
+ *
*/
private String from;
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java
index 3f7797d6b..1d5c3c9da 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java
@@ -119,4 +119,9 @@ public class PageQuery implements Serializable {
return (pageNum - 1) * pageSize;
}
+ public PageQuery(Integer pageSize, Integer pageNum) {
+ this.pageSize = pageSize;
+ this.pageNum = pageNum;
+ }
+
}
diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java
new file mode 100644
index 000000000..3c2f70329
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java
@@ -0,0 +1,165 @@
+package org.dromara.common.redis.utils;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.core.utils.StringUtils;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.redisson.api.RIdGenerator;
+import org.redisson.api.RedissonClient;
+
+import java.time.Duration;
+
+/**
+ * 发号器工具类
+ *
+ * @author 秋辞未寒
+ * @date 2024-12-10
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class SequenceUtils {
+
+ /**
+ * 默认初始值
+ */
+ public static final Long DEFAULT_INIT_VALUE = 1L;
+ /**
+ * 默认步长
+ */
+ public static final Long DEFAULT_STEP_VALUE = 1L;
+ /**
+ * 默认过期时间-天
+ */
+ public static final Duration DEFAULT_EXPIRE_TIME_DAY = Duration.ofDays(1);
+ /**
+ * 默认过期时间-分钟
+ */
+ public static final Duration DEFAULT_EXPIRE_TIME_MINUTE = Duration.ofMinutes(1);
+
+ /**
+ * 获取Redisson客户端实例
+ */
+ private static final RedissonClient REDISSON_CLIENT = SpringUtils.getBean(RedissonClient.class);
+
+ /**
+ * 获取ID生成器
+ *
+ * @param key 业务key
+ * @param expireTime 过期时间
+ * @param initValue ID初始值
+ * @param stepValue ID步长
+ * @return ID生成器
+ */
+ private static RIdGenerator getIdGenerator(String key, Duration expireTime, Long initValue, Long stepValue) {
+ if (initValue == null || initValue <= 0) {
+ initValue = DEFAULT_INIT_VALUE;
+ }
+ if (stepValue == null || stepValue <= 0) {
+ stepValue = DEFAULT_STEP_VALUE;
+ }
+ RIdGenerator idGenerator = REDISSON_CLIENT.getIdGenerator(key);
+ // 设置过期时间
+ idGenerator.expire(expireTime);
+ // 设置初始值和步长
+ idGenerator.tryInit(initValue, stepValue);
+ return idGenerator;
+ }
+
+ /**
+ * 获取指定业务key的唯一id
+ *
+ * @param key 业务key
+ * @param expireTime 过期时间
+ * @param initValue ID初始值
+ * @param stepValue ID步长
+ * @return 唯一id
+ */
+ public static long nextId(String key, Duration expireTime, Long initValue, Long stepValue) {
+ return getIdGenerator(key, expireTime, initValue, stepValue).nextId();
+ }
+
+ /**
+ * 获取指定业务key的唯一id字符串
+ *
+ * @param key 业务key
+ * @param expireTime 过期时间
+ * @param initValue ID初始值
+ * @param stepValue ID步长
+ * @return 唯一id
+ */
+ public static String nextIdStr(String key, Duration expireTime, Long initValue, Long stepValue) {
+ return String.valueOf(nextId(key, expireTime, initValue, stepValue));
+ }
+
+ /**
+ * 获取指定业务key的唯一id (ID初始值=1,ID步长=1)
+ *
+ * @param key 业务key
+ * @param expireTime 过期时间
+ * @return 唯一id
+ */
+ public static long nextId(String key, Duration expireTime) {
+ return getIdGenerator(key, expireTime, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE).nextId();
+ }
+
+ /**
+ * 获取指定业务key的唯一id字符串 (ID初始值=1,ID步长=1)
+ *
+ * @param key 业务key
+ * @param expireTime 过期时间
+ * @return 唯一id
+ */
+ public static String nextIdStr(String key, Duration expireTime) {
+ return String.valueOf(nextId(key, expireTime));
+ }
+
+ /**
+ * 获取 yyyyMMdd 开头的唯一id
+ *
+ * @return 唯一id
+ */
+ public static String nextIdDate() {
+ return nextIdDate("");
+ }
+
+ /**
+ * 获取 prefix + yyyyMMdd 开头的唯一id
+ *
+ * @param prefix 业务前缀
+ * @return 唯一id
+ */
+ public static String nextIdDate(String prefix) {
+ // 前缀+日期 构建 prefixKey
+ String prefixKey = StringUtils.format("{}{}", StringUtils.blankToDefault(prefix, ""), DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_FORMATTER));
+ // 获取下一个id
+ long nextId = getIdGenerator(prefixKey, DEFAULT_EXPIRE_TIME_DAY, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE).nextId();
+ // 返回完整id
+ return StringUtils.format("{}{}", prefixKey, nextId);
+ }
+
+ /**
+ * 获取 yyyyMMddHHmmss 开头的唯一id
+ *
+ * @return 唯一id
+ */
+ public static String nextIdDateTime() {
+ return nextIdDateTime("");
+ }
+
+ /**
+ * 获取 prefix + yyyyMMddHHmmss 开头的唯一id
+ *
+ * @param prefix 业务前缀
+ * @return 唯一id
+ */
+ public static String nextIdDateTime(String prefix) {
+ // 前缀+日期时间 构建 prefixKey
+ String prefixKey = StringUtils.format("{}{}", StringUtils.blankToDefault(prefix, ""), DateUtil.format(DateUtil.date(), DatePattern.PURE_DATETIME_FORMATTER));
+ // 获取下一个id
+ long nextId = getIdGenerator(prefixKey, DEFAULT_EXPIRE_TIME_MINUTE, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE).nextId();
+ // 返回完整id
+ return StringUtils.format("{}{}", prefixKey, nextId);
+ }
+
+}
diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java
index cdc5684fa..19557e131 100644
--- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java
+++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java
@@ -88,6 +88,13 @@ public class LoginHelper {
return Convert.toLong(getExtra(USER_KEY));
}
+ /**
+ * 获取用户id
+ */
+ public static String getUserIdStr() {
+ return Convert.toStr(getExtra(USER_KEY));
+ }
+
/**
* 获取用户账户
*/
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java
index b95c19ee8..97774ac5d 100644
--- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java
@@ -30,7 +30,7 @@ public class AuthMaxKeyRequest extends AuthDefaultRequest {
}
@Override
- protected AuthToken getAccessToken(AuthCallback authCallback) {
+ public AuthToken getAccessToken(AuthCallback authCallback) {
String body = doPostAuthorizationCode(authCallback.getCode());
Dict object = JsonUtils.parseMap(body);
// oauth/token 验证异常
@@ -51,7 +51,7 @@ public class AuthMaxKeyRequest extends AuthDefaultRequest {
}
@Override
- protected AuthUser getUserInfo(AuthToken authToken) {
+ public AuthUser getUserInfo(AuthToken authToken) {
String body = doGetUserInfo(authToken);
Dict object = JsonUtils.parseMap(body);
// oauth/token 验证异常
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamRequest.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamRequest.java
index 4867cdc94..31bb955d4 100644
--- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamRequest.java
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamRequest.java
@@ -44,7 +44,7 @@ public class AuthTopIamRequest extends AuthDefaultRequest {
}
@Override
- protected AuthToken getAccessToken(AuthCallback authCallback) {
+ public AuthToken getAccessToken(AuthCallback authCallback) {
String body = doPostAuthorizationCode(authCallback.getCode());
Dict object = JsonUtils.parseMap(body);
checkResponse(object);
@@ -58,7 +58,7 @@ public class AuthTopIamRequest extends AuthDefaultRequest {
}
@Override
- protected AuthUser getUserInfo(AuthToken authToken) {
+ public AuthUser getUserInfo(AuthToken authToken) {
String body = doGetUserInfo(authToken);
Dict object = JsonUtils.parseMap(body);
checkResponse(object);
diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java
index 341880c5d..303cf885d 100644
--- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java
+++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java
@@ -1,5 +1,6 @@
package org.dromara.demo.controller;
+import cn.hutool.core.thread.ThreadUtil;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.domain.R;
import org.dromara.common.redis.utils.RedisUtils;
@@ -83,11 +84,7 @@ public class RedisCacheController {
RedisUtils.setCacheObject(key, value);
boolean flag = RedisUtils.expire(key, Duration.ofSeconds(10));
System.out.println("***********" + flag);
- try {
- Thread.sleep(11 * 1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
+ ThreadUtil.sleep(11 * 1000);
Object obj = RedisUtils.getCacheObject(key);
return R.ok(value.equals(obj));
}
diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java
index b7e096266..237b6ee2d 100644
--- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java
+++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java
@@ -1,5 +1,6 @@
package org.dromara.demo.controller;
+import cn.hutool.core.thread.ThreadUtil;
import com.baomidou.lock.LockInfo;
import com.baomidou.lock.LockTemplate;
import com.baomidou.lock.annotation.Lock4j;
@@ -33,13 +34,9 @@ public class RedisLockController {
@Lock4j(keys = {"#key"})
@GetMapping("/testLock4j")
public R testLock4j(String key, String value) {
- System.out.println("start:" + key + ",time:" + LocalTime.now().toString());
- try {
- Thread.sleep(10000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("end :" + key + ",time:" + LocalTime.now().toString());
+ System.out.println("start:" + key + ",time:" + LocalTime.now());
+ ThreadUtil.sleep(10000);
+ System.out.println("end :" + key + ",time:" + LocalTime.now());
return R.ok("操作成功", value);
}
@@ -54,11 +51,7 @@ public class RedisLockController {
}
// 获取锁成功,处理业务
try {
- try {
- Thread.sleep(8000);
- } catch (InterruptedException e) {
- //
- }
+ ThreadUtil.sleep(8000);
System.out.println("执行简单方法1 , 当前线程:" + Thread.currentThread().getName());
} finally {
//释放锁
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java
index 13be4a4a9..eaed06847 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java
@@ -97,7 +97,7 @@ public class SysClientController extends BaseController {
@Log(title = "客户端管理", businessType = BusinessType.UPDATE)
@PutMapping("/changeStatus")
public R changeStatus(@RequestBody SysClientBo bo) {
- return toAjax(sysClientService.updateUserStatus(bo.getClientId(), bo.getStatus()));
+ return toAjax(sysClientService.updateClientStatus(bo.getClientId(), bo.getStatus()));
}
/**
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java
index d4cecbe14..e1e868a6e 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java
@@ -218,7 +218,7 @@ public class SysUserController extends BaseController {
@GetMapping("/optionselect")
public R> optionselect(@RequestParam(required = false) Long[] userIds,
@RequestParam(required = false) Long deptId) {
- return R.ok(userService.selectUserByIds(userIds == null ? null : List.of(userIds), deptId));
+ return R.ok(userService.selectUserByIds(ArrayUtil.isEmpty(userIds) ? null : List.of(userIds), deptId));
}
/**
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java
index d0f8a3cbe..546c3f33a 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java
@@ -50,7 +50,7 @@ public interface ISysClientService {
/**
* 修改状态
*/
- int updateUserStatus(String clientId, String status);
+ int updateClientStatus(String clientId, String status);
/**
* 校验并批量删除客户端管理信息
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java
index 3751b23be..a760d497e 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java
@@ -25,6 +25,14 @@ public interface ISysPostService {
*/
List selectPostList(SysPostBo post);
+ /**
+ * 查询用户所属岗位组
+ *
+ * @param userId 用户ID
+ * @return 岗位ID
+ */
+ List selectPostsByUserId(Long userId);
+
/**
* 查询所有岗位
*
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java
index 1c6924320..4f6e676df 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java
@@ -123,7 +123,7 @@ public class SysClientServiceImpl implements ISysClientService {
*/
@CacheEvict(cacheNames = CacheNames.SYS_CLIENT, key = "#clientId")
@Override
- public int updateUserStatus(String clientId, String status) {
+ public int updateClientStatus(String clientId, String status) {
return baseMapper.update(null,
new LambdaUpdateWrapper()
.set(SysClient::getStatus, status)
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java
index 470646f35..12a507203 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java
@@ -38,7 +38,7 @@ public class SysDataScopeServiceImpl implements ISysDataScopeService {
* @param roleId 角色Id
* @return 部门Id组
*/
- @Cacheable(cacheNames = CacheNames.SYS_ROLE_CUSTOM, key = "#roleId")
+ @Cacheable(cacheNames = CacheNames.SYS_ROLE_CUSTOM, key = "#roleId", condition = "#roleId != null")
@Override
public String getRoleCustom(Long roleId) {
if (ObjectUtil.isNull(roleId)) {
@@ -60,7 +60,7 @@ public class SysDataScopeServiceImpl implements ISysDataScopeService {
* @param deptId 部门Id
* @return 部门Id组
*/
- @Cacheable(cacheNames = CacheNames.SYS_DEPT_AND_CHILD, key = "#deptId")
+ @Cacheable(cacheNames = CacheNames.SYS_DEPT_AND_CHILD, key = "#deptId", condition = "#deptId != null")
@Override
public String getDeptAndChild(Long deptId) {
if (ObjectUtil.isNull(deptId)) {
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
index 478a42c72..0199ec719 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
@@ -1,5 +1,6 @@
package org.dromara.system.service.impl;
+import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.tree.Tree;
@@ -10,6 +11,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.constant.SystemConstants;
+import org.dromara.common.core.domain.dto.DeptDTO;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.service.DeptService;
import org.dromara.common.core.utils.*;
@@ -110,7 +112,7 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
.setName(dept.getDeptName())
.setWeight(dept.getOrderNum())
.putExtra("disabled", SystemConstants.DISABLE.equals(dept.getStatus())));
- Tree tree = trees.stream().filter(it -> it.getId().longValue() == d.getDeptId()).findFirst().get();
+ Tree tree = StreamUtils.findFirst(trees, it -> it.getId().longValue() == d.getDeptId());
treeList.add(tree);
}
}
@@ -174,6 +176,31 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
return String.join(StringUtils.SEPARATOR, list);
}
+ /**
+ * 根据部门ID查询部门负责人
+ *
+ * @param deptId 部门ID,用于指定需要查询的部门
+ * @return 返回该部门的负责人ID
+ */
+ @Override
+ public Long selectDeptLeaderById(Long deptId) {
+ SysDeptVo vo = SpringUtils.getAopProxy(this).selectDeptById(deptId);
+ return vo.getLeader();
+ }
+
+ /**
+ * 查询部门
+ *
+ * @return 部门列表
+ */
+ @Override
+ public List selectDeptsByList() {
+ List list = baseMapper.selectDeptList(new LambdaQueryWrapper()
+ .select(SysDept::getDeptId, SysDept::getDeptName, SysDept::getParentId)
+ .eq(SysDept::getStatus, SystemConstants.NORMAL));
+ return BeanUtil.copyToList(list, DeptDTO.class);
+ }
+
/**
* 根据ID查询所有子部门数(正常状态)
*
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java
index b95baf44b..72b497eca 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java
@@ -118,8 +118,7 @@ public class SysLogininforServiceImpl implements ISysLogininforService {
.between(params.get("beginTime") != null && params.get("endTime") != null,
SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime"));
if (StringUtils.isBlank(pageQuery.getOrderByColumn())) {
- pageQuery.setOrderByColumn("info_id");
- pageQuery.setIsAsc("desc");
+ lqw.orderByDesc(SysLogininfor::getInfoId);
}
Page page = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(page);
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java
index 750e455ac..27c2f32d5 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java
@@ -53,8 +53,7 @@ public class SysOperLogServiceImpl implements ISysOperLogService {
public TableDataInfo selectPageOperLogList(SysOperLogBo operLog, PageQuery pageQuery) {
LambdaQueryWrapper lqw = buildQueryWrapper(operLog);
if (StringUtils.isBlank(pageQuery.getOrderByColumn())) {
- pageQuery.setOrderByColumn("oper_id");
- pageQuery.setIsAsc("desc");
+ lqw.orderByDesc(SysOperLog::getOperId);
}
Page page = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(page);
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java
index 8643f0d92..72f1a5e31 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java
@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.service.PostService;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
@@ -34,7 +35,7 @@ import java.util.List;
*/
@RequiredArgsConstructor
@Service
-public class SysPostServiceImpl implements ISysPostService {
+public class SysPostServiceImpl implements ISysPostService, PostService {
private final SysPostMapper baseMapper;
private final SysDeptMapper deptMapper;
@@ -57,6 +58,17 @@ public class SysPostServiceImpl implements ISysPostService {
return baseMapper.selectVoList(buildQueryWrapper(post));
}
+ /**
+ * 查询用户所属岗位组
+ *
+ * @param userId 用户ID
+ * @return 岗位ID
+ */
+ @Override
+ public List selectPostsByUserId(Long userId) {
+ return baseMapper.selectPostsByUserId(userId);
+ }
+
/**
* 根据查询条件构建查询包装器
*
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java
index cbca57e5d..4c007358e 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java
@@ -17,6 +17,7 @@ import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.constant.TenantConstants;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.service.RoleService;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
@@ -47,7 +48,7 @@ import java.util.*;
*/
@RequiredArgsConstructor
@Service
-public class SysRoleServiceImpl implements ISysRoleService {
+public class SysRoleServiceImpl implements ISysRoleService, RoleService {
private final SysRoleMapper baseMapper;
private final SysRoleMenuMapper roleMenuMapper;
@@ -351,7 +352,7 @@ public class SysRoleServiceImpl implements ISysRoleService {
private int insertRoleMenu(SysRoleBo role) {
int rows = 1;
// 新增用户与角色管理
- List list = new ArrayList();
+ List list = new ArrayList<>();
for (Long menuId : role.getMenuIds()) {
SysRoleMenu rm = new SysRoleMenu();
rm.setRoleId(role.getRoleId());
@@ -372,7 +373,7 @@ public class SysRoleServiceImpl implements ISysRoleService {
private int insertRoleDept(SysRoleBo role) {
int rows = 1;
// 新增角色与部门(数据权限)管理
- List list = new ArrayList();
+ List list = new ArrayList<>();
for (Long deptId : role.getDeptIds()) {
SysRoleDept rd = new SysRoleDept();
rd.setRoleId(role.getRoleId());
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
index 4b5758763..40811707b 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
@@ -696,4 +696,27 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
.in(SysUser::getDeptId, deptIds));
return BeanUtil.copyToList(list, UserDTO.class);
}
+
+ /**
+ * 通过岗位ID查询用户
+ *
+ * @param postIds 岗位ids
+ * @return 用户
+ */
+ @Override
+ public List selectUsersByPostIds(List postIds) {
+ if (CollUtil.isEmpty(postIds)) {
+ return List.of();
+ }
+
+ // 通过岗位ID获取用户岗位信息
+ List userPosts = userPostMapper.selectList(
+ new LambdaQueryWrapper().in(SysUserPost::getPostId, postIds));
+
+ // 获取用户ID列表
+ Set userIds = StreamUtils.toSet(userPosts, SysUserPost::getUserId);
+
+ return selectListByIds(new ArrayList<>(userIds));
+ }
+
}