import axios from 'axios' import { ElMessage } from 'element-plus' import router from '@/router' import { encrypt, decrypt } from './sm4' const service = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL || '/api', timeout: 30000 }) service.interceptors.request.use( config => { const token = localStorage.getItem('token') if (token) { config.headers.Authorization = `Bearer ${token}` } if (config.method === 'post' || config.method === 'put') { const data = typeof config.data === 'string' ? config.data : JSON.stringify(config.data) config.data = { data: encrypt(data) } } return config }, error => { return Promise.reject(error) } ) service.interceptors.response.use( response => { const res = response.data if (response.config.responseType === 'blob') { return res } if (res.code !== 200 && res.code !== 0) { ElMessage.error(res.message || '请求失败') return Promise.reject(new Error(res.message || '请求失败')) } if (res.data && typeof res.data === 'string') { try { res.data = JSON.parse(decrypt(res.data)) } catch (e) { } } return res }, error => { if (error.response) { switch (error.response.status) { case 401: ElMessage.error('登录已过期,请重新登录') localStorage.removeItem('token') router.push('/login') break case 403: ElMessage.error('没有权限访问') break case 404: ElMessage.error('请求资源不存在') break case 500: router.push('/500') break default: ElMessage.error(error.message || '网络错误') } } else { ElMessage.error('网络连接失败') } return Promise.reject(error) } ) export default service export const request = { get: (url, params, config = {}) => service.get(url, { params, ...config }), post: (url, data, config = {}) => service.post(url, data, config), put: (url, data, config = {}) => service.put(url, data, config), delete: (url, params, config = {}) => service.delete(url, { params, ...config }), download: (url, data, config = {}) => service.post(url, data, { responseType: 'blob', ...config }), upload: (url, data, config = {}) => { const formData = new FormData() Object.keys(data).forEach(key => formData.append(key, data[key])) return service.post(url, formData, { headers: { 'Content-Type': 'multipart/form-data' }, ...config }) } }