infly-libs
Version:
工具组件库
90 lines (78 loc) • 2.85 kB
JavaScript
import axios from "axios";
import Uts from "./Uts.js";
const baseURL = process.env.VUE_APP_BASE_API;
const { env } = Uts.getEnv() || {};
const isTestEnv = Uts.contain(["localhost", "infly-test"], env);
const isProdAPI = Uts.contain(["https://api.sutpay.com"], baseURL);
/**
* 创建封装的 axios 实例
* @param {Object} config 配置项
* @param {Function|String} config.getToken 获取 token 的函数或值
* @param {Function} config.onLogout 登出回调
* @param {Function} config.onNotify 通知回调
* @returns {AxiosInstance}
*/
export function createService({ getToken, onLogout, onNotify }) {
const service = axios.create({ baseURL });
/**
* 获取 token 字符串
*/
const resolveToken = () => {
return Uts.isFunction(getToken) ? getToken() : getToken;
};
/**
* 发送通知
*/
const handleNotify = ({ message, type = "error", duration = 5000 }) => {
if (Uts.isFunction(onNotify)) {
onNotify({ message, type, duration });
} else {
console.warn("[Notify]", message);
}
};
service.interceptors.request.use(
(config) => {
const Token = resolveToken();
if (Token) {
config.headers["Authorization"] = " JWT " + Token;
}
if (isTestEnv && isProdAPI) {
handleNotify({
message: `当前环境为测试环境,接口请求为正式环境接口,请暂停操作,检查构建文件`,
type: "error",
duration: 10 * 1000,
});
}
return config;
},
(error) => {
return Promise.reject(error);
}
);
service.interceptors.response.use(
(response) => response.data,
(error) => {
const errorInfo = error.response;
if (errorInfo) {
if ([401, 403].includes(errorInfo.status)) {
handleNotify({
message: `登录信息已过期(${errorInfo.status}), 请重新登录!`,
type: "error",
});
if (Uts.isFunction(onLogout)) {
onLogout("user/logout").then(() => {
location.href = "/login";
});
}
} else if (errorInfo.status === 500) {
handleNotify({
message: `服务器异常(${errorInfo.status}),请联系开发人员`,
type: "error",
});
}
}
return Promise.reject(error);
}
);
return service;
}