import axios, { type AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios' import jwtDecode, { JwtPayload } from 'jwt-decode' import { clearLocalStorage, getToken, setToken } from '@/utils/common' import { ACCESS_DENIED, DATABASE_DATA_TO_LONG, DATABASE_DATA_VALIDATION_FAILED, DATABASE_EXECUTE_ERROR, TOKEN_HAS_EXPIRED, TOKEN_IS_ILLEGAL, TOKEN_RENEW_SUCCESS, UNAUTHORIZED } from '@/constants/Common.constants' import { message } from 'antd' const service: AxiosInstance = axios.create({ baseURL: 'http://localhost:8181', timeout: 10000, withCredentials: false }) service.defaults.paramsSerializer = (params: Record) => { return Object.keys(params) .filter((it) => { return Object.prototype.hasOwnProperty.call(params, it) }) .reduce((pre, curr) => { return params[curr] !== null ? (pre !== '' ? pre + '&' : '') + curr + '=' + encodeURIComponent(params[curr]) : pre }, '') } service.interceptors.request.use( async (config) => { let token = getToken() if (token !== null) { const jwt = jwtDecode(token) if (!jwt.exp) { return config } if ( jwt.exp * 1000 - new Date().getTime() < 1200000 && jwt.exp * 1000 - new Date().getTime() > 0 ) { await axios .get('http://localhost:8181/token', { headers: { token } }) .then((value: AxiosResponse<_Response>) => { const response = value.data if (response.code === TOKEN_RENEW_SUCCESS) { setToken(response.data?.token ?? '') } }) } token = getToken() config.headers.set('token', token) } return config }, async (error) => { return await Promise.reject(error) } ) service.interceptors.response.use( (response: AxiosResponse<_Response>) => { switch (response.data.code) { case UNAUTHORIZED: case TOKEN_IS_ILLEGAL: case TOKEN_HAS_EXPIRED: clearLocalStorage() void message.error( <> 登录已过期 ) setTimeout(function () { location.reload() }, 1500) throw response?.data case ACCESS_DENIED: void message.error( <> 暂无权限操作 ) throw response?.data case DATABASE_DATA_TO_LONG: void message.error( <> 数据过长 ) throw response?.data case DATABASE_DATA_VALIDATION_FAILED: void message.error( <> 数据验证失败 ) throw response?.data case DATABASE_EXECUTE_ERROR: void message.error( <> 数据库执行出错 ) throw response?.data } return response }, async (error: AxiosError) => { void message.error( <> 服务器出错,请稍后重试 ) return await Promise.reject(error?.response?.data) } ) const request = { async get(url: string, data?: object): Promise>> { return await request.request('GET', url, { params: data }) }, async post(url: string, data?: object): Promise>> { return await request.request('POST', url, { data }) }, async put(url: string, data?: object): Promise>> { return await request.request('PUT', url, { data }) }, async delete(url: string, data?: object): Promise>> { return await request.request('DELETE', url, { params: data }) }, async request( method = 'GET', url: string, data?: AxiosRequestConfig ): Promise>> { return await new Promise((resolve, reject) => { service({ method, url, ...data }) .then((res) => { resolve(res as unknown as Promise>>) }) .catch((e: Error | AxiosError) => { reject(e) }) }) } } export default request