This commit is contained in:
FengHui
2026-05-15 14:16:31 +08:00
parent 5910b19131
commit e857c008b4
5 changed files with 197 additions and 47 deletions

View File

@@ -2,6 +2,9 @@ import config from "@/config.js"
import { sm4Encrypt, sm4Decrypt } from '@/utils/crypto';
import useUserStore from '@/stores/useUserStore';
let isRefreshing = false;
let refreshSubscribers = [];
const needToEncryptSet = new Set([
'POST:/app/login',
'GET:/app/user/resume',
@@ -36,6 +39,20 @@ const encryptPathPrefixes = [
'/refreshToken',
];
const addRefreshSubscriber = (callback) => {
refreshSubscribers.push(callback);
};
const notifyRefreshSubscribers = (token) => {
refreshSubscribers.forEach((callback) => callback(token));
refreshSubscribers = [];
};
const resetRefreshState = () => {
isRefreshing = false;
refreshSubscribers = [];
};
const noEncryptSet = new Set([
'DELETE:/app/job/applyJobCencal',
]);
@@ -172,56 +189,89 @@ export function createRequest(url, data = {}, method = 'GET', loading = false, h
header["Authorization"] = Authorization;
}
const requestData = isEncryptNeeded(method, url) ? encryptRequestData(data) : data;
return new Promise((resolve, reject) => {
uni.request({
url: config.baseUrl + url,
method: method,
data: requestData,
header,
success: resData => {
// 响应拦截
if (resData.statusCode === 200) {
const responseData = handleResponseData(resData.data)
console.log('[请求] 接口地址:', config.baseUrl + url)
console.log('[请求] 解密后数据:', responseData)
const {
code,
msg
} = responseData
if (code === 200) {
resolve(responseData)
const doRequest = () => {
return new Promise((resolve, reject) => {
uni.request({
url: config.baseUrl + url,
method: method,
data: requestData,
header,
success: resData => {
// 响应拦截
if (resData.statusCode === 200) {
const responseData = handleResponseData(resData.data)
// console.log('[请求] 接口地址:', config.baseUrl + url)
// console.log('[请求] 解密后数据:', responseData)
const {
code,
msg
} = responseData
if (code === 200) {
resolve(responseData)
return
}
// 处理业务错误
if (responseData?.code === 401 || responseData?.code === 402) {
handleTokenExpired(resolve, reject, doRequest, loading)
return
}
// 显示具体的错误信息
const errorMsg = msg || '请求出现异常,请联系工作人员'
const err = new Error(errorMsg)
err.error = resData
reject(err)
return
}
// 处理业务错误
if (responseData?.code === 401 || responseData?.code === 402) {
useUserStore().logOut()
}
// 显示具体的错误信息
const errorMsg = msg || '请求出现异常,请联系工作人员'
// uni.showToast({
// title: errorMsg,
// icon: 'none'
// })
const err = new Error(errorMsg)
// HTTP状态码不是200的情况
const err = new Error('网络请求失败,请检查网络连接')
err.error = resData
reject(err)
return
},
fail: (err) => {
reject(err)
},
complete: () => {
if (loading) {
uni.hideLoading();
}
}
// HTTP状态码不是200的情况
const err = new Error('网络请求失败,请检查网络连接')
err.error = resData
reject(err)
},
fail: (err) => {
reject(err)
},
complete: () => {
if (loading) {
uni.hideLoading();
}
}
});
})
});
})
}
return doRequest()
}
const handleTokenExpired = (resolve, reject, retryRequest, loading) => {
if (isRefreshing) {
addRefreshSubscriber((token) => {
if (token) {
retryRequest().then(resolve).catch(reject)
} else {
reject(new Error('刷新token失败'))
}
})
return
}
isRefreshing = true
useUserStore().refreshAccessToken().then((newToken) => {
notifyRefreshSubscribers(newToken)
retryRequest().then(resolve).catch(reject)
}).catch((error) => {
resetRefreshState()
uni.showToast({
title: '登录过期,请重新登录',
icon: 'none'
})
reject(error)
}).finally(() => {
if (loading) {
uni.hideLoading()
}
})
}