request.js 3.21 KB
import axios from "axios";
import { getToken, removeToken } from "@/utils/auth";
import { Notification, MessageBox, Message, Loading } from 'element-ui'
import errorCode from '@/utils/errorCode'
import { tansParams, blobValidate } from "@/utils/index";
import define from '@/utils/define'
// 是否显示重新登录
export let isRelogin = { show: false };

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'

const service = axios.create({
    // axios中请求配置有baseURL选项,表示请求URL公共部分
    baseURL: process.env.VUE_APP_BASE_API + '/api',
    withCredentials: false,
    // 超时
    // timeout: define.timeout
})

//拦截器(请求,响应)
//请求
service.interceptors.request.use(config => {
    if (config.url.indexOf('http') > -1) config.baseURL = ''
    // 是否需要设置 token
    const isToken = (config.headers || {}).isToken === false
    // 是否需要防止数据重复提交
    const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
    // 判断token
    if (getToken() && !isToken) {
        config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    if (config.method === 'get' && config.params) {
        let url = config.url + '?' + tansParams(config.params);
        url = url.slice(0, -1);
        config.params = {};
        config.url = url;
    }
    if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
        const requestObj = {
            url: config.url,
            data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
            time: new Date().getTime()
        }
        const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
        const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
        if (requestSize >= limitSize) {
            console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制,无法进行防重复提交验证。')
            return config;
        }
    }
    return config
})
//响应
service.interceptors.response.use(res => {
    const code = res.data.code || 200;
    const msg = errorCode[code] || res.data.msg || errorCode['default']

    if (code === 401 || code == 600) {
        if (!isRelogin.show) {
            isRelogin.show = true;
            MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
                isRelogin.show = false;
                removeToken();
                location.href = '#/login';
            }).catch(() => {
                isRelogin.show = false;
            });
        }
    } else if (code === 500) {
        Message({ message: msg, type: 'error' })
        return Promise.reject(new Error(msg))
    } else if (code === 601) {
        Message({ message: msg, type: 'warning' })
        return Promise.reject('error')
    } else if (code !== 200) {
        Notification.error({ title: msg })
        return Promise.reject('error')
    } else {
        return res.data
    }
}, err => {
    //失败
    return Promise.reject(err)
})


export default service;