123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- "use strict";
- import Vue from 'vue';
- import axios from "axios";
- import constants from "@/utils/constants";
- import storage from "@/utils/storage";
- import { Notification, Loading } from 'element-ui'
- import Store from '@/store'
- import Api from '@/api'
- import Config from '@/config'
- import Router from '@/router'
- // Full config: https://github.com/axios/axios#request-config
- // axios.defaults.baseURL = process.env.baseURL || process.env.apiUrl || '';
- // axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
- // axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
- // 是否正在刷新的标记
- let isRefreshing = false
- // 重试队列,每一项将是一个待执行的函数形式
- let retryRequests = []
- let loadingInstance = {}
- let config = {
- baseURL: Config.baseURL,
- // timeout: 60 * 1000, // Timeout
- // withCredentials: true, // Check cross-site Access-Control
- retries:3
- };
- const _axios = axios.create(config);
- _axios.interceptors.request.use(
- async function (config) {
- // Do something before request is sent
- const token = storage.getStr(constants.token)
- if (token) {
- // config.headers[constants.tokenHeader] = token
- }
- config.headers['x-project-id'] = Store.getters.projectId || ''
- if (config.loading) {
- loadingInstance = Loading.service({})
- }
- //重试
- if(config.retry){
- config.timeout = 5000
- }
- return config;
- },
- function (error) {
- // Do something with request error
- return Promise.reject(error);
- }
- );
- // Add a response interceptor
- _axios.interceptors.response.use(
- function (response) {
- const config = response.config
- if (config.loading) {
- loadingInstance.close()
- }
- let { code, message } = response.data
- if (code === 200 || config.responseType === 'blob') {
- isRefreshing = false
- return response.data
- }
- if (code === 401) {
- Router.push({
- path: `/login`
- }).then(r => {})
- return Promise.reject(response.data)
- }
- if (code === 402 || code===201) {
- Notification.error({
- title: '权限不足',
- message: message
- })
- return Promise.reject(response.data)
- }
- if(code == 806){
- Notification.error({
- title: '账号未启用',
- message: message
- })
- return Promise.reject(response.data)
- }
- if (code === 500) {
- // TODO
- if(response.data == '未登录'){
- Router.push({
- path: `/login`
- }).then(r => {})
- }
- return Promise.reject(response.data)
- } else if (code === 0) {
- isRefreshing = false
- Notification.error({
- title: '请求错误',
- message: message
- })
- return Promise.reject(response.data)
- } else if (code !== 401) {
- }
- // Do something with response data
- // return response;
- },
- function (error) {
- const obj = error.config
- if(error.code =='ECONNABORTED' && obj.retry){
- obj.__retryCount = obj.__retryCount || 0
- // 检查是否达到最大重试次数
- if (obj.__retryCount >= config.retries) {
- return Promise.reject(error)
- }
- obj.isPagination = false
- // 增加重试计数器
- obj.__retryCount += 1
- // 创建一个新的Promise来处理每次重试之前等待一段时间
- const backoff = new Promise((resolve) => {
- setTimeout(() => {
- resolve('重新请求:' + obj.__retryCount)
- }, obj.timeout || 3000)
- })
-
- // 返回Promise,以便Axios知道我们已经处理了错误
- return backoff.then((txt) => {
- console.log(txt)
- obj.url = obj.url.replace('/api','')
- return _axios(obj)
- })
- }
- if(error.response.status == 404){
- Notification.error({
- title: '接口不存在',
- message: error.response.data.message
- })
- }else{
- // Do something with response error
- Notification.error({
- title: '系统错误',
- message: error.response.data.message
- })
- }
-
-
- isRefreshing = false
- return Promise.reject(error);
- }
- );
- Plugin.install = function (Vue) {
- Vue.axios = _axios;
- window.axios = _axios;
- Object.defineProperties(Vue.prototype, {
- axios: {
- get() {
- return _axios;
- }
- },
- $axios: {
- get() {
- return _axios;
- }
- },
- });
- };
- Vue.use(Plugin)
- export default _axios;
|