企业端
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.
 
 
 
 

216 lines
6.4 KiB

import axios from "axios";
import { Notification, MessageBox, Message } from "element-ui";
import store from "@/store";
import { getToken } from "@/utils/auth";
import errorCode from "@/utils/errorCode";
import { Encrypt } from "@/utils/encryp";
import { tansParams } from "@/utils/ruoyi";
import { getAcceptLanguage } from "@/utils/language";
import cache from "@/plugins/cache";
import { t } from "@/lang";
// 是否显示重新登录
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,
// 超时
timeout: 10000,
});
// request 拦截器
service.interceptors.request.use(
(config) => {
// 接口密码加密
const encryptUrls = [
"/merchant/merchantInfo",
"/merchant/merchantInfo/updateMerchantPwdAdmin",
"/business/businessUser",
"/business/businessUser/employee",
"/business/businessUser/resetPwd",
"/business/businessUser/profile/updatePwd",
];
if (encryptUrls.includes(config.url)) {
const encryptMap = [
"passwordHash",
"newPasswordHash",
"oldPassword",
"newPassword",
];
encryptMap.forEach((key) => {
if (config.data && config.data[key]) {
config.data[key] = Encrypt(config.data[key]);
}
if (config.params && config.params[key]) {
config.params[key] = Encrypt(config.params[key]);
}
});
}
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false;
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
if (getToken() && !isToken) {
config.headers["Authorization"] = "Bearer " + getToken();
}
console.log(`语言:${getAcceptLanguage()}`)
console.log("navigator.language =", navigator.language);
console.log("navigator.languages =", navigator.languages);
console.log("localStorage.language =", localStorage.getItem("language"));
config.headers["Accept-Language"] = getAcceptLanguage();
const clientTimeZone =
(Intl.DateTimeFormat &&
Intl.DateTimeFormat().resolvedOptions &&
Intl.DateTimeFormat().resolvedOptions().timeZone) ||
"Asia/Shanghai";
config.headers["X-Timezone"] = clientTimeZone;
console.log(`时区:${clientTimeZone}`)
// 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 requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
const limitSize = 5 * 1024 * 1024; // 限制存放数据 5M
if (requestSize >= limitSize) {
console.warn(
`[${config.url}]: ` +
"请求数据大小超出允许的 5M 限制,无法进行防重复提交验证。"
);
return config;
}
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 = 1000; // 间隔时间(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));
}
cache.session.setJSON("sessionObj", requestObj);
}
}
return config;
},
(error) => {
console.log(error);
return Promise.reject(error);
}
);
// 响应拦截器
service.interceptors.response.use(
(res) => {
// 未设置状态码则默认成功状态
const code = res.data.code || 200;
// 获取错误信息(优先后端返回,支持 i18n)
const msg = res.data.msg || errorCode[code] || 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(
t("request.reloginTip"),
t("common.tips"),
{
confirmButtonText: t("request.relogin"),
cancelButtonText: t("common.cancel"),
type: "warning",
}
)
.then(() => {
isRelogin.show = false;
store.dispatch("LogOut").then(() => {
location.href = "/index";
});
})
.catch(() => {
isRelogin.show = false;
});
}
return Promise.reject(t("request.invalidSession"));
}
if (code === 500) {
Message({ message: msg, type: "error" });
return Promise.reject(new Error(msg));
}
if (code === 601) {
Message({ message: msg, type: "warning" });
return Promise.reject("error");
}
if (code !== 200) {
Notification.error({ title: msg });
return Promise.reject("error");
}
return res.data;
},
(error) => {
console.log("err" + error);
let { message } = error;
if (message === "Network Error") {
message = t("request.backendConnectError");
} else if (message.includes("timeout")) {
message = t("request.requestTimeout");
} else if (message.includes("Request failed with status code")) {
message = t("request.apiErrorStatus", { status: message.substr(message.length - 3) });
}
Message({ message, type: "error", duration: 5 * 1000 });
return Promise.reject(error);
}
);
export default service;