diff --git a/pom.xml b/pom.xml
index 552c3631..74db0989 100644
--- a/pom.xml
+++ b/pom.xml
@@ -241,19 +241,11 @@
mybatis-plus-boot-starter
3.4.0
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+ 2.7.10
+
diff --git a/research-framework/pom.xml b/research-framework/pom.xml
index ed68925a..7b999936 100644
--- a/research-framework/pom.xml
+++ b/research-framework/pom.xml
@@ -62,6 +62,10 @@
org.projectlombok
lombok
+
+ org.springframework
+ spring-websocket
+
diff --git a/research-framework/src/main/java/com/research/framework/config/WebSocketClientConfig.java b/research-framework/src/main/java/com/research/framework/config/WebSocketClientConfig.java
new file mode 100644
index 00000000..d13a9367
--- /dev/null
+++ b/research-framework/src/main/java/com/research/framework/config/WebSocketClientConfig.java
@@ -0,0 +1,17 @@
+package com.research.framework.config;
+
+import com.research.framework.config.handler.WebSocketClientHandler;
+import org.springframework.context.annotation.Bean;
+
+/**
+ * @Author zzc
+ * @Package com.research.framework.config
+ * @Date 2025/11/25 17:14
+ * @description:
+ */
+public class WebSocketClientConfig {
+ @Bean
+ public WebSocketClientHandler myWebSocketClientHandler() {
+ return new WebSocketClientHandler();
+ }
+}
diff --git a/research-framework/src/main/java/com/research/framework/config/WebSocketServerConfig.java b/research-framework/src/main/java/com/research/framework/config/WebSocketServerConfig.java
new file mode 100644
index 00000000..455e103d
--- /dev/null
+++ b/research-framework/src/main/java/com/research/framework/config/WebSocketServerConfig.java
@@ -0,0 +1,27 @@
+package com.research.framework.config;
+
+import com.research.framework.config.handler.WebSocketServerHandler;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.socket.WebSocketHandler;
+import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
+import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
+
+/**
+ * @Author zzc
+ * @Package com.research.framework.config
+ * @Date 2025/11/25 13:47
+ * @description:
+ */
+public class WebSocketServerConfig implements WebSocketConfigurer {
+
+ @Bean
+ public WebSocketHandler webSocketHandler() {
+ return new WebSocketServerHandler();
+ }
+ @Override
+ public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
+ registry
+ .addHandler(webSocketHandler(), "/ws")//添加处理器并指定WebSocket的endpoint端点
+ .setAllowedOrigins("*"); //允许跨域访问
+ }
+}
diff --git a/research-framework/src/main/java/com/research/framework/config/handler/WebSocketClientHandler.java b/research-framework/src/main/java/com/research/framework/config/handler/WebSocketClientHandler.java
new file mode 100644
index 00000000..8cd74dd3
--- /dev/null
+++ b/research-framework/src/main/java/com/research/framework/config/handler/WebSocketClientHandler.java
@@ -0,0 +1,91 @@
+package com.research.framework.config.handler;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.socket.*;
+import org.springframework.web.socket.client.WebSocketClient;
+import org.springframework.web.socket.client.standard.StandardWebSocketClient;
+
+import javax.annotation.PreDestroy;
+
+/**
+ * @Author zzc
+ * @Package com.research.framework.config.handler
+ * @Date 2025/11/25 17:14
+ * @description:
+ */
+@Slf4j
+public class WebSocketClientHandler extends StandardWebSocketClient implements WebSocketHandler {
+
+ private WebSocketSession session;
+ private String url = "ws://localhost:38001/ws";
+ /**
+ * 连接WebSocket服务端
+ */
+ @Scheduled(fixedDelay = 60000) // 每隔1分钟连接一次
+ public void connect() throws Exception {
+ WebSocketClient client = new StandardWebSocketClient();
+ session = client.doHandshake(new WebSocketClientHandler(), url).get();
+ log.info("Client: WebSocket connection established");
+ }
+ /**
+ * 关闭WebSocket连接
+ */
+ @PreDestroy
+ public void close() throws Exception {
+ session.close();
+ }
+ /**
+ * @param message:向服务端发送的消息
+ */
+ public void sendMessage(String message) throws Exception {
+ session.sendMessage(new TextMessage(message));
+ }
+// @Scheduled(fixedDelay = 5000)
+// public void sendMessage() throws Exception {
+// session.sendMessage(new TextMessage("message"));
+// }
+ /**
+ * 处理连接后的逻辑
+ * @param session:WebSocketSession域对象,有获取通信信息,发送消息,打开关闭通道等等功能
+ */
+ @Override
+ public void afterConnectionEstablished(WebSocketSession session) throws Exception {
+ log.info("Client: WebSocket connection established");
+ }
+ /**
+ * 处理客户端发送的消息
+ * @param session:WebSocketSession域对象,有获取通信信息,发送消息,打开关闭通道等等功能
+ * @param message:客户端发送的文本消息
+ */
+ @Override
+ public void handleMessage(WebSocketSession session, WebSocketMessage> message) throws Exception {
+ log.info("Client: Received message: " + message.getPayload());
+ session.sendMessage(new TextMessage("Client: Hello, server!"));
+ }
+ /**
+ * 处理发生的错误
+ * @param session:WebSocketSession域对象,有获取通信信息,发送消息,打开关闭通道等等功能
+ * @param exception:通信出现的异常
+ */
+ @Override
+ public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
+ log.info("Client: Error Occurred: " + exception.getMessage());
+ }
+ /**
+ * 连接关闭
+ */
+ @Override
+ public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
+ log.info("Client: Connection Closed");
+ }
+ /**
+ * 用于判断服务器或客户端是否支持分片消息partial message
+ * WebSocket 协议规范要求所有的 WebSocket 实现都必须支持接收和处理完整的消息
+ * @return boolean
+ */
+ @Override
+ public boolean supportsPartialMessages() {
+ return false;
+ }
+}
diff --git a/research-framework/src/main/java/com/research/framework/config/handler/WebSocketServerHandler.java b/research-framework/src/main/java/com/research/framework/config/handler/WebSocketServerHandler.java
new file mode 100644
index 00000000..c0a16528
--- /dev/null
+++ b/research-framework/src/main/java/com/research/framework/config/handler/WebSocketServerHandler.java
@@ -0,0 +1,34 @@
+package com.research.framework.config.handler;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+import org.springframework.web.socket.handler.TextWebSocketHandler;
+
+/**
+ * @Author zzc
+ * @Package com.research.framework.config.handler
+ * @Date 2025/11/25 13:50
+ * @description:
+ */
+@Slf4j
+public class WebSocketServerHandler extends TextWebSocketHandler {
+ /**
+ * 处理连接后的逻辑
+ * @param session:WebSocketSession域对象,有获取通信信息,发送消息,打开关闭通道等等功能
+ */
+ @Override
+ public void afterConnectionEstablished(WebSocketSession session) throws Exception {
+ log.info("Server: WebSocket connection established");
+ }
+ /**
+ * 处理客户端发送的消息
+ * @param session:WebSocketSession域对象,有获取通信信息,发送消息,打开关闭通道等等功能
+ * @param message:客户端发送的文本消息
+ */
+ @Override
+ protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
+ log.info("Server: Received message: " + message.getPayload());
+ session.sendMessage(new TextMessage("Server: Hello, client!"));
+ }
+}
diff --git a/research-system/pom.xml b/research-system/pom.xml
index f06edfd4..9bc0abed 100644
--- a/research-system/pom.xml
+++ b/research-system/pom.xml
@@ -37,6 +37,10 @@
hutool-all
5.8.24
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+
\ No newline at end of file
diff --git a/research-system/src/main/java/com/research/system/domain/vo/SessionVo.java b/research-system/src/main/java/com/research/system/domain/vo/SessionVo.java
index 81950e4d..d9e55d70 100644
--- a/research-system/src/main/java/com/research/system/domain/vo/SessionVo.java
+++ b/research-system/src/main/java/com/research/system/domain/vo/SessionVo.java
@@ -2,6 +2,7 @@ package com.research.system.domain.vo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
+import com.research.common.utils.SecurityUtils;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -30,6 +31,7 @@ public class SessionVo {
private String lastMessage;
@ApiModelProperty("最后消息时间")
private Date lastMessageTime;
+ private String orgName;
private Long senderId;
}
@@ -61,6 +63,7 @@ public class SessionVo {
private Long messageId;
@ApiModelProperty
private Long senderId;
+ private String senderName;
@ApiModelProperty
private String content;
@ApiModelProperty
@@ -68,6 +71,12 @@ public class SessionVo {
@ApiModelProperty
private Date sendTime;
private Byte readStatus;
+ private String avatar;
+ private String orgName;
+
+ public boolean isMine(){
+ return senderId.equals(SecurityUtils.getUserId());
+ }
}
@Data
diff --git a/research-system/src/main/resources/mapper/dao/SessionDao.xml b/research-system/src/main/resources/mapper/dao/SessionDao.xml
index 41c5dfd9..dbd94bf5 100644
--- a/research-system/src/main/resources/mapper/dao/SessionDao.xml
+++ b/research-system/src/main/resources/mapper/dao/SessionDao.xml
@@ -16,7 +16,8 @@ select * from
m.content as lastMessage,
m.create_time as lastMessageTime,
m.sender_id as senderId,
- s.create_time as createTime
+ s.create_time as createTime,
+ null
FROM
chat_sessions s
LEFT JOIN chat_session_messages m on s.id = m.session_id
@@ -36,7 +37,8 @@ select * from
'',
null,
l.user_id as senderId,
- null
+ null,
+ L.org_name AS orgName
FROM
chat_contact_list l
LEFT JOIN chat_session_members sm on sm.session_member_id = l.user_id and sm.is_creator = 1
@@ -70,9 +72,13 @@ select * from
m.content,
m.content_type as contentType,
m.create_time AS sendTime,
- s.read_status as readStatus
+ s.read_status as readStatus,
+ cl.nick_name as senderName,
+ cl.avatar,
+ cl.org_name as orgName
FROM chat_session_messages m
left join chat_message_read_status s on m.session_id = s.session_id and m.id = s.session_message_id and s.del_status = 0
+ left join chat_contact_list cl on cl.user_id = m.sender_id
WHERE m.session_id = #{sessionId}
ORDER BY m.create_time DESC