详解mpvue开发小程序小总结


Posted in Javascript onJuly 25, 2018

最近用mpvue开发了一个小程序,现总结一下碰见的问题及解决方案

1.项目中数据请求用到了fly.io,封装成request.js如下:

import wx from 'wx'
import Fly from 'flyio'
import store from '../store/index'

const fly = new Fly()

fly.config.baseURL = process.env.BASE_URL
fly.config.timeout = 5000

//http 请求拦截器
fly.interceptors.request.use((config) => {
 wx.showNavigationBarLoading()//导航条加载动画
 //给所有请求添加自定义header
 if (store.getters.accessToken) {
  config.headers['Authorization'] = `JWT ${store.getters.accessToken}`
 }
 config.headers['X-Tag'] = 'flyio'
 return config
})

//http 响应拦截器
fly.interceptors.response.use((response) => {
  wx.hideNavigationBarLoading()//导航条加载动画
  const res = response.data
  if (res.status === 0 && (res.errCode === 401 || res.errCode === 403)) {
   //跳转到登录页面
   wx.redirectTo({
    url: '/pages/welcome/main',
   })
  }
  return res
 },
 (err) => {
  wx.hideNavigationBarLoading()//导航条加载动画
  //发生网络错误后会走到这里
  return Promise.reject(err.response)
 },
)

export default fly

2.有关登录的处理:

这个项目中用到了一个登录页,用户登录态失效也会跳转到登录页login.js

import wx from 'wx'
import { loginByCode } from '../api/weAppAuth' //登录接口
import store from '../store'

/**
 * 登录
 * @returns {Promise<any>}
 */
export function weAppLogin () {
 return new Promise((resolve, reject) => {
  // 先调用 wx.login 获取到 code
  wx.login({
   success: (res) => {
    wx.getUserInfo({
     lang: 'zh_CN',
     success: ({rawData, signature, encryptedData, iv, userInfo}) => {
      let data = {
       code: res.code,
       rawData,
       signature,
       encryptedData,
       iv,
       userInfo,
      }
      // console.log(JSON.stringify(data))
      loginByCode(data).then(res => {
       // 该为我们后端的逻辑 若code > 0为登录成功,其他情况皆为异常 (视自身情况而定)
       if (res.status === 1) {
        // 保存用户信息相关操作
        ...
        resolve(res)
       } else {
        reject(res)
       }
      }).catch(err => {
       reject(err)
      })
     },
     // 若获取不到用户信息 (最大可能是用户授权不允许,也有可能是网络请求失败,但该情况很少)
     fail: (err) => {
      reject(err)
     },
    })
   },
  })
 })
}

welcome.vue

<button
    class="default-btn "
    open-type="getUserInfo"
    @getuserinfo="onGotUserInfo"
    type="primary"
   >
    微信登录
</button>

 methods: {
   //登录
   onGotUserInfo ({mp}) {
    const {detail} = mp
    if (!detail.rawData) {
     Dialog({
      title: '重新授权',
      message: '需要获取您的公开信息(昵称、头像等),请点击"微信登录"进行授权',
      confirmButtonText: '确定',
      confirmButtonColor: '#373737',
     })
    } else {
     weAppLogin().then(res => {
      console.log(res)
      Toast({
       type: 'success',
       message: '登录成功',
       selector: '#zan-toast-test',
       timeout:1000
      })
      setTimeout(() => {
       wx.switchTab({
        url: '/pages/index/main',
       })
      }, 1000)
     }).catch(err => {
      console.log(err)
     })
    }
   },
  },

3.支付方法封装成promise

import wx from 'wx'

/**
 * 支付
 * @param data
 * @returns {Promise<any>}
 */
export function wechatPay (data) {
 const {timeStamp, nonceStr, signType, paySign} = data
 return new Promise((resolve, reject) => {
  wx.requestPayment({
   timeStamp: timeStamp,
   nonceStr: nonceStr,
   package: data.package,
   signType: signType,
   paySign: paySign,
   success: (res) => {
    resolve(res)
   },
   fail: (err) => {
    reject(err)
   },
  })
 })
}

4.使用腾讯云存储上传图片

项目中使用了cos-wx-sdk-v5

封装upload.js方法:

const COS = require('../../static/js/cos-wx-sdk-v5')
import fly from './request'

export const Bucket = process.env.Bucket
export const Region = process.env.Region

// 文件扩展名提取
export function fileType (fileName) {
 return fileName.substring(fileName.lastIndexOf('.') + 1)
}

// 名称定义
export function path(id, type, fileType) {
 const date = new Date()
 const year = date.getFullYear()
 const month = date.getMonth() + 1
 const day = date.getDate()
 var time = date.toTimeString()
 time = time.substr(0, 8)
 time = time.replace(/:/g, '-')
 return `/mobile/groups/${id}/${type}/` +
  (year + '-' + (month < 10 ? '0' + month : String(month)) + '-' +
   (day < 10 ? '0' + day : String(day)) + '-' + time) + '.' + fileType
}

