• vue的搭建项目


    请求的封装,先在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");
    

      

     

  • 相关阅读:
    gitlab + gitlab-runner 实现项目的自动化部署测试环境与打包
    docker 部署 zookeeper 集群
    CSS 使用id属性的规则
    SimpleXML使用详解
    PHP通用分页类
    MYSQL远程连接速度慢的解决方法
    远程连接mysql出现1045错误的解决办法
    Bootstrap 元素居中设置
    PHP 时间戳
    html代码/如何做到有横线无竖线的表格/或横线有颜色/竖线没颜色
  • 原文地址:https://www.cnblogs.com/gfweb/p/10026732.html
Copyright © 2020-2023  润新知