Newer
Older
safe_production_front / src / api / indexGm.ts
dutingting 14 days ago 5 KB 优化
import axios from 'axios'
// import qs from 'qs'
import { ElLoading, ElMessage } from 'element-plus'
// import config from '../../public/config/config.json'
import router from '@/router/index'
import useUserStore from '@/store/modules/user'
import { log } from '@/utils/log'

// 错误码枚举
enum responseCode {
  success = 200, // 成功
  noPermission = 401, // 未授权
  error = 500, // 服务器异常
  hikSuccess = '0', // 海康成功
}
// 以下地址发生错误直接跳转至登录页
const toLoginPath = ['/sys/user/permission', '/sys/user/info']

// 跳转到登录页面
const toLogin = () => {
  useUserStore().logout()
  router.push({
    path: '/login',
    query: {
      redirect: router.currentRoute.value.path !== '/login' ? router.currentRoute.value.fullPath : undefined,
    },
  })
}

const request = axios.create({
  // baseURL: config.baseUrl,
  baseURL: window.localStorage.getItem('baseURL')!,
  // baseURL: import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY === 'true' ? '/proxy/' : import.meta.env.VITE_APP_API_BASEURL,
  timeout: 1000 * 60,
  responseType: 'json',
})

request.interceptors.request.use(
  (request) => {
    const userStore = useUserStore()
    /**
     * 全局拦截请求发送前提交的参数
     * 以下代码为示例,在请求头里带上 token 信息
     */
    if (userStore.isLogin && request.headers) {
      // request.headers.token = userStore.token
      request.headers.token = localStorage.getItem('token')
    }
    if (!userStore.isLogin && localStorage.getItem('tokenBak') === 'true') { // 未登录且url带token
      request.headers.token = localStorage.getItem('token')
    }

    // 是否将 POST 请求参数进行字符串化处理
    if (request.method === 'post') {
      // request.data = qs.stringify(request.data, {
      //   arrayFormat: 'brackets',
      // })
    }
    return request
  },
)

request.interceptors.response.use(
  (response) => {
    /**
     * 全局拦截请求发送后返回的数据,如果数据有报错则在这做全局的错误提示
     * 如果是文件直接返回整个response对象
     */
    if (response.data instanceof Blob) {
      return Promise.resolve(response)
    }
    else if (response.data.code !== responseCode.success && response.data.code !== responseCode.hikSuccess) {
      if (response.data.code === responseCode.noPermission) { // token失效状态跳转到登录页
        // toLogin()
        // if (useUserStore().isLogout === 0) {
        //   ElMessage.error(response.data.message || '发生错误')
        // }
        // useUserStore().toLogout()// 携带token
        const hrefIdx = localStorage.getItem('tokenBak')
        if (hrefIdx === 'true') {
          console.log('跳转到404')
          router.push({
            path: '/noPage',
          })
        }
        else {
          console.log('跳转到404以外其他页面')

          if (window.localStorage.getItem('systemType') === 'gm') {
            // token失效状态跳转到登录页
            // toLogin()
            router.push({
              path: '/noPage',
            })
          } else if (window.localStorage.getItem('systemType') === 'sm') {
            // sm走网关
            router.push({
              path: '/smGateway',
            })
          }
          if (useUserStore().isLogout === 0) {
            // ElMessage.warning(response.data.message || '发生错误')
            console.log(response.data.message || '发生错误')
          }
          useUserStore().toLogout()
        }
      }
      else if (response.data.code === 500 && response.data.message === '数据格式不正确' && response.data.data) {
        const mes = response.data.data.filter((item: any, index: number) => index < 2).join(',')
        // ElMessage.warning(mes)
        console.log(mes)
      }
      else if (response.data.code === 500 && response.data.msg) {
        // ElMessage.warning(response.data.msg)
        console.log(response.data.mes)
      }
      else {
        // 这里做错误提
        if (response.data.message) {
          // ElMessage.warning(`${response.data.message}` || '发生错误')
          console.log(`${response.data.message}` || '发生错误')
        }
        if (response.data.msg) {
          // ElMessage.warning(`${response.data.msg}` || '发生错误')
          console.log(`${response.data.msg}` || '发生错误')
        }
        const loadingInstance = ElLoading.service({})
        nextTick(() => {
          // Loading should be closed asynchronously
          loadingInstance.close()
        })
      }

      return Promise.reject(response.data)
    }
    else { // 成功
      return Promise.resolve(response.data)
    }
  },
  (error) => {
    // 处理文件下载的错误提示
    if (error.message) {
      let message = error.message
      if (message === 'Network Error') {
        message = '后端网络故障'
      }
      else if (message.includes('timeout')) {
        message = '接口请求超时'
      }
      else if (message.includes('Request failed with status code')) {
        message = `接口${message.substr(message.length - 3)}异常`
      }
      // ElMessage({
      //   message,
      //   type: 'warning',
      // })
      console.log(message)
    }
    return Promise.reject(error)
  },
)

export default request