// base64转换成file文件
export function Base64ToBlob (urlData) {
 // 去掉url的头,并转换为byte
 let bytes = window.atob(urlData.split(',')[1])

 // 处理异常,将ascii码小于0的转换为大于0
 let ab = new ArrayBuffer(bytes.length)
 let ia = new Uint8Array(ab)
 for (let i = 0; i < bytes.length; i++) {
  ia[i] = bytes.charCodeAt(i)
 }
 return new Blob([ab], {
  type: 'image/png',
 })
}

export const cos = new COS({
 getAuthorization: (options, callback) => {
  let url = '/qcloud/cos_sign'
  fly.request({
   url: url,
   method: 'post',
   body: {
    method: (options.Method || 'get').toLowerCase(),
    pathname: '/' + (options.Key || ''),
   },
  }).then(res => {
   callback(res.data.authorization)
  }).catch(err => {
   console.log(err)
  })

  //本地测试
  /*let authorization = COS.getAuthorization({
   SecretId: '你的id',
   SecretKey: '你的key',
   Method: options.Method,
   Key: options.Key,
  })
  callback(authorization)*/
 },
})

小程序上传多图时保证图片均上传到cos服务器再执行其余操作:

//选择图片
chooseImage () {
    wx.chooseImage({
     count: this.chooseImageNum,
     sizeType: ['original'],
     sourceType: ['album', 'camera'],
     success: (res) => {
      this.imageList = [...this.imageList, ...res.tempFilePaths]
     },
    })

},

uploadImg (data, index) {
    return new Promise((resolve, reject) => {
     let filePath = data
     let fileName = path(this.id, 'test',
      fileType(filePath.substr(filePath.lastIndexOf('/') + 1))) + index
     cos.postObject({
      Bucket: Bucket,
      Region: Region,
      Key: fileName,
      FilePath: filePath,
     }, (err, res) => {
      if (res.statusCode === 200) {
       let item = {
        imageUrl: res.Location,
       }
       this.data.imageList.push(item)
       resolve(res)
      } else {
       reject(err)
      }
     })

    })
},
//上传图片
 upload () {
    return new Promise((resolve, reject) => {
     //没有图片
     if (this.imageList.length === 0) {
      let data = {
       statusCode: 200,
      }
      resolve(data)
      return
     }
     //有图片
     let all = []
     for (let i = 0; i < this.imageList.length; i++) {
      all.push(this.uploadImg(this.imageList[i], i))
     }
     Promise.all(all).then(res => {
      resolve(res)
     }).catch(err => {
      reject(err)
     })
    })
},

handleSubmit(){
   this.upload().then(res=>{
    //执行剩余步骤
    }).catch(err=>{
     console.log(err)
  })
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
Jan 11 Javascript
js单例模式的两种方案
Oct 22 Javascript
js随机生成字母数字组合的字符串 随机动画数字
Sep 02 Javascript
Bootstrap每天必学之标签与徽章
Nov 27 Javascript
理解Javascript文件动态加载
Jan 29 Javascript
javascript每日必学之循环
Feb 19 Javascript
jquery的checkbox,radio,select等方法小结
Aug 30 Javascript
angular中的http拦截器Interceptors的实现
Feb 21 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
Oct 22 Javascript
深入学习JavaScript 高阶函数
Jun 11 Javascript
JS实现电脑虚拟键盘的操作
Jun 24 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 Vue.js
Bootstrap table表格初始化表格数据的方法
Jul 25 #Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
Jul 24 #Javascript
微信小程序实现图片上传放大预览删除代码
Jun 28 #Javascript
vue实现底部菜单功能
Jul 24 #Javascript
vue 下列表侧滑操作实例代码详解
Jul 24 #Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
Jul 24 #Javascript
微信小程序实现滴滴导航tab切换效果
Jul 24 #Javascript
You might like
用PHP实现的生成静态HTML速度快类库
2007/03/31 PHP
php中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
PHP删除数组中特定元素的两种方法
2013/07/02 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
轻松理解JavaScript闭包
2017/03/14 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
JS中跳出循环的示例代码
2017/09/14 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
vue3 源码解读之 time slicing的使用方法
2019/10/31 Javascript
对python .txt文件读取及数据处理方法总结
2018/04/23 Python
Python Flask前后端Ajax交互的方法示例
2018/07/31 Python
浅谈Python中的bs4基础
2018/10/21 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
python re模块常见用法例举
2021/03/01 Python
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
PHP面试题附答案
2015/11/28 面试题
两道JAVA笔试题
2016/09/14 面试题
幼儿园师德师风学习材料
2014/05/29 职场文书
国际商务英语专业求职信
2014/07/08 职场文书
2015年元旦演讲稿
2014/09/12 职场文书
二年级学生期末评语
2014/12/26 职场文书
Vue.js中v-for指令的用法介绍
2022/03/13 Vue.js
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python
pandas时间序列之pd.to_datetime()的实现
2022/06/16 Python