import axios from 'axios' import { getToken, clearAuth } from '@/utils/auth' import { toast } from '@/utils/feedback' const BASE_URL = '/api' const instance = axios.create({ baseURL: BASE_URL, timeout: 30000 }) instance.interceptors.request.use( (config) => { const token = getToken() if (token) { config.headers = config.headers || {} config.headers.Authorization = `Bearer ${token}` } return config }, (err) => Promise.reject(err) ) function handleUnauthorized() { clearAuth() toast('登录已过期,请重新登录', 'error') setTimeout(() => { if (location.hash !== '#/login') { location.hash = '#/login' } }, 400) } instance.interceptors.response.use( (response) => response, (err) => { if (err && err.response && err.response.status === 401) { handleUnauthorized() } return Promise.reject(err) } ) export function request({ url, method = 'GET', data, params, headers, responseType } = {}) { return new Promise((resolve, reject) => { instance({ url, method, data, params, headers, responseType }) .then((res) => { if (responseType === 'blob' || responseType === 'arraybuffer') { resolve(res) return } const body = res.data || {} if (body.code === 0) { resolve(body.data) return } const message = body.message || '请求失败' toast(message, 'error') reject(new Error(message)) }) .catch((err) => { if (err && err.response && err.response.status === 401) { reject(err) return } const msg = (err && err.message) || '网络异常' if (!/Unauthorized/.test(msg)) { toast(msg, 'error') } reject(err) }) }) } export function uploadFile(file) { const formData = new FormData() formData.append('file', file) return new Promise((resolve, reject) => { instance({ url: '/upload/image', method: 'POST', data: formData, headers: { 'Content-Type': 'multipart/form-data' } }) .then((res) => { const body = res.data || {} if (body.code === 0) { resolve(body.data) return } const message = body.message || '上传失败' toast(message, 'error') reject(new Error(message)) }) .catch((err) => { const msg = (err && err.message) || '上传失败' toast(msg, 'error') reject(err) }) }) } export function downloadBlob({ url, method = 'POST', data, filename }) { return request({ url, method, data, responseType: 'blob' }).then((res) => { const blob = new Blob([res.data]) const link = document.createElement('a') link.href = URL.createObjectURL(blob) link.download = filename || 'download' document.body.appendChild(link) link.click() setTimeout(() => { URL.revokeObjectURL(link.href) document.body.removeChild(link) }, 0) }) } export function getServerBase() { return '' } export default instance