diff --git a/README.md b/README.md
index f72dbcff..db95f5d8 100644
--- a/README.md
+++ b/README.md
@@ -45,17 +45,22 @@ youlai-boot
├── mysql5 # MySQL5 脚本
├── mysql8 # MySQL8 脚本
├── src # 源码目录
- ├── base # 核心模块
- ├── mybatisplus # Mybatis-Plus 配置和插件
- ├── security # Spring Security 安全配置和扩展
├── common # 公共模块
├── config # 自动装配配置
├── CorsConfig # 跨域共享配置
- ├── RedisConfig # Redis 配置
+ ├── MybatisConfig # Mybatis 自动装配配置
+ ├── RedisCacheConfig # Redis 缓存自动装配配置
+ ├── RedisConfig # Redis 自动装配配置
+ ├── SecurityConfig # Spring Security 自动装配配置
├── SwaggerConfig # API 接口文档配置
├── WebMvcConfig # WebMvc 配置
+ ├── WebSocketConfig # WebSocket 自动装配配置
+ ├── XxlJobConfig # XXL-JOB 自动装配配置
├── controller # 控制层
├── converter # MapStruct转换器
+ ├── core # 核心模块
+ ├── security # Spring Security 安全配置和扩展
+ ├── mybatis # Mybatis-Plus 配置和插件
├── filter # 过滤器
├── RequestLogFilter # 请求日志过滤器
├── VerifyCodeFilter # 验证码过滤器
@@ -68,6 +73,7 @@ youlai-boot
├── vo # 视图对象
├── mapper # 数据库访问层
├── plugin # 插件(可选)
+ ├── captcha # 验证码插件,用于生成验证码
├── dupsubmit # 防重提交插件,用于防止表单重复提交
├── easyexcel # EasyExcel 插件,Excel 文件的读写
├── rabbitmq # RabbitMQ 插件,消息队列交互
diff --git a/pom.xml b/pom.xml
index 5f41cbf9..97cdaefb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
com.youlai
youlai-boot
- 2.5.0
+ 2.5.1
基于 Java 17 + SpringBoot 3 构建的权限管理系统。
diff --git a/src/main/java/com/youlai/system/common/util/SecurityUtils.java b/src/main/java/com/youlai/system/common/util/SecurityUtils.java
index 9a64a377..48a7631f 100644
--- a/src/main/java/com/youlai/system/common/util/SecurityUtils.java
+++ b/src/main/java/com/youlai/system/common/util/SecurityUtils.java
@@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.youlai.system.common.constant.SystemConstants;
-import com.youlai.system.base.security.model.SysUserDetails;
+import com.youlai.system.core.security.model.SysUserDetails;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
diff --git a/src/main/java/com/youlai/system/base/mybatisplus/config/MybatisPlusConfig.java b/src/main/java/com/youlai/system/config/MybatisConfig.java
similarity index 86%
rename from src/main/java/com/youlai/system/base/mybatisplus/config/MybatisPlusConfig.java
rename to src/main/java/com/youlai/system/config/MybatisConfig.java
index 018d9ef0..74274c85 100644
--- a/src/main/java/com/youlai/system/base/mybatisplus/config/MybatisPlusConfig.java
+++ b/src/main/java/com/youlai/system/config/MybatisConfig.java
@@ -1,12 +1,12 @@
-package com.youlai.system.base.mybatisplus.config;
+package com.youlai.system.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
-import com.youlai.system.base.mybatisplus.handler.MyDataPermissionHandler;
-import com.youlai.system.base.mybatisplus.handler.MyMetaObjectHandler;
+import com.youlai.system.core.mybatis.handler.MyDataPermissionHandler;
+import com.youlai.system.core.mybatis.handler.MyMetaObjectHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@@ -19,7 +19,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
*/
@Configuration
@EnableTransactionManagement
-public class MybatisPlusConfig {
+public class MybatisConfig {
/**
* 分页插件和数据权限插件
diff --git a/src/main/java/com/youlai/system/base/security/config/SecurityConfig.java b/src/main/java/com/youlai/system/config/SecurityConfig.java
similarity index 93%
rename from src/main/java/com/youlai/system/base/security/config/SecurityConfig.java
rename to src/main/java/com/youlai/system/config/SecurityConfig.java
index f970e35c..01896f04 100644
--- a/src/main/java/com/youlai/system/base/security/config/SecurityConfig.java
+++ b/src/main/java/com/youlai/system/config/SecurityConfig.java
@@ -1,11 +1,11 @@
-package com.youlai.system.base.security.config;
+package com.youlai.system.config;
import com.youlai.system.common.constant.SecurityConstants;
-import com.youlai.system.base.security.exception.MyAccessDeniedHandler;
-import com.youlai.system.base.security.exception.MyAuthenticationEntryPoint;
-import com.youlai.system.base.security.jwt.JwtTokenFilter;
+import com.youlai.system.core.security.exception.MyAccessDeniedHandler;
+import com.youlai.system.core.security.exception.MyAuthenticationEntryPoint;
+import com.youlai.system.core.security.jwt.JwtTokenFilter;
import com.youlai.system.filter.VerifyCodeFilter;
-import com.youlai.system.base.security.jwt.JwtTokenProvider;
+import com.youlai.system.core.security.jwt.JwtTokenProvider;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
diff --git a/src/main/java/com/youlai/system/config/WebSocketConfig.java b/src/main/java/com/youlai/system/config/WebSocketConfig.java
new file mode 100644
index 00000000..c44e0fe3
--- /dev/null
+++ b/src/main/java/com/youlai/system/config/WebSocketConfig.java
@@ -0,0 +1,111 @@
+package com.youlai.system.config;
+
+import cn.hutool.core.util.StrUtil;
+import com.youlai.system.core.security.jwt.JwtTokenProvider;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpHeaders;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.messaging.simp.config.ChannelRegistration;
+import org.springframework.messaging.simp.config.MessageBrokerRegistry;
+import org.springframework.messaging.simp.stomp.StompCommand;
+import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
+import org.springframework.messaging.support.ChannelInterceptor;
+import org.springframework.messaging.support.MessageHeaderAccessor;
+import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
+import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
+import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
+
+/**
+ * WebSocket 配置
+ *
+ * @author haoxr
+ * @since 2.4.0
+ */
+@Configuration
+@EnableWebSocketMessageBroker // 启用WebSocket消息代理功能和配置STOMP协议,实现实时双向通信和消息传递
+@RequiredArgsConstructor
+@Slf4j
+public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
+
+ private final JwtTokenProvider jwtTokenProvider;
+
+ /**
+ * 注册一个端点,客户端通过这个端点进行连接
+ */
+ @Override
+ public void registerStompEndpoints(StompEndpointRegistry registry) {
+ registry
+ .addEndpoint("/ws") // 注册了一个 /ws 的端点
+ .setAllowedOriginPatterns("*") // 允许跨域的 WebSocket 连接
+ .withSockJS(); // 启用 SockJS (浏览器不支持WebSocket,SockJS 将会提供兼容性支持)
+ registry.addEndpoint("/ws-app").setAllowedOriginPatterns("*"); // 注册了一个 /ws-app 的端点,支持 uni-app 的 ws 连接协议
+ }
+
+
+ /**
+ * 配置消息代理
+ */
+ @Override
+ public void configureMessageBroker(MessageBrokerRegistry registry) {
+ // 客户端发送消息的请求前缀
+ registry.setApplicationDestinationPrefixes("/app");
+
+ // 客户端订阅消息的请求前缀,topic一般用于广播推送,queue用于点对点推送
+ registry.enableSimpleBroker("/topic", "/queue");
+
+ // 服务端通知客户端的前缀,可以不设置,默认为user
+ registry.setUserDestinationPrefix("/user");
+ }
+
+
+ /**
+ * 配置客户端入站通道拦截器
+ *
+ * @param registration 通道注册器
+ */
+ @Override
+ public void configureClientInboundChannel(ChannelRegistration registration) {
+ registration.interceptors(new ChannelInterceptor() {
+ @Override
+ public Message> preSend(Message> message, MessageChannel channel) {
+ StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
+
+ // 如果 StompHeaderAccessor 为 null,说明不是 STOMP 消息,直接放行
+ if (accessor == null) {
+ return ChannelInterceptor.super.preSend(message, channel);
+ }
+
+ // 如果是连接请求(CONNECT 命令),从请求头中取出 token 并设置到认证信息中
+ if (StompCommand.CONNECT.equals(accessor.getCommand())) {
+ // 从连接头中提取授权令牌
+ String bearerToken = accessor.getFirstNativeHeader(HttpHeaders.AUTHORIZATION);
+
+ // 验证令牌格式并提取用户信息
+ if (StrUtil.isNotBlank(bearerToken) && bearerToken.startsWith("Bearer ")) {
+ try {
+ // 移除 "Bearer " 前缀
+ String tokenWithoutPrefix = bearerToken.substring(7);
+ String username = jwtTokenProvider.getUsername(tokenWithoutPrefix);
+
+ // 如果用户名有效,设置用户到访问器中
+ if (StrUtil.isNotBlank(username)) {
+ accessor.setUser(() -> username);
+ return message;
+ }
+ } catch (Exception e) {
+ // 异常处理,可能是解析令牌失败
+ log.error("Failed to process authentication token.", e);
+ }
+ }
+ }
+
+ // 如果不是连接命令或授权失败,继续执行默认逻辑
+ return ChannelInterceptor.super.preSend(message, channel);
+ }
+ });
+ }
+
+}
diff --git a/src/main/java/com/youlai/system/plugin/xxljob/XxlJobConfig.java b/src/main/java/com/youlai/system/config/XxlJobConfig.java
similarity index 97%
rename from src/main/java/com/youlai/system/plugin/xxljob/XxlJobConfig.java
rename to src/main/java/com/youlai/system/config/XxlJobConfig.java
index d326dd6e..a0f802ed 100644
--- a/src/main/java/com/youlai/system/plugin/xxljob/XxlJobConfig.java
+++ b/src/main/java/com/youlai/system/config/XxlJobConfig.java
@@ -1,4 +1,4 @@
-package com.youlai.system.plugin.xxljob;
+package com.youlai.system.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/com/youlai/system/controller/WebsocketController.java b/src/main/java/com/youlai/system/controller/WebsocketController.java
index 18d724cb..ed82a66e 100644
--- a/src/main/java/com/youlai/system/controller/WebsocketController.java
+++ b/src/main/java/com/youlai/system/controller/WebsocketController.java
@@ -1,6 +1,6 @@
package com.youlai.system.controller;
-import com.youlai.system.model.dto.SocketMessage;
+import com.youlai.system.model.dto.ChatMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.handler.annotation.DestinationVariable;
@@ -48,11 +48,14 @@ public class WebsocketController {
* @param message 消息内容
*/
@MessageMapping("/sendToUser/{username}")
- //@SendToUser(value = "/queue/greeting")
public void sendToUser(Principal principal, @DestinationVariable String username, String message) {
- log.info("sender:{};receiver:{}", principal.getName(), username);
- messagingTemplate.convertAndSendToUser(username, "/queue/greeting", new SocketMessage(principal.getName(), message));
- /// return "Hello, " + message;
+
+ String sender = principal.getName(); // 发送人
+ String receiver = username; // 接收人
+
+ log.info("发送人:{}; 接收人:{}", sender, receiver);
+ // 发送消息给指定用户 /user/{username}/queue/greeting
+ messagingTemplate.convertAndSendToUser(receiver, "/queue/greeting", new ChatMessage(sender, message));
}
}
diff --git a/src/main/java/com/youlai/system/base/mybatisplus/annotation/DataPermission.java b/src/main/java/com/youlai/system/core/mybatis/annotation/DataPermission.java
similarity index 90%
rename from src/main/java/com/youlai/system/base/mybatisplus/annotation/DataPermission.java
rename to src/main/java/com/youlai/system/core/mybatis/annotation/DataPermission.java
index edd372a9..63e73277 100644
--- a/src/main/java/com/youlai/system/base/mybatisplus/annotation/DataPermission.java
+++ b/src/main/java/com/youlai/system/core/mybatis/annotation/DataPermission.java
@@ -1,4 +1,4 @@
-package com.youlai.system.base.mybatisplus.annotation;
+package com.youlai.system.core.mybatis.annotation;
import java.lang.annotation.*;
diff --git a/src/main/java/com/youlai/system/base/mybatisplus/handler/MyDataPermissionHandler.java b/src/main/java/com/youlai/system/core/mybatis/handler/MyDataPermissionHandler.java
similarity index 96%
rename from src/main/java/com/youlai/system/base/mybatisplus/handler/MyDataPermissionHandler.java
rename to src/main/java/com/youlai/system/core/mybatis/handler/MyDataPermissionHandler.java
index 82a275a8..b39f9b10 100644
--- a/src/main/java/com/youlai/system/base/mybatisplus/handler/MyDataPermissionHandler.java
+++ b/src/main/java/com/youlai/system/core/mybatis/handler/MyDataPermissionHandler.java
@@ -1,9 +1,9 @@
-package com.youlai.system.base.mybatisplus.handler;
+package com.youlai.system.core.mybatis.handler;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler;
-import com.youlai.system.base.mybatisplus.annotation.DataPermission;
+import com.youlai.system.core.mybatis.annotation.DataPermission;
import com.youlai.system.common.base.IBaseEnum;
import com.youlai.system.common.enums.DataScopeEnum;
import com.youlai.system.common.util.SecurityUtils;
diff --git a/src/main/java/com/youlai/system/base/mybatisplus/handler/MyMetaObjectHandler.java b/src/main/java/com/youlai/system/core/mybatis/handler/MyMetaObjectHandler.java
similarity index 94%
rename from src/main/java/com/youlai/system/base/mybatisplus/handler/MyMetaObjectHandler.java
rename to src/main/java/com/youlai/system/core/mybatis/handler/MyMetaObjectHandler.java
index 68bcfc40..9cf7d3d5 100644
--- a/src/main/java/com/youlai/system/base/mybatisplus/handler/MyMetaObjectHandler.java
+++ b/src/main/java/com/youlai/system/core/mybatis/handler/MyMetaObjectHandler.java
@@ -1,4 +1,4 @@
-package com.youlai.system.base.mybatisplus.handler;
+package com.youlai.system.core.mybatis.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
diff --git a/src/main/java/com/youlai/system/base/security/exception/MyAccessDeniedHandler.java b/src/main/java/com/youlai/system/core/security/exception/MyAccessDeniedHandler.java
similarity index 94%
rename from src/main/java/com/youlai/system/base/security/exception/MyAccessDeniedHandler.java
rename to src/main/java/com/youlai/system/core/security/exception/MyAccessDeniedHandler.java
index 60bb2623..c7979301 100644
--- a/src/main/java/com/youlai/system/base/security/exception/MyAccessDeniedHandler.java
+++ b/src/main/java/com/youlai/system/core/security/exception/MyAccessDeniedHandler.java
@@ -1,4 +1,4 @@
-package com.youlai.system.base.security.exception;
+package com.youlai.system.core.security.exception;
import com.youlai.system.common.result.ResultCode;
import com.youlai.system.common.util.ResponseUtils;
diff --git a/src/main/java/com/youlai/system/base/security/exception/MyAuthenticationEntryPoint.java b/src/main/java/com/youlai/system/core/security/exception/MyAuthenticationEntryPoint.java
similarity index 95%
rename from src/main/java/com/youlai/system/base/security/exception/MyAuthenticationEntryPoint.java
rename to src/main/java/com/youlai/system/core/security/exception/MyAuthenticationEntryPoint.java
index a5fd840c..2a82ab8a 100644
--- a/src/main/java/com/youlai/system/base/security/exception/MyAuthenticationEntryPoint.java
+++ b/src/main/java/com/youlai/system/core/security/exception/MyAuthenticationEntryPoint.java
@@ -1,4 +1,4 @@
-package com.youlai.system.base.security.exception;
+package com.youlai.system.core.security.exception;
import com.youlai.system.common.result.ResultCode;
import com.youlai.system.common.util.ResponseUtils;
diff --git a/src/main/java/com/youlai/system/base/security/jwt/JwtTokenFilter.java b/src/main/java/com/youlai/system/core/security/jwt/JwtTokenFilter.java
similarity index 97%
rename from src/main/java/com/youlai/system/base/security/jwt/JwtTokenFilter.java
rename to src/main/java/com/youlai/system/core/security/jwt/JwtTokenFilter.java
index a116f1d7..5fba6042 100644
--- a/src/main/java/com/youlai/system/base/security/jwt/JwtTokenFilter.java
+++ b/src/main/java/com/youlai/system/core/security/jwt/JwtTokenFilter.java
@@ -1,4 +1,4 @@
-package com.youlai.system.base.security.jwt;
+package com.youlai.system.core.security.jwt;
import com.youlai.system.common.result.ResultCode;
import com.youlai.system.common.util.ResponseUtils;
diff --git a/src/main/java/com/youlai/system/base/security/jwt/JwtTokenProvider.java b/src/main/java/com/youlai/system/core/security/jwt/JwtTokenProvider.java
similarity index 98%
rename from src/main/java/com/youlai/system/base/security/jwt/JwtTokenProvider.java
rename to src/main/java/com/youlai/system/core/security/jwt/JwtTokenProvider.java
index 26725297..2f34d6c3 100644
--- a/src/main/java/com/youlai/system/base/security/jwt/JwtTokenProvider.java
+++ b/src/main/java/com/youlai/system/core/security/jwt/JwtTokenProvider.java
@@ -1,8 +1,8 @@
-package com.youlai.system.base.security.jwt;
+package com.youlai.system.core.security.jwt;
import cn.hutool.core.convert.Convert;
import com.youlai.system.common.constant.JwtClaimConstants;
-import com.youlai.system.base.security.model.SysUserDetails;
+import com.youlai.system.core.security.model.SysUserDetails;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
diff --git a/src/main/java/com/youlai/system/base/security/model/SysUserDetails.java b/src/main/java/com/youlai/system/core/security/model/SysUserDetails.java
similarity index 98%
rename from src/main/java/com/youlai/system/base/security/model/SysUserDetails.java
rename to src/main/java/com/youlai/system/core/security/model/SysUserDetails.java
index 124c60e2..578d3a2a 100644
--- a/src/main/java/com/youlai/system/base/security/model/SysUserDetails.java
+++ b/src/main/java/com/youlai/system/core/security/model/SysUserDetails.java
@@ -1,4 +1,4 @@
-package com.youlai.system.base.security.model;
+package com.youlai.system.core.security.model;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
diff --git a/src/main/java/com/youlai/system/base/security/service/PermissionService.java b/src/main/java/com/youlai/system/core/security/service/PermissionService.java
similarity index 98%
rename from src/main/java/com/youlai/system/base/security/service/PermissionService.java
rename to src/main/java/com/youlai/system/core/security/service/PermissionService.java
index ced6e3e8..b13b8784 100644
--- a/src/main/java/com/youlai/system/base/security/service/PermissionService.java
+++ b/src/main/java/com/youlai/system/core/security/service/PermissionService.java
@@ -1,4 +1,4 @@
-package com.youlai.system.base.security.service;
+package com.youlai.system.core.security.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
diff --git a/src/main/java/com/youlai/system/base/security/service/SysUserDetailsService.java b/src/main/java/com/youlai/system/core/security/service/SysUserDetailsService.java
similarity index 89%
rename from src/main/java/com/youlai/system/base/security/service/SysUserDetailsService.java
rename to src/main/java/com/youlai/system/core/security/service/SysUserDetailsService.java
index 7d575451..f2f8b26f 100644
--- a/src/main/java/com/youlai/system/base/security/service/SysUserDetailsService.java
+++ b/src/main/java/com/youlai/system/core/security/service/SysUserDetailsService.java
@@ -1,6 +1,6 @@
-package com.youlai.system.base.security.service;
+package com.youlai.system.core.security.service;
-import com.youlai.system.base.security.model.SysUserDetails;
+import com.youlai.system.core.security.model.SysUserDetails;
import com.youlai.system.model.dto.UserAuthInfo;
import com.youlai.system.service.SysUserService;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/youlai/system/mapper/SysDeptMapper.java b/src/main/java/com/youlai/system/mapper/SysDeptMapper.java
index 73bf622d..3b4aaa97 100644
--- a/src/main/java/com/youlai/system/mapper/SysDeptMapper.java
+++ b/src/main/java/com/youlai/system/mapper/SysDeptMapper.java
@@ -3,7 +3,7 @@ package com.youlai.system.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
-import com.youlai.system.base.mybatisplus.annotation.DataPermission;
+import com.youlai.system.core.mybatis.annotation.DataPermission;
import com.youlai.system.model.entity.SysDept;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
diff --git a/src/main/java/com/youlai/system/mapper/SysUserMapper.java b/src/main/java/com/youlai/system/mapper/SysUserMapper.java
index ebb59ca2..45ffca7e 100644
--- a/src/main/java/com/youlai/system/mapper/SysUserMapper.java
+++ b/src/main/java/com/youlai/system/mapper/SysUserMapper.java
@@ -2,7 +2,7 @@ package com.youlai.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.youlai.system.base.mybatisplus.annotation.DataPermission;
+import com.youlai.system.core.mybatis.annotation.DataPermission;
import com.youlai.system.model.bo.UserBO;
import com.youlai.system.model.entity.SysUser;
import com.youlai.system.model.dto.UserAuthInfo;
diff --git a/src/main/java/com/youlai/system/model/dto/SocketMessage.java b/src/main/java/com/youlai/system/model/dto/ChatMessage.java
similarity index 91%
rename from src/main/java/com/youlai/system/model/dto/SocketMessage.java
rename to src/main/java/com/youlai/system/model/dto/ChatMessage.java
index cda51641..6dd6de32 100644
--- a/src/main/java/com/youlai/system/model/dto/SocketMessage.java
+++ b/src/main/java/com/youlai/system/model/dto/ChatMessage.java
@@ -10,7 +10,7 @@ import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
-public class SocketMessage {
+public class ChatMessage {
/**
* 发送者
diff --git a/src/main/java/com/youlai/system/plugin/dupsubmit/aspect/DuplicateSubmitAspect.java b/src/main/java/com/youlai/system/plugin/dupsubmit/aspect/DuplicateSubmitAspect.java
index 90a08fd6..23777e92 100644
--- a/src/main/java/com/youlai/system/plugin/dupsubmit/aspect/DuplicateSubmitAspect.java
+++ b/src/main/java/com/youlai/system/plugin/dupsubmit/aspect/DuplicateSubmitAspect.java
@@ -4,7 +4,7 @@ import cn.hutool.core.util.StrUtil;
import com.youlai.system.plugin.dupsubmit.annotation.PreventDuplicateSubmit;
import com.youlai.system.common.result.ResultCode;
import com.youlai.system.common.exception.BusinessException;
-import com.youlai.system.base.security.jwt.JwtTokenProvider;
+import com.youlai.system.core.security.jwt.JwtTokenProvider;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/com/youlai/system/plugin/websocket/WebSocketConfig.java b/src/main/java/com/youlai/system/plugin/websocket/WebSocketConfig.java
deleted file mode 100644
index 85f865c8..00000000
--- a/src/main/java/com/youlai/system/plugin/websocket/WebSocketConfig.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.youlai.system.plugin.websocket;
-
-import lombok.RequiredArgsConstructor;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.messaging.simp.config.ChannelRegistration;
-import org.springframework.messaging.simp.config.MessageBrokerRegistry;
-import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
-import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
-import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
-
-/**
- * WebSocket 配置
- *
- * @author haoxr
- * @since 2.4.0
- */
-@Configuration
-@EnableWebSocketMessageBroker // 启用WebSocket消息代理功能和配置STOMP协议,实现实时双向通信和消息传递
-@RequiredArgsConstructor
-public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
-
- private final WebsocketChannelInterceptor websocketChannelInterceptor;
-
- /**
- * 注册一个端点,客户端通过这个端点进行连接
- */
- @Override
- public void registerStompEndpoints(StompEndpointRegistry registry) {
- registry
- .addEndpoint("/ws") // 注册了一个 /ws 的端点
- .setAllowedOriginPatterns("*") // 允许跨域的 WebSocket 连接
- .withSockJS(); // 启用 SockJS (浏览器不支持WebSocket,SockJS 将会提供兼容性支持)
- registry.addEndpoint("/ws-app").setAllowedOriginPatterns("*"); // 注册了一个 /ws-app 的端点,支持 uni-app 的 ws 连接协议
- }
-
-
- /**
- * 配置消息代理
- */
- @Override
- public void configureMessageBroker(MessageBrokerRegistry registry) {
- // 客户端发送消息的请求前缀
- registry.setApplicationDestinationPrefixes("/app");
-
- // 客户端订阅消息的请求前缀,topic一般用于广播推送,queue用于点对点推送
- registry.enableSimpleBroker("/topic", "/queue");
-
- // 服务端通知客户端的前缀,可以不设置,默认为user
- registry.setUserDestinationPrefix("/user");
- }
-
-
- /**
- * 配置客户端入站通道拦截器
- *
- * @param registration 通道注册器
- */
- @Override
- public void configureClientInboundChannel(ChannelRegistration registration) {
- registration.interceptors(websocketChannelInterceptor);
- }
-}
diff --git a/src/main/java/com/youlai/system/plugin/websocket/WebsocketChannelInterceptor.java b/src/main/java/com/youlai/system/plugin/websocket/WebsocketChannelInterceptor.java
deleted file mode 100644
index bbfca0f2..00000000
--- a/src/main/java/com/youlai/system/plugin/websocket/WebsocketChannelInterceptor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.youlai.system.plugin.websocket;
-
-import cn.hutool.core.util.StrUtil;
-import com.youlai.system.base.security.jwt.JwtTokenProvider;
-import lombok.RequiredArgsConstructor;
-import org.springframework.messaging.Message;
-import org.springframework.messaging.MessageChannel;
-import org.springframework.messaging.simp.stomp.StompCommand;
-import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
-import org.springframework.messaging.support.ChannelInterceptor;
-import org.springframework.messaging.support.MessageHeaderAccessor;
-import org.springframework.stereotype.Component;
-
-import java.security.Principal;
-
-/**
- * Websocket 连接认证拦截器
- *
- * @author haoxr
- * @since 2.4.0
- */
-@Component
-@RequiredArgsConstructor
-public class WebsocketChannelInterceptor implements ChannelInterceptor {
-
- private final JwtTokenProvider jwtTokenProvider;
-
- /**
- * 连接前监听
- *
- * @param message 消息
- * @param channel 通道
- * @return
- */
- @Override
- public Message> preSend(Message> message, MessageChannel channel) {
- StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
- assert accessor != null;
-
- if (StompCommand.CONNECT.equals(accessor.getCommand())) {
- String bearerToken = accessor.getFirstNativeHeader("Authorization");
- if (StrUtil.isNotBlank(bearerToken)) {
- bearerToken = bearerToken.substring(7); // remove "Bearer "
- String username = jwtTokenProvider.getUsername(bearerToken);
- if (StrUtil.isNotBlank(username)) {
- Principal principal = () -> username;
- accessor.setUser(principal);
- return message;
- }
- }
- }
- return ChannelInterceptor.super.preSend(message, channel);
- }
-
-}
diff --git a/src/main/java/com/youlai/system/service/impl/AuthServiceImpl.java b/src/main/java/com/youlai/system/service/impl/AuthServiceImpl.java
index fedac225..a34e4ed5 100644
--- a/src/main/java/com/youlai/system/service/impl/AuthServiceImpl.java
+++ b/src/main/java/com/youlai/system/service/impl/AuthServiceImpl.java
@@ -1,10 +1,9 @@
package com.youlai.system.service.impl;
-import cn.hutool.captcha.AbstractCaptcha;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.youlai.system.common.constant.CacheConstants;
-import com.youlai.system.base.security.jwt.JwtTokenProvider;
+import com.youlai.system.core.security.jwt.JwtTokenProvider;
import com.youlai.system.model.dto.CaptchaResult;
import com.youlai.system.model.dto.LoginResult;
import com.youlai.system.plugin.captcha.CaptchaGenerator;
diff --git a/src/main/java/com/youlai/system/service/impl/SysRoleServiceImpl.java b/src/main/java/com/youlai/system/service/impl/SysRoleServiceImpl.java
index 7561592d..4771cbba 100644
--- a/src/main/java/com/youlai/system/service/impl/SysRoleServiceImpl.java
+++ b/src/main/java/com/youlai/system/service/impl/SysRoleServiceImpl.java
@@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.system.common.constant.SystemConstants;
import com.youlai.system.common.model.Option;
import com.youlai.system.converter.RoleConverter;
-import com.youlai.system.base.security.service.PermissionService;
+import com.youlai.system.core.security.service.PermissionService;
import com.youlai.system.mapper.SysRoleMapper;
import com.youlai.system.model.entity.SysRole;
import com.youlai.system.model.entity.SysRoleMenu;