refactor: ♻️ 优化 websocket 示例样式

Former-commit-id: 8fbf8aa3d469fed39cb331e89c2a0122082bacff
This commit is contained in:
郝先瑞
2023-10-10 20:59:01 +08:00
parent c9ebeeb6fd
commit ef1d6dd7ea

View File

@@ -1,6 +1,5 @@
<!-- websocket 示例 --> <!-- websocket 示例 -->
<script setup lang="ts"> <script setup lang="ts">
// https://github.com/sockjs/sockjs-client/issues/547 报错 global is not defined 换成下面的引入
import SockJS from "sockjs-client"; import SockJS from "sockjs-client";
import Stomp from "stompjs"; import Stomp from "stompjs";
@@ -9,11 +8,18 @@ import { useUserStoreHook } from "@/store/modules/user";
const userStore = useUserStoreHook(); const userStore = useUserStoreHook();
const isConnected = ref(false); const isConnected = ref(false);
const socketEndpoint = ref("http://47.117.115.107:8989/ws"); const socketEndpoint = ref("http://47.117.115.107:8989/ws"); // 线上
// const socketEndpoint = ref("http://localhost:8989/ws"); // 本地
const receiverUsername = ref("root"); const receiver = ref("root");
const systemMessages = ref<string[]>([]); // 系统消息集合 interface MessageType {
type?: string; // 消息类型: tip-提示消息
sender?: string;
content: string;
}
const messages = ref<MessageType[]>([]);
const topicMessage = ref( const topicMessage = ref(
"亲爱的大冤种们由于一只史诗级的BUG系统版本已经被迫回退到了0.0.1。" "亲爱的大冤种们由于一只史诗级的BUG系统版本已经被迫回退到了0.0.1。"
@@ -21,7 +27,7 @@ const topicMessage = ref(
const queneMessage = ref( const queneMessage = ref(
"hi , " + "hi , " +
receiverUsername.value + receiver.value +
" , 我是" + " , 我是" +
userStore.user.username + userStore.user.username +
" , 想和你交个朋友 ! " " , 想和你交个朋友 ! "
@@ -36,11 +42,7 @@ function sendToAll() {
} }
function sendToUser() { function sendToUser() {
stompClient.send( stompClient.send("/app/sendToUser/" + receiver.value, {}, queneMessage.value);
"/app/sendToUser/" + receiverUsername.value,
{},
queneMessage.value
);
messages.value.push({ messages.value.push({
sender: userStore.user.username, sender: userStore.user.username,
content: queneMessage.value, content: queneMessage.value,
@@ -58,15 +60,21 @@ function connectWebSocket() {
{ Authorization: userStore.token }, { Authorization: userStore.token },
() => { () => {
isConnected.value = true; isConnected.value = true;
systemMessages.value.push("Websocket 已连接"); messages.value.push({
sender: "Server",
content: "Websocket 已连接",
type: "tip",
});
stompClient.subscribe("/topic/notice", (res: any) => { stompClient.subscribe("/topic/notice", (res: any) => {
console.log("接收到订阅主题消息", res); messages.value.push({
messages.value.push({ sender: "Server", content: res.body }); sender: "Server",
content: res.body,
});
}); });
stompClient.subscribe("/user/queue/greeting", (res) => { stompClient.subscribe("/user/queue/greeting", (res) => {
const messageData = JSON.parse(res.body) as MessageType; const messageData = JSON.parse(res.body) as MessageType;
messages.value.push({ messages.value.push({
sender: messageData.sender, sender: messageData.sender,
content: messageData.content, content: messageData.content,
@@ -74,8 +82,13 @@ function connectWebSocket() {
}); });
}, },
(error) => { (error) => {
console.log("连接失败: " + error);
isConnected.value = false; // 更新连接状态 isConnected.value = false; // 更新连接状态
systemMessages.value.push("Websocket 已断开"); messages.value.push({
sender: "Server",
content: "Websocket 已断开",
type: "tip",
});
} }
); );
} }
@@ -84,18 +97,15 @@ function disconnectWebSocket() {
if (stompClient && stompClient.connected) { if (stompClient && stompClient.connected) {
stompClient.disconnect(() => { stompClient.disconnect(() => {
isConnected.value = false; // 更新连接状态 isConnected.value = false; // 更新连接状态
systemMessages.value.push("Websocket 已断开"); messages.value.push({
sender: "Server",
content: "Websocket 已断开",
type: "tip",
});
}); });
} }
} }
interface MessageType {
sender?: string;
content: any;
}
const messages = ref<MessageType[]>([]);
onMounted(() => { onMounted(() => {
connectWebSocket(); connectWebSocket();
}); });
@@ -110,7 +120,6 @@ onMounted(() => {
class="mb-[20px]" class="mb-[20px]"
>示例源码 请点击>>>></el-link >示例源码 请点击>>>></el-link
> >
<el-row :gutter="10"> <el-row :gutter="10">
<el-col :span="12"> <el-col :span="12">
<el-card> <el-card>
@@ -160,7 +169,7 @@ onMounted(() => {
<el-input type="textarea" v-model="queneMessage" /> <el-input type="textarea" v-model="queneMessage" />
</el-form-item> </el-form-item>
<el-form-item label="消息接收人"> <el-form-item label="消息接收人">
<el-input v-model="receiverUsername" /> <el-input v-model="receiver" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="sendToUser" type="primary" <el-button @click="sendToUser" type="primary"
@@ -174,26 +183,17 @@ onMounted(() => {
<el-col :span="12"> <el-col :span="12">
<el-card> <el-card>
<div class="message-container"> <div class="message-container">
<div
class="system-message"
v-for="(message, index) in systemMessages"
:key="index"
>
{{ message }}
</div>
<div <div
v-for="(message, index) in messages" v-for="(message, index) in messages"
:key="index" :key="index"
class="message-item"
:class="{ :class="{
'message-item--sent': 'tip-message': message.type === 'tip',
message.sender === userStore.user.username, message: message.type !== 'tip',
'message-item--received': 'message--sent': message.sender === userStore.user.username,
message.sender !== userStore.user.username, 'message--received': message.sender !== userStore.user.username,
}" }"
> >
<div class="message-content"> <div v-if="message.type != 'tip'" class="message-content">
<div <div
:class="{ :class="{
'message-sender': 'message-sender':
@@ -204,8 +204,9 @@ onMounted(() => {
> >
{{ message.sender }} {{ message.sender }}
</div> </div>
<div class="message-text">{{ message.content }}</div> <div class="color-#333">{{ message.content }}</div>
</div> </div>
<div v-else>{{ message.content }}</div>
</div> </div>
</div> </div>
</el-card> </el-card>
@@ -220,18 +221,18 @@ onMounted(() => {
flex-direction: column; flex-direction: column;
} }
.message-item { .message {
padding: 10px; padding: 10px;
margin: 10px; margin: 10px;
border-radius: 5px; border-radius: 5px;
} }
.message-item--sent { .message--sent {
align-self: flex-end; align-self: flex-end;
background-color: #dcf8c6; background-color: #dcf8c6;
} }
.message-item--received { .message--received {
align-self: flex-start; align-self: flex-start;
background-color: #e8e8e8; background-color: #e8e8e8;
} }
@@ -253,11 +254,7 @@ onMounted(() => {
text-align: left; text-align: left;
} }
.message-text { .tip-message {
color: #333;
}
.system-message {
align-self: center; align-self: center;
padding: 5px 10px; padding: 5px 10px;
margin-bottom: 5px; margin-bottom: 5px;