import axios from 'axios'
import Qs from 'qs'//(如果只是get请求就不需要引qs)//序列化插件
import md5 from 'js-md5';//加密插件
import router from '../src/router/index'
import JSONbig from 'json-bigint'
import messages from '../src/components/commonjs/common';
import {Loading} from 'element-ui'
import _ from 'lodash'//这里时用的防抖函数
import Vue from 'vue';
let loadingInstance; //loading 实例
let needLoadingRequestCount = 0; //当前正在请求的数量
axios.defaults.withCredentials = false; //false 不跨域 true 跨域 //是否允许携带cookie跨域
export default function(path, params, method = "GET", headerType = "json"){
let pending = []; // 声明一个数组用于存储每个请求的取消函数和axios标识
let cancelToken = axios.CancelToken;//用于取消已发送的请求
let removePending = (config) => {
for (let i in pending) {
if (pending[i].url === config.url.split('?')[0]) { // 在当前请求在数组中存在时执行取消函数
pending[i].f(); // 执行取消操作
pending.splice(i, 1); // 把pending记录删掉
}
}
}
let data = {};//baseURL = ""
let arrs = ['LoginUser','SendVerifyCode','GetEnterpriseListByTel','GetCompanys','SelectCompany','Logout']
function getfilter(){
return arrs.filter(item=>{
return path.indexOf(item)>-1
})
}
for(var i in params){//去除参数的空格
if (params.hasOwnProperty(i) === true){
if(typeof params[i] == 'string'){
if(params[i] !=''){
params[i] = params[i].trim();
}
// this.accountSearch[i] = this.accountSearch[i].trim();
}
}
}
let loading;
function showLoading() {
// card__body
//loadingInstance = null;
let main = document.querySelector('.el-card')
if (main) {
if (needLoadingRequestCount === 0 && !loadingInstance) {
loadingInstance = Loading.service({
target: main, text: '正在加载...', background: 'rgba(255,255,255,255,.7)'
});
}
needLoadingRequestCount++;
}
}
function closeLoading() {
Vue.nextTick(() => { // 以服务的方式调用的 Loading 需要异步关闭
needLoadingRequestCount--;
needLoadingRequestCount = Math.max(needLoadingRequestCount, 0); // 保证大于等于0
if (needLoadingRequestCount === 0) {
if (loadingInstance) {
hideLoading()
}
}
});
}
var hideLoading = _.debounce(() => {//防抖
loadingInstance.close();
loadingInstance = null;
}, 300);
let token = '';
var strCookies = document.cookie;
strCookies = strCookies.replace(/\s*/g,"");//去空格
//截取变成cookie数组
var array = strCookies.split(';');
for (let i = 0; i < array.length; i++) {
//将cookie截取成两部分
var item = array[i].split("=");
//判断cookie的name 是否相等
if (item[0] == 'access_token') {
axios.defaults.headers['Access-Token'] = item[1];
localStorage.setItem('Token',item[1]);
}
}
if(getfilter().length<=0){
var usermsg = JSON.parse(localStorage.getItem('usermsg'))||'';
axios.defaults.headers['Authorization'] = md5(usermsg.LoginUserID + localStorage.getItem('TokenStr'))+ '&'+new Date().getTime().toString()+'&'+usermsg.LoginUserID;
}else{
}
//设置请求头
if (method === 'POST') { //post请求
if (headerType === "json") {
axios.defaults.headers["Content-Type"] = 'application/json;charset=UTF-8'
data = params
} else{
axios.defaults.headers["Content-Type"] = 'application/x-www-form-urlencoded;charset=UTF-8'
data = Qs.stringify(params);
}
}else if(method === 'GET'){
axios.defaults.headers["X-Requested-With"] = 'XMLHttpRequest';
axios.defaults.headers["Access-Control-Allow-Origin"] = "*";
if (headerType == !'json') {
axios.defaults.headers["Content-Type"] = 'application/x-www-form-urlencoded;charset=UTF-8'
axios.defaults.headers["Access-Control-Allow-Origin"] = "*";
}
data = Qs.stringify(params);
path = path + '?' + data
data = {};
}
let headers = axios.defaults.headers;
// 请求拦截
axios.interceptors.request.use(function (config) {
showLoading();
removePending(config); // 在一个axios发送前执行一下判定操作,在removePending中执行取消操作
if(config.url.indexOf('Channel/SearchOne')<=-1){//在企业详情页 必须请求两次不同的数据
config.cancelToken = new cancelToken(function executor (c) { // 本次axios请求的配置添加cancelToken
pending.push({
url: config.url.split('?')[0],
f: c
});
})
}
return config;
}, function (error) {
return Promise.reject(error);
});
//响应拦截
axios.interceptors.response.use(response=>{
closeLoading();
removePending(response.config); // 在一个axios响应后再执行一下取消操作,把已经完成的请求从pending中移除
return response
},err=>{
closeLoading();
if (err && err.response) {
switch (err.response.status) {
case 400:
err.message = err.response.data.detail.issue;
messages.message.error(err.message)
break;
case 401:
localStorage.setItem('UserName','')
localStorage.setItem('ispagehead','')
localStorage.setItem('QYMC','')
localStorage.setItem('QYID','')
localStorage.setItem('isLogin','0')
localStorage.setItem('isLogins','0')
var exdate = new Date();
exdate.setDate(exdate.getDate() -1);
window.document.cookie = 'access_token=;path=/;expires='+exdate.toGMTString()
localStorage.setItem('usermsg','')
localStorage.setItem('TokenStr','')
localStorage.setItem('AccessToken','')
router.push({ path: '/'});
if(err.response.config.url.indexOf('Login/GetLoginUserInfo')>-1){
}else{
err.message = '登陆过期,请重新登录';
messages.message.error(err.message)
}
break;
case 403:
if(err.response.config.url.indexOf('Channel/GetAllSelect')>-1){
}else{
messages.message.error(err.message)
}
break;
case 404:
messages.message.error('请求出错(404)')
break;
case 408:
messages.message.error('请求超时(408)')
break;
case 412:
router.push({ path: '/SelectCompany'});
break;
case 470:
err.message = err.response.data.detail.issue;
messages.message.error(err.message)
break;
case 500:
//messages.message.error('服务器错误(500)')
break;
case 501:
// messages.message.error('服务未实现(501)')
break;
case 502:
messages.message.error('网络错误(502)')
break;
case 503:
messages.message.error('服务不可用(503)')
break;
case 504:
messages.message.error('网络超时(504)')
break;
case 505:
messages.message.error('HTTP版本不受支持(505)')
break;
}
}else if (err.__CANCEL__) {
//messages.message.error('操作过于频繁,稍后重试')
} else {
messages.message.error('连接服务器失败')
}
return Promise.reject(err)
})
const request = axios.create({
transformResponse: [function (data) {
return data//JdSONbig.parse(data)
}],
})
//发送请求
return new Promise((resolve,reject)=>{
axios({
url:path,
method,
data:params,
timeout:60000,
}).then(result=>{
resolve(result.data)
}).catch(err=>{
console.log(err.message)
if(err.message == 'Request failed with status code 401'){
localStorage.setItem('UserName','')
localStorage.setItem('ispagehead','')
localStorage.setItem('QYMC','')
localStorage.setItem('QYID','')
localStorage.setItem('isLogin','0')
localStorage.setItem('isLogins','0')
var exdate = new Date();
exdate.setDate(exdate.getDate() -1);
window.document.cookie = 'access_token=;path=/;expires='+exdate.toGMTString()
localStorage.setItem('usermsg','')
localStorage.setItem('TokenStr','')
localStorage.setItem('AccessToken','')
router.push({ path: '/'})
}else if(err.message == 'Request failed with status code 412'){
router.push({ path: '/SelectCompany'})
}else{
reject(err)
}
})
})
}