import axios from "axios"; import qs from "qs"; import { MessageBox, Notification } from "element-ui"; import router from "../router"; import Vue from "vue"; // 防止鉴权失效之后多次弹窗。 let unauthMsgBoxIsShow = false; const mdData = datas => { let nData = {}; if (!datas) return nData; Object.entries(datas).forEach(([key, val]) => { if (val === null || val === "null" || val === "") return; nData[key] = val; }); return nData; }; /** * errorCallback 请求失败的回调 * @param {Object} error 请求失败时的错误信息 */ const errorCallback = error => { let message = ""; if (error.response) { message = (error.response.data && error.response.data.message) || "服务错误"; } else if (error.request) { message = "请求错误"; if (error.message.indexOf("timeout") > -1) { message = "请求超时"; } } else { return error; } message = message.indexOf("###") !== -1 ? "参数错误" : message; Notification.error({ title: "错误提示", message }); return error; }; /** * errorDataCallback 请求成功,结果有误的回调 * @param {Object} error Response中的data信息 */ const errorDataCallback = error => { let message = error.message || "数据错误"; message = message.indexOf("###") !== -1 ? "参数错误" : message; if (error.code === 106) { if (unauthMsgBoxIsShow) return error; unauthMsgBoxIsShow = true; message = "身份验证失效,请重新登录"; MessageBox.confirm(message, "重新登陆?", { type: "warning", cancelButtonClass: "el-button--danger is-plain", confirmButtonClass: "el-button--primary", closeOnClickModal: false, closeOnPressEscape: false, showClose: false, callback: action => { unauthMsgBoxIsShow = false; if (action !== "confirm") return; Vue.ls.clear(); router.push({ name: "Login" }); } }); } else { Notification.error({ title: "错误提示", message }); } return error; }; /** * response format * { config, header, data, request, status, statusText } * */ /** * successCallback 请求成功的回调 * @param {Object} data Response中的data信息 */ const successCallback = data => { if (data.code === 200) { return data.data; } else { throw new Error(errorDataCallback(data)); } }; /** * get请求 * @param {String} url 请求地址 * @param {Object} datas 请求数据 */ const $get = (url, datas) => { const sqDatas = qs.stringify(mdData(datas), { arrayFormat: "brackets" }); url += "?" + sqDatas; return axios .get(url) .then(rep => { return successCallback(rep.data); }) .catch(error => { throw new Error(errorCallback(error)); }); }; /** * get请求 * @param {String} url 请求地址 * @param {Object} datas 请求数据 */ const $postParam = (url, datas, config = {}) => { const sqDatas = qs.stringify(mdData(datas), { arrayFormat: "brackets" }); url += "?" + sqDatas; return axios .post(url, {}, config) .then(rep => { return successCallback(rep.data); }) .catch(error => { throw new Error(errorCallback(error)); }); }; /** * post请求 * @param {String} url 请求地址 * @param {Object} datas 请求数据 */ const $post = (url, datas, config = {}) => { let sqDatas = {}; if (datas.constructor === Object) { sqDatas = mdData(datas); } else { sqDatas = datas; } return axios .post(url, sqDatas, config) .then(rep => { return successCallback(rep.data); }) .catch(error => { throw new Error(errorCallback(error)); }); }; /** * delete请求 * @param {String} url * @param {Object} datas */ const $del = (url, datas) => { let sqDatas = ""; if (datas) { sqDatas = qs.stringify(datas, { arrayFormat: "brackets" }); url += "?" + sqDatas; } return axios .delete(url) .then(rep => { return rep.data; }) .catch(error => { throw new Error(errorCallback(error)); }); }; /** * put 请求 * @param {String} url 请求地址 * @param {Object} datas 请求数据 */ const $put = (url, datas) => { let sqDatas = ""; if (datas) { sqDatas = qs.stringify(datas); } return axios .put(url, sqDatas) .then(rep => { return rep.data; }) .catch(error => { throw new Error(errorCallback(error)); }); }; /** * patch请求 * @param {String} url 请求地址 * @param {Object} datas 请求数据 */ const $patch = (url, datas) => { let sqDatas = ""; if (datas) { sqDatas = qs.stringify(datas); } return axios .patch(url, sqDatas) .then(rep => { return rep.data; }) .catch(error => { throw new Error(errorCallback(error)); }); }; export { $get, $postParam, $post, $del, $put, $patch };