import Vue from 'vue' import axios from 'axios' import router from '@/router' import qs from 'qs' import merge from 'lodash/merge' import { clearLoginInfo } from '@/utils' const baseUrl = '/wx' // 设置请求的基础路径 // 创建axios实例 const http = axios.create({ timeout: 1000 * 30, // 设置请求超时为30秒 withCredentials: true, // 允许携带跨域请求的cookie headers: { 'Content-Type': 'application/json; charset=utf-8' // 默认请求头为json格式 } }) /** * 请求拦截器 * 在每个请求发送之前,加入token(从cookie中获取) */ http.interceptors.request.use(config => { config.headers['token'] = Vue.cookie.get('token') // 在请求头中加入token return config // 返回请求配置 }, error => { return Promise.reject(error) // 请求出错时,返回Promise拒绝 }) /** * 响应拦截器 * 对响应数据进行拦截处理 * 如果返回的状态码为401(未授权),则清除登录信息并跳转到登录页 */ http.interceptors.response.use(response => { if (response.data && response.data.code === 401) { // 判断返回的code是否为401,代表token失效 clearLoginInfo() // 清除登录信息 router.push({ name: 'login' }) // 跳转到登录页面 } return response // 返回响应数据 }, error => { return Promise.reject(error) // 响应出错时,返回Promise拒绝 }) /** * 请求地址处理函数 * @param {*} actionName 接口的名称,拼接成完整的URL * @returns {string} 拼接后的完整URL */ http.adornUrl = (actionName) => { // 在开发环境下,如果开启了代理,则请求路径会带上代理前缀 return baseUrl + actionName // 返回完整的请求URL } /** * get请求的参数处理 * @param {*} params 请求的参数对象 * @param {*} openDefultParams 是否开启默认参数 * @returns {object} 处理后的参数对象 */ http.adornParams = (params = {}, openDefultParams = true) => { const defaults = { 't': new Date().getTime() // 添加时间戳参数,防止缓存 } return openDefultParams ? merge(defaults, params) : params // 合并默认参数和传入的参数 } /** * post请求的数据处理 * @param {*} data 请求的数据对象 * @param {*} openDefultdata 是否开启默认数据 * @param {*} contentType 数据格式类型('json'或'form') * @returns {string} 处理后的数据 */ http.adornData = (data = {}, openDefultdata = true, contentType = 'json') => { const defaults = { 't': new Date().getTime() // 添加时间戳参数,防止缓存 } data = openDefultdata ? merge(defaults, data) : data // 合并默认数据和传入的数据 // 根据不同的contentType,处理数据格式 return contentType === 'json' ? JSON.stringify(data) : qs.stringify(data) } export default http // 导出axios实例,供其他模块使用