httpqueueManagement.js 4.28 KB
import axios from 'axios'
import qs from 'qs'
import * as Cookies from 'js-cookie'
import router from '@/router'
import Vue from 'vue'
import {
    loading,
    Message
} from 'element-ui'
import { param2 } from '@/utils'
import md5 from 'blueimp-md5'

// 创建 axios 的一个实例
const Axios = axios.create({
    baseURL: window._vionConfig.queuingUrl, // 因为我本地做了反向代理
    timeout: 0,
    // responseType: "json",
    // changeOrigin: true,//允许跨域
    withCredentials: true, // 是否允许带cookie这些
    headers: {
        "Content-Type": "application/json;charset=UTF-8"
            // 'Content-Type': 'application/x-www-form-urlencoded'
    }
})
window.axios = Axios;
var loadingStatus;
let store = {
    source: {
        token: null,
        cancel: null
    }
}

// 请求拦截器
Axios.interceptors.request.use(
    config => {
        const suffix = '4c413628731691abc99eb2fca5f69aab'
        const { method, params, data, url } = config
        let language = localStorage.getItem('lang'),
            aToken = Cookies.get('atoken');
        if (language) {
            let languageObj = {
                'mall_CN': 'zh-CN,zh;q=0.9',
                'zh_CN': 'zh-CN,zh;q=0.9',
                'en_US': 'en-US,en;q=0.5',
                'zh_TW': 'zh-TW,zh;q=0.3',
                // 'zh_ar': 'zh-AR,zh;q=0.9'
            }
            languageObj[language] && (config.headers['Accept-Language'] = languageObj[language]);
        }
        aToken && (config.headers.Authorization = aToken);
        config.cancelToken = store.source.token
        const signalStr = method.toUpperCase() +
            (params ? param2(params) : '') +
            (data ? JSON.stringify(data) : '') +
            suffix + (config.headers.Authorization ? config.headers.Authorization : '');

        const hashSignature = md5(signalStr)
        config.headers['signature'] = hashSignature
        return config;
    }, error => {
        Message({
            showClose: true,
            message: error,
            type: 'error.data.error.message'
        })
        return Promise.reject(error.data.msg)
    }
)

// 跳转路由打断请求
router.beforeEach((to, from, next) => {
        if (!to.matched.some(item => item.path === from.fullPath)) {
            let CancelToken = axios.CancelToken;
            store.source.cancel && store.source.cancel();
            store.source = CancelToken.source();
        }
        next()
    })
    // 响应拦截器
Axios.interceptors.response.use(
    res => {
        if (res.data && !res.data.success) {
            if (res.data.ecode && res.data.ecode != 200) {
                Vue.prototype.removeStorge()
                router.push({
                    path: '/'
                })
                Message({
                    showClose: true,
                    message: res.data.enote,
                    type: 'error'
                })
                return
            } else {
                // 非标准返回体
                if (res.status == 200) {
                    return res;
                }
            }
            if (res.data.code == 500) {
                Message({
                    showClose: true,
                    message: res.data.msg,
                    type: 'error'
                })
            }
            return Promise.reject(res.data.msg);
        } else if (!res.data && res.status == 200) {
            return res;
        } else if (res.data.success && res.config.method != 'get') {
            //
        }
        return res;
    }
    // , error => {
    //     return Promise.reject(error)
    // }
)

export default function(method, url, data = null, config = null, bodyDelete) {
    method = method.toLowerCase()
    if (method == 'post') {
        return Axios.post(url, data, config)
    } else if (method == 'get') {
        let defaultParam = {
            _t: Date.parse(new Date()) / 1000
        }
        return Axios.get(url, { params: {...defaultParam, ...data }, config })
    } else if (bodyDelete) {
        return Axios.delete(url, { data: data }, config)
    } else if (method == 'delete') {
        return Axios.delete(url, { params: data }, config)
    } else if (method == 'put') {
        return Axios.put(url, data, config)
    } else {
        console.error('unknown method' + method)
        return false
    }
}