From 9f635dc5f4b137fda6b6d73af0fdcb40562ac97c Mon Sep 17 00:00:00 2001
From: ktianc <2445667550@qq.com>
Date: Wed, 13 Mar 2024 18:57:53 +0800
Subject: [PATCH 1/7] add chat 1
---
kinit-admin/src/components/Chat/index.ts | 3 +
kinit-admin/src/components/Chat/src/Chat.vue | 30 ++++++
.../src/layout/components/ToolHeader.vue | 2 +
kinit-admin/src/store/modules/chat.ts | 100 ++++++++++++++++++
4 files changed, 135 insertions(+)
create mode 100644 kinit-admin/src/components/Chat/index.ts
create mode 100644 kinit-admin/src/components/Chat/src/Chat.vue
create mode 100644 kinit-admin/src/store/modules/chat.ts
diff --git a/kinit-admin/src/components/Chat/index.ts b/kinit-admin/src/components/Chat/index.ts
new file mode 100644
index 0000000..68e1d60
--- /dev/null
+++ b/kinit-admin/src/components/Chat/index.ts
@@ -0,0 +1,3 @@
+import Chat from './src/Chat.vue'
+
+export { Chat }
diff --git a/kinit-admin/src/components/Chat/src/Chat.vue b/kinit-admin/src/components/Chat/src/Chat.vue
new file mode 100644
index 0000000..d29df3b
--- /dev/null
+++ b/kinit-admin/src/components/Chat/src/Chat.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
diff --git a/kinit-admin/src/layout/components/ToolHeader.vue b/kinit-admin/src/layout/components/ToolHeader.vue
index 6b2479c..8bd05d5 100644
--- a/kinit-admin/src/layout/components/ToolHeader.vue
+++ b/kinit-admin/src/layout/components/ToolHeader.vue
@@ -5,6 +5,7 @@ import { LocaleDropdown } from '@/components/LocaleDropdown'
import { SizeDropdown } from '@/components/SizeDropdown'
import { UserInfo } from '@/components/UserInfo'
import { Screenfull } from '@/components/Screenfull'
+import { Chat } from '@/components/Chat'
import { Breadcrumb } from '@/components/Breadcrumb'
import { useAppStore } from '@/store/modules/app'
import { useDesign } from '@/hooks/web/useDesign'
@@ -54,6 +55,7 @@ export default defineComponent({
) : undefined}
+
{screenfull.value ? (
diff --git a/kinit-admin/src/store/modules/chat.ts b/kinit-admin/src/store/modules/chat.ts
new file mode 100644
index 0000000..b98cd3b
--- /dev/null
+++ b/kinit-admin/src/store/modules/chat.ts
@@ -0,0 +1,100 @@
+import { defineStore } from 'pinia'
+import { store } from '../index'
+import { ref } from 'vue'
+import { ElMessage } from 'element-plus'
+
+interface ChatState {
+ socket: any
+ messageQueue: string[]
+ socketMessage: string
+}
+
+export const useChatStore = defineStore('chat', {
+ state: (): ChatState => {
+ return {
+ socket: null,
+ messageQueue: [],
+ socketMessage: '1'
+ }
+ },
+ getters: {},
+ actions: {
+ SET_SOCKET(socket: any) {
+ this.socket = socket
+ },
+ SET_SOCKET_MESSAGE(socketMessage: any) {
+ this.socketMessage = socketMessage
+ },
+ connectWebSocket() {
+ if (typeof WebSocket === 'undefined') {
+ ElMessage.error('您的浏览器不支持Websocket通信协议,请使用Chrome或者其他高版本的浏览器!')
+ return
+ }
+ if (this.socket != null && this.socket.readyState === WebSocket.OPEN) {
+ return this.socket
+ }
+
+ const HOST_ADDRESS = 'ws://127.0.0.1:8000/api/v1/ws/chat/'
+ const PING_INTERVAL = 5000 // 心跳间隔,单位为毫秒
+ const heartbeatMessage = { type: 0, msg: 'ping' } // 心跳消息
+ const heartbeatMessage2 = { type: 0, msg: 'pong', data: ['在线设备'] } // 发送消息
+
+ const socket = ref
(new WebSocket(HOST_ADDRESS))
+ let checkTask: any = null
+ // 监听连接事件
+ socket.value.onopen = () => {
+ // 启动心跳检测 确保连接存活 客户端每隔5秒向服务端发送一次心跳消息
+ checkTask = setInterval(() => {
+ socket.value.send(JSON.stringify(heartbeatMessage))
+ }, PING_INTERVAL)
+ }
+
+ // 当WebSocket接收到服务器发送的消息时,这个函数将被调用。
+ socket.value.onmessage = (event) => {
+ console.log('接收到服务端发送过来的消息', event.data)
+ const message = JSON.parse(event.data)
+ console.log(message.type)
+ if (message.type == WebSocket.CONNECTING) {
+ socket.value.send(JSON.stringify(heartbeatMessage2))
+ return
+ } else {
+ if (this.messageQueue.length > 2 << 16) {
+ this.messageQueue = []
+ }
+ console.log('WebSocket消息: ', message)
+ this.SET_SOCKET_MESSAGE(message)
+ }
+ }
+
+ // 监听关闭事件 断线重连
+ socket.value.onclose = () => {
+ if (this.socket.readyState === WebSocket.CLOSED) {
+ this.messageQueue.forEach((message) => {
+ this.sendMessage(message)
+ })
+ this.messageQueue = []
+ }
+ // 清除心跳计时器
+ checkTask && clearInterval(checkTask)
+ // 断线重连
+ setTimeout(() => {
+ this.connectWebSocket()
+ }, 3000)
+ }
+
+ // 连接错误
+ socket.value.onerror = (event) => {
+ console.log('WebSocket error:', event)
+ }
+ },
+ // 发送消息方法
+ sendMessage(message: string) {
+ this.socket.send(message)
+ }
+ },
+ persist: true
+})
+
+export const useChatStoreWithOut = () => {
+ return useChatStore(store)
+}
From 53a694be367e0b30a1070e9a72476cf01be8db90 Mon Sep 17 00:00:00 2001
From: ktianc <2445667550@qq.com>
Date: Fri, 15 Mar 2024 17:39:17 +0800
Subject: [PATCH 2/7] =?UTF-8?q?=E6=9B=B4=E6=96=B01?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
kinit-admin/src/components/Chat/src/Chat.vue | 34 ++++++++++++++++++--
1 file changed, 31 insertions(+), 3 deletions(-)
diff --git a/kinit-admin/src/components/Chat/src/Chat.vue b/kinit-admin/src/components/Chat/src/Chat.vue
index d29df3b..7229bf5 100644
--- a/kinit-admin/src/components/Chat/src/Chat.vue
+++ b/kinit-admin/src/components/Chat/src/Chat.vue
@@ -1,7 +1,7 @@
-
-
-
-
diff --git a/kinit-admin/src/layout/components/ToolHeader.vue b/kinit-admin/src/layout/components/ToolHeader.vue
index 8bd05d5..6b2479c 100644
--- a/kinit-admin/src/layout/components/ToolHeader.vue
+++ b/kinit-admin/src/layout/components/ToolHeader.vue
@@ -5,7 +5,6 @@ import { LocaleDropdown } from '@/components/LocaleDropdown'
import { SizeDropdown } from '@/components/SizeDropdown'
import { UserInfo } from '@/components/UserInfo'
import { Screenfull } from '@/components/Screenfull'
-import { Chat } from '@/components/Chat'
import { Breadcrumb } from '@/components/Breadcrumb'
import { useAppStore } from '@/store/modules/app'
import { useDesign } from '@/hooks/web/useDesign'
@@ -55,7 +54,6 @@ export default defineComponent({
) : undefined}
-
{screenfull.value ? (
diff --git a/kinit-admin/src/store/modules/chat.ts b/kinit-admin/src/store/modules/chat.ts
deleted file mode 100644
index b98cd3b..0000000
--- a/kinit-admin/src/store/modules/chat.ts
+++ /dev/null
@@ -1,100 +0,0 @@
-import { defineStore } from 'pinia'
-import { store } from '../index'
-import { ref } from 'vue'
-import { ElMessage } from 'element-plus'
-
-interface ChatState {
- socket: any
- messageQueue: string[]
- socketMessage: string
-}
-
-export const useChatStore = defineStore('chat', {
- state: (): ChatState => {
- return {
- socket: null,
- messageQueue: [],
- socketMessage: '1'
- }
- },
- getters: {},
- actions: {
- SET_SOCKET(socket: any) {
- this.socket = socket
- },
- SET_SOCKET_MESSAGE(socketMessage: any) {
- this.socketMessage = socketMessage
- },
- connectWebSocket() {
- if (typeof WebSocket === 'undefined') {
- ElMessage.error('您的浏览器不支持Websocket通信协议,请使用Chrome或者其他高版本的浏览器!')
- return
- }
- if (this.socket != null && this.socket.readyState === WebSocket.OPEN) {
- return this.socket
- }
-
- const HOST_ADDRESS = 'ws://127.0.0.1:8000/api/v1/ws/chat/'
- const PING_INTERVAL = 5000 // 心跳间隔,单位为毫秒
- const heartbeatMessage = { type: 0, msg: 'ping' } // 心跳消息
- const heartbeatMessage2 = { type: 0, msg: 'pong', data: ['在线设备'] } // 发送消息
-
- const socket = ref(new WebSocket(HOST_ADDRESS))
- let checkTask: any = null
- // 监听连接事件
- socket.value.onopen = () => {
- // 启动心跳检测 确保连接存活 客户端每隔5秒向服务端发送一次心跳消息
- checkTask = setInterval(() => {
- socket.value.send(JSON.stringify(heartbeatMessage))
- }, PING_INTERVAL)
- }
-
- // 当WebSocket接收到服务器发送的消息时,这个函数将被调用。
- socket.value.onmessage = (event) => {
- console.log('接收到服务端发送过来的消息', event.data)
- const message = JSON.parse(event.data)
- console.log(message.type)
- if (message.type == WebSocket.CONNECTING) {
- socket.value.send(JSON.stringify(heartbeatMessage2))
- return
- } else {
- if (this.messageQueue.length > 2 << 16) {
- this.messageQueue = []
- }
- console.log('WebSocket消息: ', message)
- this.SET_SOCKET_MESSAGE(message)
- }
- }
-
- // 监听关闭事件 断线重连
- socket.value.onclose = () => {
- if (this.socket.readyState === WebSocket.CLOSED) {
- this.messageQueue.forEach((message) => {
- this.sendMessage(message)
- })
- this.messageQueue = []
- }
- // 清除心跳计时器
- checkTask && clearInterval(checkTask)
- // 断线重连
- setTimeout(() => {
- this.connectWebSocket()
- }, 3000)
- }
-
- // 连接错误
- socket.value.onerror = (event) => {
- console.log('WebSocket error:', event)
- }
- },
- // 发送消息方法
- sendMessage(message: string) {
- this.socket.send(message)
- }
- },
- persist: true
-})
-
-export const useChatStoreWithOut = () => {
- return useChatStore(store)
-}