From fcc0076c3507bc4e544c3cb3915204937fa46f60 Mon Sep 17 00:00:00 2001 From: qx <1084500556@qq.com> Date: 星期三, 06 八月 2025 11:15:42 +0800 Subject: [PATCH] qxtj --- utils/request.js | 197 +++++++++++++++++++++++++++++------------------- 1 files changed, 118 insertions(+), 79 deletions(-) diff --git a/utils/request.js b/utils/request.js index 14829cd..821ac67 100644 --- a/utils/request.js +++ b/utils/request.js @@ -19,6 +19,10 @@ '/api/updatePhone' ] +// 鉁� 璇锋眰缂撳瓨鍜岄槻鎶栫鐞� +const pendingRequests = new Map(); // 瀛樺偍姝e湪绛夊緟鐨勮姹� +const requestCache = new Map(); // 瀛樺偍缂撳瓨鐨勮姹傜粨鏋� + const request = config => { const isToken = (config.headers || {}).isToken === false config.header = config.header || {} @@ -40,96 +44,131 @@ config.url = url } + // 鉁� 鐢熸垚鍞竴璇锋眰鏍囪瘑锛屽寘鍚� URL銆佹柟娉曞拰鍙傛暟 + const requestKey = `${config.url}_${config.method}_${JSON.stringify(config.data || {})}`; + + // 鉁� 妫�鏌ョ紦瀛� + if (requestCache.has(requestKey)) { + const cached = requestCache.get(requestKey); + if (cached.expiry > Date.now()) { + return Promise.resolve(cached.response); // 杩斿洖缂撳瓨缁撴灉 + } else { + requestCache.delete(requestKey); // 缂撳瓨杩囨湡锛屽垹闄� + } + } + + // 鉁� 闃叉姈閫昏緫锛氬鏋滅煭鏃堕棿鍐呮湁鐩稿悓璇锋眰锛屽彇娑堜箣鍓嶇殑 + if (pendingRequests.has(requestKey)) { + clearTimeout(pendingRequests.get(requestKey).timer); // 娓呴櫎涔嬪墠鐨勫畾鏃跺櫒 + } + // 鉁� 鍒ゆ柇鏄惁闇�瑕佸姞瀵� - const isEncryptApi = encryptApiList.includes(config.url) + const isEncryptApi = encryptApiList.includes(config.url); + const isLoginRequest = config.url.includes('/login'); - // 鐧诲綍鎺ュ彛绀轰緥锛堝亣濡備綘鐨勭櫥褰曟帴鍙f槸 /api/login锛� - const isLoginRequest = config.url.includes('/login') - - let data = config.data + let data = config.data; if (isEncryptApi) { - console.log('[鍔犲瘑鍓嶇殑data]', config.data) - data = encrypt(JSON.stringify(config.data)) + console.log('[鍔犲瘑鍓嶇殑data]', config.data); + data = encrypt(JSON.stringify(config.data)); } else if (isLoginRequest) { - data = JSON.stringify(config.data) + data = JSON.stringify(config.data); } else { - // 鍏朵粬鎺ュ彛淇濇寔鍘熸牱 - data = config.data + data = config.data; } return new Promise((resolve, reject) => { - uni.request({ - method: config.method || 'get', - timeout: config.timeout || timeout, - url: config.baseUrl || baseUrl + config.url, - data: data, - header: config.header, - responseType: config.responseType || 'text', - dataType: config.responseType === 'arraybuffer' ? undefined : 'json' - }).then(response => { - let [error, res] = response - if (error) { - toast('鍚庣鎺ュ彛杩炴帴寮傚父') - reject('鍚庣鎺ュ彛杩炴帴寮傚父') - return - } + // 鉁� 璁剧疆闃叉姈瀹氭椂鍣� + const timer = setTimeout(() => { + pendingRequests.delete(requestKey); // 璇锋眰鍙戦�佸悗绉婚櫎 - let resData - try { - if (isEncryptApi) { - const decrypted = decrypt(res.data) - resData = JSON.parse(decrypted) - } else if (isLoginRequest) { - resData = typeof res.data === 'string' ? JSON.parse(res.data) : res.data - } else { - resData = res.data + uni.request({ + method: config.method || 'get', + timeout: config.timeout || timeout, + url: config.baseUrl || baseUrl + config.url, + data: data, + header: config.header, + responseType: config.responseType || 'text', + dataType: config.responseType === 'arraybuffer' ? undefined : 'json' + }).then(response => { + let [error, res] = response; + if (error) { + toast('鍚庣鎺ュ彛杩炴帴寮傚父'); + reject('鍚庣鎺ュ彛杩炴帴寮傚父'); + return; } - } catch (e) { - console.error('鍝嶅簲瑙f瀽澶辫触:', e) - toast('鍝嶅簲鏁版嵁澶勭悊澶辫触') - reject('鍝嶅簲鏁版嵁澶勭悊澶辫触') - return - } - if (config.responseType === 'arraybuffer') { - resolve(resData) - return - } - - const code = resData.code || 200 - const msg = errorCode[code] || resData.msg || errorCode['default'] - - if (code === 401) { - showConfirm('鐧诲綍鐘舵�佸凡杩囨湡锛屾偍鍙互缁х画鐣欏湪璇ラ〉闈紝鎴栬�呴噸鏂扮櫥褰�?').then(res => { - if (res.confirm) { - store.dispatch('LogOut').then(() => { - uni.reLaunch({ url: '/pages/login' }) - }) + let resData; + try { + if (isEncryptApi) { + const decrypted = decrypt(res.data); + resData = JSON.parse(decrypted); + } else if (isLoginRequest) { + resData = typeof res.data === 'string' ? JSON.parse(res.data) : res.data; + } else { + resData = res.data; } - }) - reject('鏃犳晥鐨勪細璇濓紝鎴栬�呬細璇濆凡杩囨湡锛岃閲嶆柊鐧诲綍銆�') - } else if (code === 500) { - toast(msg) - reject(resData) - } else if (code !== 200) { - toast(msg) - reject(resData) - } else { - resolve(resData) - } - }).catch(error => { - let { message } = error - if (message === 'Network Error') { - message = '鍚庣鎺ュ彛杩炴帴寮傚父' - } else if (message.includes('timeout')) { - message = '绯荤粺鎺ュ彛璇锋眰瓒呮椂' - } else if (message.includes('Request failed with status code')) { - message = '绯荤粺鎺ュ彛' + message.substr(message.length - 3) + '寮傚父' - } - toast(message) - reject(error) - }) - }) + } catch (e) { + console.error('鍝嶅簲瑙f瀽澶辫触:', e); + toast('鍝嶅簲鏁版嵁澶勭悊澶辫触'); + reject('鍝嶅簲鏁版嵁澶勭悊澶辫触'); + return; + } + + if (config.responseType === 'arraybuffer') { + // 鉁� 缂撳瓨 arraybuffer 绫诲瀷鍝嶅簲 + requestCache.set(requestKey, { + response: resData, + expiry: Date.now() + 5000 // 缂撳瓨 5 绉� + }); + resolve(resData); + return; + } + + const code = resData.code || 200; + const msg = errorCode[code] || resData.msg || errorCode['default']; + + if (code === 401) { + showConfirm('鐧诲綍鐘舵�佸凡杩囨湡锛屾偍鍙互缁х画鐣欏湪璇ラ〉闈紝鎴栬�呴噸鏂扮櫥褰�?').then(res => { + if (res.confirm) { + store.dispatch('LogOut').then(() => { + uni.reLaunch({ url: '/pages/login' }); + }); + } + }); + reject('鏃犳晥鐨勪細璇濓紝鎴栬�呬細璇濆凡杩囨湡锛岃閲嶆柊鐧诲綍銆�'); + } else if (code === 500) { + toast(msg); + reject(resData); + } else if (code !== 200) { + toast(msg); + reject(resData); + } else { + // 鉁� 缂撳瓨鎴愬姛鍝嶅簲 + requestCache.set(requestKey, { + response: resData, + expiry: Date.now() + 5000 // 缂撳瓨 5 绉� + }); + resolve(resData); + } + }).catch(error => { + let { message } = error; + if (message === 'Network Error') { + message = '鍚庣鎺ュ彛杩炴帴寮傚父'; + } else if (message.includes('timeout')) { + message = '绯荤粺鎺ュ彛璇锋眰瓒呮椂'; + } else if (message.includes('Request failed with status code')) { + message = '绯荤粺鎺ュ彛' + message.substr(message.length - 3) + '寮傚父'; + } + toast(message); + reject(error); + }).finally(() => { + // 鉁� 娓呯悊 pendingRequests + pendingRequests.delete(requestKey); + }); + }, 500); // 鉁� 闃叉姈鏃堕棿 500ms + + pendingRequests.set(requestKey, { timer }); + }); } -export default request +export default request; \ No newline at end of file -- Gitblit v1.8.0