Skip to content
On this page

qApiPlugin

配置

import { router } from '@/router/index'
import qqtApi from '@qqt-product/api'
//项目api模块
import { CustomLoginModule } from '../api/index'
//pina
import { useUserStore } from '@/stores/user'
//TS
import { MapObject } from '@/types/index'
import type { InternalAxiosRequestConfig, AxiosResponse, AxiosRequestHeaders } from '@qqt-product/api'
import { message } from 'ant-design-vue'

function clearUserStore() {
  const userStore = useUserStore()
  const { setToken, setSrmVersion, setUserInfo, setCompanySet, setUserOrg } = userStore
  // 重置 user 状态管理Pinia
  setToken('')
  setSrmVersion('')
  setUserInfo({})
  setCompanySet({})
  setUserOrg({})
}

/*
常量
*/
const BASE_URL = '/els'
const TIME_OUT = 600000


const Funerr = (error: MapObject) => {
  const { push } = router
  const userStore = useUserStore()

  if (error.response) {
    // const data = error.response.data
    // const token = localStorage.getItem("TOKEN");
    // console.log("------异常响应------", token);
    console.log('------异常响应------', error.response.status)
    switch (error.response.status) {
      case 403:

        message.warning('拒绝访问')
        break
      case 520:
        if (userStore.token) {
          clearUserStore()
          message.warning(
            {
              content: '很抱歉,登录已过期,请重新登录!',
              onClose() {
                push('/user/login')
              },
            },
            2000,
          )
        }
        break
      case 404:
        // alert('很抱歉,资源未找到!')
        message.warning('很抱歉,资源未找到!')
        break
      case 504:
        // alert('网络超时')
        message.warning('网络超时')
        break
      case 401:
        message.warning('网络超时')
        break
      default:
        message.warning('网络超时')
        break
    }
  }
  return Promise.reject(error)
}

const resErr = (data: MapObject) => {
  const { push } = router
  const { code } = data
  if (code === 520 || code === 530) {
    clearUserStore()
    // alert(message)

    message.warning({
      content: data.message,
      onClose() {
        push('/user/login')
      },
    })
  } else if (code === 510) {
    // 接口权限拦截
    // clearUserStore()
    // alert(message)
    message.warning(data.message)
    // message.warning({
    //   content: data.message,
    //   onClose() {
    //     push('/user/login')
    //   },
    // })
  } else {
    return true
  }
}

const api = qqtApi.createApi({
  baseURL: BASE_URL,
  timeout: TIME_OUT,
  headers: {
    'Content-Type': 'application/json',
  },
  module: { CustomLoginModule },
  interceptors: {
    requestInterceptors: (config: InternalAxiosRequestConfig) => {
      const userStore = useUserStore()
      const configUrl = Number(config.url?.toString().indexOf('els/dict/findDictItems'))
      const language = localStorage.getItem('default_language') || 'zh'
      if (userStore.token) {
        if (!config.headers) {
          config.headers = <AxiosRequestHeaders>{}
        }

        config.headers['X-Access-Token'] = userStore.token || '' // 让每个请求携带自定义 token 请根据实际情况自行修改
        config.headers['language'] = language // 让每个请求携带自定义 token 请根据实际情况自行修改
      }

      if (configUrl < 0) {
        config.params = {
          _t: new Date().getTime() / 1000,
          ...config.params,
        }
      }

      return config
    },
    requestInterceptorsCatch: (err: MapObject) => {
      console.log('请求失败的拦截')
      return err
    },
    responseInterceptors: (res: AxiosResponse) => {
      resErr(res.data)
      return res.data
    },
    responseInterceptorsCatch: (err: MapObject) => {
      console.log('响应失败的拦截')
      Funerr(err)
      return err
    },
  },
})

export default api

该代码为v6包的配置方法,可以自行根据自己项目配置