Blame view

src/utils/request.js 3.73 KB
renchao@pashanhoo.com committed
1

2
/*
3
 * @Description: 此文件主要创建 axios 实例,然后添加请求拦截器和响应拦截器
4
 * @Autor: renchao
5
 * @LastEditTime: 2024-01-22 17:02:42
6
 */
赵千 committed
7
import axios from 'axios'
renchao@pashanhoo.com committed
8
import Router from '@/router'
9
import { Message } from 'element-ui'
任超 committed
10
import { endLoadingSubCount } from './requestLoading'
11
import { getToken, setToken } from "@/utils/util";
12

赵千 committed
13 14
// create an axios instance
const service = axios.create({
15
    baseURL:
16 17
        process.env.NODE_ENV == "development"
            ? process.env.VUE_APP_BASE_API
18
            : window._config.baseUrl + "/",
19
    withCredentials: true,  //是否允许跨域
赵千 committed
20
    headers: {
21
        'Content-Type': 'application/json'
赵千 committed
22
    },
23
    timeout: 15000
赵千 committed
24 25 26 27 28
})

// request interceptor
service.interceptors.request.use(
    config => {
29
        if (process.env.NODE_ENV === 'development') {
yangwei committed
30
            const token = getToken()
31 32 33
            // 添加请求头
            if (token) {
                config.headers['Authorization'] = 'Bearer ' + token
34 35 36
            } else {
                config.headers.delete('Authorization')
            }
37
        }
38
        return config
赵千 committed
39 40
    },
    error => {
41 42 43
        // do something with request error
        console.log(error); // for debug
        return Promise.reject(error);
赵千 committed
44 45
    }
)
46
window.__isNeedLogin = true
赵千 committed
47 48 49
// response interceptor
service.interceptors.response.use(
    response => {
50
        /**
任超 committed
51
         *  对响应数据判断:
52 53 54 55 56
         *  如果成功返回数据,就通过return把数据返出去
         *  如果请求不成功,就在拦截器这里统一处理(组件的代码就不用关注错误的情况了)
         */
        if (response.status == 200) {
            return response.data;
57
        } else if (response.status == 2002) {
yangwei committed
58
            Message.error(response.message);
59 60
        } else {
            handleErrorData(response.status);
赵千 committed
61
        }
62
        return response;
赵千 committed
63 64
    },
    error => {
任超 committed
65
        endLoadingSubCount()
renchao@pashanhoo.com committed
66 67 68 69
        if (error.response.status === 401) {
            //todo: 需要解决 一个页面多个请求,刷新后此处会触发多次
            if (window.__isNeedLogin) {
                window.__isNeedLogin = false
70
                Message.error('token失效,请重新登录');
renchao@pashanhoo.com committed
71
                let locationUrl = window.location.protocol + '//' + window.location.host + window.location.pathname;
yangwei committed
72 73
                setToken(undefined)
                sessionStorage.removeItem('token')
renchao@pashanhoo.com committed
74 75 76
                if (window._config.casEnable) {
                    window.location.href = window._config.casBaseURL + '/logout?service=' + encodeURIComponent(locationUrl);
                } else {
renchao@pashanhoo.com committed
77
                    Router.replace({
renchao@pashanhoo.com committed
78 79
                        path: '/login',
                        query: {
yangwei committed
80
                            redirect: Router.currentRoute.fullPath
renchao@pashanhoo.com committed
81 82 83 84 85 86 87 88
                        }
                    })
                    return false
                }
            }
        } else {
            // 对响应错误做点什么
            Message({
89
                message: error.response.data.message,
renchao@pashanhoo.com committed
90 91 92 93 94
                type: 'error',
                duration: 5 * 1000,
                customClass: 'messageIndex'
            })
        }
95
        return Promise.reject(error);
赵千 committed
96 97
    }
)
98 99
//对错误信息的处理函数
function handleErrorData (errMes) {
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
    switch (errMes) {
        case 401:
            Message.error("未授权,请重新登录!");
            break;
        case 403:
            Message.error("拒绝访问");
            break;
        case 404:
            Message.error("很抱歉,资源未找到!");
            break;
        case 500:
            Message.error("服务器错误!");
            break;
        default:
            Message.error("服务正在联调中,请稍后!");
            break;
116 117
    }
}
赵千 committed
118
export default service
119

任超 committed
120