fix bugs
This commit is contained in:
114
utils/request.js
114
utils/request.js
@@ -9,6 +9,7 @@ class Request {
|
||||
constructor() {
|
||||
this.baseURL = config.baseURL
|
||||
this.timeout = config.timeout
|
||||
this.isRedirecting = false // 防止重复跳转登录页
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -76,12 +77,13 @@ class Request {
|
||||
* @returns {Object}
|
||||
*/
|
||||
getHeaders(customHeader = {}) {
|
||||
// 获取token
|
||||
const token = uni.getStorageSync('token') || ''
|
||||
// 获取token - 使用access_token作为key
|
||||
const token = uni.getStorageSync('access_token') || ''
|
||||
|
||||
return {
|
||||
'Content-Type': 'application/json',
|
||||
'Blade-Auth': token ? `Bearer ${token}` : '',
|
||||
'Blade-Auth': token ? `bearer ${token}` : '',
|
||||
'Tenant-Id': '000000',
|
||||
...customHeader
|
||||
}
|
||||
}
|
||||
@@ -95,24 +97,41 @@ class Request {
|
||||
handleResponse(res, resolve, reject) {
|
||||
const data = res.data
|
||||
|
||||
// 判断HTTP状态码
|
||||
// 2xx 和 304 都是成功的状态码
|
||||
// 判断HTTP状态码 - 特别处理401
|
||||
if (res.statusCode === 401) {
|
||||
this.handleTokenExpired()
|
||||
reject({
|
||||
statusCode: 401,
|
||||
code: 401,
|
||||
message: '未登录或登录已过期'
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 其他HTTP错误状态码
|
||||
if (res.statusCode < 200 || (res.statusCode >= 300 && res.statusCode !== 304)) {
|
||||
this.showError('网络请求失败')
|
||||
reject({
|
||||
statusCode: res.statusCode,
|
||||
code: res.statusCode,
|
||||
message: '网络请求失败'
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 特殊处理:OAuth2 token接口直接返回数据(有access_token字段)
|
||||
if (data.access_token) {
|
||||
resolve(data)
|
||||
return
|
||||
}
|
||||
|
||||
// 判断业务状态码
|
||||
if (data.code === 200 || data.success === true) {
|
||||
// 请求成功,返回数据
|
||||
resolve(data.data)
|
||||
} else {
|
||||
// 业务错误处理
|
||||
const errorMsg = data.msg || data.message || '请求失败'
|
||||
const errorMsg = data.msg || data.message || data.error_description || '请求失败'
|
||||
|
||||
// 特殊错误码处理
|
||||
if (data.code === 401 || data.code === 403) {
|
||||
@@ -122,6 +141,7 @@ class Request {
|
||||
|
||||
this.showError(errorMsg)
|
||||
reject({
|
||||
statusCode: res.statusCode,
|
||||
code: data.code,
|
||||
message: errorMsg,
|
||||
data: data.data
|
||||
@@ -174,23 +194,85 @@ class Request {
|
||||
* 处理token过期
|
||||
*/
|
||||
handleTokenExpired() {
|
||||
// 清除token
|
||||
uni.removeStorageSync('token')
|
||||
console.log('=== handleTokenExpired 被调用 ===')
|
||||
console.log('isRedirecting:', this.isRedirecting)
|
||||
|
||||
// 防止重复跳转
|
||||
if (this.isRedirecting) {
|
||||
console.log('已经在跳转中,跳过')
|
||||
return
|
||||
}
|
||||
this.isRedirecting = true
|
||||
|
||||
console.log('开始清除认证信息')
|
||||
// 清除所有认证信息
|
||||
uni.removeStorageSync('access_token')
|
||||
uni.removeStorageSync('refresh_token')
|
||||
uni.removeStorageSync('userInfo')
|
||||
console.log('认证信息已清除')
|
||||
|
||||
// 提示用户
|
||||
console.log('显示Toast提示')
|
||||
uni.showToast({
|
||||
title: '登录已过期,请重新登录',
|
||||
icon: 'none',
|
||||
duration: 2000
|
||||
duration: 1500
|
||||
})
|
||||
|
||||
// 跳转到登录页(如果有)
|
||||
setTimeout(() => {
|
||||
// uni.reLaunch({
|
||||
// url: '/pages/login/login'
|
||||
// })
|
||||
}, 2000)
|
||||
// 立即跳转,不等待Toast
|
||||
console.log('准备跳转到登录页')
|
||||
|
||||
// 获取当前页面路径
|
||||
const pages = getCurrentPages()
|
||||
console.log('当前页面栈:', pages)
|
||||
const currentPage = pages[pages.length - 1]
|
||||
const currentRoute = currentPage ? currentPage.route : ''
|
||||
|
||||
console.log('当前页面路由:', currentRoute)
|
||||
|
||||
// 如果当前不在登录页,才跳转
|
||||
if (currentRoute !== 'pages/login/login') {
|
||||
console.log('开始执行跳转...')
|
||||
|
||||
// 使用 setTimeout 确保在下一个事件循环执行
|
||||
setTimeout(() => {
|
||||
this.isRedirecting = false
|
||||
|
||||
uni.reLaunch({
|
||||
url: '/pages/login/login',
|
||||
success: () => {
|
||||
console.log('✅ reLaunch 跳转成功')
|
||||
},
|
||||
fail: (err) => {
|
||||
console.error('❌ reLaunch 失败:', err)
|
||||
// 如果reLaunch失败,尝试使用redirectTo
|
||||
uni.redirectTo({
|
||||
url: '/pages/login/login',
|
||||
success: () => {
|
||||
console.log('✅ redirectTo 跳转成功')
|
||||
},
|
||||
fail: (err2) => {
|
||||
console.error('❌ redirectTo 也失败:', err2)
|
||||
// 最后尝试navigateTo
|
||||
uni.navigateTo({
|
||||
url: '/pages/login/login',
|
||||
success: () => {
|
||||
console.log('✅ navigateTo 跳转成功')
|
||||
},
|
||||
fail: (err3) => {
|
||||
console.error('❌ navigateTo 也失败:', err3)
|
||||
console.error('所有跳转方式都失败了!')
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}, 100)
|
||||
} else {
|
||||
console.log('当前已在登录页,不需要跳转')
|
||||
this.isRedirecting = false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -212,7 +294,7 @@ class Request {
|
||||
/**
|
||||
* POST请求
|
||||
* @param {String} url 请求地址
|
||||
* @param {Object} data 请求参数
|
||||
* @param {Object|String} data 请求参数(可以是对象或字符串)
|
||||
* @param {Object} options 额外配置
|
||||
* @returns {Promise}
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user