存档点
This commit is contained in:
110
utils/api.js
110
utils/api.js
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user