125 lines
3.2 KiB
TypeScript
125 lines
3.2 KiB
TypeScript
import type { Method } from 'alova'
|
|
import type { AxiosError } from 'axios'
|
|
import { axiosRequestAdapter } from '@alova/adapter-axios'
|
|
import { createAlova } from 'alova'
|
|
import { useNavStore } from '@/store/navigation'
|
|
import { useSpaceStore } from '@/store/space'
|
|
import { useUserStore } from '@/store/user'
|
|
import { toast } from '@/utils/toast'
|
|
|
|
enum HttpCode {
|
|
Success = 200,
|
|
Unauthorized = 401,
|
|
Fail = 500,
|
|
}
|
|
|
|
// 仅保留「无需登录」接口
|
|
const WhiteList = [
|
|
'/auth/login/**',
|
|
'/auth/register/**',
|
|
]
|
|
|
|
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.5.6:8086/app',
|
|
baseURL: 'http://192.168.1.137:8086/app',
|
|
requestAdapter: axiosRequestAdapter(),
|
|
timeout: 5000,
|
|
cacheFor: null,
|
|
|
|
responded: {
|
|
onSuccess: async (response, _method: Method) => {
|
|
const resData = response.data as ResponseData<any>
|
|
|
|
const result = {
|
|
...resData,
|
|
isSuccess: resData.code === HttpCode.Success,
|
|
}
|
|
|
|
/**
|
|
* 登录态失效:
|
|
* - 清空本地状态
|
|
* - 跳转登录页
|
|
* - 不做 token 刷新、不重试请求
|
|
*/
|
|
if (resData.code === HttpCode.Unauthorized) {
|
|
useUserStore.getState().clear()
|
|
useNavStore.getState().navigateToAuth()
|
|
return Promise.reject(new Error('登录已失效'))
|
|
}
|
|
|
|
return result
|
|
},
|
|
|
|
onError: (error: AxiosError) => {
|
|
const status = error.status
|
|
|
|
switch (status) {
|
|
case 400:
|
|
toast.show({ title: '请求错误,请检查输入参数' })
|
|
break
|
|
case 401:
|
|
toast.show({ title: '未授权,请重新登录' })
|
|
break
|
|
case 403:
|
|
toast.show({ title: '没有权限访问该资源' })
|
|
break
|
|
case 404:
|
|
toast.show({ title: '请求丢失啦,请稍后再试!' })
|
|
break
|
|
case 500:
|
|
toast.show({ title: '服务器出错啦,请稍后重试' })
|
|
break
|
|
case 502:
|
|
toast.show({ title: '网关错误,请稍后重试' })
|
|
break
|
|
case 503:
|
|
toast.show({ title: '服务暂不可用,请稍后再试' })
|
|
break
|
|
case 504:
|
|
toast.show({ title: '网关超时,请稍后再试' })
|
|
break
|
|
default:
|
|
toast.show({ title: '服务器出错啦,请稍后重试' })
|
|
break
|
|
}
|
|
|
|
return Promise.reject(error)
|
|
},
|
|
},
|
|
|
|
beforeRequest(method) {
|
|
// 白名单接口直接放行
|
|
if (isWhiteListed(method.url))
|
|
return
|
|
|
|
const userStore = useUserStore.getState()
|
|
|
|
// 未登录直接拦截
|
|
if (!userStore.isLoggedIn()) {
|
|
useNavStore.getState().navigateToAuth()
|
|
return Promise.reject(new Error('未登录'))
|
|
}
|
|
|
|
// 注入 JWT
|
|
method.config.headers.token = userStore.userInfo!.token
|
|
|
|
// 注入 space 信息(如果存在)
|
|
const userSpace = useSpaceStore.getState().userSpace
|
|
if (userSpace) {
|
|
method.config.headers['x-space-id'] = userSpace.space_id
|
|
}
|
|
},
|
|
})
|
|
|
|
export default alovaInstance
|