存档点

This commit is contained in:
2026-01-14 18:17:16 +08:00
parent 39ea6f2fb1
commit cdc5dff129
8 changed files with 408 additions and 117 deletions

View File

@@ -1,4 +1,17 @@
import config from '../config.js'
import storage from './storage.js'
let isRefreshing = false
let refreshSubscribers = []
const subscribeTokenRefresh = (callback) => {
refreshSubscribers.push(callback)
}
const onTokenRefreshed = (token) => {
refreshSubscribers.forEach(callback => callback(token))
refreshSubscribers = []
}
const request = (options) => {
return new Promise((resolve, reject) => {
@@ -8,23 +21,105 @@ const request = (options) => {
console.log('Method:', options.method || 'GET')
console.log('Data:', options.data)
const token = storage.getToken()
uni.request({
url: fullUrl,
method: options.method || 'GET',
data: options.data || {},
header: {
'Content-Type': 'application/json',
...(token ? { 'Authorization': `Bearer ${token}` } : {}),
...options.header
},
timeout: config.timeout,
success: (res) => {
success: async (res) => {
console.log('=== 请求成功 ===')
console.log('StatusCode:', res.statusCode)
console.log('Response:', res.data)
const { statusCode, data } = res
if (statusCode === 200) {
if (statusCode === 401) {
console.log('=== Token 过期,尝试刷新 ===')
if (isRefreshing) {
return new Promise((resolve) => {
subscribeTokenRefresh((newToken) => {
options.header = options.header || {}
options.header.Authorization = `Bearer ${newToken}`
resolve(request(options))
})
}).then(resolve).catch(reject)
}
isRefreshing = true
try {
const refreshToken = storage.getRefreshToken()
if (!refreshToken) {
throw new Error('没有刷新令牌')
}
const refreshRes = await new Promise((resolve, reject) => {
uni.request({
url: config.baseUrl + '/gw/open/refresh_token',
method: 'POST',
data: {
refreshToken
},
header: {
'Content-Type': 'application/json'
},
success: (res) => {
if (res.statusCode === 200 && res.data.code === 0) {
resolve(res.data)
} else {
reject(res.data)
}
},
fail: reject
})
})
if (refreshRes.data && refreshRes.data.accessToken) {
storage.setToken(refreshRes.data.accessToken)
if (refreshRes.data.refreshToken) {
storage.setRefreshToken(refreshRes.data.refreshToken)
}
onTokenRefreshed(refreshRes.data.accessToken)
isRefreshing = false
options.header = options.header || {}
options.header.Authorization = `Bearer ${refreshRes.data.accessToken}`
const retryRes = await request(options)
resolve(retryRes)
} else {
throw new Error('刷新令牌失败')
}
} catch (refreshError) {
console.error('=== 刷新令牌失败 ===', refreshError)
isRefreshing = false
storage.removeToken()
storage.removeRefreshToken()
storage.removeUserInfo()
uni.showModal({
title: '登录过期',
content: '请重新登录',
showCancel: false,
success: () => {
uni.reLaunch({
url: '/pages/login/login'
})
}
})
reject(refreshError)
}
} else if (statusCode === 200) {
if (data.code === 0 || data.success === true) {
resolve(data)
} else {
@@ -114,6 +209,17 @@ const api = {
})
},
getRecord(page = 1, pageSize = 10) {
return request({
url: '/qgdzs/auth/get_record',
method: 'POST',
data: {
page,
page_size: pageSize
}
})
},
get(url, data = {}) {
return request({
url,

View File

@@ -1,4 +1,5 @@
const TOKEN_KEY = 'access_token'
const REFRESH_TOKEN_KEY = 'refresh_token'
const USER_INFO_KEY = 'user_info'
const QUESTION_KEY = 'question'
const ANSWERED_QUESTIONS_KEY = 'answered_questions'
@@ -16,6 +17,18 @@ const storage = {
uni.removeStorageSync(TOKEN_KEY)
},
setRefreshToken(token) {
uni.setStorageSync(REFRESH_TOKEN_KEY, token)
},
getRefreshToken() {
return uni.getStorageSync(REFRESH_TOKEN_KEY) || ''
},
removeRefreshToken() {
uni.removeStorageSync(REFRESH_TOKEN_KEY)
},
setUserInfo(userInfo) {
uni.setStorageSync(USER_INFO_KEY, userInfo)
},