若依封装的request.js

import axios from 'axios'
import { Notification, MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import { tokenName } from '@/settings'
import { encrypt } from '@/utils/jsencrypt'
import { generatekey, aesEncrypt } from '@/utils/aes'
import { Loading } from 'element-ui';

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';

// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项,表示请求URL公共部分
  baseURL: process.env.VUE_APP_BASE_API,
  // 超时
  timeout: 10000
});

// 等待框实例
let requestLoading = undefined;

// request拦截器
service.interceptors.request.use(config => {
  // 扩展参数
  let extCfg = config.extCfg || {};
  // 是否需要设置 token
  const isToken = (config.headers || {}).isToken === false;
  if (getToken() && !isToken) {
    config.headers[tokenName] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  }
  // 是否加密传输
  if (extCfg && extCfg.security === true) {
    config.headers["security"] = "securityData";
    const contentType = config.headers['Content-Type'] || "application/json;charset=UTF-8";
    const aesKey = generatekey(16);
    let newData = {
      key: encrypt(aesKey),
      data: aesEncrypt(JSON.stringify(config.data), aesKey)
    }
    if (contentType.indexOf("/json") > 0 && config.method && config.method.toLocaleUpperCase !== "GET") {
      newData = JSON.stringify(newData);
    }
    config['data'] = newData;
  }
  // 不启动Loading框
  if (extCfg && extCfg.noLoading !== true) {
    requestLoading = Loading.service({
      fullscreen: true,
      text: '数据加载中......',
      spinner: 'el-icon-loading',
      background: 'rgba(0, 0, 0, 0.7)'
    });
  }
  return config
}, error => {
  if (requestLoading) {
    requestLoading.close();
  }
  console.log(error)
  Promise.reject(error)
});

// 响应拦截器
service.interceptors.response.use(res => {
  if (requestLoading) {
    requestLoading.close();
  }
  // 未设置状态码则默认成功状态
  const code = res.data.code || 200;
  // 获取错误信息
  const msg = res.data.msg || errorCode[code] || errorCode['default'];
  if (code === 401 || code === '401') {
    MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
      confirmButtonText: '重新登录',
      cancelButtonText: '取消',
      type: 'warning'
    }).then(() => {
      store.dispatch('LogOut').then(() => {
        location.reload();
      })
    })
  } else if (code === 500 || code === '500') {
    Message({
      message: msg,
      type: 'error'
    })
    return Promise.reject(new Error(msg))
  } else if (code !== 200 && code !== '200') {
    Notification.error({
      title: msg
    });
    return Promise.reject(new Error(msg));
  } else {
    return res.data
  }
},
  error => {
    console.log('err' + error)

    if (requestLoading) {
      requestLoading.close();
    }

    let { message } = error;
    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) + "异常";
    }
    Message({
      message: message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
);

export default service

 

posted @ 2022-09-14 11:27  鼓舞飞扬  阅读(1061)  评论(0编辑  收藏  举报