mpvue 项目初始化及实现授权登录的实现方法


Posted in Javascript onJuly 20, 2020

mpvue

mpvue是一个使用vue.js开发小程序的框架。其官网 http://mpvue.com/ 的介绍是,mpvue框架基于Vue.js核心,mpvue修改了Vue.js的runtime和compiler实现,使其可以运行在小程序环境中,从而为小程序开发引入了整套Vue.js开发体验。

使用mpvue框架开发小程序,能够直接使用vue语法进行开发。

Vant Weapp

Vant Weapp是一套小程序UI组件库,可以使用这个UI库封装好的一些组件来实现某些功能,类似element组件的引入使用。

flyio

github: https://github.com/wendux/fly

Flyio帮助文档: https://wendux.github.io/dist/#/doc/flyio/readme

如官网所说,Fly.js是一个支持所有JavaScript运行环境的基于Promise、支持请求转发的http请求库,它可最大限度地在多个端上实现代码复用。

其拥有的特点:

1、提供统一的PromiseAPI

2、浏览器环境下非常轻量

3、支持多种JavaScript运行环境

4、支持请求/响应拦截器

5、自动转换JSON数据

6、支持切换底层 HTTP Engine,可轻松适配各种运行环境

7、浏览器端支持全局Ajax拦截

8、H5页面内嵌到原生APP时,支持将HTTP请求转发到Native,支持直接请求图片

本次搭建的小程序环境,将使用flyio这个http请求库来实现数据的请求,目前用到的方法为get、post。

两者的使用示例在官网帮助文档有示例:

mpvue 项目初始化及实现授权登录的实现方法

mpvue 项目初始化及实现授权登录的实现方法

项目初始化

1、搭建mpvue脚手架

基于mpvue-quickstart模版创建新项目

vue init mpvue/mpvue-quickstart one_hour_app

2、打开并跑起项目

新建的项目打开,dist文件夹尚未存在

mpvue 项目初始化及实现授权登录的实现方法

跑起项目

cd one_hour_app
npm run dev

这样跑起来后项目中便多了一个dist文件夹,里面有个wx文件夹

mpvue 项目初始化及实现授权登录的实现方法

这个wx文件夹就是要导入到微信开发者工具中的文件。

安装微信开发者工具,打开微信官网文档页面可下载: https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html

安装好微信开发者工具后点击导入项目

mpvue 项目初始化及实现授权登录的实现方法

弹窗内输入导入的目录

mpvue 项目初始化及实现授权登录的实现方法

目录就是刚才说的那个在one_hour_app项目中npm run dev之后生成的dist下的wx。AppID的获取,需要先在微信公众平台注册,然后打开开发-开发设置找到。

mpvue 项目初始化及实现授权登录的实现方法

导入成功后显示这样

mpvue 项目初始化及实现授权登录的实现方法

这样,就可以在编辑器写我们的代码,然后在微信开发者工具里面可以像浏览器一样查看页面效果。

查看项目vue文件可以发现,我们基本上可以像写vue一样写里面的vue文件。

之后对项目结构进行删减,把原本提供的那些没用到的文件先删除。保留一个架构。开发主要关注的是src这个目录。

statics里面的images、tabs删掉

src/main.js保持不变

src/App.vue里的代码删掉,剩下

mpvue 项目初始化及实现授权登录的实现方法

src/app.json对应到页面路由pages配置、头部windows的样式和文字设置、脚部tabBar菜单配置,现在只保留如下:

mpvue 项目初始化及实现授权登录的实现方法

src/utils文件先保持不变

src/components/card.vue删掉

src/pages只留下index那块的内容。接着是删掉index.vue的东西。

修整完后,只剩下首页

mpvue 项目初始化及实现授权登录的实现方法

至此,基于mpvue的小程序项目架构已经搭建好了。

接着是css扩展语言scss、Vant Weapp UI组件库、flyio、mpvue路由插件mpvue-router-patch。

1、安装scss,sass-loader的版本是7.3.1,如果使用最新的版本会报错,这里安装这个低版本的。

npm i -D sass-loader node-sass

测试下:

mpvue 项目初始化及实现授权登录的实现方法

mpvue 项目初始化及实现授权登录的实现方法

2、安装Vant Weapp

npm i vant-weapp -S --production

打开Vant Weapp的官网找一个button的例子测试下,但是使用之前需要在app.json文件中配置引入组件。

由于把这个组件安装到了node_modules/vant-weapp/dist,

mpvue 项目初始化及实现授权登录的实现方法

所以引入组件的路径跟官网给的不一样,需要手动修改一下路径:

mpvue 项目初始化及实现授权登录的实现方法

同时由于我们需要在微信开发者工具查看,而那里导入了的是dist/wx,跟编辑器里的目录是不一样的,所以为了能在微信开发者工具正常显示组件,还需要做一个配置,将整个node_modules/vant-weapp/dist目录拷贝到dist/wx/vant-weapp/dist目录,在wepack.base.conf.js添加如下配置:

