11
This commit is contained in:
140
utils/request.js
140
utils/request.js
@@ -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()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user