uniappフレームワーク構成(ブロッキング、ドメイン間)および使用


uniappプロジェクトを作成するだけでデフォルトの構成がありますが、ドメイン間の問題などを解決するため、プロジェクトの構成とパッケージを構築する必要があります.

1.基本構成


ルートディレクトリにcommonフォルダを新規作成し、utilを構成します.js 、 request.js 、 config.jsはオンデマンドで構成できます.以下に内容を添付します.
  • util.js
  • /**
     *           
     *          (     )       
     * @param {Object} obj -       
     * @returns {string} -          
     **/
    export function formatGetUri(obj, Object) {
    	// const params: Array < string >= []
    	const params = []
    	Object.keys(obj).forEach((key) => {
    		let value = obj[key]
    		if (typeof value !== 'undefined' || value !== null) {
    			params.push([key, encodeURIComponent(value)].json('='))
    		}
    	})
    	return '?' + params.join('&')
    }
    
    //     
    export function convertSerialize(data){
        let list = [];
        Object.keys(data).forEach(ele => {
            list.push(`${ele}=${data[ele]}`)
        })
        return list.join('&');
    }
    
  • request.js
  • import {convertSerialize} from './util.js'
    import store from '../store/index.js'
    const request = {}
    const headers = {}
    
    request.globalRequest = (url, method, data, power) => {
    	let header = {}
    	/**
    	 *     
    	 */
    	switch (power) {
    		case 0:
    			headers['Authorization'] = 'Bearer' + uni.getStorageSync('token')
    			//     token           
    			headers['refresh_token'] = false
    			break
    		case 1:
    			headers['Authorization'] = 'Basic a3N1ZGk6a3N1ZGk='
    			break;
    		case 2:
    			headers['Authorization'] = 'Basic a3N1ZGlfcGM6a3N1ZGlfcGM='
    			break;
    		case 3:
    			responseType = 'blob'
    			break;
    		case 4:
    			header = {
    				'content-type': "application/x-www-form-urlencoded;charset=utf-8"
    			}
    			break;
    		default:
    			break;
    	}
    	//      
    	const obj = {
    		orgId: uni.getStorageSync('orgId') || 0,
    		userId: uni.getStorageSync('userId') || 0,
    		operator: uni.getStorageSync('loginName') || '  ',
    		timestamp: new Date().getTime()
    	}
    
    	let JSONParams = {
    		url: url,
    		method: method,
    		data: { ...obj,
    			...data
    		},
    		dataType: 'JSON',
    		header: header,
    	}
    
    	if (power != 4) {
    		JSONParams = {
    			url: url,
    			method: method,
    			data: { ...obj,
    				...data
    			},
    			dataType: 'JSON',
    			header: headers,
    		}
    	}
    
    	return uni.request(JSONParams).then(res => {
    		if (res[1]) {
    			//TODO             
    			if (res[1].statusCode == 200) {
    				// #ifdef H5
    				return res[1].data
    				// #endif
    
    				// #ifdef MP-WEIXIN
    				return JSON.parse(res[1].data)
    				// #endif
    
    				// #ifdef APP-PLUS
    				return res[1].data
    				// #endif
    			} else if (res[1].statusCode == 401 && !headers.refresh_token) {
    				//    401      
    				const {url, method, data} = JSONParams
    				headers.refresh_token = true
    				return store.dispatch('refreshToken').then(res=>{
    					uni.setStorageSync('token',res)
    					return request.globalRequest(url, method, data, 0)
    				})
    			} else if (res[1].statusCode == 403) {
    				//    403 token      ,   
    				uni.redirectTo({
    					url: '/pages/public/login'
    				})
    			} else {
    				//    
    				throw res[1].data
    			}
    		}
    	}).catch(params => {
    		switch (params.code) {
    			case 401:
    				uni.clearStorageSync()
    				break
    			default:
    				uni.showToast({
    					title: params.message,
    					icon: 'none'
    				})
    				return Promise.reject()
    				break
    		}
    	})
    }
    
    export default request
    

    ここでは更新に使用します.ついでにこの機能を追加します.必要でない場合は削除できます.ブロッカーブロック401の前にstoreエントリファイルに操作を追加する必要があります.place look
    import Vue from 'vue'
    import Vuex from 'vuex'
    import api from '../api/index.js'
    Vue.use(Vuex)
    
    const store = new Vuex.Store({
    	state: {},
    	actions: {
    		async refreshToken(store) {
    			let token = uni.getStorageSync('token')
    			let refresh_Token = uni.getStorageSync('refreshToken')
    			let params = {
    				access_token: token,
    				refresh_token: refresh_Token,
    				grant_type: 'refresh_token',
    				client_id: 'flying',
    				client_secret: 'yaohw',
    			}
    			//  
    			let newToken = await api.user.login(params)
    			return newToken.value
    		}
    	}
    })
    
    export default store
    
  • config.js(h 5、app、ウィジェット対応)
  • let UAC_URL = ""
    let DT_WB_URL = ""
    //       manifest.json   ,    
    let DEFAULT_UAC_URL = "http://192.168.0.125:9101"
    let DEFAULT_DT_WB_URL = "http://192.168.0.125:9102"
    
    if (process.env.NODE_ENV === 'development') {
    	// #ifdef H5
    	UAC_URL = '/uac'
    	DT_WB_URL = '/lift'
    	// #endif
    
    	// #ifdef MP-WEIXIN
    	UAC_URL = DEFAULT_UAC_URL
    	DT_WB_URL = DEFAULT_DT_WB_URL
    	// #endif
    
    	// #ifdef APP-PLUS
    	UAC_URL = DEFAULT_UAC_URL
    	DT_WB_URL = DEFAULT_DT_WB_URL
    	// #endif
    
    } else {
    	UAC_URL = DEFAULT_UAC_URL
    	DT_WB_URL = DEFAULT_DT_WB_URL
    }
    
    export default {
    	UAC_URL,
    	DT_WB_URL
    }
    

    2.manifest.jsonソースの構成を試みる

    {
    	"h5" : {
    		//      
            "devServer" : {
                "port" : 9200, //    
                "disableHostCheck" : true,
                "proxy" : { //   ip   ,    
                    "/uac" : {
                        "target" : "http://192.168.0.125:9101/",
                        "changeOrigin" : true,
                        "secure" : false,
                        "pathRewrite" : {
                            "^/uac" : "/"
                        }
                    },
                    "/lift" : {
                        "target" : "http://192.168.0.125:9102/",
                        "changeOrigin" : true,
                        "secure" : false,
                        "pathRewrite" : {
                            "^/lift" : "/"
                        }
                    }
                }
            }
        }
    }
    

    3.ルートディレクトリapiフォルダの作成


    ディレクトリの手配:api-index.jsファイル、modulesフォルダmodules-jsファイル(リクエストインタフェース)
  • index.jsコンテンツ
  • import user from './modules/user.js'
    import home from './modules/home.js'
    import order from './modules/order.js'
    const api = {
    	user,
    	home,
    	order
    }
    export default api
    
  • インタフェースドキュメント、ここではuser.js例
  • import request from '@/common/request.js'
    import config from '@/common/config.js'
    import {
    	formatGetUri
    } from '@/common/util.js'
    
    const uac = config.UAC_URL
    const lift = config.DT_WB_URL
    const user = {}
    
    //   
    user.banners = () => request.globalRequest(lift + "/anon/banner/app/valid", 'POST', null, 0)
    
    export default user
    

    4.main.js導入で使用可能

    import Vue from 'vue'
    import App from './App'
    import api from 'api/index.js'
    import url from './common/config.js'
    
    Vue.config.productionTip = false
    Vue.prototype.$fire = new Vue();
    Vue.prototype.$api = {
      api
    };
    
    Vue.prototype.$url = url;
    App.mpType = 'app'
    
    const app = new Vue({
      ...App
    })
    app.$mount()
    

    5.vueページ要求マルチキャスト図インタフェース

    //   ,    user.js  
    banners() {
    	this.$api.api.user.banners().then(res => {
    		if (res.result.code == '000000') {
    			this.carouselList = res.body
    		} else if (res.result.code == '999999') {
    			this.$u.toast(' ,      ')
    		} else {
    			this.$u.toast(res);
    		}
    	})
    },
    

    これまでは、簡単なフレームワークが完成したとしても、インタフェースのリクエストや呼び出し、tokenの期限切れの再登録、再署名が付いていて、整理したいのははっきりしています.