lsc 1 месяц назад
Родитель
Сommit
1c58d7cb18
1 измененных файлов с 39 добавлено и 6 удалено
  1. 39 6
      src/views/Student/index.vue

+ 39 - 6
src/views/Student/index.vue

@@ -594,6 +594,7 @@ const connectionStatus = ref<'disconnected' | 'connecting' | 'connected'>('disco
 // 认证 token 相关变量
 const authToken = ref<string | null>(null)
 const authTokenUpdateTimer = ref<NodeJS.Timeout | null>(null)
+const socketCheckTimer = ref<NodeJS.Timeout | null>(null)
 
 // 同步数据最大保留时间(40分钟)
 const SYNC_DATA_MAX_AGE = 40 * 60 * 1000 // 40分钟 = 40 * 60 * 1000毫秒
@@ -3411,6 +3412,12 @@ onUnmounted(() => {
     authTokenUpdateTimer.value = null
   }
 
+  // 清理 socket 连接检查定时器
+  if (socketCheckTimer.value) {
+    clearInterval(socketCheckTimer.value)
+    socketCheckTimer.value = null
+  }
+
   if (providerSocket.value) {
     providerSocket.value.destroy()
     providerSocket.value = null
@@ -3529,7 +3536,7 @@ const manualReconnect = () => {
 }
 
 // 创建WebSocket连接
-const createWebSocketConnection = async () => {
+const createWebSocketConnection = async (type = 1) => {
   if (!api.yweb_socket || isConnecting.value) return
   
   isConnecting.value = true
@@ -3537,7 +3544,7 @@ const createWebSocketConnection = async () => {
   
   try {
     // 清理之前的连接
-    if (providerSocket.value) {
+    if (providerSocket.value && type == 1) {
       providerSocket.value.destroy()
       providerSocket.value = null
     }
@@ -3644,7 +3651,7 @@ const createWebSocketConnection = async () => {
         console.log('👉 WebSocket连接断开')
         connectionStatus.value = 'disconnected'
         isConnecting.value = false
-        handleDisconnection()
+        createWebSocketConnection(2)
       }
     })
     
@@ -3653,7 +3660,7 @@ const createWebSocketConnection = async () => {
       console.error('👉 WebSocket连接错误:', error)
       connectionStatus.value = 'disconnected'
       isConnecting.value = false
-      handleDisconnection()
+      createWebSocketConnection(2)
     })
     
   }
@@ -3661,8 +3668,11 @@ const createWebSocketConnection = async () => {
     console.error('👉 创建WebSocket连接失败:', error)
     connectionStatus.value = 'disconnected'
     isConnecting.value = false
-    handleDisconnection()
+    createWebSocketConnection(2)
   }
+
+  // 启动 socket 连接检查定时器
+  startSocketCheckTimer()
 }
 
 // 处理连接断开
@@ -3673,7 +3683,7 @@ const handleDisconnection = () => {
     
     reconnectTimer.value = setTimeout(() => {
       createWebSocketConnection()
-    }, reconnectInterval.value)
+    }, reconnectInterval.value) as unknown as NodeJS.Timeout
   }
   else {
     console.error('👉 WebSocket重连次数已达上限,停止重连')
@@ -3682,6 +3692,29 @@ const handleDisconnection = () => {
   }
 }
 
+// 启动 socket 连接检查定时器
+const startSocketCheckTimer = () => {
+  // 清理之前的定时器
+  if (socketCheckTimer.value) {
+    clearInterval(socketCheckTimer.value)
+    socketCheckTimer.value = null
+  }
+  
+  // 每10秒检查一次 socket 连接状态
+  socketCheckTimer.value = setTimeout(() => {
+    if (providerSocket.value) {
+      // 直接检查 providerSocket 的连接状态
+      // WebsocketProvider 有一个 connected 属性来表示连接状态
+      const isConnected = (providerSocket.value as any).ws.readyState
+      console.log('🔍 定时器检查 socket 连接状态:', isConnected)
+      if (isConnected !== 1) {
+        console.log('🔍 定时器检查发现 socket 未连接,执行重连')
+        createWebSocketConnection(2)
+      }
+    }
+  }, 10000) as unknown as NodeJS.Timeout
+}
+
 // 工具函数:格式化时间
 const formatTime = (totalSec: number) => {
   const m = Math.floor(totalSec / 60)