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 相关文章推荐
表单提交时自动复制内容到剪贴板的js代码
Mar 16 Javascript
JS保存和删除cookie操作 判断cookie是否存在
Nov 13 Javascript
jQuery中data()方法用法实例
Dec 27 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
Aug 03 Javascript
基于js中的原型、继承的一些想法
Aug 10 Javascript
jQuery插件echarts实现的多柱子柱状图效果示例【附demo源码下载】
Mar 04 Javascript
Angular.JS中select下拉框设置value的方法
Jun 20 Javascript
swiper自定义分页器使用方法详解
Sep 14 Javascript
Less 安装及基本用法
May 05 Javascript
Node.js使用Angular简单示例
May 11 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
Jul 07 Javascript
JavaScript实现H5接金币功能(实例代码)
Feb 22 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
PHP 加密解密内部算法
2010/04/22 PHP
解析php安全性问题中的:Null 字符问题
2013/06/21 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
javascript中的float运算精度实例分析
2010/08/21 Javascript
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
动态加载js、css等文件跨iframe实现
2014/02/24 Javascript
javascript中clone对象详解
2014/12/03 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
jQuery简介_动力节点Java学院整理
2017/07/04 jQuery
vue获取input输入值的问题解决办法
2017/10/17 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
python实现Decorator模式实例代码
2018/02/09 Python
Django开发的简易留言板案例详解
2018/12/04 Python
详解python 爬取12306验证码
2019/05/10 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
利用HTML5 Canvas制作一个简单的打飞机游戏
2015/05/11 HTML / CSS
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
记帐员岗位责任制
2014/02/08 职场文书
《陋室铭》教学反思
2014/02/26 职场文书
竞选大队委员演讲稿
2014/04/28 职场文书
考试诚信承诺书
2014/05/23 职场文书
原料仓仓管员岗位职责
2014/07/08 职场文书
医疗专业毕业生求职信
2014/08/28 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js
Spring Bean是如何初始化的详解
2022/03/22 Java/Android