详解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 相关文章推荐
如何使用Jquery获取Form表单中被选中的radio值
Aug 09 Javascript
Jquery网页内滑动缓冲导航的实现代码
Apr 05 Javascript
JS更改select内option属性的方法
Oct 14 Javascript
jquery实现全选、不选、反选的两种方法
Sep 06 Javascript
AngularJS中watch监听用法分析
Nov 04 Javascript
jQuery获取this当前对象子元素对象的方法
Nov 29 Javascript
Angularjs实现下拉框联动的示例代码
Aug 22 Javascript
vue.js如何将echarts封装为组件一键使用详解
Oct 10 Javascript
angularJs select绑定的model取不到值的解决方法
Oct 08 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
Apr 22 Javascript
JavaScript ES6 Class类实现原理详解
May 08 Javascript
一篇文章告诉你如何实现Vue前端分页和后端分页
Feb 18 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实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
详解php中的implements 使用
2017/06/13 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
javascript跑马灯悬停放大效果实现代码
2012/12/12 Javascript
Jquery倒数计时按钮setTimeout的实例代码
2013/07/04 Javascript
JavaScript打印iframe内容示例代码
2013/08/20 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
基于jquery实现发送文章到手机的代码
2014/12/26 Javascript
JavaScript中实现无缝滚动、分享到侧边栏实例代码
2016/04/06 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
Vue.js自定义指令的用法与实例解析
2017/01/18 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
vue解决花括号数据绑定不成功的问题
2019/10/30 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
python通过pil模块获得图片exif信息的方法
2015/03/16 Python
Python的Django框架中的数据库配置指南
2015/07/17 Python
dataframe设置两个条件取值的实例
2018/04/12 Python
python判断数字是否是超级素数幂
2018/09/27 Python
详解Python直接赋值,深拷贝和浅拷贝
2020/07/09 Python
阿迪达斯西班牙官方网站:adidas西班牙
2016/07/21 全球购物
为智能设备设计个性化保护套网站:caseable
2017/01/05 全球购物
澳大利亚购买最佳炊具品牌网站:Cookware Brands
2019/02/16 全球购物
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
奶茶专卖店创业计划书
2014/01/18 职场文书
cf搞笑广告词
2014/03/14 职场文书
文艺晚会主持词
2014/03/24 职场文书
学雷锋活动倡议书
2014/08/30 职场文书
读后感作文评语
2014/12/25 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书