import axios from 'axios' import { ElMessage } from 'element-plus' import router from '@/router' const request = axios.create({ baseURL: '', timeout: 15000, }) request.interceptors.request.use( (config) => { const token = localStorage.getItem('access_token') if (token) { config.headers.Authorization = `Bearer ${token}` } return config }, (error) => Promise.reject(error) ) request.interceptors.response.use( (response) => { const res = response.data if (res.code !== 200) { ElMessage.error(res.message || '请求失败') if (res.code === 401) { localStorage.removeItem('access_token') localStorage.removeItem('refresh_token') localStorage.removeItem('user_info') router.push({ name: 'Login' }) } return Promise.reject(new Error(res.message)) } return res }, async (error) => { if (error.response) { const status = error.response.status if (status === 401) { const refreshToken = localStorage.getItem('refresh_token') if (refreshToken) { try { const res = await axios.post('/api/public/refresh-token', null, { params: { refreshToken }, }) if (res.data.code === 200) { localStorage.setItem('access_token', res.data.data.accessToken) localStorage.setItem('refresh_token', res.data.data.refreshToken) error.config.headers.Authorization = `Bearer ${res.data.data.accessToken}` return request(error.config) } } catch { // refresh failed } } localStorage.removeItem('access_token') localStorage.removeItem('refresh_token') localStorage.removeItem('user_info') router.push({ name: 'Login' }) } else if (status === 403) { ElMessage.error('无权限访问') } else if (status === 429) { ElMessage.error('请求过于频繁,请稍后再试') } else { ElMessage.error(error.response.data?.message || '服务器错误') } } else { ElMessage.error('网络连接失败') } return Promise.reject(error) } ) export default request