From 425386f6f403d8dee0db2632ad3598039d833f4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Fri, 26 Jul 2024 16:06:17 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=20sse=20=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/layout/index.vue | 2 ++ src/utils/sse.ts | 48 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 src/utils/sse.ts diff --git a/src/layout/index.vue b/src/layout/index.vue index 29fb5ff..e7bec82 100644 --- a/src/layout/index.vue +++ b/src/layout/index.vue @@ -27,6 +27,7 @@ import { AppMain, Navbar, Settings, TagsView } from './components'; import useAppStore from '@/store/modules/app'; import useSettingsStore from '@/store/modules/settings'; import { initWebSocket } from '@/utils/websocket'; +import { initSSE } from "@/utils/sse"; const settingsStore = useSettingsStore(); const theme = computed(() => settingsStore.theme); @@ -69,6 +70,7 @@ onMounted(() => { onMounted(() => { let protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://'; initWebSocket(protocol + window.location.host + import.meta.env.VITE_APP_BASE_API + '/resource/websocket'); + initSSE(import.meta.env.VITE_APP_BASE_API + '/sse') }); const handleClickOutside = () => { diff --git a/src/utils/sse.ts b/src/utils/sse.ts new file mode 100644 index 0000000..7db4aa7 --- /dev/null +++ b/src/utils/sse.ts @@ -0,0 +1,48 @@ +import { getToken } from '@/utils/auth'; +import { ElNotification } from 'element-plus'; +import useNoticeStore from '@/store/modules/notice'; + +let message = ''; + +// 初始化 +export const initSSE = (url: any) => { + if (import.meta.env.VITE_APP_WEBSOCKET === 'false') { + return; + } + url = url + '?Authorization=Bearer ' + getToken() + '&clientid=' + import.meta.env.VITE_APP_CLIENT_ID + const { + data, + error + } = useEventSource(url, [], { + autoReconnect: { + retries: 10, + delay: 3000, + onFailed() { + console.log('Failed to connect after 10 retries') + }, + } + }); + + watch(error, () => { + console.log('SSE connection error:', error.value) + error.value = null; + }); + + watch(data, () => { + if (!data.value) return; + useNoticeStore().addNotice({ + message: data.value, + read: false, + time: new Date().toLocaleString() + }); + ElNotification({ + title: '消息', + message: data.value, + type: 'success', + duration: 3000 + }); + data.value = null; + }); +}; + +