fetch-api.js 4.11 KB
import axiosIns from 'axios';
import state from '@/store/state.js';
// 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;
let base = "";
const axios = axiosIns.create({
	// baseURL: process.env.VUE_APP_BASE_URL || "http://localhost:9101",
	baseURL: "http://localhost:9101",
	timeout: 5000
})

// 请求拦截器
// 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.data);
			}
		} else {
			return Promise.reject(response.data);
		}
	},
	// 服务器状态码不是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,
		sid
	} = params;
	let headers = {};
	if (sid) {
		let sessionId = state.userInfo && state.userInfo.sid ? state.userInfo.sid : "";
		headers = {
			headers: {
				sid: sessionId
			}
		}
	}
	return axios.get(`${base}${url}`, {
		params: data
	}, headers).then(res => res.data.content);
}

/**
 * 封装post方法
 * @param {*} params
 */
export const httpPost = params => {
	let {
		url,
		data,
		sid
	} = params;
	let headers = {};
	if (sid) {
		let sessionId = state.userInfo && state.userInfo.sid ? state.userInfo.sid : "";
		headers = {
			headers: {
				sid: sessionId
			}
		}
	}
	return axios.post(`${base}${url}`, data, headers).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);
}