import axios from 'axios'
import qs from 'qs'
// 引入配置文件
import baseConfig from '@/config/config.base'
// 创建一个请求对象
let axiosX = axios.create({
baseURL: baseConfig.DEV_API_URL
})
// request 拦截,带入登录凭证
axiosX.interceptors.request.use(
config => {
//登录成功时获取token
if (sessionStorage.getItem('token') && sessionStorage.getItem('token') !== '') {
config.headers['token'] = sessionStorage.getItem('token') // 请求头带上token
}
return config
},
err => {
return Promise.reject(err)
}
)
// response 拦截
axiosX.interceptors.response.use(
response => {
const code = response.data.code
// 如果未返回 body 体
if (!response.data) {
alert('系统繁忙!请稍后再试!')
}
// 如果登录信息失效
if (code === '0000002' || code === '0000001' || code === '1000') {
store.dispatch('auth/logout')
}
// 导出文件的时候
if (response.data instanceof Blob) {
return response
}
// 错误处理
if (+code !== 0) {
SG_Message.error()
}
// 成功则直接返回数据
return response.data
},
error => {
// 如果服务器返回500错误
if (error.response && error.response.status === 500) {
alert()
}
return Promise.reject(error)
}
)
/**
* @param {string} method 请求方法
* @param {string} url 请求地址
* @param {Object} params 请求参数
* @param {Boolean} loading loading 状态
* @param {Boolean} stringify 是否格式化参数
*/
function XHR(url, { method = 'get', params = {}, loading = false, stringify = true, options = {} }) {
// 格式化参数
let fromData = method === 'get' ? { params, ...options } : params
// 如果开启格式参数,且请求为 post
if (method === 'post' && stringify) {
fromData = qs.stringify(fromData)
}
// 启用loading
let loadingName
// 全局加载组件
if (loading) loadingName = loading()
// 返回结果
return new Promise((resolve, reject) => {
axiosX[method](url, fromData, options).then(res => {
// 销毁加载组件
if (loadingName) destroy(loadingName)
resolve(res)
}).catch(error => {
if (loadingName) destroy(loadingName)
reject(error)
})
})
}
/**
* GET 请求
* @param {String} url 地址
* @param {Object} params 参数
* @param {Boolean} loading 加载状态,默认开启
* @param {Object} options 请求头设置
*/
export function axiosGet(url, params, loading = false, options) {
return XHR(url, { method: 'get', params, loading, options })
}
/**
* POST 请求
* @param {String} url 地址
* @param {Object} params 参数
* @param {Boolean} loading 加载状态,默认开启
* @param {Boolean} stringify 是否格式化参数
* @param {Object} options 请求头设置
*/
export function axiosPost(url, params, loading = false, stringify = false, options) {
return XHR(url, { method: 'post', params, loading, options, stringify })
}
export default function (Vue) {
// 注入未封装的原始请求
Vue.prototype.$axios = axiosX
// 注入封装好的请求
Vue.prototype.$http = {
get: axiosGet,
post: axiosPost
}
}