feat: 修改接口报错登出问题
This commit is contained in:
@@ -36,12 +36,13 @@ function request(config) {
|
|||||||
// let url = config.url.indexOf('http') > -1 ? config.url : host + config.url
|
// let url = config.url.indexOf('http') > -1 ? config.url : host + config.url
|
||||||
let url = host + config.url
|
let url = host + config.url
|
||||||
console.log(url,'url---')
|
console.log(url,'url---')
|
||||||
// 3. 显示加载中
|
|
||||||
|
// 显示加载中
|
||||||
if (config.options.load) {
|
if (config.options.load) {
|
||||||
uni.showLoading({ title: config.options.loadText || '正在加载' })
|
uni.showLoading({ title: config.options.loadText || '正在加载' })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. 返回Promise,核心改造逻辑
|
// 返回Promise,核心改造逻辑
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
// 封装核心请求逻辑
|
// 封装核心请求逻辑
|
||||||
const coreRequest = () => {
|
const coreRequest = () => {
|
||||||
@@ -60,13 +61,15 @@ function request(config) {
|
|||||||
// 白名单接口不处理
|
// 白名单接口不处理
|
||||||
const isWhiteList = whiteList.some(v => config.url.includes(v))
|
const isWhiteList = whiteList.some(v => config.url.includes(v))
|
||||||
if (isWhiteList) {
|
if (isWhiteList) {
|
||||||
ajaxError(res.data)
|
// 仅提示错误,不触发登出
|
||||||
|
ajaxError(res.data, false)
|
||||||
reject(res.data.msg)
|
reject(res.data.msg)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------- 刷新token请求改为问号拼接参数 -------------
|
// ------------- 刷新token逻辑 -------------
|
||||||
if (!refreshToken) {
|
if (!refreshToken) {
|
||||||
|
// 无刷新token,触发登出
|
||||||
await handleAuthorized()
|
await handleAuthorized()
|
||||||
reject(res.data.msg)
|
reject(res.data.msg)
|
||||||
return
|
return
|
||||||
@@ -81,18 +84,19 @@ function request(config) {
|
|||||||
try {
|
try {
|
||||||
// 拼接URL参数
|
// 拼接URL参数
|
||||||
const refreshUrl = `${host}/admin-api/system/auth/refresh-token?refreshToken=${encodeURIComponent(refreshToken)}`
|
const refreshUrl = `${host}/admin-api/system/auth/refresh-token?refreshToken=${encodeURIComponent(refreshToken)}`
|
||||||
// 调用刷新token接口(POST方法 + URL参数,无请求体)
|
// 调用刷新token接口
|
||||||
const refreshRes = await uni.request({
|
const refreshRes = await uni.request({
|
||||||
url: refreshUrl, // 带参数的URL
|
url: refreshUrl,
|
||||||
method: 'POST', // 保持POST方法
|
method: 'POST',
|
||||||
header: {
|
header: {
|
||||||
'tenant-id': tenantId, // 携带租户ID
|
'tenant-id': tenantId,
|
||||||
'Content-Type': 'application/json'
|
'Content-Type': 'application/json'
|
||||||
},
|
},
|
||||||
data: {} // 无请求体,参数全在URL上
|
data: {}
|
||||||
})
|
})
|
||||||
|
|
||||||
// 刷新成功处理
|
// 刷新成功处理
|
||||||
if (refreshRes.data.code == 0) {
|
if (refreshRes.data && (refreshRes.data.code == 0 || refreshRes.data.code == 200)) {
|
||||||
const newTokenData = refreshRes.data.data
|
const newTokenData = refreshRes.data.data
|
||||||
// 存储新token
|
// 存储新token
|
||||||
uni.setStorageSync('token', newTokenData.accessToken)
|
uni.setStorageSync('token', newTokenData.accessToken)
|
||||||
@@ -105,10 +109,12 @@ function request(config) {
|
|||||||
requestQueue.forEach(cb => cb())
|
requestQueue.forEach(cb => cb())
|
||||||
requestQueue = []
|
requestQueue = []
|
||||||
} else {
|
} else {
|
||||||
|
// 刷新token失败,触发登出
|
||||||
await handleAuthorized()
|
await handleAuthorized()
|
||||||
reject('刷新token失败:' + (refreshRes.data?.msg || '接口返回异常'))
|
reject('刷新token失败:' + (refreshRes.data?.msg || '接口返回异常'))
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
// 刷新token异常,触发登出
|
||||||
await handleAuthorized()
|
await handleAuthorized()
|
||||||
reject('刷新token异常:' + err.errMsg)
|
reject('刷新token异常:' + err.errMsg)
|
||||||
} finally {
|
} finally {
|
||||||
@@ -116,16 +122,19 @@ function request(config) {
|
|||||||
requestQueue = []
|
requestQueue = []
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ajaxError(res.data)
|
// 普通业务错误,仅提示,不登出
|
||||||
|
ajaxError(res.data, false)
|
||||||
reject(res.data.msg)
|
reject(res.data.msg)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ajaxError(res.data)
|
// HTTP状态码错误,仅提示,不登出
|
||||||
|
ajaxError(res.data, false)
|
||||||
reject(res.errMsg)
|
reject(res.errMsg)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
fail: (err) => {
|
fail: (err) => {
|
||||||
uni.hideLoading();
|
uni.hideLoading();
|
||||||
|
// 网络错误,仅提示,不登出
|
||||||
uni.showToast({ title: '连接服务器失败', icon: 'none' })
|
uni.showToast({ title: '连接服务器失败', icon: 'none' })
|
||||||
reject(err)
|
reject(err)
|
||||||
}
|
}
|
||||||
@@ -137,39 +146,57 @@ function request(config) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ------------- 辅助函数 -------------
|
// ------------- 辅助函数 -------------
|
||||||
function ajaxError(data) {
|
/**
|
||||||
|
* 错误提示函数
|
||||||
|
* @param {Object} data 错误数据
|
||||||
|
* @param {Boolean} isAuthError 是否是认证错误(是否需要触发登出)
|
||||||
|
*/
|
||||||
|
function ajaxError(data, isAuthError = false) {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: data.msg || '请求出错,请重试',
|
title: data.msg || '请求出错,请重试',
|
||||||
icon: 'none',
|
icon: 'none',
|
||||||
|
duration: 2000, // 延长提示时间,提升体验
|
||||||
complete() {
|
complete() {
|
||||||
if ([600, 601, 602, 401].includes(data.code) && !isRefreshingToken) {
|
// 只有明确的认证错误且不在刷新token过程中,才触发登出
|
||||||
|
if (isAuthError && [600, 601, 602, 401].includes(data.code) && !isRefreshingToken) {
|
||||||
setTimeout(() => handleAuthorized(), 1500)
|
setTimeout(() => handleAuthorized(), 1500)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理登录过期逻辑(仅token失效时调用)
|
||||||
|
*/
|
||||||
async function handleAuthorized() {
|
async function handleAuthorized() {
|
||||||
|
// 防止重复弹出登录弹窗
|
||||||
if (!isRelogin.show) {
|
if (!isRelogin.show) {
|
||||||
isRelogin.show = true
|
isRelogin.show = true
|
||||||
const res = await uni.showModal({
|
try {
|
||||||
title: '登录过期',
|
const res = await uni.showModal({
|
||||||
content: '您的登录已过期,请重新登录',
|
title: '登录过期',
|
||||||
showCancelButton: false,
|
content: '您的登录已过期,请重新登录',
|
||||||
confirmText: '重新登录'
|
showCancelButton: false,
|
||||||
})
|
confirmText: '重新登录'
|
||||||
if (res.confirm) {
|
})
|
||||||
// 清除缓存(建议用项目封装的removeToken方法)
|
if (res.confirm) {
|
||||||
uni.removeStorageSync('token')
|
// 清除登录相关缓存
|
||||||
uni.removeStorageSync('refreshToken')
|
uni.removeStorageSync('token')
|
||||||
uni.removeStorageSync('cid')
|
uni.removeStorageSync('refreshToken')
|
||||||
uni.removeStorageSync('userInfo')
|
uni.removeStorageSync('cid')
|
||||||
uni.removeStorageSync('permissionList')
|
uni.removeStorageSync('userInfo')
|
||||||
uni.removeStorageSync('sysVersion')
|
uni.removeStorageSync('permissionList')
|
||||||
uni.removeStorageSync('dynamicModelExtra')
|
uni.removeStorageSync('sysVersion')
|
||||||
uni.reLaunch({ url: '/pages/login/index' })
|
uni.removeStorageSync('dynamicModelExtra')
|
||||||
|
// 跳转到登录页
|
||||||
|
uni.reLaunch({ url: '/pages/login/index' })
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error('处理登录过期异常:', err)
|
||||||
|
} finally {
|
||||||
|
isRefreshingToken = false
|
||||||
|
isRelogin.show = false
|
||||||
}
|
}
|
||||||
isRelogin.show = false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user