if (/^wx$/.test(PLATFORM)) {
 baseWebpackConfig = merge(baseWebpackConfig, {
  plugins: [
   new CopyWebpackPlugin([{
    from: resolve('node_modules/vant-weapp/dist'),
    to: resolve('dist/wx/vant-weapp/dist'),
    ignore: ['.*']
   }])
  ]
 })
}

使用一个button组件测试下:

<van-button type="primary">主要按钮</van-button>

这样组件就成功引入了,而且也可以看到刚才那个拷贝目录的配置也生效了,可以看到vant-weapp目录已在wx里生成。

mpvue 项目初始化及实现授权登录的实现方法

3、安装flyio、mpvue-router-push

npm i -S flyio
npm i -S mpvue-router-patch

现在用不到这个路由插件,先安装着放着。

接着是使用flyio来实现小程序授权登录的请求。

首先在utils里创建request.js用来封装flyio的请求。

// 初始化flyio请求
function createFly () {
 if (mpvuePlatform === 'wx') {
  const Fly = require('flyio/dist/npm/wx')
  return new Fly()
 } else {
  return null
 }
}
// 处理get请求、post请求,
//如果是post,就把get改成post就行,这里为了节省篇幅,省去了post的那段代码
export function get (url, params = {}, showErr = true) {
 const fly = new createFly()
 if (fly) {
  return new Promise((resolve, reject) => {
   fly.get(url, params).then(response => {
    const data = (response && response.data) || {}
    if (data.error_code === 0) {
     resolve(response)
     console.log(response)
    } else {
     if (showErr) {
      mpvue.showToast({
       title: data.msg || '请求失败',
       icon: 'none',
       duration: 1500
      });
     }
     reject(response)
    }
   }).catch(err => {
    console.log(err)
   })
  })
 }
}

如果遇到了 TypeError: __webpack_require__(...) is not a function这样的问题,就关闭微信开发者工具,删除dist包,再重新npm run dev跑一下,重新打开微信开发者工具应该就没问题了。

接下来是用户授权的内容。

授权登录

首页的展示,需要调用mpvue.getSetting获取用户的当前设置。已授权就展示正常页面,未授权就展示auth.vue授权登录页面。

未授权的状态,当用户同意授权使用的时候,这时首页就会变成正常的页面,同时,需要获取用户的信息userInfo。

在成功获取了用户信息之后,需要使用存储器mpvue.setStorageSync把它存储起来供之后需要的时候使用getStorageSync来获取。这时会存在两种情况,一种是已存在openId的情况,另一种是还没获取openId的情况。

当未取到openId时,需要调用接口获取openId,而调用这个接口需要获得code,这个code可以通过mpvue.login API获取到。当取得code之后就调用获取openId的接口,返回openId并存储起来。取得openId后,就可以把这个openId作为参数,传给获取首页数据的接口。

当已经取得openId时,就直接调用首页接口数据并传openId作为接口的参数。

在此之后,需要调用register注册接口,调用这个接口能够把用户的行为数据存储在后台,辨别不同的用户。

流程示意图:

mpvue 项目初始化及实现授权登录的实现方法

auth.vue组件主要的按钮事件:

<button class="auth-btn" 
       open-type="getUserInfo"
       @getuserinfo="getUserInfo">授权登录</button>
getUserInfo () {
   this.$emit('getUserInfo')
  }

src/api/index.js用来存放接口

import { get, post } from "@/utils/request.js"
const API_BASE = '后台接口前缀'

export function getOpenId (params) {
 return get(`${API_BASE}/openId/get`, params)
}

export function getHomeData (params) {
 return get(`${API_BASE}/book/home/v2`, params)
}

export function register (params) {
 return post(`${API_BASE}/user/register`, params)
}

src/api/wechat.js用来存放微信平台相关的API

import { getOpenId } from '@/api'
const APP_ID = '填写微信公众平台的App_ID'
const SECRET = '填写微信公众平台的secret'

// 请求getSetting获取用户当前的授权
export function getSetting (auth, onSuccess, onFail) {
 mpvue.getSetting({
  success (res) {
   if (res.authSetting[`scope.${auth}`]) {
    onSuccess(res)
   } else {
    onFail(res)
   }
  },
  fail (res) {
   console.log(res)
  }
 })
}
// 获取用户信息
export function getUserInfo (onSuccess, onFail) {
 mpvue.getUserInfo({
  success (res) {
   onSuccess(res)
   console.log(res)
  },
  fail (res) {
   onFail(res)
  }
 })
}
// 获取openId
export function getUserOpenId (callback) {
 mpvue.login({  // 调用login API 获得code
  success (res) {
   console.log(res)
   const { code } = res // 这个code是获取openId的前提
   getOpenId({ code, appId: APP_ID, secret: SECRET }).then(response => {
    const { openid } = response.data.data
    mpvue.setStorageSync('openId', openid)
    callback && callback(openid)
   }).catch(err => {
    console.log(err)
   })
  },
  fail (res) {
   console.log(res)
  }
 })
}

index.vue页面:

