import axios from "axios"; import React from 'react'; import { message } from 'antd'; const instance = axios.create({ baseURL: import.meta.env.VITE_SERVER_BASE || '', timeout: 10000, withCredentials: true, // 跨域 }); // 添加请求拦截器 instance.interceptors.request.use(function (config) { const { headers = {}, method = 'get', responseType = 'json', download = false, silent } = config; const token = localStorage.getItem('token') || ''; let noTip = silent; if (noTip === undefined) { noTip = method.toLocaleLowerCase() === 'get' ? true : false; } // 在发送请求之前做些什么 return { ...config, silent: noTip, headers: { ...headers, Authorization: token, }, responseType: download ? 'blob' : responseType, }; }, function (error) { // 对请求错误做些什么 return Promise.reject(error); }); // 添加响应拦截器 instance.interceptors.response.use(function (response) { // 2xx 范围内的状态码都会触发该函数。 // 对响应数据做点什么 const { data, config } = response; if (config.download && !data.code) { return downloadBlob(response, '下载文件'); } if (data.code === 1000) { if (data.data?.token) { localStorage.setItem('token', data.data.token); } if (!config.silent) { message.success('操作成功'); } return data.data; } else if (data.code === 1001) { if (!config.silent) { message.error('未登录或者超时, 请重新登录'); } } else { console.log(config) if (!config.silent) { const errMsg = data.message || '系统错误'; message.error(errMsg.indexOf('exception') > -1 ? '服务异常' : errMsg); } } return Promise.reject(response); }, function (error) { // 超出 2xx 范围的状态码都会触发该函数。 // 对响应错误做点什么 console.error(error); message.error('网络超时或异常...') return Promise.reject("网络异常, 请重试..."); }); export default instance; export function queryTable (apiRequest) { return function (params) { const { pageSize } = params; return apiRequest({ ...params, pageSize, pageNum: params.current, }) .then((res) => { return { data: res.records, success: true, total: res.total, }; }) .catch((err) => { return { success: false, }; }); }; } export function queryDict (apiRequest, {labelKey = 'name', valueKey = 'id'}) { return function (params) { const { current, pageSize, ...leftParams } = params || {}; return apiRequest({ pageSize: 9999, pageNum: 1, ...(leftParams || {}), }) .then((res) => { return res?.records?.map((x) => ({ label: x[labelKey], value: x[valueKey], ...x, })); }) .catch((err) => { return { success: false, }; }); }; } export function restful (url) { const list = params => instance.get(url, { params }); const get = id => instance.get(`${url}/${id}`); const add = data => instance.post(url, data); const update = (id, data) => instance.put(`${url}/${id}`, data); const del = id => instance.delete(`${url}/${id}`); return [list, get, add, update, del]; } export function useRequest (fn) { const [loading, setLoading] = React.useState(false); const p = (...args) => new Promise((resolve, reject) => { setLoading(true); fn(...args).then(res => { setLoading(false); resolve(res); }).catch(e => { setLoading(false); reject(e); }); }); return [loading, p] } function downloadBlob (response) { let fileName = '未知文件'; const contentType = response.headers['content-type']; const contentDisposition = response.headers['content-disposition']; if (contentDisposition) { const parts = contentDisposition.split(';filename='); if (parts[1]) { fileName = decodeURIComponent(parts[1]); } } const url = window.URL.createObjectURL(new Blob([response.data], { type: contentType })); const link = document.createElement('a'); link.href = url; link.setAttribute('download', fileName); link.click(); window.URL.revokeObjectURL(url); }