request.js 3.6 KB
Newer Older
何秀钢 已提交
1
import axios from 'axios' // 引入axios
2
import { ElMessage, ElMessageBox } from 'element-plus'
何秀钢 已提交
3
import { store } from '@/store'
4
import { emitter } from '@/utils/bus.js'
5

Mr.奇淼('s avatar
Mr.奇淼( 已提交
6
const service = axios.create({
7 8
    baseURL: import.meta.env.VITE_BASE_API,
    timeout: 99999
Mr.奇淼('s avatar
Mr.奇淼( 已提交
9
})
Mr.奇淼('s avatar
Mr.奇淼( 已提交
10 11 12
let acitveAxios = 0
let timer
const showLoading = () => {
13 14 15
    acitveAxios++
    if (timer) {
        clearTimeout(timer)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
16
    }
17 18 19 20 21
    timer = setTimeout(() => {
        if (acitveAxios > 0) {
            emitter.emit('showLoading')
        }
    }, 400)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
22
}
Mr.奇淼('s avatar
Mr.奇淼( 已提交
23

Mr.奇淼('s avatar
Mr.奇淼( 已提交
24
const closeLoading = () => {
25 26 27 28 29
        acitveAxios--
        if (acitveAxios <= 0) {
            clearTimeout(timer)
            emitter.emit('closeLoading')
        }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
30
    }
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
    // http request 拦截器
service.interceptors.request.use(
    config => {
        if (!config.donNotShowLoading) {
            showLoading()
        }
        const token = store.getters['user/token']
        const user = store.getters['user/userInfo']
        config.data = JSON.stringify(config.data)
        config.headers = {
            'Content-Type': 'application/json',
            'x-token': token,
            'x-user-id': user.ID
        }
        return config
    },
    error => {
        closeLoading()
        ElMessage({
            showClose: true,
            message: error,
            type: 'error'
        })
        return error
何秀钢 已提交
55 56
    }
)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
57

何秀钢 已提交
58
// http response 拦截器
Mr.奇淼('s avatar
Mr.奇淼( 已提交
59
service.interceptors.response.use(
60 61 62 63 64 65 66 67 68 69 70 71 72
    response => {
        closeLoading()
        if (response.headers['new-token']) {
            store.commit('user/setToken', response.headers['new-token'])
        }
        if (response.data.code === 0 || response.headers.success === 'true') {
            if (response.headers.msg) {
                response.data.msg = decodeURI(response.headers.msg)
            }
            return response.data
        } else {
            ElMessage({
                showClose: true,
P
piexlmax 已提交
73
                message: response.data.msg||decodeURI(response.headers.msg),
74 75 76 77 78 79 80 81 82 83 84 85 86
                type: 'error'
            })
            if (response.data.data && response.data.data.reload) {
                store.commit('user/LoginOut')
            }
            return response.data.msg ? response.data : response
        }
    },
    error => {
        closeLoading()
        switch (error.response.status) {
            case 500:
                ElMessageBox.confirm(`
K
krank 已提交
87 88 89
        <p>检测到接口错误${error}</p>
        <p>错误码<span style="color:red"> 500 </span>:此类错误内容常见于后台panic,请先查看后台日志,如果影响您正常使用可强制登出清理缓存</p>
        `, '接口报错', {
90 91 92 93 94 95 96 97 98 99 100
                        dangerouslyUseHTMLString: true,
                        distinguishCancelAndClose: true,
                        confirmButtonText: '清理缓存',
                        cancelButtonText: '取消'
                    })
                    .then(() => {
                        store.commit('user/LoginOut')
                    })
                break
            case 404:
                ElMessageBox.confirm(`
K
krank 已提交
101 102 103
          <p>检测到接口错误${error}</p>
          <p>错误码<span style="color:red"> 404 </span>:此类错误多为接口未注册(或未重启)或者请求路径(方法)与api路径(方法)不符--如果为自动化代码请检查是否存在空格</p>
          `, '接口报错', {
104 105 106 107 108 109 110
                    dangerouslyUseHTMLString: true,
                    distinguishCancelAndClose: true,
                    confirmButtonText: '我知道了',
                    cancelButtonText: '取消'
                })
                break
        }
K
krank 已提交
111

112 113
        return error
    }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
114 115
)

116
export default service