<template>
 <div>
  <div v-if="isAuth">
   <div class="index">首页</div>
   <van-button type="primary">主要按钮</van-button>
   <div>
    获取userInfo示例:
    <div>
     {{ userInfo.nickName }}
    </div>
    获取homeData数据示例:
    <div>{{ homeData.hotSearch && homeData.hotSearch.num }}</div>
   </div>
  </div>
  <auth v-if="!isAuth" @getUserInfo="init" />
 </div>
</template>
import { get, post } from '@/utils/request'
import Auth from '@/components/base/auth.vue'
import { getHomeData, register } from '@/api'
import { getSetting, getUserInfo, getUserOpenId } from '@/api/wechat'
data () {
  return {
   isAuth: false,
   userInfo: {},
   homeData: {}
  }
 },
 mounted () {
  this.init()
 },
// 获取首页数据
getIndexData (openId, userInfo) {
  getHomeData({ openId }).then(response => {
    console.log('getHomeData-----', response)
    this.homeData = response.data.data
  })
},
// 在获得授权信息后调用以获得用户信息
getUserInfoData () {
  const onCompleteGetOpenId = (openId, userInfo) => {
    this.getIndexData(openId, userInfo) // 获取首页数据
    register({ openId, platform: mpvuePlatform, ...userInfo }) // 注册
  } 
  getUserInfo( // 获取用户信息
    (res) => {
      const { userInfo } = res
      this.userInfo = userInfo
      mpvue.getStorageSync('userInfo', userInfo)
      const openId = mpvue.getStorageSync('openId')
      if (!openId || openId.length === 0) { // 未存在openId
        getUserOpenId((openId) => { // 需要请求接口获得
          onCompleteGetOpenId(openId, userInfo)
        })
      } else {
        onCompleteGetOpenId(openId, userInfo) // 已存在openId
      }
    },
    (res) => {
      console.log(res)
    }
  )
}
// 一开始就需要获取授权信息,mounted里调用
init () {
  getSetting(
    'userInfo',
    (res) => {
      this.isAuth = true
      console.log(res)
      this.getUserInfoData()
    },
    (res) => {
      this.isAuth = false
      console.log(res)
    }
  )
}

最后放上授权的过程示意图:

mpvue 项目初始化及实现授权登录的实现方法

到此这篇关于mpvue 项目初始化及实现授权登录的实现方法的文章就介绍到这了,更多相关mpvue 项目初始化及授权登录内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
使用Firebug对js进行断点调试的图文方法
Apr 02 Javascript
node.js中的http.get方法使用说明
Dec 14 Javascript
JQuery中attr方法和removeAttr方法用法实例
May 18 Javascript
FullCalendar日历插件应用之数据展现(一)
Dec 23 Javascript
node.js中 stream使用教程
Aug 28 Javascript
让编辑器支持word复制黏贴、截屏的js代码
Oct 17 Javascript
Javascript实现数组中的元素上下移动
Apr 28 Javascript
react-router browserHistory刷新页面404问题解决方法
Dec 29 Javascript
JS中数据结构之栈
Jan 01 Javascript
C#程序员入门学习微信小程序的笔记
Mar 05 Javascript
微信小程序上传多图到服务器并获取返回的路径
May 05 Javascript
原生js实现的移动端可拖动进度条插件功能详解
Aug 15 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
Jul 20 #Javascript
解决Echarts2竖直datazoom滑动后显示数据不全的问题
Jul 20 #Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
Jul 20 #Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
Jul 20 #Javascript
如何实现echarts markline标签名显示自己想要的
Jul 20 #Javascript
在Echarts图中给坐标轴加一个标识线markLine
Jul 20 #Javascript
jquery实现简单拖拽效果
Jul 20 #jQuery
You might like
非常好用的Zend Framework分页类
2014/06/25 PHP
关于php 高并发解决的一点思路
2017/04/16 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
js网页实时倒计时精确到秒级
2014/02/10 Javascript
jquery.validate使用详解
2016/06/02 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
js中json处理总结之JSON.parse
2016/10/14 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
微信小程序 scroll-view组件实现列表页实例代码
2016/12/14 Javascript
使用npm安装最新版本nodejs
2018/01/18 NodeJs
基于Three.js实现360度全景图片
2018/12/30 Javascript
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
Vue实现可移动水平时间轴
2020/06/29 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
python使用append合并两个数组的方法
2015/04/28 Python
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
python 按钮点击关闭窗口的实现
2020/03/04 Python
Python requests.post方法中data与json参数区别详解
2020/04/30 Python
Python爬虫之爬取淘女郎照片示例详解
2020/07/28 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
python中绕过反爬虫的方法总结
2020/11/25 Python
Giuseppe Zanotti美国官方网站:将鞋履视为高级时装般精心制作
2018/02/06 全球购物
Surfdome西班牙:世界上最受欢迎的生活方式品牌
2019/02/13 全球购物
销售辞职报告范文
2014/01/12 职场文书
办公室文员工作职责
2014/01/31 职场文书
销售主管岗位职责范本
2014/02/14 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
个人存款证明书
2014/10/18 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript
详解MySQL的内连接和外连接
2023/05/08 MySQL