http-request.js 4.28 KB
import axios, { CancelToken } from 'axios'
import { APP } from '@/config'
import store from '@/store'
import { Modal } from 'antd'

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 => {
      // config.headers['Authorization'] = getToken()
      return config
    }, error => {
      if (process.env.NODE_ENV === 'development') console.error(error)
      return Promise.reject(error)
    })

    // 响应
    instance.interceptors.response.use(res => {
      if (res.headers['content-type'] && res.headers['content-type'].indexOf('download') !== -1) return res
      if (res.headers['content-type'] && res.headers['content-type'].indexOf('excel') !== -1) return res
      if (res.data.type === 'multipart/form-data' && res.data.size) return res
      if (res.headers['content-type'] && res.headers['content-disposition']) return 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 = 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.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:
        if (res.config.url.indexOf(this.loginUrl) !== -1) {
          this.saveLoginInfo(res.data) //保存登陆数据
        }
        return Array.isArray(data)?data:(typeof data === 'object' ? {message, code, ...data} : {data, message})
      // case 400001: 
      // 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}`)

        Modal.error({
          title: '登陆状态已过期,正在退出登陆'
        })
        // store.commit('SYSTEM_CLEAR') // 清除登陆状态
      break
      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)
    }
  }
  
  /**
   * 保存登陆数据
   * @param {*} jwt token
   * @param {*} data 请求数据体
   */
  saveLoginInfo(res) {
    store.dispatch.user.SYSTEM_LOGIN(res)
    store.dispatch.route.change(res.menu)
  }
}

export default HttpRequest