This commit is contained in:
2025-12-12 17:29:38 +08:00
parent 7d9ac4c8ca
commit 7807f4b3e4
14 changed files with 2476 additions and 51 deletions

View File

@@ -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}
*/