// 配置API接口地址 // var root = '/api/v1' // var root = '/api/debugapi' var root = "/api"; // var root = '' // 引用axios var axios = require("axios"); // import Notice from 'iview/src/components/notice'; import { Message } from "view-design"; // 自定义判断元素类型JS function toType(obj) { return {}.toString .call(obj) .match(/\s([a-zA-Z]+)/)[1] .toLowerCase(); } // 参数过滤函数 function filterNull(o) { for (var key in o) { if (o[key] === null) { delete o[key]; } if (toType(o[key]) === "string") { o[key] = o[key].trim(); } else if (toType(o[key]) === "object") { o[key] = filterNull(o[key]); } else if (toType(o[key]) === "array") { o[key] = filterNull(o[key]); } } return o; } /* 接口处理函数 这个函数每个项目都是不一样的,我现在调整的是适用于 https://cnodejs.org/api/v1 的接口,如果是其他接口 需要根据接口的参数进行调整。参考说明文档地址: https://cnodejs.org/topic/5378720ed6e2d16149fa16bd 主要是,不同的接口的成功标识和失败提示是不一致的。 另外,不同的项目的处理方法也是不一致的,这里出错就是简单的alert */ function apiAxios(method, url, params, success, failure) { let conentTypeIsJosn = false; if (params && typeof params != "string") { params = filterNull(params); } else conentTypeIsJosn = true; // if (!window.location.origin) { // window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: ''); // } // let redirectUrl=window.location.origin + window.location.hash.replace('#','/xiaoxi/#'); // console.log(window.location); axios({ method: method, url: url, data: method === "POST" || method === "PUT" ? params : null, params: method === "GET" || method === "DELETE" ? params : null, baseURL: root, withCredentials: true, crossDomain: true, transformRequest: [ function (data) { // Do whatever you want to transform the data if (conentTypeIsJosn) return data; let ret = ""; for (let it in data) { ret += encodeURIComponent(it) + "=" + encodeURIComponent(data[it]) + "&"; } return ret; }, ], headers: { // 'Content-Type': 'application/x-www-form-urlencoded', "Content-Type": conentTypeIsJosn ? "application/json" : "application/x-www-form-urlencoded", // bschapirequest: 1, yschapirequest:1, yschreferer: strToHexCharCode(window.location.href), }, }) .then(function (res) { let response = res.data; if (response.code == 302) { window.location.href = response.urlToRedirectTo; return; } else if (response.code == 0) { if (success) { success(response); } }else if (response.code == 4) { Message.error(response.msg); //错误处理 } else { if (failure) { failure(response); } else { if (response.data == 2) { Message.error(response.msg); //错误处理 setTimeout(() => { location.reload(); }, 1000); } else { Message.info(response.msg); //错误处理 } } } }) .catch(function (err) { let res = err.response; console.error(res || err); if (res) { Message.destroy(); clearTimeout(tiemObj); if (res.data.msg) { Message.error(res.data.msg); //错误处理 } else { Message.error("网络请求出错"); //错误处理 } return; } }); } //字符串的16进制表达 function strToHexCharCode(_str) { if (_str === "") return ""; var hexCharCode = []; for (var i = 0; i < _str.length; i++) { var str = _str.charCodeAt(i).toString(16); if (_str.length == 1) str += "0" + _str; hexCharCode.push(str); } return hexCharCode.join(""); } let requestCount = 0, tiemObj; // http request 拦截器 axios.interceptors.request.use(config => { requestCount++; if (requestCount == 1) { tiemObj = setTimeout(() => { Message.loading({ content: "加载中...", duration: 0 }); }, 800); } // if (localStorage.getItem("currentRole")) // config.headers["currentRole"] = localStorage.getItem("currentRole"); if (localStorage.getItem("currentRole")) { let currentRole = localStorage.getItem("currentRole"); config.headers["currentrole"] = currentRole; let { schId, roleId, userId, childId } = JSON.parse(decodeURIComponent(currentRole)); // config.headers["schoolId"] = schId; // config.headers["userId"] = userId; // config.headers["roleId"] = roleId; if (roleId == 3) { config.headers["userId"] = childId; } sessionStorage.setItem("userId",userId); } if(sessionStorage.getItem("uType")){ config.headers["uType"] = sessionStorage.getItem("uType"); } return config; }); // http response 拦截器 axios.interceptors.response.use(response => { requestCount--; if (requestCount === 0) { setTimeout(() => { Message.destroy(); }, 1500); clearTimeout(tiemObj); } return response; }); // axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; // axios.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8'; // axios.defaults.withCredentials = true // 返回在vue模板中的调用接口 export default { get: function (url, params, success, failure) { return apiAxios("GET", url, params, success, failure); }, post: function (url, params, success, failure) { return apiAxios("POST", url, params, success, failure); }, put: function (url, params, success, failure) { return apiAxios("PUT", url, params, success, failure); }, delete: function (url, params, success, failure) { return apiAxios("DELETE", url, params, success, failure); }, };