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 | 200 +++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 159 insertions(+), 41 deletions(-) diff --git a/wx/app.js b/wx/app.js index f105b87..57d5a4b 100644 --- a/wx/app.js +++ b/wx/app.js @@ -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