handleSmsBlendException(SmsBlendException e, HttpServletRequest request) {
+ String requestURI = request.getRequestURI();
+ log.error("请求地址'{}',发生sms短信异常.", requestURI, e);
+ return R.fail(HttpStatus.HTTP_INTERNAL_ERROR, "短信发送失败,请稍后再试...");
+ }
+
+}
diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java
index 3fb99c5b1..07302bc81 100644
--- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java
+++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java
@@ -35,7 +35,7 @@ public class TenantConfig {
@ConditionalOnBean(MybatisPlusConfig.class)
@AutoConfiguration(after = {MybatisPlusConfig.class})
- static class MybatisPlusConfigation {
+ static class MybatisPlusConfiguration {
/**
* 多租户插件
diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java
index e830c190a..9d087e113 100644
--- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java
+++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java
@@ -1,6 +1,5 @@
package org.dromara.common.tenant.helper;
-import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.convert.Convert;
import com.alibaba.ttl.TransmittableThreadLocal;
@@ -79,22 +78,28 @@ public class TenantHelper {
}
}
+ public static void setDynamic(String tenantId) {
+ setDynamic(tenantId, false);
+ }
+
/**
* 设置动态租户(一直有效 需要手动清理)
*
* 如果为未登录状态下 那么只在当前线程内生效
+ *
+ * @param tenantId 租户id
+ * @param global 是否全局生效
*/
- public static void setDynamic(String tenantId) {
+ public static void setDynamic(String tenantId, boolean global) {
if (!isEnable()) {
return;
}
- if (!isLogin()) {
+ if (!isLogin() || !global) {
TEMP_DYNAMIC_TENANT.set(tenantId);
return;
}
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
RedisUtils.setCacheObject(cacheKey, tenantId);
- SaHolder.getStorage().set(cacheKey, tenantId);
}
/**
@@ -109,13 +114,13 @@ public class TenantHelper {
if (!isLogin()) {
return TEMP_DYNAMIC_TENANT.get();
}
- String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
- String tenantId = (String) SaHolder.getStorage().get(cacheKey);
+ // 如果线程内有值 优先返回
+ String tenantId = TEMP_DYNAMIC_TENANT.get();
if (StringUtils.isNotBlank(tenantId)) {
return tenantId;
}
+ String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
tenantId = RedisUtils.getCacheObject(cacheKey);
- SaHolder.getStorage().set(cacheKey, tenantId);
return tenantId;
}
@@ -130,9 +135,9 @@ public class TenantHelper {
TEMP_DYNAMIC_TENANT.remove();
return;
}
+ TEMP_DYNAMIC_TENANT.remove();
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
RedisUtils.deleteObject(cacheKey);
- SaHolder.getStorage().delete(cacheKey);
}
/**
diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/config/WebSocketConfig.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/config/WebSocketConfig.java
index 30d109e20..ef5cfc96f 100644
--- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/config/WebSocketConfig.java
+++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/config/WebSocketConfig.java
@@ -27,17 +27,20 @@ public class WebSocketConfig {
@Bean
public WebSocketConfigurer webSocketConfigurer(HandshakeInterceptor handshakeInterceptor,
- WebSocketHandler webSocketHandler,
- WebSocketProperties webSocketProperties) {
+ WebSocketHandler webSocketHandler, WebSocketProperties webSocketProperties) {
+ // 如果WebSocket的路径为空,则设置默认路径为 "/websocket"
if (StrUtil.isBlank(webSocketProperties.getPath())) {
webSocketProperties.setPath("/websocket");
}
+ // 如果允许跨域访问的地址为空,则设置为 "*",表示允许所有来源的跨域请求
if (StrUtil.isBlank(webSocketProperties.getAllowedOrigins())) {
webSocketProperties.setAllowedOrigins("*");
}
+ // 返回一个WebSocketConfigurer对象,用于配置WebSocket
return registry -> registry
+ // 添加WebSocket处理程序和拦截器到指定路径,设置允许的跨域来源
.addHandler(webSocketHandler, webSocketProperties.getPath())
.addInterceptors(handshakeInterceptor)
.setAllowedOrigins(webSocketProperties.getAllowedOrigins());
diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/constant/WebSocketConstants.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/constant/WebSocketConstants.java
index 54eb4470b..e243279d9 100644
--- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/constant/WebSocketConstants.java
+++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/constant/WebSocketConstants.java
@@ -6,6 +6,7 @@ package org.dromara.common.websocket.constant;
* @author zendwang
*/
public interface WebSocketConstants {
+
/**
* websocketSession中的参数的key
*/
diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java
index a53583f19..759aecea0 100644
--- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java
+++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java
@@ -31,33 +31,42 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
}
/**
- * 处理发送来的文本消息
+ * 处理接收到的文本消息
*
- * @param session
- * @param message
- * @throws Exception
+ * @param session WebSocket会话
+ * @param message 接收到的文本消息
+ * @throws Exception 处理消息过程中可能抛出的异常
*/
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
+ // 从WebSocket会话中获取登录用户信息
LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY);
- List userIds = List.of(loginUser.getUserId());
+
+ // 创建WebSocket消息DTO对象
WebSocketMessageDto webSocketMessageDto = new WebSocketMessageDto();
- webSocketMessageDto.setSessionKeys(userIds);
+ webSocketMessageDto.setSessionKeys(List.of(loginUser.getUserId()));
webSocketMessageDto.setMessage(message.getPayload());
WebSocketUtils.publishMessage(webSocketMessageDto);
}
+ /**
+ * 处理接收到的二进制消息
+ *
+ * @param session WebSocket会话
+ * @param message 接收到的二进制消息
+ * @throws Exception 处理消息过程中可能抛出的异常
+ */
@Override
protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
super.handleBinaryMessage(session, message);
}
/**
- * 心跳监测的回复
+ * 处理接收到的Pong消息(心跳监测)
*
- * @param session
- * @param message
- * @throws Exception
+ * @param session WebSocket会话
+ * @param message 接收到的Pong消息
+ * @throws Exception 处理消息过程中可能抛出的异常
*/
@Override
protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {
@@ -65,11 +74,11 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
}
/**
- * 连接出错时
+ * 处理WebSocket传输错误
*
- * @param session
- * @param exception
- * @throws Exception
+ * @param session WebSocket会话
+ * @param exception 发生的异常
+ * @throws Exception 处理过程中可能抛出的异常
*/
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
@@ -77,10 +86,10 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
}
/**
- * 连接关闭后
+ * 在WebSocket连接关闭后执行清理操作
*
- * @param session
- * @param status
+ * @param session WebSocket会话
+ * @param status 关闭状态信息
*/
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
@@ -90,9 +99,9 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
}
/**
- * 是否支持分片消息
+ * 指示处理程序是否支持接收部分消息
*
- * @return
+ * @return 如果支持接收部分消息,则返回true;否则返回false
*/
@Override
public boolean supportsPartialMessages() {
diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java
index de8c5a758..368801c3d 100644
--- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java
+++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java
@@ -18,24 +18,52 @@ public class WebSocketSessionHolder {
private static final Map USER_SESSION_MAP = new ConcurrentHashMap<>();
+ /**
+ * 将WebSocket会话添加到用户会话Map中
+ *
+ * @param sessionKey 会话键,用于检索会话
+ * @param session 要添加的WebSocket会话
+ */
public static void addSession(Long sessionKey, WebSocketSession session) {
USER_SESSION_MAP.put(sessionKey, session);
}
+ /**
+ * 从用户会话Map中移除指定会话键对应的WebSocket会话
+ *
+ * @param sessionKey 要移除的会话键
+ */
public static void removeSession(Long sessionKey) {
if (USER_SESSION_MAP.containsKey(sessionKey)) {
USER_SESSION_MAP.remove(sessionKey);
}
}
+ /**
+ * 根据会话键从用户会话Map中获取WebSocket会话
+ *
+ * @param sessionKey 要获取的会话键
+ * @return 与给定会话键对应的WebSocket会话,如果不存在则返回null
+ */
public static WebSocketSession getSessions(Long sessionKey) {
return USER_SESSION_MAP.get(sessionKey);
}
+ /**
+ * 获取存储在用户会话Map中所有WebSocket会话的会话键集合
+ *
+ * @return 所有WebSocket会话的会话键集合
+ */
public static Set getSessionsAll() {
return USER_SESSION_MAP.keySet();
}
+ /**
+ * 检查给定的会话键是否存在于用户会话Map中
+ *
+ * @param sessionKey 要检查的会话键
+ * @return 如果存在对应的会话键,则返回true;否则返回false
+ */
public static Boolean existSession(Long sessionKey) {
return USER_SESSION_MAP.containsKey(sessionKey);
}
diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java
index 1dc4120db..0abbbd3c9 100644
--- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java
+++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java
@@ -1,8 +1,8 @@
package org.dromara.common.websocket.interceptor;
+import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.satoken.utils.LoginHelper;
-import lombok.extern.slf4j.Slf4j;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
@@ -21,13 +21,13 @@ import static org.dromara.common.websocket.constant.WebSocketConstants.LOGIN_USE
public class PlusWebSocketInterceptor implements HandshakeInterceptor {
/**
- * 握手前
+ * WebSocket握手之前执行的前置处理方法
*
- * @param request request
- * @param response response
- * @param wsHandler wsHandler
- * @param attributes attributes
- * @return 是否握手成功
+ * @param request WebSocket握手请求
+ * @param response WebSocket握手响应
+ * @param wsHandler WebSocket处理程序
+ * @param attributes 与WebSocket会话关联的属性
+ * @return 如果允许握手继续进行,则返回true;否则返回false
*/
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) {
@@ -37,15 +37,16 @@ public class PlusWebSocketInterceptor implements HandshakeInterceptor {
}
/**
- * 握手后
+ * WebSocket握手成功后执行的后置处理方法
*
- * @param request request
- * @param response response
- * @param wsHandler wsHandler
- * @param exception 异常
+ * @param request WebSocket握手请求
+ * @param response WebSocket握手响应
+ * @param wsHandler WebSocket处理程序
+ * @param exception 握手过程中可能出现的异常
*/
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
-
+ // 在这个方法中可以执行一些握手成功后的后续处理逻辑,比如记录日志或者其他操作
}
+
}
diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java
index 01528d0c9..0ad39affe 100644
--- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java
+++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/listener/WebSocketTopicListener.java
@@ -1,9 +1,9 @@
package org.dromara.common.websocket.listener;
import cn.hutool.core.collection.CollUtil;
+import lombok.extern.slf4j.Slf4j;
import org.dromara.common.websocket.holder.WebSocketSessionHolder;
import org.dromara.common.websocket.utils.WebSocketUtils;
-import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.Ordered;
@@ -16,8 +16,15 @@ import org.springframework.core.Ordered;
@Slf4j
public class WebSocketTopicListener implements ApplicationRunner, Ordered {
+ /**
+ * 在Spring Boot应用程序启动时初始化WebSocket主题订阅监听器
+ *
+ * @param args 应用程序参数
+ * @throws Exception 初始化过程中可能抛出的异常
+ */
@Override
public void run(ApplicationArguments args) throws Exception {
+ // 订阅WebSocket消息
WebSocketUtils.subscribeMessage((message) -> {
log.info("WebSocket主题订阅收到消息session keys={} message={}", message.getSessionKeys(), message.getMessage());
// 如果key不为空就按照key发消息 如果为空就群发
diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java
index 086599c40..afe76e06d 100644
--- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java
+++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java
@@ -29,10 +29,10 @@ import static org.dromara.common.websocket.constant.WebSocketConstants.WEB_SOCKE
public class WebSocketUtils {
/**
- * 发送消息
+ * 向指定的WebSocket会话发送消息
*
- * @param sessionKey session主键 一般为用户id
- * @param message 消息文本
+ * @param sessionKey 要发送消息的用户id
+ * @param message 要发送的消息内容
*/
public static void sendMessage(Long sessionKey, String message) {
WebSocketSession session = WebSocketSessionHolder.getSessions(sessionKey);
@@ -40,18 +40,18 @@ public class WebSocketUtils {
}
/**
- * 订阅消息
+ * 订阅WebSocket消息主题,并提供一个消费者函数来处理接收到的消息
*
- * @param consumer 自定义处理
+ * @param consumer 处理WebSocket消息的消费者函数
*/
public static void subscribeMessage(Consumer consumer) {
RedisUtils.subscribe(WEB_SOCKET_TOPIC, WebSocketMessageDto.class, consumer);
}
/**
- * 发布订阅的消息
+ * 发布WebSocket订阅消息
*
- * @param webSocketMessage 消息对象
+ * @param webSocketMessage 要发布的WebSocket消息对象
*/
public static void publishMessage(WebSocketMessageDto webSocketMessage) {
List unsentSessionKeys = new ArrayList<>();
@@ -76,9 +76,9 @@ public class WebSocketUtils {
}
/**
- * 发布订阅的消息(群发)
+ * 向所有的WebSocket会话发布订阅的消息(群发)
*
- * @param message 消息内容
+ * @param message 要发布的消息内容
*/
public static void publishAll(String message) {
WebSocketMessageDto broadcastMessage = new WebSocketMessageDto();
@@ -88,14 +88,31 @@ public class WebSocketUtils {
});
}
+ /**
+ * 向指定的WebSocket会话发送Pong消息
+ *
+ * @param session 要发送Pong消息的WebSocket会话
+ */
public static void sendPongMessage(WebSocketSession session) {
sendMessage(session, new PongMessage());
}
+ /**
+ * 向指定的WebSocket会话发送文本消息
+ *
+ * @param session WebSocket会话
+ * @param message 要发送的文本消息内容
+ */
public static void sendMessage(WebSocketSession session, String message) {
sendMessage(session, new TextMessage(message));
}
+ /**
+ * 向指定的WebSocket会话发送WebSocket消息对象
+ *
+ * @param session WebSocket会话
+ * @param message 要发送的WebSocket消息对象
+ */
private static void sendMessage(WebSocketSession session, WebSocketMessage> message) {
if (session == null || !session.isOpen()) {
log.warn("[send] session会话已经关闭");
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java
index 0cdb67548..559e1d59b 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java
@@ -3,10 +3,12 @@ package org.dromara.system.controller.system;
import cn.dev33.satoken.secure.BCrypt;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.io.FileUtil;
+import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.file.MimeTypeUtils;
import org.dromara.common.encrypt.annotation.ApiEncrypt;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.satoken.utils.LoginHelper;
@@ -19,9 +21,7 @@ import org.dromara.system.domain.vo.ProfileVo;
import org.dromara.system.domain.vo.SysOssVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysOssService;
-import org.dromara.system.service.ISysRoleService;
import org.dromara.system.service.ISysUserService;
-import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -57,12 +57,14 @@ public class SysProfileController extends BaseController {
}
/**
- * 修改用户
+ * 修改用户信息
*/
+ @RepeatSubmit
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
@PutMapping
- public R updateProfile(@RequestBody SysUserProfileBo profile) {
+ public R updateProfile(@Validated @RequestBody SysUserProfileBo profile) {
SysUserBo user = BeanUtil.toBean(profile, SysUserBo.class);
+ user.setUserId(LoginHelper.getUserId());
String username = LoginHelper.getUsername();
if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
return R.fail("修改用户'" + username + "'失败,手机号码已存在");
@@ -70,7 +72,6 @@ public class SysProfileController extends BaseController {
if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
return R.fail("修改用户'" + username + "'失败,邮箱账号已存在");
}
- user.setUserId(LoginHelper.getUserId());
if (userService.updateUserProfile(user) > 0) {
return R.ok();
}
@@ -82,6 +83,7 @@ public class SysProfileController extends BaseController {
*
* @param bo 新旧密码
*/
+ @RepeatSubmit
@ApiEncrypt
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
@PutMapping("/updatePwd")
@@ -106,6 +108,7 @@ public class SysProfileController extends BaseController {
*
* @param avatarfile 用户头像
*/
+ @RepeatSubmit
@Log(title = "用户头像", businessType = BusinessType.UPDATE)
@PostMapping(value = "/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R avatar(@RequestPart("avatarfile") MultipartFile avatarfile) {
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java
index 053ff1712..60be68a95 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java
@@ -144,7 +144,7 @@ public class SysTenantController extends BaseController {
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
@GetMapping("/dynamic/{tenantId}")
public R dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) {
- TenantHelper.setDynamic(tenantId);
+ TenantHelper.setDynamic(tenantId, true);
return R.ok();
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java
index fb4c605f5..846dd7960 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java
@@ -1,14 +1,16 @@
package org.dromara.system.domain.bo;
-import org.dromara.common.core.xss.Xss;
-import org.dromara.common.mybatis.core.domain.BaseEntity;
-import org.dromara.common.sensitive.annotation.Sensitive;
-import org.dromara.common.sensitive.core.SensitiveStrategy;
import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
+import org.dromara.common.core.constant.RegexConstants;
+import org.dromara.common.core.xss.Xss;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.sensitive.annotation.Sensitive;
+import org.dromara.common.sensitive.core.SensitiveStrategy;
/**
* 个人信息业务处理
@@ -21,11 +23,6 @@ import lombok.NoArgsConstructor;
@EqualsAndHashCode(callSuper = true)
public class SysUserProfileBo extends BaseEntity {
- /**
- * 用户ID
- */
- private Long userId;
-
/**
* 用户昵称
*/
@@ -44,6 +41,7 @@ public class SysUserProfileBo extends BaseEntity {
/**
* 手机号码
*/
+ @Pattern(regexp = RegexConstants.MOBILE, message = "手机号格式不正确")
@Sensitive(strategy = SensitiveStrategy.PHONE)
private String phonenumber;
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 93f1cc7fd..d8f481dbf 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
@@ -37,6 +37,7 @@ import org.dromara.system.domain.vo.SysUserExportVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.*;
import org.dromara.system.service.ISysUserService;
+import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -338,6 +339,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
* @return 结果
*/
@Override
+ @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId")
@Transactional(rollbackFor = Exception.class)
public int updateUser(SysUserBo user) {
// 新增用户与角色管理
@@ -386,6 +388,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
* @param user 用户信息
* @return 结果
*/
+ @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId")
@Override
public int updateUserProfile(SysUserBo user) {
return baseMapper.update(null,
@@ -636,7 +639,10 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
if (CollUtil.isEmpty(userIds)) {
return List.of();
}
- List list = this.selectUserByIds(userIds, null);
+ List list = baseMapper.selectVoList(new LambdaQueryWrapper()
+ .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName)
+ .eq(SysUser::getStatus, UserConstants.USER_NORMAL)
+ .in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds));
return BeanUtil.copyToList(list, UserDTO.class);
}
diff --git a/ruoyi-modules/ruoyi-workflow/README.md b/ruoyi-modules/ruoyi-workflow/README.md
new file mode 100644
index 000000000..59096b10e
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/README.md
@@ -0,0 +1,3 @@
+# 工作流说明
+
+工作流目前在未成熟阶段 后续仍会经历重构 甚至重写(生产使用前请慎重考虑后续是否要更新维护)
\ No newline at end of file
diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml
index 021709868..9ed40970a 100644
--- a/ruoyi-modules/ruoyi-workflow/pom.xml
+++ b/ruoyi-modules/ruoyi-workflow/pom.xml
@@ -109,7 +109,10 @@
org.dromara
ruoyi-common-tenant
-
+
+ org.dromara
+ ruoyi-common-security
+
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/annotation/FlowListenerAnnotation.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/annotation/FlowListenerAnnotation.java
deleted file mode 100644
index 5ea262d17..000000000
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/annotation/FlowListenerAnnotation.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.dromara.workflow.annotation;
-
-
-import java.lang.annotation.*;
-
-/**
- * 流程任务监听注解
- *
- * @author may
- * @date 2023-12-27
- */
-@Target({ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Inherited
-public @interface FlowListenerAnnotation {
-
- /**
- * 流程定义key
- */
- String processDefinitionKey();
-
- /**
- * 节点id
- */
- String taskDefId() default "";
-}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java
index df27d3cf9..c3fcafa87 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java
@@ -71,9 +71,9 @@ public interface FlowConstant {
String ZIP = "ZIP";
/**
- * 流程实例对象
+ * 业务与流程实例关联对象
*/
- String PROCESS_INSTANCE_VO = "processInstanceVo";
+ String BUSINESS_INSTANCE_DTO = "businessInstanceDTO";
/**
* 流程定义配置
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java
index 142386b61..931b9f568 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java
@@ -58,33 +58,33 @@ public class ActProcessInstanceController extends BaseController {
}
/**
- * 通过流程实例id获取历史流程图
+ * 通过业务id获取历史流程图
*
- * @param processInstanceId 流程实例id
+ * @param businessKey 业务id
*/
- @GetMapping("/getHistoryImage/{processInstanceId}")
- public R getHistoryImage(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) {
- return R.ok("操作成功", actProcessInstanceService.getHistoryImage(processInstanceId));
+ @GetMapping("/getHistoryImage/{businessKey}")
+ public R getHistoryImage(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) {
+ return R.ok("操作成功", actProcessInstanceService.getHistoryImage(businessKey));
}
/**
- * 通过流程实例id获取历史流程图运行中,历史等节点
+ * 通过业务id获取历史流程图运行中,历史等节点
*
- * @param processInstanceId 流程实例id
+ * @param businessKey 业务id
*/
- @GetMapping("/getHistoryList/{processInstanceId}")
- public R