请求的封装,先在src下面创建一个utils的文件夹,文件夹里面有ajax.js loading.js index.js to

1 请求的封装 ajax文件 需要引入的文件在后面

/*
 * [page ajax]
 */
import qs from 'qs'
import axios from 'axios'
import { host } from '../config'
import $load from './loading'
import $toast from './toast'

const service = axios.create({
    baseURL: host,
    timeout: 6e4,
    validateStatus: x => x === 200
})

/**
 * 統一樣式的狀態碼處理
 * @param {any} h 囘調
 * @returns {null} 無
 */
const done = function(h){
    return this.then(h).catch(({ code, msg }) => {
        console.error('請求出錯啦 =>', code, msg)
    })
}


/**
 * 請求發送前處理
 * @param {any} o 配置前
 * @returns {object} 配置後
 */
const onsend = o => {
    // const token = $store.state.userInfo.Data.Token
	// this.$vux.loading.show({
	// 	text: '加载中'
	// });
    //$load.loadIn()
    if (typeof o.data === 'string'){
        o.headers[o.method]['Content-Type'] = 'application/json'
    }
    else if (Array.isArray(o.data)){
        const form = new FormData()

        Object.entries(o.data[0]).forEach(([ k, v ]) => {
            if (Array.isArray(v)){
                v.forEach(x => form.append(k, x))
            }
            else {
                form.append(k, v)
            }
        })

        o.data = form
    }
    else {
        o.data = qs.stringify(o.data)
    }

    // if (token){
    //     // o.headers.common.Authorization = token
    // }
    return o
}

/**
 * 請求成功囘調
 * @param {object} o 請求對象
 * @returns {object} 響應
 */
const onsuccess = o => {
    console.log('請求結果 =>', o.data)
    $load.loadOut()
    if (o.status !== 200){
        throw o.status
    }

    // 此處數據有後臺api數據格式決定
    const { success, message, data } = o.data

    if (success === true){
        return data
    }
    else if(success == false){
        return $toast(message)
    }

    throw {
        success,
        Message
    }
}

/**
 * 請求失敗囘調
 * @param {any} e 錯誤信息
 * @returns {any} 無
 */
const onerror = e => {
    $load.loadOut()
    const info = e.toString()
    const err = {
        Code: -1,
        Message: '请求失败'
    }

    if (info.includes('Network Error')){
        err.Message = '网络错误'
    }
    else if (info.includes('timeout of')){
        err.Message = '请求超时'
    }

    // console.log('error =>', e)
    $toast(err.Message)
    throw err
}

Promise.prototype.done = done
window.Promise.prototype.done = done
service.interceptors.request.use(onsend)
service.interceptors.response.use(onsuccess, onerror)

export default {
    $get: (url, params) => service.get(url, { params }),
    $pop: (url, params) => service.delete(url, { params }),
    $put: (url, o) => service.put(url, o),
    $post: (url, o) => service.post(url, o),
    $patch: (url, o) => service.patch(url, o),
    $form: (url, o) => service.post(url, [o]),
    $auth: url => service.get(url, { responseType: 'blob' }).then(o => ({
        key: o.headers.key,
        data: o.data
    }))
}

 index

// import filter from './filter'
import ajax from './ajax'
// import {elem} from './elem'
// import $bridge from './bridge.js'
import $toast from './toast.js'
import $load from './loading'

const $pick = (o = {}, b) => {
    if (!(o instanceof Object)){
        throw 'The parameter only can be an object'
    }

    return Object.entries(o).reduce((p, [ k, v ]) => {
        if (b && typeof v === 'boolean' || v){
            p[k] = v
        }

        return p
    }, {})
}

export default {
    /* 注册插件 */
    install(Vue, { store, router }) {
        /* 路由设置 */
        router.beforeEach((to, from, next) => {
            next()
        })
        router.afterEach(() => {
            window.scrollTo(0, 0)
        })

        /* 添加过滤器 */
        //  Object.entries (filter).forEach(f => Vue.filter(...f))
        /* 添加UI组件 */
        //  Object.entries(elem).forEach(r => Vue.component(...r))

        /* 添加自定义属性/方法 */
        Object.assign(Vue.prototype, {
            ...ajax,
            // $bridge,
            $pick,
            $toast,
            $load
        })
    }
}

 loading.js文件

 /* eslint-disable */
 /* 
 * @Author: nooldey 
 * @Author-Email: <nooldey@gmail.com> 
 * @Date: 2018-03-18 16:50:34 
 * @Last Modified by: Matt
 * @Last Modified time: 2018-07-12 11:11:44
 * @Description: 加载中提示
 */

/**
 * 打開加載動畫
 * @param {string} [text='正在加载...'] 提示文字
 * @returns {Null} 無
 */
const loadIn = (text = '') => {
    if (window.spin){
        return
    }

    window.spin = document.createElement('div')
    window.spin.className = 'ui-spin'
    window.spin.innerHTML = `<div class="spin"><i></i><span>${ text }</span></div>`
    document.body.appendChild(window.spin)
}

/**
 * 關閉加載動畫
 * @returns {Null} 無
 */
const loadOut = () => {
    if (!window.spin){
        return
    }

    window.spin.classList.add('fade-out')
    setTimeout(() => {
        try {
            document.body.removeChild(window.spin)
        }
        catch(e){}
        finally {
            if (window.spin){
                delete window.spin
            }
        }
    }, 250)
}

export default {
	loadIn,
    loadOut
}

  toast文件

/**
 *
 *
 * @param {String} t 提示文字
 * @param {Function} fn 回调函数
 * @returns {null} 无
 */
const toast = (t, fn) => {
    if (window.toast){
        return
    }

    const tip = document.createElement('div')
    tip.className = 'ui-toast'
    tip.innerHTML = `<p>${ t }</p>`
    document.body.appendChild(tip)
    setTimeout(() => tip.classList.add('active'), 0)
    window.toast = tip

    setTimeout(() => {
        // if (!window.toast){
        //     return
        // }

        tip.classList.remove('active')
        setTimeout(() => {
            try {
                document.body.removeChild(tip)
            }
            catch(e){}
            finally {
                window.toast = null
            }

            fn && fn()
        }, 300)
    }, 1500)
}

export default toast

  最后在main.js里面使用他

 前端获取Token,后台需要配置

Access-Control-Expose-Headers : 'Authorization'
response.setHeader("Cache-Control","no-store");

  

 

posted on 2018-11-27 15:42  菜鸡H  阅读(220)  评论(0编辑  收藏  举报