xt_web_td/src/api/request.js

76 lines
2.5 KiB
JavaScript

import axios from "axios";
import { authToken } from "@/store/index.js"
import { MessagePlugin } from "tdesign-vue-next"
import router from "@/router/index.js"
function get_api_url() {
if (import.meta.env.MODE === 'development' || (import.meta.env.MODE === 'production' && window.location.host.indexOf('localhost') > -1)) {
return import.meta.env.VITE_API_BASEURL
}
return 'http://' + window.location.host + '/api'
}
const instance = axios.create({
baseURL: get_api_url(),
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
instance.interceptors.request.use(
config => {
const token = authToken.access
if (token) {
config.headers['Authorization'] = `Bearer ${token}`
}
config._err_i = config._err_i !== false; // 默认 true
return config;
},
error => {
MessagePlugin.error(error.message)
return Promise.reject(error);
}
)
instance.interceptors.response.use(
response => {
return response.data
},
error => {
let err_msg = "请求错误";
if (error.response) {
const status = error.response.status;
const url = error.config?.url || '';
switch (status) {
case 401:
if (authToken.access) { authToken.access = null }
if (authToken.refresh) { authToken.refresh = null }
if (!url.includes('/login')) {
// 避免重复跳转
if (!window.location.pathname.includes('/login')) {
router.replace('/login');
}
}
break;
default:
err_msg = error.response?.data?.err_msg || "内部错误"
}
} else if (error.request) {
err_msg = '网络连接失败,请检查网络';
}
if (error.config._err_i) {
MessagePlugin.error(err_msg);
}
return Promise.reject(error)
}
)
const http = {
get: (url, params={}, err_i=true) => instance.get(url, { params, err_i }),
post: (url, data={}, err_i=true) => instance.post(url, data, err_i),
put: (url, data={}, err_i=true) => instance.put(url, data, err_i),
delete: (url, err_i=true) => instance.delete(url, err_i),
postForm: (url, data, onProgress=null, err_i=true) => instance.post(url, data, { headers: { 'Content-Type': 'multipart/form-data' }, onUploadProgress: onProgress, err_i})
};
export default http;