http-request.js 4.22 KB
import axios from 'axios'
import { APP } from '@/config'
import store from '@/store'
import { Modal } from 'antd'
import { downFile } from './utilts'

class HttpRequest {
    constructor(baseUrl, loginUrl = APP.loginPath) {
        this.baseUrl = baseUrl
        this.loginUrl = loginUrl
        this.header = { ...APP.header }
        this.instance = null
        this.init()
    }
    /** 初始化 */
    init() {
        let instance = axios.create({ baseURL: this.baseUrl, headers: this.header })
        this.interceptors(instance)
        this.instance = instance
    }

    /** 绑定请求拦截器 */
    interceptors(instance) {
        // 请求
        instance.interceptors.request.use(config => {
            return config
        }, error => {
            if (process.env.NODE_ENV === 'development') console.error(error)
            return Promise.reject(error)
        })

        // 响应
        instance.interceptors.response.use(res => {
            return this.handleRespone(res)
        }, error => {
            if (process.env.NODE_ENV === 'development') console.error(error)

            return Promise.reject(error.response ?
                `发生错误!状态码:${error.response.status}${error.response.message || error.response.data.message}`
                : error.message + "")
        })

    }

    /** 请求 */
    async request(options) {
        return this.instance(options)
    }

    /**
     * 可取消的请求,返回一个source对象对象。可通过 source.cancel(msg) 取消此请求
     * @param {*} options
     * @param {function} successCallback
     * @param {function} errorCallback
     */
    sourceRequest(options, successCallback, errorCallback) {
        const source = axios.CancelToken.source()
        options = Object.assign(options, { cancelToken: source.token })
        this.instance(options)
            .then(successCallback)
            .catch(errorCallback)
        return source
    }

    /**
     * 设置请求头
     * @param {string} key
     * @param {any} value
     */
    setHeader(key, value) {
        this.instance.defaults.headers.common[key] = value
    }

    /**
     * 设置URL
     * @param {string} url
     */
    setBaseUrl(url) {
        this.instance.defaults.baseURL = url
    }

    /**
     * 处理响用体
     * @param {response} res
     */
    handleRespone(res) {

        if (res.headers['content-type'] && res.headers['content-type'].indexOf('download') !== -1 && !res?.data?.code) return downFile(res)
        if (res.headers['content-type'] && res.headers['content-type'].indexOf('excel') !== -1 && !res?.data?.code) return downFile(res)

        if (res.data.type === 'multipart/form-data' && res.data.size) return res
        if (res.headers['content-type'] && res.headers['content-disposition']) return res

        if (!res.data) return res

        const { code, message, data, list } = res.data

        if (typeof code === 'undefined') return data

        if (typeof list !== 'undefined' && typeof data === 'undefined') return list

        switch (code) {
            case 0:
                return data ? data : { data, list }
            case "0":
                return data ? data : { data, list }
            case 200:
                return Array.isArray(data) ? data : (typeof data === 'object' ? { message, code, ...data } : { data, message })
            case 401:
                if (process.env.NODE_ENV === 'development') console.error(`发生错误,错误代码: ${code};详情:${message}`)
                store.dispatch.user.SYSTEM_OUT()
                Modal.error('未登录或登录状已失效,请重新登陆')
                return Promise.reject('未登录或登录状已失效,请重新登陆')
            case 403:
                if (process.env.NODE_ENV === 'development') console.error(`发生错误,错误代码: ${code};详情:${message}`, data)
                return Promise.reject(`发生错误!错误代码: ${code},无权限使用此功能`, data)
            default:
                if (process.env.NODE_ENV === 'development') console.error(`发生错误,错误代码: ${code};详情:${message}`, data)
                return Promise.reject(`发生错误!代码: ${code},${message}`, data)
        }
    }
}

export default HttpRequest