fetch-api.js 3.84 KB
import axios from 'axios';
// import {
//   Toast
// } from 'vant';

function Toast(msg) {
  console.log("msg:", msg);
}

// axios的默认url
// axios.defaults.baseURL = ""

// 服务器地址
let base = process.env.REQUEST_DOMAIN || "http://localhost:9101";
// let base = COM.baseUrl;

// 请求拦截器
// axios.interceptors.request.use(
//   config => {
//     // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
//     // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
//     const token = "token"; //这里写入token
//     token && (config.headers.Authorization = token);
//     return config;
//   },
//   error => {
//     return Promise.error(error);
//   })

// 响应拦截器
axios.interceptors.response.use(
  response => {
    if (response.status === 200) {
      if (response.data.code === 200) {
        return Promise.resolve(response);
      } else {
        Toast(response.data.bizMsg);
        return Promise.reject(response);
      }
    } else {
      return Promise.reject(response);
    }
  },
  // 服务器状态码不是200的情况
  error => {
    if (error.response.status) {
      switch (error.response.status) {
        // 401: 未登录
        // 未登录则跳转登录页面,并携带当前页面的路径
        // 在登录成功后返回当前页面,这一步需要在登录页操作。
        case 401:
          router.replace({
            path: '/login',
            query: {
              redirect: router.currentRoute.fullPath
            }
          });
          break;
        // 403 token过期
        // 登录过期对用户进行提示
        // 清除本地token和清空vuex中token对象
        // 跳转登录页面
        case 403:
          Toast({
            message: '登录过期,请重新登录',
            duration: 1000,
            forbidClick: true
          });
          // 清除token
          localStorage.removeItem('token');
          store.commit('loginSuccess', null);
          // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
          setTimeout(() => {
            router.replace({
              path: '/login',
              query: {
                redirect: router.currentRoute.fullPath
              }
            });
          }, 1000);
          break;
        // 404请求不存在
        case 404:
          Toast({
            message: '网络请求不存在',
            duration: 1500,
            forbidClick: true
          });
          break;
        // 其他错误,直接抛出错误提示
        default:
          Toast({
            message: error.response.data.message,
            duration: 1500,
            forbidClick: true
          });
      }
      return Promise.reject(error.response);
    }
  }
);

//formDataHeaders设置
let formDataHeaders = {
  headers: {
    "Content-Type": "multipart/form-data"
  }
}

/**
 * 封装get方法
 * @param {*} params
 */
export const httpGet = params => {
  let {
    url,
    data
  } = params;
  return axios.get(`${base}${url}`, {
    params: data
  }).then(res => res.data.content);
}

/**
 * 封装post方法
 * @param {*} params
 */
export const httpPost = params => {
  let {
    url,
    data
  } = params;
  return axios.post(`${base}${url}`, data).then(res => res.data.content);
}


/**
 * 封装post方法
 * @param {*} params
 * data数据是 formdata格式
 * 例如:
 *          this.file = file
            let data = new FormData() //使用formData对象
            data.append('path', '/pro/mzczcradmin/')
            data.append('file', file.file)
 */
export const formdata = params => {
  let {
    url,
    data
  } = params;
  return axios.post(`${base}${url}`, data, formDataHeaders).then(res => res.data);
}