From c4e73a0d43256029f2312fb006f3cd5f011dd45e Mon Sep 17 00:00:00 2001
From: jia <2744404105@qq.com>
Date: Wed, 27 Mar 2024 14:16:31 +0800
Subject: [PATCH] =?UTF-8?q?=E8=81=8A=E5=A4=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
bwie-common/pom.xml | 1 +
.../java/com/bwie/common/domain/Chat.java | 28 +++
.../java/com/bwie/common/domain/Info.java | 46 +++++
.../java/com/bwie/common/domain/Message.java | 30 +++
.../com/bwie/chat/handle/WebScoketHandle.java | 186 ++++++++++++++++++
5 files changed, 291 insertions(+)
create mode 100644 bwie-common/src/main/java/com/bwie/common/domain/Chat.java
create mode 100644 bwie-common/src/main/java/com/bwie/common/domain/Info.java
create mode 100644 bwie-common/src/main/java/com/bwie/common/domain/Message.java
create mode 100644 bwie-modules/bwie-chat/src/main/java/com/bwie/chat/handle/WebScoketHandle.java
diff --git a/bwie-common/pom.xml b/bwie-common/pom.xml
index 6f86910..b3ec386 100644
--- a/bwie-common/pom.xml
+++ b/bwie-common/pom.xml
@@ -116,5 +116,6 @@
fastjson2
2.0.42
+
diff --git a/bwie-common/src/main/java/com/bwie/common/domain/Chat.java b/bwie-common/src/main/java/com/bwie/common/domain/Chat.java
new file mode 100644
index 0000000..c4d8646
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/domain/Chat.java
@@ -0,0 +1,28 @@
+package com.bwie.common.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Chat {
+ private Long ChatId;
+ private Long sendId;
+ private Long receiveId;
+ private String chatText;
+ private Integer isUp;
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date craeteTime;
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date updateTime;
+ private Integer isDelete;
+ private Integer isRead;
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/domain/Info.java b/bwie-common/src/main/java/com/bwie/common/domain/Info.java
new file mode 100644
index 0000000..d2a4529
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/domain/Info.java
@@ -0,0 +1,46 @@
+package com.bwie.common.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class Info {
+ /*
+ id
+ */
+ private Long userId;
+ /*
+ 姓名
+ */
+ private String userName;
+ /*
+ 手机号
+ */
+ private String userTel;
+
+ /*
+ 公司
+ */
+ private String company;
+ /*
+ 积分
+ */
+ private Integer point;
+
+ /*
+ 登陆人身份【0-经纪人 1-用户】
+ */
+ private Integer userRole;
+
+
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/domain/Message.java b/bwie-common/src/main/java/com/bwie/common/domain/Message.java
new file mode 100644
index 0000000..2e7e2fa
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/domain/Message.java
@@ -0,0 +1,30 @@
+package com.bwie.common.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Message {
+ private Long messageId;
+ private Long userId;
+ private String messageText;
+ private Integer isUp;
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date craeteTime;
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date updateTime;
+ private Integer isDelete;
+ private Integer isRead;
+
+
+
+}
diff --git a/bwie-modules/bwie-chat/src/main/java/com/bwie/chat/handle/WebScoketHandle.java b/bwie-modules/bwie-chat/src/main/java/com/bwie/chat/handle/WebScoketHandle.java
new file mode 100644
index 0000000..bd77362
--- /dev/null
+++ b/bwie-modules/bwie-chat/src/main/java/com/bwie/chat/handle/WebScoketHandle.java
@@ -0,0 +1,186 @@
+package com.bwie.chat.handle;
+
+import com.bwie.chat.entry.CodeEnum;
+import com.bwie.common.result.Result;
+import com.mysql.cj.protocol.x.Notice;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.socket.*;
+
+import java.io.IOException;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+@Slf4j
+public class WebScoketHandle implements WebSocketHandler {
+ // 存放 sessionId 与 session
+ private static Map SESSIONS = new ConcurrentHashMap<>();
+ // 在线用户列表
+ private static List ONLINE_USERS = new ArrayList<>();
+ // 消息列表
+ private static List msgList = new ArrayList<>();
+ // 公告
+ private static Notice notice = new Notice();
+
+ /**
+ * WebSocket 连接建立后调用的方法,通常用于处理连接建立后的业务逻辑。
+ * @param session
+ * @throws Exception
+ */
+ @Override
+ public void afterConnectionEstablished(WebSocketSession session) throws Exception {
+ log.info("WebSocket 连接已打开:" + session.getId());
+ // 获取请求路径 判断是否携带用户名
+ String uri = session.getUri().toString();
+ // ws://localhost:8080/username=zxwy&id=1
+ log.info(uri);
+ // 获取id 与 用户名
+ String id = uri.substring(uri.lastIndexOf('=')+1);
+ uri = uri.substring(0,uri.lastIndexOf('&'));
+ String username = uri.substring(uri.lastIndexOf('=')+1);
+
+ if ("".equals(username)){
+ session.sendMessage(new TextMessage(JsonUtils.toJson(Result.error(CodeEnum.NOT_USERNAME))));
+ return;
+ }
+ User user = new User();
+ user.setUsername(username);
+ user.setId(Integer.valueOf(id));
+
+ // 判断当前用户是否已经连接过
+ List onlineUser = ONLINE_USERS.stream()
+ .filter(tmp -> tmp.getId()==user.getId())
+ .collect(Collectors.toList());
+ // 如果存在相同用户已经登录 删除之前登录的session并关闭
+ if (onlineUser.size() != 0){
+ delSessionById(onlineUser.get(0).getId());
+ }
+
+ SESSIONS.put(session.getId(),session);
+ // 将用户添加到在线列表
+ ONLINE_USERS.add(user);
+
+ session.getAttributes().put(session.getId(),user);
+ session.getAttributes().put("sessionId",session.getId());
+
+ // 将连接id推送给前端
+ session.sendMessage(new TextMessage(JsonUtils.toJson(Result.set(CodeEnum.SESSION_ID,session.getId(),null))));
+ // 推送在线列表
+ pushOnlineUser();
+ // 推送公告
+ pushNotice(session);
+ // 首次连接推送所有消息
+ session.sendMessage(new TextMessage(JsonUtils.toJson(Result.set(CodeEnum.SERVER_TO,null,msgList))));
+ }
+
+ /**
+ * handleTextMessage: 处理接收到的文本消息。
+ * @param session
+ * @param message 前端发送的消息
+ * @throws Exception
+ */
+ @Override
+ public void handleMessage(WebSocketSession session, WebSocketMessage> message) throws Exception {
+ log.info("收到 WebSocket 消息:" + message.getPayload().toString());
+
+ Result result = JsonUtils.parse(message.getPayload().toString(),Result.class);
+ userMsg userMsg = JsonUtils.parse(result.getData().toString(), userMsg.class);
+ String username = userMsg.getUser().getUsername();
+ long id = userMsg.getUser().getId();
+ if (username == null || "".equals(username)){
+ session.sendMessage(new TextMessage(JsonUtils.toJson(Result.error(CodeEnum.NOT_USERNAME))));
+ }
+ String mtext = userMsg.getMessageInput();
+ // 指令 清空消息
+ if (mtext.substring(0,1).equals("$")){
+ if (mtext.equals("$clear")&&id==1){
+ msgList.removeAll(msgList);
+ broadcast(JsonUtils.toJson(Result.set(CodeEnum.SERVER_TO,null,msgList)));
+ return;
+ }
+ // 指令 发送公告
+ if (mtext.substring(0,3).equals("$gg")&&id==1){
+ notice.setTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")));
+ notice.setGg(mtext.substring(3));
+ broadcast(JsonUtils.toJson(Result.set(CodeEnum.NOTICE,null,notice)));
+ return;
+ }
+ }
+
+
+ // 普通消息
+ Message msg = new Message();
+ msg.setId(msgList.size());
+ msg.setSender(username);
+ msg.setTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")));
+ msg.setText(mtext);
+ // 广播消息给所有连接的客户端
+ msgList.add(msg);
+ if (msgList.size()==60)
+ msgList.remove(0);
+ broadcast(JsonUtils.toJson(Result.set(CodeEnum.MESSAGE,session.getId(),msg)));
+ }
+
+
+
+ @Override
+ public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
+ log.info("WebSocket 连接错误:" + session.getId() + ", " + exception.getMessage());
+ }
+
+ @Override
+ public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
+ log.info("WebSocket 连接已关闭:" + session.getId());
+ // 移除session id与websocket连接的映射关系
+ User user = (User) session.getAttributes().get(session.getId());
+ ONLINE_USERS.remove(user);
+ String sessionId = (String) session.getAttributes().get("sessionId");
+ if (sessionId != null) {
+ SESSIONS.remove(sessionId);
+ session.close();
+ }
+ pushOnlineUser();
+ }
+
+ @Override
+ public boolean supportsPartialMessages() {
+ return false;
+ }
+
+ private void broadcast(String message) throws IOException {
+ Set> entries = SESSIONS.entrySet();
+ for (Map.Entry sessions : entries) {
+ if(sessions.getValue().isOpen()){
+ sessions.getValue().sendMessage(new TextMessage(message));
+ }
+ }
+ }
+
+ // 推送在线列表
+ private void pushOnlineUser() throws Exception{
+
+ broadcast(JsonUtils.toJson(Result.set(CodeEnum.ONLINE_USERS,null,ONLINE_USERS)));
+ }
+ // 推送公告
+ private void pushNotice(WebSocketSession session) throws Exception{
+ session.sendMessage(new TextMessage(JsonUtils.toJson
+ (Result.set(CodeEnum.NOTICE,null,notice))));
+ }
+ private void delSessionById(long id) throws Exception{
+ Set> entries = SESSIONS.entrySet();
+ for (Map.Entry sessions : entries) {
+ User user = (User)sessions.getValue().getAttributes().get(sessions.getValue().getId());
+ if (user.getId()==id){
+ String sessionId = (String) sessions.getValue().getAttributes().get("sessionId");
+ if (sessionId != null) {
+ SESSIONS.remove(sessionId);
+ sessions.getValue().close();
+ }
+ }
+ }
+ }
+
+}