2025-08-07 15:16:23 +08:00
|
|
|
|
import axios from "axios";
|
|
|
|
|
|
import {
|
|
|
|
|
|
message as antdMessage
|
2025-11-03 16:40:10 +08:00
|
|
|
|
} from "@hwork/ant-design-vue";
|
2025-08-07 15:16:23 +08:00
|
|
|
|
import store from "../store";
|
|
|
|
|
|
import qs from 'qs';
|
|
|
|
|
|
import router from '@/route/index'
|
|
|
|
|
|
|
|
|
|
|
|
class Request {
|
|
|
|
|
|
|
|
|
|
|
|
constructor(config) {
|
|
|
|
|
|
this.config = config || {
|
|
|
|
|
|
timeout: 8000,
|
|
|
|
|
|
withCredentials: true,
|
|
|
|
|
|
baseURL: process.env.VUE_APP_API_BASE_URL,
|
|
|
|
|
|
headers: {
|
|
|
|
|
|
"Content-Type": "application/json; charset=utf-8"
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
interceptors(instance) {
|
|
|
|
|
|
|
|
|
|
|
|
/// 请求拦截
|
|
|
|
|
|
instance.interceptors.request.use(
|
|
|
|
|
|
config => {
|
|
|
|
|
|
// 确保 headers 存在
|
|
|
|
|
|
config.headers = config.headers || {};
|
|
|
|
|
|
/// 权鉴相关
|
|
|
|
|
|
const tokenKey = localStorage.getItem("token_key");
|
|
|
|
|
|
const token = localStorage.getItem("token")
|
|
|
|
|
|
if (token) config.headers["Authorization"] = "Bearer " + token;
|
|
|
|
|
|
if (tokenKey) config.headers["Authorization-key"] = tokenKey;
|
|
|
|
|
|
config.headers["Platform"] = "PC";
|
|
|
|
|
|
config.cancelToken = new axios.CancelToken(async cancel => {
|
|
|
|
|
|
await store.dispatch("app/execCancelToken", {
|
|
|
|
|
|
cancelToken: cancel
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
/// 格式化 []
|
|
|
|
|
|
if (config.method === 'delete') {
|
|
|
|
|
|
config.paramsSerializer = (params) => {
|
|
|
|
|
|
return qs.stringify(params, {
|
|
|
|
|
|
arrayFormat: 'repeat'
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 如果是文件上传,设置Content-Type为multipart/form-data
|
|
|
|
|
|
if (config.data instanceof FormData) {
|
|
|
|
|
|
delete config.headers["Content-Type"]; // 让 Axios 设置正确的 Content-Type
|
|
|
|
|
|
config.headers["Content-Type"] = "multipart/form-data";
|
|
|
|
|
|
} else {
|
|
|
|
|
|
config.headers["Content-Type"] = "application/json; charset=utf-8";
|
|
|
|
|
|
}
|
|
|
|
|
|
// config.cancelToken = new axios.CancelToken(async cancel => {
|
|
|
|
|
|
// await store.dispatch("app/execCancelToken", {
|
|
|
|
|
|
// cancelToken: cancel
|
|
|
|
|
|
// });
|
|
|
|
|
|
// });
|
|
|
|
|
|
return config;
|
|
|
|
|
|
},
|
|
|
|
|
|
error => {
|
|
|
|
|
|
return Promise.reject(error);
|
|
|
|
|
|
}
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
/// 响应拦截
|
|
|
|
|
|
instance.interceptors.response.use(
|
|
|
|
|
|
response => {
|
|
|
|
|
|
if (response.data.code === 502) {
|
|
|
|
|
|
antdMessage.error("登录过期").then(() => router.push("/login"))
|
|
|
|
|
|
}
|
|
|
|
|
|
return response.data;
|
|
|
|
|
|
},
|
|
|
|
|
|
error => {
|
|
|
|
|
|
console.log("响应拦截error", error)
|
|
|
|
|
|
this.errorHandle(error);
|
|
|
|
|
|
return Promise.reject(error);
|
|
|
|
|
|
}
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
errorHandle = function(error) {
|
|
|
|
|
|
var response = error.response
|
|
|
|
|
|
var message = error.message
|
|
|
|
|
|
if (response) {
|
|
|
|
|
|
if (response.status === 404) antdMessage.error("接口不存在");
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (message === "Network Error") antdMessage.error("连接异常")
|
|
|
|
|
|
|
|
|
|
|
|
if (message.includes("timeout")) antdMessage.error("请求超时");
|
|
|
|
|
|
|
|
|
|
|
|
if (message.includes("Request failed with status code")) antdMessage.error("接口异常");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
request(options) {
|
|
|
|
|
|
const instance = axios.create();
|
|
|
|
|
|
const requestOptions = Object.assign({}, this.config, options);
|
|
|
|
|
|
this.interceptors(instance);
|
|
|
|
|
|
return instance(requestOptions);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const request = new Request();
|
|
|
|
|
|
export default new Request();
|