From 18fd5961832acb90f78e2bc48e0c73e633cbcac5 Mon Sep 17 00:00:00 2001 From: xlsea Date: Wed, 19 Nov 2025 18:10:11 +0800 Subject: [PATCH] =?UTF-8?q?optimize(projects):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../advanced/table-column-setting.vue | 15 +- src/service/api/system/menu.ts | 2 +- src/service/api/system/oss.ts | 4 +- src/service/api/system/tenant.ts | 8 + src/store/modules/route/index.ts | 12 +- src/utils/sse.ts | 8 +- src/utils/websocket.ts | 188 +++++------------- 7 files changed, 90 insertions(+), 147 deletions(-) diff --git a/src/components/advanced/table-column-setting.vue b/src/components/advanced/table-column-setting.vue index 10bd35ad..5c240755 100644 --- a/src/components/advanced/table-column-setting.vue +++ b/src/components/advanced/table-column-setting.vue @@ -21,7 +21,7 @@ const columns = defineModel('columns', { {{ $t('common.columnSetting') }} - +
('columns', { - + diff --git a/src/service/api/system/menu.ts b/src/service/api/system/menu.ts index 926b1ad7..b1f9cd08 100644 --- a/src/service/api/system/menu.ts +++ b/src/service/api/system/menu.ts @@ -60,7 +60,7 @@ export function fetchGetTenantPackageMenuTreeSelect(packageId: CommonType.IdType }); } -// 级联删除菜单 +/** 级联删除菜单 */ export function fetchCascadeDeleteMenu(menuIds: CommonType.IdType[]) { return request({ url: `/system/menu/cascade/${menuIds.join(',')}`, diff --git a/src/service/api/system/oss.ts b/src/service/api/system/oss.ts index 9cd0fee6..cecf098e 100644 --- a/src/service/api/system/oss.ts +++ b/src/service/api/system/oss.ts @@ -17,7 +17,7 @@ export function fetchBatchDeleteOss(ossIds: CommonType.IdType[]) { }); } -// 查询OSS对象基于id串 +/** 查询OSS对象基于id串 */ export function fetchGetOssListByIds(ossIds: CommonType.IdType[]) { return request({ url: `/resource/oss/listByIds/${ossIds.join(',')}`, @@ -25,7 +25,7 @@ export function fetchGetOssListByIds(ossIds: CommonType.IdType[]) { }); } -// 上传文件 +/** 上传文件 */ export function fetchUploadFile(file: File) { const formData = new FormData(); formData.append('file', file); diff --git a/src/service/api/system/tenant.ts b/src/service/api/system/tenant.ts index 0724a4c1..33baa5f9 100644 --- a/src/service/api/system/tenant.ts +++ b/src/service/api/system/tenant.ts @@ -56,6 +56,14 @@ export function fetchSyncTenantPackage(params: Api.System.TenantPackageSyncParam }); } +/** 同步租户参数配置 */ +export function fetchSyncTenantConfig() { + return request({ + url: '/system/tenant/syncTenantConfig', + method: 'get' + }); +} + /** 动态切换租户 */ export function fetchChangeTenant(tenantId: CommonType.IdType) { return request({ diff --git a/src/store/modules/route/index.ts b/src/store/modules/route/index.ts index c5daceba..d54388b1 100644 --- a/src/store/modules/route/index.ts +++ b/src/store/modules/route/index.ts @@ -127,6 +127,8 @@ export const useRouteStore = defineStore(SetupStoreId.Route, () => { } // @ts-expect-error no hidden field route.meta.hideInMenu = route.hidden; + // @ts-expect-error route.meta.activeMenu is activeMenu type + route.meta.activeMenu = route.meta?.activeMenu?.substring(1); if (route.meta.hideInMenu && parent && !route.meta.activeMenu) { // @ts-expect-error parent.name is activeMenu type route.meta.activeMenu = parent.name; @@ -142,10 +144,12 @@ export const useRouteStore = defineStore(SetupStoreId.Route, () => { route.name = random; route.component = 'layout.base$view.iframe-page'; } else { - route.props = { - // @ts-expect-error no query field - url: route.query - }; + try { + route.props = { + // @ts-expect-error no query field + url: JSON.parse(route.query)?.url + }; + } catch {} } route.component = parent && !isExternalLink ? 'view.iframe-page' : 'layout.base$view.iframe-page'; } else if (!isLayout && !isParentLayout) { diff --git a/src/utils/sse.ts b/src/utils/sse.ts index 725ca251..63e8a73a 100644 --- a/src/utils/sse.ts +++ b/src/utils/sse.ts @@ -4,8 +4,12 @@ import useNoticeStore from '@/store/modules/notice'; import { $t } from '@/locales'; import { localStg } from './storage'; -// 初始化 -export const initSSE = (url: any) => { +/** + * 初始化 SSE + * + * @param url - SSE 地址 + */ +export const initSSE = (url: string) => { const token = localStg.get('token'); if (import.meta.env.VITE_APP_SSE === 'N' || !token) { return; diff --git a/src/utils/websocket.ts b/src/utils/websocket.ts index 519585d4..c1b1ed62 100644 --- a/src/utils/websocket.ts +++ b/src/utils/websocket.ts @@ -1,144 +1,60 @@ -/** - * socket 通信 - * - * @module initWebSocket 初始化 - * @module websocketonopen 连接成功 - * @module websocketonerror 连接失败 - * @module websocketclose 断开连接 - * @module resetHeart 重置心跳 - * @module sendSocketHeart 心跳发送 - * @module reconnect 重连 - * @module sendMsg 发送数据 - * @module websocketonmessage 接收数据 - * @module test 测试收到消息传递 - * @param {any} url socket地址 - * @param {any} websocket websocket 实例 - * @param {any} heartTime 心跳定时器实例 - * @param {number} socketHeart 心跳次数 - * @param {number} HeartTimeOut 心跳超时时间 - * @param {number} socketError 错误次数 - */ - +import { useWebSocket } from '@vueuse/core'; import useNoticeStore from '@/store/modules/notice'; import { localStg } from './storage'; -let socketUrl: any = ''; // socket地址 -let websocket: any = null; // websocket 实例 -let heartTime: any = null; // 心跳定时器实例 -// eslint-disable-next-line @typescript-eslint/no-unused-vars -let socketHeart = 0; // 心跳次数 -const HeartTimeOut = 10000; // 心跳超时时间 10000 = 10s -let socketError = 0; // 错误次数 - -// 初始化socket -export function initWebSocket(url: any) { +/** + * 初始化 WebSocket + * + * @param url - WebSocket 地址 + */ +export const initWebSocket = (url: string) => { const token = localStg.get('token'); if (import.meta.env.VITE_APP_WEBSOCKET === 'N' || !token) { - return null; + return; } - socketUrl = url; - // 初始化 websocket - websocket = new WebSocket(`${url}?Authorization=Bearer ${token}&clientid=${import.meta.env.VITE_APP_CLIENT_ID}`); - websocketonopen(); - websocketonmessage(); - websocketonerror(); - websocketclose(); - sendSocketHeart(); - return websocket; -} + const socketUrl = `${url}?Authorization=Bearer ${token}&clientid=${import.meta.env.VITE_APP_CLIENT_ID}`; + useWebSocket(socketUrl, { + autoReconnect: { + // 重连最大次数 + retries: 3, + // 重连间隔 + delay: 1000, + onFailed() { + // eslint-disable-next-line no-console + console.warn('WebSocket 重连失败'); + } + }, + heartbeat: { + message: JSON.stringify({ type: 'ping' }), + // 发送心跳的间隔 + interval: 10000, + // 接收到心跳response的超时时间 + pongTimeout: 2000 + }, + onConnected() { + // eslint-disable-next-line no-console + console.log('WebSocket 已经连接'); + }, + onDisconnected() { + // eslint-disable-next-line no-console + console.warn('WebSocket 已经断开连接'); + }, + onMessage: (_, e) => { + if (e.data.indexOf('ping') > 0) { + return; + } + useNoticeStore().addNotice({ + message: e.data, + read: false, + time: new Date().toLocaleString() + }); -// socket 连接成功 -export function websocketonopen() { - websocket.onopen = () => { - // eslint-disable-next-line no-console - console.log('连接 websocket 成功'); - resetHeart(); - }; -} - -// socket 连接失败 -export function websocketonerror() { - websocket.onerror = (e: any) => { - // eslint-disable-next-line no-console - console.error('连接 websocket 失败', e); - }; -} - -// socket 断开链接 -export function websocketclose() { - websocket.onclose = (e: any) => { - // eslint-disable-next-line no-console - console.warn('断开连接', e); - }; -} - -// socket 重置心跳 -export function resetHeart() { - socketHeart = 0; - socketError = 0; - clearInterval(heartTime); - sendSocketHeart(); -} - -// socket心跳发送 -export function sendSocketHeart() { - heartTime = setInterval(() => { - // 如果连接正常则发送心跳 - if (websocket.readyState === 1) { - // if (socketHeart <= 30) { - websocket.send( - JSON.stringify({ - type: 'ping' - }) - ); - socketHeart += 1; - } else { - // 重连 - reconnect(); + window.$notification?.create({ + title: '消息', + content: e.data, + type: 'success', + duration: 3000 + }); } - }, HeartTimeOut); -} - -// socket重连 -export function reconnect() { - if (socketError <= 2) { - clearInterval(heartTime); - initWebSocket(socketUrl); - socketError += 1; - // eslint-disable-next-line no-console - console.log('socket重连', socketError); - } else { - // eslint-disable-next-line no-console - console.warn('重试次数已用完'); - clearInterval(heartTime); - } -} - -// socket 发送数据 -export function sendMsg(data: any) { - websocket.send(data); -} - -// socket 接收数据 -export function websocketonmessage() { - websocket.onmessage = (e: any) => { - if (e.data.indexOf('heartbeat') > 0) { - resetHeart(); - } - if (e.data.indexOf('ping') > 0) { - return null; - } - useNoticeStore().addNotice({ - message: e.data, - read: false, - time: new Date().toLocaleString() - }); - window.$notification?.create({ - title: '消息', - content: e.data, - type: 'success', - duration: 3000 - }); - return e.data; - }; -} + }); +};