From b3199440073246655d7aa116eaeb06926bc6b0a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Thu, 21 Aug 2025 11:12:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=81=94=E7=B3=BB=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E5=AD=97=E6=AE=B5=E4=B8=BA=E7=94=B5=E8=AF=9D=20=20?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E4=B8=AD=E5=A4=9A=E4=B8=AA=E8=81=94=E7=B3=BB?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E7=BA=B5=E5=90=91=E6=8E=92=E5=88=97=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=20=20=20=E4=BC=9A=E5=A2=9E=E5=8A=A0=E5=85=AC=E5=8F=B8?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E7=9A=84=E8=87=AA=E5=AE=9A=E4=B9=89=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E6=A1=86=20=20=E6=8E=92=E5=BA=8F=E6=90=9C=E7=B4=A2=20?= =?UTF-8?q?=E7=AD=89=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/layouts/art-header-bar/index.vue | 5 +- src/utils/sys/wsClient.ts | 50 +++++- src/views/admin/customer/customeraudit.vue | 23 ++- src/views/admin/customer/highseas.vue | 23 ++- src/views/admin/customer/index.vue | 24 ++- src/views/admin/user/index.vue | 17 +- src/views/crmpc/customer/Add.vue | 7 +- src/views/crmpc/customer/index.vue | 151 ++++++++++++++++-- src/views/crmpc/highseas/index.vue | 15 +- src/views/crmpc/team/team_customer.vue | 31 ++-- src/views/work/order/index.vue | 4 +- 11 files changed, 299 insertions(+), 51 deletions(-) diff --git a/src/components/core/layouts/art-header-bar/index.vue b/src/components/core/layouts/art-header-bar/index.vue index b476e77..c55d6b9 100644 --- a/src/components/core/layouts/art-header-bar/index.vue +++ b/src/components/core/layouts/art-header-bar/index.vue @@ -55,13 +55,14 @@ -->
-
+
@@ -123,7 +124,7 @@
-->
-
+
{{ isDark ? '' : '' }}
diff --git a/src/utils/sys/wsClient.ts b/src/utils/sys/wsClient.ts index 1c98797..75c2cc6 100644 --- a/src/utils/sys/wsClient.ts +++ b/src/utils/sys/wsClient.ts @@ -12,6 +12,42 @@ let reconnectAttempts = 0 const maxReconnectDelayMs = 30000 const heartbeatIntervalMs = 30000 +// 生成全局唯一的 trace_id(优先使用 crypto.randomUUID) +const generateTraceId = (): string => { + try { + // @ts-ignore + if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') { + // @ts-ignore + return `req-${crypto.randomUUID()}` + } + } catch (_) {} + // Fallback:基于时间戳 + 随机数 + const timestampPart = Date.now().toString(36) + let randomPart = '' + try { + // @ts-ignore + if (typeof crypto !== 'undefined' && crypto.getRandomValues) { + const buf = new Uint8Array(16) + // @ts-ignore + crypto.getRandomValues(buf) + randomPart = Array.from(buf) + .map((b) => b.toString(16).padStart(2, '0')) + .join('') + } else { + randomPart = Array.from({ length: 16 }) + .map(() => + Math.floor(Math.random() * 256) + .toString(16) + .padStart(2, '0') + ) + .join('') + } + } catch (_) { + randomPart = Math.random().toString(36).slice(2) + } + return `req-${timestampPart}-${randomPart}` +} + const getReconnectDelay = () => { const base = 1000 * Math.pow(2, reconnectAttempts) return Math.min(base, maxReconnectDelayMs) @@ -38,7 +74,12 @@ const startHeartbeat = () => { heartbeatTimer = setTimeout(() => { try { if (socket && socket.readyState === WebSocket.OPEN) { - socket.send(JSON.stringify({ type: 'ping' })) + const msg = { + event: 'system.ping', + data: {}, + trace_id: generateTraceId() // 可选,用于请求-响应匹配 + } + socket.send(JSON.stringify(msg)) } } catch (_) {} // 下一次心跳 @@ -74,7 +115,12 @@ export const initWebSocket = (token: string) => { startHeartbeat() mittBus.emit('ws:open') try { - socket?.send(JSON.stringify({ type: 'ping' })) + const msg = { + event: 'system.ping', + data: {}, + trace_id: generateTraceId() // 可选,用于请求-响应匹配 + } + socket?.send(JSON.stringify(msg)) } catch (_) {} } diff --git a/src/views/admin/customer/customeraudit.vue b/src/views/admin/customer/customeraudit.vue index d3887bb..fab2ae6 100644 --- a/src/views/admin/customer/customeraudit.vue +++ b/src/views/admin/customer/customeraudit.vue @@ -22,14 +22,31 @@ lass="customer-table" >