You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

270 lines
9.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import axios from "axios";
import { Notification, MessageBox, Message, Loading } from "element-ui";
import store from "@/store";
import { getToken } from "@/utils/auth";
import errorCode from "@/utils/errorCode";
import { tansParams, blobValidate } from "@/utils/ruoyi";
import cache from "@/plugins/cache";
import { saveAs } from "file-saver";
import Cookies from "js-cookie";
import API from "@/api/index.js";
let downloadLoadingInstance;
// 是否显示重新登录
export let isRelogin = { show: false };
axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
// 创建axios实例
const service = axios.create({
// axios中请求配置有baseURL选项表示请求URL公共部分
// !本地使用
// baseURL: process.env.VUE_APP_BASE_API,
// !外地使用
baseURL: location.origin + process.env.VUE_APP_URL,
// 超时
timeout: 60000,
});
// request拦截器
service.interceptors.request.use(
(config) => {
// 是否需要设置 token
const isToken = (config.headers || {}).isToken == undefined ? true : false;
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
if (isToken) {
config.headers["Authentication"] = localStorage.getItem("MSSM-LIAONING__TOKEN");
}
// get请求映射params参数
if (config.method === "get" && config.params) {
let url = config.url + "?" + tansParams(config.params);
url = url.slice(0, -1);
config.params = {};
config.url = url;
}
if (
!isRepeatSubmit &&
(config.method === "post" || config.method === "put")
) {
const requestObj = {
url: config.url,
data:
typeof config.data === "object"
? JSON.stringify(config.data)
: config.data,
time: new Date().getTime(),
};
const sessionObj = cache.session.getJSON("sessionObj");
if (
sessionObj === undefined ||
sessionObj === null ||
sessionObj === ""
) {
cache.session.setJSON("sessionObj", requestObj);
} else {
const s_url = sessionObj.url; // 请求地址
const s_data = sessionObj.data; // 请求数据
const s_time = sessionObj.time; // 请求时间
const interval = 2000; // 间隔时间(ms),小于此时间视为重复提交
if (
s_data === requestObj.data &&
requestObj.time - s_time < interval &&
s_url === requestObj.url
) {
const message = "数据正在处理,请勿重复提交";
console.warn(`[${s_url}]: ` + message);
return Promise.reject(new Error(message));
} else {
cache.session.setJSON("sessionObj", requestObj);
}
}
}
return config;
},
(error) => {
Promise.reject(error);
}
);
// 响应拦截器
service.interceptors.response.use(
(res) => {
// console.log("响应数据",res)
// 未设置状态码则默认成功状态
const code = res.data.code || 200;
// 获取错误信息
const msg = errorCode[code] || res.data.msg || errorCode["default"];
// 二进制数据则直接返回
if (
res.request.responseType === "blob" ||
res.request.responseType === "arraybuffer"
) {
return res.data;
}
if (code === 401) {
if (!isRelogin.show) {
isRelogin.show = true;
MessageBox.confirm(
"登录状态已过期,您可以继续留在该页面,或者重新登录",
"系统提示",
{
confirmButtonText: "重新登录",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
localStorage.removeItem("Login_index");
localStorage.removeItem("loginName");
isRelogin.show = false;
location.href = `${location.origin}${process.env.VUE_APP_URL}/pharmaceuticals/singleSignOn/signOut`;
})
.catch(() => {
isRelogin.show = false;
});
}
return Promise.reject("无效的会话,或者会话已过期,请重新登录。");
} else if (code == 403) {
localStorage.removeItem("Login_index");
localStorage.removeItem("loginName");
location.href = `${location.origin}${process.env.VUE_APP_URL}/pharmaceuticals/singleSignOn/signOut`;
} else if (code === 500) {
Message({ message: msg, type: "error" });
return Promise.reject(new Error(msg));
} else if (code === 601) {
Message({ message: msg, type: "warning" });
return Promise.reject("error");
} else if (code !== 200) {
Notification.error({ title: msg });
return Promise.reject("error");
} else {
return res.data;
}
},
async(error) => {
// console.log(error);
// console.log(error.response)
let { message } = error;
// console.log(3333, message);
if (
message == "Request failed with status code 401" ||
message == "Request failed with status code 500"
) {
let Authentication = await API.login.frimLogin();
const originalRequest = error.config;
originalRequest.headers["Authentication"] = Authentication.data.result.userToken;
localStorage.setItem(
"Authentication",
Authentication.data.result.userToken
);
return axios.request(originalRequest);
// if (!isRelogin.show) {
// isRelogin.show = true;
// MessageBox.confirm(
// "登录状态已过期,您可以继续留在该页面,或者重新登录",
// "系统提示",
// {
// confirmButtonText: "重新登录",
// cancelButtonText: "取消",
// type: "warning",
// }
// )
// .then(() => {
// localStorage.removeItem("Login_index");
// localStorage.removeItem("loginName");
// localStorage.removeItem("Authentication");
// localStorage.removeItem("Ls-Token");
// isRelogin.show = false;
// location.href = `${location.origin}${process.env.VUE_APP_URL}/pharmaceuticals/singleSignOn/signOut`;
// })
// .catch(() => {
// isRelogin.show = false;
// });
// }
}
// if (message == "Network Error") {
// message = "后端接口连接异常";
// } else if (message.includes("timeout")) {
// message = "系统接口请求超时";
// } else if (message.includes("Request failed with status code")) {
// message = "系统接口" + message.substr(message.length - 3) + "异常";
// }
// Message({ message: message, type: "error", duration: 5 * 1000 });
return Promise.reject(error);
}
);
// 通用下载方法
export function download(file, name) {
downloadLoadingInstance = Loading.service({
text: "正在下载数据,请稍候",
spinner: "el-icon-loading",
background: "rgba(0, 0, 0, 0.7)",
});
console.log(file);
// return service
// .get(
// //process.env.VUE_APP_BASE_API +
// '/common/download/downloadmino?filename=' + file, {
// headers: { "Content-Type": "application/x-www-form-urlencoded" ,"Authorization":localStorage.getItem("MSSM-LIAONING__TOKEN"),"token":localStorage.getItem("Ls__Token")},
// responseType: "blob",
// })
// .then(async(resp) => {
// const isBlob = blobValidate(resp);
// if (isBlob) {
// const blob = new Blob([resp]);
// saveAs(blob, name);
// } else {
// const resText = await resp.text();
// const rspObj = JSON.parse(resText);
// const errMsg =
// errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
// Message.error(errMsg);
// }
// downloadLoadingInstance.close();
// console.log(resp);
// // let temp = document.createElement("a"); // 创建a标签
// // temp.download = name; // 设置下载名称
// // // 创建blob对象在javascript中blob代表一个二进制流对象不可修改
// // const blob = new Blob([resp.data], {
// // // 类型从响应头中获取
// // type: resp.headers["content-type"],
// // });
// // // 创建对象url并赋值给a标签
// // let URL = window.URL || window.webkitURL;
// // temp.href = URL.createObjectURL(blob);
// // // 手动触发点击事件
// // temp.click();
// // downloadLoadingInstance.close();
// })
// .catch((r) => {
// console.error(r);
// Message.error("下载文件错误!");
// downloadLoadingInstance.close();
// });
// 路径
// var url = ""
// // 会打开一个空白页下载,然后空白页消失,用户体验不好
// function download1() {
// window.open(url);
// }
// window.open(process.env.VUE_APP_BASE_API +
// '/common/download/downloadmino?filename=' + file,'这是我的文件',null,null)
const link = document.createElement("a");
link.setAttribute(
"href",
process.env.VUE_APP_BASE_API == undefined
? location.origin + process.env.VUE_APP_URL
: process.env.VUE_APP_BASE_API +
"/common/downloadmino/download?filename=" +
file
); //设置下载文件的url地址
link.download = name; //用于设置下载文件的文件名
link.click();
downloadLoadingInstance.close();
}
export default service;