From 0a48616045ddce1562584543a0e89e5144051fde Mon Sep 17 00:00:00 2001
From: Codex Assistant <codex@example.com>
Date: 星期日, 05 十月 2025 14:52:44 +0800
Subject: [PATCH] 报名审核

---
 wx/app.js |  202 ++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 160 insertions(+), 42 deletions(-)

diff --git a/wx/app.js b/wx/app.js
index 41ba5ea..57d5a4b 100644
--- a/wx/app.js
+++ b/wx/app.js
@@ -4,7 +4,7 @@
     userInfo: null,
     token: null,
     sessionKey: null, // 寰俊浼氳瘽瀵嗛挜锛岀敤浜庤В瀵嗘墜鏈哄彿绛夋晱鎰熸暟鎹�
-    baseUrl: 'http://localhost:8080/graphql', // 鍚庡彴GraphQL鎺ュ彛鍦板潃
+    baseUrl: 'http://localhost:8080/api/graphql', // 鍚庡彴GraphQL鎺ュ彛鍦板潃
     hasPhoneAuth: false, // 鏄惁宸叉巿鏉冩墜鏈哄彿
     rejectPhone: false, // 鏄惁鎷掔粷杩囨墜鏈哄彿鎺堟潈
     cos: {
@@ -276,56 +276,174 @@
   // GraphQL璇锋眰灏佽
   graphqlRequest(query, variables = {}) {
     return new Promise((resolve, reject) => {
-      // 纭繚token鐨勪竴鑷存�э細浼樺厛浣跨敤globalData涓殑token锛屽鏋滄病鏈夊垯浠巗torage鑾峰彇
-      let token = this.globalData.token
-      if (!token) {
-        token = wx.getStorageSync('token')
-        if (token) {
-          this.globalData.token = token // 鍚屾鍒癵lobalData
-        }
-      }
+      this._makeGraphQLRequest(query, variables, resolve, reject, false)
+    })
+  },
 
-      wx.request({
-        url: this.globalData.baseUrl,
-        method: 'POST',
-        header: {
-          'Content-Type': 'application/json',
-          'Authorization': token ? `Bearer ${token}` : ''
-        },
-        data: {
-          query: query,
-          variables: variables
-        },
-        success: (res) => {
-          console.log('GraphQL鍝嶅簲:', res.data)
-          
-          // 妫�鏌TTP鐘舵�佺爜
-          if (res.statusCode !== 200) {
+  // 鍐呴儴GraphQL璇锋眰鏂规硶锛屾敮鎸侀噸璇曟満鍒�
+  _makeGraphQLRequest(query, variables, resolve, reject, isRetry = false) {
+    // 纭繚token鐨勪竴鑷存�э細浼樺厛浣跨敤globalData涓殑token锛屽鏋滄病鏈夊垯浠巗torage鑾峰彇
+    let token = this.globalData.token
+    if (!token) {
+      token = wx.getStorageSync('token')
+      if (token) {
+        this.globalData.token = token // 鍚屾鍒癵lobalData
+      }
+    }
+
+    wx.request({
+      url: this.globalData.baseUrl,
+      method: 'POST',
+      header: {
+        'Content-Type': 'application/json',
+        'Authorization': token ? `Bearer ${token}` : ''
+      },
+      data: {
+        query: query,
+        variables: variables
+      },
+      success: (res) => {
+        console.log('GraphQL鍝嶅簲:', res.data)
+        
+        // 妫�鏌TTP鐘舵�佺爜
+        if (res.statusCode !== 200) {
+          // 瀵逛簬401鐘舵�佺爜锛屽彲鑳芥槸璁よ瘉閿欒锛岄渶瑕佹鏌ュ搷搴斿唴瀹�
+          if (res.statusCode === 401 && res.data && res.data.errors) {
+            console.log('鏀跺埌401鐘舵�佺爜锛屾鏌ユ槸鍚︿负璁よ瘉閿欒')
+            // 缁х画澶勭悊锛岃涓嬮潰鐨凣raphQL閿欒妫�鏌ラ�昏緫澶勭悊璁よ瘉閿欒
+          } else {
             console.error('GraphQL HTTP閿欒:', res.statusCode)
             reject(new Error(`HTTP閿欒: ${res.statusCode}`))
             return
           }
+        }
 
-          // 妫�鏌raphQL閿欒
-          if (res.data.errors) {
-            console.error('GraphQL閿欒:', res.data.errors)
-            reject(new Error(res.data.errors[0]?.message || 'GraphQL璇锋眰閿欒'))
+        // 妫�鏌raphQL閿欒
+        if (res.data && res.data.errors) {
+          console.error('GraphQL閿欒:', res.data.errors)
+          
+          // 妫�鏌ユ槸鍚︽槸璁よ瘉閿欒锛坱oken杩囨湡鎴栨棤鏁堬級
+          const authErrors = res.data.errors.filter(error => 
+            error.message && (
+              error.message.includes('娌℃湁鏉冮檺璁块棶') ||
+              error.message.includes('璇峰厛鐧诲綍') ||
+              error.message.includes('UNAUTHORIZED') ||
+              error.extensions?.code === 'UNAUTHORIZED'
+            )
+          )
+          
+          if (authErrors.length > 0 && !isRetry) {
+            console.log('馃攧 妫�娴嬪埌璁よ瘉閿欒锛屽皾璇曢噸鏂扮櫥褰�...')
+            // 娓呴櫎杩囨湡鐨勮璇佷俊鎭�
+            this.globalData.token = null
+            this.globalData.userInfo = null
+            this.globalData.sessionKey = null
+            wx.removeStorageSync('token')
+            wx.removeStorageSync('userInfo')
+            wx.removeStorageSync('sessionKey')
+            
+            // 閲嶆柊鐧诲綍
+            wx.login({
+              success: (loginRes) => {
+                if (loginRes.code) {
+                  console.log('馃攧 閲嶆柊鑾峰彇寰俊code鎴愬姛锛岃皟鐢ㄥ悗绔櫥褰�...')
+                  this._retryAfterLogin(loginRes.code, query, variables, resolve, reject)
+                } else {
+                  console.error('鉂� 閲嶆柊鑾峰彇寰俊code澶辫触')
+                  reject(new Error('閲嶆柊鐧诲綍澶辫触'))
+                }
+              },
+              fail: (err) => {
+                console.error('鉂� 閲嶆柊鐧诲綍澶辫触:', err)
+                reject(new Error('閲嶆柊鐧诲綍澶辫触'))
+              }
+            })
             return
           }
-
-          // 妫�鏌ユ暟鎹�
-          if (res.data.data !== undefined) {
-            resolve(res.data.data)
-          } else {
-            console.error('GraphQL鍝嶅簲寮傚父:', res.data)
-            reject(new Error('GraphQL鍝嶅簲鏁版嵁寮傚父'))
-          }
-        },
-        fail: (err) => {
-          console.error('GraphQL缃戠粶璇锋眰澶辫触:', err)
-          reject(new Error('缃戠粶璇锋眰澶辫触'))
+          
+          reject(new Error(res.data.errors[0]?.message || 'GraphQL璇锋眰閿欒'))
+          return
         }
-      })
+
+        // 妫�鏌ユ暟鎹�
+        if (res.data.data !== undefined) {
+          resolve(res.data.data)
+        } else {
+          console.error('GraphQL鍝嶅簲寮傚父:', res.data)
+          reject(new Error('GraphQL鍝嶅簲鏁版嵁寮傚父'))
+        }
+      },
+      fail: (err) => {
+        console.error('GraphQL缃戠粶璇锋眰澶辫触:', err)
+        reject(new Error('缃戠粶璇锋眰澶辫触'))
+      }
+    })
+  },
+
+  // 閲嶆柊鐧诲綍鍚庨噸璇旼raphQL璇锋眰
+  _retryAfterLogin(code, query, variables, resolve, reject) {
+    const that = this
+    const deviceInfo = this.getDeviceInfo()
+    const requestData = {
+      code: code,
+      loginIp: '127.0.0.1', // 灏忕▼搴忔棤娉曡幏鍙栫湡瀹濱P锛屼娇鐢ㄩ粯璁ゅ��
+      deviceInfo: deviceInfo
+    }
+    
+    wx.request({
+      url: 'http://localhost:8080/api/auth/wx-login',
+      method: 'POST',
+      header: {
+        'Content-Type': 'application/json'
+      },
+      data: requestData,
+      success: (res) => {
+        console.log('馃攧 閲嶆柊鐧诲綍鍝嶅簲:', res.data)
+        
+        if (res.statusCode !== 200 || res.data.error) {
+          console.error('鉂� 閲嶆柊鐧诲綍澶辫触:', res.data.error || res.data.message)
+          reject(new Error('閲嶆柊鐧诲綍澶辫触'))
+          return
+        }
+        
+        // 妫�鏌ュ搷搴旀暟鎹牸寮�
+        let loginResult = null
+        if (res.data.token && res.data.userInfo) {
+          loginResult = res.data
+        } else if (res.data.success && res.data.data) {
+          loginResult = res.data.data
+        }
+        
+        if (loginResult && loginResult.token) {
+          console.log('鉁� 閲嶆柊鐧诲綍鎴愬姛锛屾洿鏂皌oken')
+          
+          // 淇濆瓨鏂扮殑鐧诲綍淇℃伅
+          try {
+            wx.setStorageSync('token', loginResult.token)
+            wx.setStorageSync('userInfo', loginResult.userInfo)
+            if (loginResult.sessionKey) {
+              wx.setStorageSync('sessionKey', loginResult.sessionKey)
+            }
+          } catch (storageErr) {
+            console.error('鉂� 淇濆瓨閲嶆柊鐧诲綍淇℃伅澶辫触:', storageErr)
+          }
+          
+          that.globalData.token = loginResult.token
+          that.globalData.userInfo = loginResult.userInfo
+          that.globalData.sessionKey = loginResult.sessionKey
+          
+          // 浣跨敤鏂皌oken閲嶈瘯鍘熷璇锋眰
+          console.log('馃攧 浣跨敤鏂皌oken閲嶈瘯GraphQL璇锋眰...')
+          that._makeGraphQLRequest(query, variables, resolve, reject, true)
+        } else {
+          console.error('鉂� 閲嶆柊鐧诲綍鍝嶅簲鏍煎紡閿欒')
+          reject(new Error('閲嶆柊鐧诲綍鍝嶅簲鏍煎紡閿欒'))
+        }
+      },
+      fail: (err) => {
+        console.error('鉂� 閲嶆柊鐧诲綍缃戠粶璇锋眰澶辫触:', err)
+        reject(new Error('閲嶆柊鐧诲綍缃戠粶璇锋眰澶辫触'))
+      }
     })
   }
 })
\ No newline at end of file

--
Gitblit v1.8.0