This commit is contained in:
oneao committed 2025-11-06 17:32:51 +08:00
1 parent 6849579652
commit d60be4a75b
24 files changed
+463 -179

No files matched your search

+101 -12
View File
@@ -1,21 +1,110 @@
import type { Method } from 'alova'
import type { AxiosError } from 'axios'
import { axiosRequestAdapter } from '@alova/adapter-axios'
import { createAlova } from 'alova'
import { createServerTokenAuthentication } from 'alova/client'
import adapterFetch from 'alova/fetch'
import { useToast } from '@/utils/toast'
import { router } from 'expo-router'
import { userStore } from '@/store/user'
import { toast } from '@/utils/toast'
const { onAuthRequired, onResponseRefreshToken } = createServerTokenAuthentication({
// ...
})
enum HttpCode {
Success = 200,
Unauthorized = 401,
RefreshToken = 402,
Fail = 500,
}
const WhiteList = [
'/auth/login/**',
'/auth/register/**',
'/auth/refresh/token',
]
function isWhiteListed(url: string) {
return WhiteList.some((pattern) => {
if (pattern.endsWith('/**')) {
const base = pattern.slice(0, -3)
return url.startsWith(base)
}
return url === pattern
})
}
const alovaInstance = createAlova({
// baseURL: 'http://192.168.1.136:8085/app',
baseURL: 'http://192.168.5.6:8085/app',
baseURL: 'http://192.168.1.136:8085/app',
requestAdapter: axiosRequestAdapter(),
responded(response) {
// response自动被推断为AxiosResponse类型
return response.data
responded: {
onSuccess: async (response, method: Method) => {
const resData = response.data as ResponseData<any>
if (resData.code === HttpCode.Success) {
return resData.data
}
// Access Token 失效 → 重新登录
if (resData.code === HttpCode.Unauthorized) {
console.log('===到这一步了===')
router.replace('/auth/login')
return
}
// Access Token 过期但 Refresh Token 有效 → 刷新 token 并重试
if (resData.code === HttpCode.RefreshToken) {
try {
const refreshToken = userStore.getState().userInfo?.refreshToken
if (!refreshToken) {
router.replace('/auth/login')
return
}
// 调用刷新接口
const res = await alovaInstance.Get<ResponseData<string>>('/auth/refresh/token', {
headers: {
refreshToken,
},
})
const newToken = res.data
// 更新 store
userStore.getState().setUserInfo({
...userStore.getState().userInfo!,
token: newToken,
})
// 重试原请求
method.config.headers.token = newToken
await method.send()
return
}
catch (err) {
console.log('===到这一步了===')
router.replace('/auth/login')
return Promise.reject(err)
}
}
// 其他错误
return Promise.reject(resData.message || '请求失败')
},
onError: (error: AxiosError, method) => {
console.log(error.status)
return Promise.reject(error)
},
},
beforeRequest(method) {
if (isWhiteListed(method.url))
return
if (!userStore.getState().isLoggedIn()) {
toast.show({
title: '尚未登录',
})
router.replace('/auth/login')
return
}
method.config.headers.token = userStore.getState().userInfo?.token ?? ''
},
})