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