import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import router from '@/router/index'
import { Loading } from 'element-ui'

let loading = null

// 创建axios
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // baseURL: process.env.VUE_APP_MOCK_API, // mock 地址
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 100000 // 超时
})

// 请求拦截
service.interceptors.request.use(
  config => {
    const lastTime = localStorage.getItem('lastTokenTime') // 最后请求时间
    const nowTime = Date.now() // 当前时间
    const loginTime = localStorage.getItem('loginTime') //  登录时间
    //  判断是否有登录  时间戳 60000等于1分钟
    if (loginTime && loginTime !== 0) {
      //  判断是否长时间登陆无操作 大于就是长时间无操作 14400000 4个小时 小于就判断更新token
      if (nowTime - lastTime > 14400000) {
        // 将登录的时间设置为0
        localStorage.setItem('loginTime', 0)
        // 调用store里的退出登录
        // store.dispatch('user/logout')
        // 刷新页面到login页面
        location.reload()

        //  最后请求的时间减去登录时间大于token限制时间 刷新token
      } else if (lastTime - loginTime > 14000000) {
        //  调用登录接口
        store.dispatch('user/refreshLogin')
        // 重新计算登录时间
        localStorage.setItem('loginTime', nowTime)
      }
    }
    if (config.method.toLocaleLowerCase() !== 'get') {
      config.data = config.params
      delete config.params
    }
    if (config.isDefaultLoading) {
      loading = Loading.service({
        background: 'rgba(0,0,0,0.2)'
      })
    }
    if (getToken()) {
      // 如果有token
      // 带上token
      config.headers['Authorization'] = getToken()
      config.headers['accessToken'] = getToken()
    }
    return config
  },
  error => {
    console.log(error)
    return Promise.reject(error)
  }
)

const errorTip = '服务器开小差啦~'
// 响应拦截
service.interceptors.response.use(
  response => {
    const res = response.data
    const dates = Date.now() //  获取当前时间戳
    localStorage.setItem('lastTokenTime', dates) //  临时存储最后操作时间
    if (response.config.isDefaultLoading) {
      loading.close()
    }
    switch (res.code) {
    case 10000:
      return res
    case 10403:
      Message({
        message: res.message || 'Token未授权',
        type: 'error'
      })
      router.replace({
        path: '/401'
      })
      return Promise.reject(res)
    case 10401:
      Message({
        message: res.message || 'token无效,请重新登录',
        type: 'error'
      })
      setTimeout(() => {
        store.dispatch('user/resetToken').then(() => {
          location.reload() //TODO 跳转登录页
        })
      }, 1000)
      return Promise.reject(res)
    default:
      console.log('res',res)
      Message({
        message: res.msg || res.error || errorTip,
        type: 'error'
      })
      return Promise.reject(res)
    }
  },
  error => {
    if (error.config.isDefaultLoading) {
      loading.close()
    }
    const errorData = error.response.data
    Message({
      message: errorData.msg || errorTip,
      type: 'error'
    })
    return Promise.reject(error)
  }
)

export default service

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