import axios from "axios";
import { Message } from "element-ui";
import { Loading } from "element-ui";
import $store from "@/store";
import store from "@/store/login";
import tenant from "@/store/tenant";
import router from "@/router.js";
import NProgress from "nprogress";
import utils from "@/hotent-ui-util.js";
import "nprogress/nprogress.css";
import { saveAs } from "file-saver";
axios.defaults.timeout = 100000;
// 配合大屏
axios.defaults.validateStatus = function (status) {
return status >= 200 && status <= 500; // 默认的
};
// axios.defaults.withCredentials = true;
// 配合大屏
let pending = []; //声明一个数组用于存储每个ajax请求的取消函数和ajax标识
let cancelToken = axios.CancelToken;
let removePending = ever => {
for (let p in pending) {
if (
pending[p].u === ever.url + "&" + ever.method &&
pending[p].data === eval.data
) {
//当当前请求在数组中存在时执行函数体
pending[p].f(); //执行取消操作
pending.splice(p, 1); //把这条记录从数组中移除
}
}
};
Message.errorLog = function(obj, logId){
if(typeof obj == "string" && logId){
let msg = obj;
let log = `【日志ID:${logId}】`;
Message({
type:"error",
message:msg + "
",
dangerouslyUseHTMLString:true,
})
}else{
Message.error(obj);
}
}
// 请求拦截(配置发送请求的信息)
axios.interceptors.request.use(
config => {
// 处理请求之前的配置
NProgress.start(); //开始
store.state.loadding = true; //在请求发出之前进行一些操作
config.headers = config.headers || {};
if (config.headers && config.headers.constructor == String) {
try {
config.headers = JSON.parse(config.headers);
}
catch (e) {
Message.error(`请求头部不是有效的JSON格式:${config.headers}`);
throw e;
}
}
config.headers["Accept-Language"] = localStorage.getItem("lang") || "zh-CN";
if (store.state.loginAccount) {
config.headers["Tenant-Code"] =
localStorage
.getItem(store.state.loginAccount + "loginRoutePath")
.replace("/login/", "") || "";
}
const currentUser = store.state.currentUser;
currentUser && currentUser.token && !config.headers.Authorization && (config.headers.Authorization = `Bearer ${currentUser.token}`);
if (tenant.state.tenantId && config.url.indexOf("tenantId=") == -1) {
let joinChar = "?";
if (config.url.indexOf("?") != -1) {
joinChar = "&";
}
config.url = config.url + joinChar + "tenantId=" + tenant.state.tenantId;
}
//如果是请求auth接口,则不带token
if (config.url.indexOf('/auth?') != -1) {
delete config.headers.Authorization;
}
removePending(config); //在一个ajax发送前执行一下取消操作
config.cancelToken = new cancelToken(c => {
// 将请求的地址和请求的方式构建为一个字符串存放到请求数组中
pending.push({
u: config.url + "&" + config.method,
f: c,
data: config.data
});
});
// 判断是否需要刷新token
let currentTime = new Date().getTime();
if (currentUser && currentUser.loginTime && currentTime - currentUser.loginTime >= (currentUser.expiration / 5) * 1000 && config.url.indexOf('/refresh') == -1) {
$store.dispatch("login/refreshAndGetAuthenticationToken");
}
return config;
},
error => {
// 请求失败的处理
NProgress.done(); // 结束
return Promise.reject(error);
}
);
// 响应拦截(配置请求回来的信息)
axios.interceptors.response.use(
res => {
// 处理响应数据
removePending(res.config); //在一个ajax响应后再执行一下取消操作,把已经完成的请求从pending中移除
if (res.data && res.data.state != undefined && res.data.state === false) {
Message.errorLog(res.data.message,res.data.logId);
}
store.state.loadding = false; //在这里对返回的数据进行处理
NProgress.done(); // 结束
// 附件下载
if (
res &&
res.status == 200 &&
res.headers &&
res.headers["content-disposition"] &&
res.headers["content-disposition"].startsWith("attachment;")
) {
let blob = new Blob([res.data]);
const fileName = decodeURIComponent(
res.headers["content-disposition"].split(";")[1].split("filename=")[1]
);
saveAs(blob, fileName);
}
return res;
},
error => {
// 处理响应失败
let loadingInstance = Loading.service({ fullscreen: true }); //开始
const errorMessage = error && error.response && error.response.data && error.response.data.message ? error.response.data.message : error.message;
if (error && error.response && error.response.status === 401) {
sessionStorage.clear();
if (window.ssoConfig.mode != 'cas' && window.ssoConfig.mode != 'oauth') {
router.push({ path: localStorage.getItem("loginRoutePath") || "/login" });
}
} else if (error && error.response && error.response.status === 403) {
if(error && error.response && error.response.data){
Message.errorLog(errorMessage,error.response.data.logId)
}else{
Message.error(errorMessage);
}
} else if (error && error.response && error.response.status === 500) {
if (error.response.config.url.indexOf("saveForm") == -1) {
//设计表单页面-控件没有绑定属性,点击保存后会有多个提示
if (error.response.data && error.response.data.message) {
Message.errorLog(error.response.data.message,error.response.data.logId);
}else if(error.response.config.url.indexOf("getFileById") != -1){
Message.error("附件不存在");
}else {
Message.error(error.message);
}
}
} else if (error && error.isAxiosError && error.response && error.response.status != 403) {
Message.error(errorMessage);
} else if (errorMessage && typeof (errorMessage) != 'undefined') {
Message.error(errorMessage);
}
NProgress.done(); // 结束
loadingInstance.close(); // 结束
return Promise.reject(error);
}
);
export default {
axios,
request(data) {
let reqData = data.data || {};
//支持表达式作为域名解析
data.url = utils.parseUrl(data.url);
//统一拼接域名接口
if (data.url.indexOf("http") == -1) {
data.url = context.manage + data.url;
}
let requestData = {
url: data.url,
data: reqData,
method: data.method || "GET",
params: data.params || {},
onUploadProgress: data.onUploadProgress || null,
headers: data.headers || "",
responseType: data.responseType || "json"
};
return axios(requestData);
},
put(url, data, responseType) {
return this.request({url, data, method: 'PUT', responseType: responseType})
},
download(url) {
return this.request({ url, responseType: "arraybuffer" });
},
get(url, type) {
return this.request({ url, responseType: type });
},
post(url, data, params, responseType) {
return this.request({
url,
data,
params,
method: "POST",
responseType: responseType
});
},
remove(url) {
return this.request({ url, method: "DELETE" });
},
getContext() {
return context;
}
};