注册机制:
//app.js
let Api = require('./http/api.js')
let request = require('./http/request.js')
let config = require('./env/index.js')
let env = 'dev'
App.version = '1.0.0'
App.config = config[env] || {}
App.config.env = env
App.config.mockApi = config.mockApi
//App实例只供页面使用
App({
// 全局注册APi
Api,
config: config[env],
get: request.fetch,
post: (url, data, option) => {
option.method = 'POST'
return request.fetch(url, data, option)
},
onLaunch: function () {
// 展示本地存储能力
var logs = wx.getStorageSync('logs') || []
logs.unshift(Date.now())
wx.setStorageSync('logs', logs)
// 登录
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
}
})
// 获取用户信息
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
// 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
wx.getUserInfo({
success: res => {
// 可以将 res 发送给后台解码出 unionId
this.globalData.userInfo = res.userInfo
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if (this.userInfoReadyCallback) {
this.userInfoReadyCallback(res)
}
}
})
}
}
})
},
globalData: {
userInfo: null
}
})
存储机制:
/** 按模块集中管理storage **/
const STORAGE_KEY = 'sym_pay';
module.exports = {
setItem(key, value, module_name) {
// 如果有分模块的化就模块进行存储,没有的话直接全局存储
if (module_name) {
let module_name_info = this.getItem(module_name)
module_name_info[key] = value;
wx.setStorageSync(module_name, module_name_info)
} else {
wx.setStorageSync(key, value)
}
},
// 获取值
getItem(key, module_name) {
if (module_name) {
let value = this.getItem(module_name)
if (value) return value[key]
return '';
} else {
return wx.getStorageSync(key)
}
},
clear(key) {
// 如果没有传key的话全部删除
key ? wx.removeStorageSync(key) : wx.clearStorageSync()
}
}
路由机制:
/**
* @author Nyan Shen
* @description 通用的路由跳转机制
*/
const routerPath = {
'index': '/pages/index/index',
'log': '/pages/logs/logs',
'pay': '/pages/pay/index',
'activity': '/pages/activity/index'
}
module.exports = {
push(path, option = {}) {
if (typeof path === 'string') {
option.path = path;
} else {
option = path;
}
let url = routerPath[option.path]
// query跳转参数,openType跳转方式,duration时间延迟
let { query = {}, openType, duration } = option
let urlParam = this.parseDataObjectToUrlParam(query);
if (urlParam) {
url += '?' + urlParam;
}
duration ? setTimeout(() => {
this.to(openType, url)
}, duration) : this.to(openType, url)
},
to(openType, url) {
let obj = { url }
if (openType === 'redirect') {
wx.redirectTo(obj)
} else if (openType === 'reLaunch') {
wx.reLaunch(obj)
} else if (openType === 'back') {
wx.navigateBack({
delta: 1
})
} else {
wx.navigateTo(obj)
}
},
parseDataObjectToUrlParam(dataObject) {
let arr = [];
for (let key in dataObject) {
arr.push(key + '=' + dataObject[key])
}
return arr.join('&')
}
}
请求机制:
/**
* @author Nyan Shehn
* @description 通用请求封装
* */
let store = require('../utils/store.js')
const system = store.getSystemInfo()
const clientInfo = {
'clientType': 'mp', //小程序
'appName': 'sym_wx_small_progress',
'model': system.model,
'os': system.system,
'screen': system.screenWidth + '*' + system.screenHeight,
'version': App.version,
'channel': 'miniprogram'
}
const errMsg = '服务异常,请稍后再试'
module.exports = {
fetch(url, data = {}, { method = 'GET', loading = true, toast = true, isMock = false }) {
return new Promise((resolve, reject) => {
if (loading) {
wx.showLoading({
title: '加载中......',
mask: true
})
}
let baseUrl = isMock ? App.config.mockApi : App.config.baseApi
wx.request({
url: baseUrl + url,
data,
method,
header: {
'clientInfo': JSON.stringify(clientInfo)
},
success: function (result) {
let res = result.data
if (res.code === 0) {
if (loading) {
wx.hideLoading()
}
resolve(res.data)
} else {
if (toast) {
wx.showToast({
mask: true,
title: res.message,
icon: 'none'
})
} else {
wx.hideLoading()
}
reject(res)
}
},
fail: function (e = { code: -1, msg: errMsg, errMsg }) {
let msg = e.errMsg
if (msg == 'request:fail timeout') {
msg = '服务器请求超时,请稍后再试'
}
wx.showToast({
title: msg,
icon: 'none'
})
reject(e)
}
})
})
}
}