import axios from 'axios'; // 引入axios //import QS from 'qs'; // 引入qs模块,用来序列化post类型的数据,后面会提到 import { Toast, Dialog } from 'vant'; import store from "@/store/index"; import i18n from '@/i18n'; import router from '@/router/router' import { signatureGenerate } from "@/utils/signatureUtil" class AxiosRequest { /** * @description Class AxiosRequest constructor. * @param {String} baseUrl Request base url. * @param {Object} headers Request headers config. * @param {Boolean} isLoading Request loading switch. */ constructor(baseUrl, headers, isLoading) { this.baseUrl = baseUrl; this.headers = headers; this.isLoading = isLoading; this.queue = {}; } /** * @description Get inside config. * @returns Inside config. */ getInsideConfig() { const config = { // alert: Axios default base url param is "baseURL" not is "baseUrl" ! baseURL: this.baseUrl, headers: this.headers, timeout: 10000 } return config; } /** * @description Destroy completed request. * @param {String} url The completed request. */ destroy(url) { delete this.queue[url]; if (!Object.keys(this.queue).length) { // Present request complete. // Remove request loading. if (this.isLoading) { Toast.clear(); } } } /** * @description The axios intercept. * @param {Function} instance Create axios get instance. * @param {String} url Request url. */ interceptors(instance, url) { // Request intercept. instance.interceptors.request.use( config => { var token = store.state.user.userInfo.token if (token) { if (!config.params) { config.params = {} } config.params.token = token; // console.log(config) // const METHOD = config.method.toUpperCase() // if (METHOD === 'GET') { // if (!config.params) { // config.params = {} // } // config.params.token = token; // } else if(METHOD === 'POST') { // if (!config.data) { // config.data = {} // } // config.data.token = token // } else { // // TODO // } } if (!Object.keys(this.queue).length) { if (this.isLoading) { // Add request loading. Toast.loading({ duration: 0, forbidClick: true, loadingType: "spinner", message: i18n.t('加载中...') }); } this.queue[url] = true; } // 获取请求头参数 const { timestamp, signature } = signatureGenerate() // 分别将签名、时间戳 至请求头 if (signature) config.headers["sign"] = signature if (timestamp) config.headers["tissuePaper"] = timestamp return config; }, error => { if (this.isLoading) { Toast.clear(); } return Promise.reject(error); } ); // Response intercept. instance.interceptors.response.use( result => { this.destroy(url); if (result.data.code == 0||result.data.code == 200) { return result.data; } else if (result.data.code == 401) { Dialog.confirm({ confirmButtonText: i18n.t('确定'), cancelButtonText: i18n.t('取消'), title: i18n.t('提示'), message: i18n.t('未实名认证,是否认证?'), beforeClose: (action, done) => { if (action === 'confirm') { done(); router.push({ path: '/authentication' }); } else { done(); } }, }); return result.data; } else if (result.data.code == 403) { router.replace({ path: '/login', query: { redirect: router.currentRoute.fullPath } }); store.commit('user/SET_OUT'); } else { if (result.data.msg != undefined) { Toast(i18n.t(result.data.msg)); } return Promise.reject(result.data); } }, error => { if (this.isLoading) { Toast.clear(); } if (error.code == 'ERR_NETWORK') { Toast({ message: 'ERR_NETWORK', type: 'fail', duration: 1000 }) } else if (error.code == 'ECONNABORTED') { //Toast({ message: 'Network Timeout', type: 'fail', duration: 2000 }) return Promise.reject(error); } // if (error.message.includes("timeout")) { // Toast.fail(i18n.t("网络超时!")); // } return Promise.reject(error); } ); } /** * @description Axios request function. * @param {Object} options Axios request options. * @returns Create axios get instance. */ request(options) { const instance = axios.create(); options = Object.assign(this.getInsideConfig(), options); this.interceptors(instance, options.url); return instance(options); } } export default AxiosRequest;