详解使用uni-app开发微信小程序之登录模块


Posted in Javascript onMay 09, 2019

从微信小程序官方发布的公告中我们可获知:小程序体验版、开发版调用 wx.getUserInfo 接口,将无法弹出授权询问框,默认调用失败,需使用 <button open-type="getUserInfo"></button> 引导用户主动进行授权操作:

1.当用户未授权过,调用该接口将直接报错

2.当用户授权过,可以使用该接口获取用户信息

但在实际开发中我们可能需要弹出授权询问框,因此需要我们自己来写模拟授权弹框(主要是对<buttonopen-type="getUserInfo"></button>的包裹+用户是否是第一次授权判断来显示该页面),代码如下:

1.页面结构

<template>
  <view>
    <!-- #ifdef MP-WEIXIN -->
    <view v-if="isCanUse">
      <view>
        <view class='header'>
          <image src='../../static/img/wx_login.png'></image>
        </view>
        <view class='content'>
          <view>申请获取以下权限</view>
          <text>获得你的公开信息(昵称,头像、地区等)</text>
        </view>

        <button class='bottom' type='primary' open-type="getUserInfo" withCredentials="true" lang="zh_CN" @getuserinfo="wxGetUserInfo">
          授权登录
        </button>
      </view>
    </view>
    <!-- #endif -->
  </view>
</template>

这里的isCanUse是用来记录当前用户是否是第一次授权使用的,wx_login.png图在底部下载获取即可。

2.样式

<style>
  .header {
    margin: 90rpx 0 90rpx 50rpx;
    border-bottom: 1px solid #ccc;
    text-align: center;
    width: 650rpx;
    height: 300rpx;
    line-height: 450rpx;
  }

  .header image {
    width: 200rpx;
    height: 200rpx;
  }

  .content {
    margin-left: 50rpx;
    margin-bottom: 90rpx;
  }

  .content text {
    display: block;
    color: #9d9d9d;
    margin-top: 40rpx;
  }

  .bottom {
    border-radius: 80rpx;
    margin: 70rpx 50rpx;
    font-size: 35rpx;
  }
</style>

3.脚本部分

<script>
  export default {
    data() {
      return {
        SessionKey: '',
        OpenId: '',
        nickName: null,
        avatarUrl: null,
        isCanUse: uni.getStorageSync('isCanUse')||true//默认为true
      };
    },
    methods: {
      //第一授权获取用户信息===》按钮触发
      wxGetUserInfo() {
        let _this = this;
        uni.getUserInfo({
          provider: 'weixin',
          success: function(infoRes) {
            let nickName = infoRes.userInfo.nickName; //昵称
            let avatarUrl = infoRes.userInfo.avatarUrl; //头像
            try {
              uni.setStorageSync('isCanUse', false);//记录是否第一次授权 false:表示不是第一次授权
              _this.updateUserInfo();
            } catch (e) {}
          },
          fail(res) {}
        });
      },



//登录
        login() {
        let _this = this;
        uni.showLoading({
          title: '登录中...'
        });
       
        // 1.wx获取登录用户code
        uni.login({
          provider: 'weixin',
          success: function(loginRes) {
            let code = loginRes.code;
            if (!_this.isCanUse) {
              //非第一次授权获取用户信息
              uni.getUserInfo({
                provider: 'weixin',
                success: function(infoRes) {
 










//获取用户信息后向调用信息更新方法
                  let nickName = infoRes.userInfo.nickName; //昵称
                  let avatarUrl = infoRes.userInfo.avatarUrl; //头像
                    _this.updateUserInfo();//调用更新信息方法
                }
              });
            }
      
            //2.将用户登录code传递到后台置换用户SessionKey、OpenId等信息
            uni.request({
              url: '服务器地址',
              data: {
                code: code,
              },
              method: 'GET',
              header: {
                'content-type': 'application/json'
              },
              success: (res) => {
                //openId、或SessionKdy存储//隐藏loading
                uni.hideLoading();
              }
            });
          },
        });
      },
     //向后台更新信息
      updateUserInfo() {
        let _this = this;
        uni.request({
          url:'url' ,//服务器端地址
          data: {
            appKey: this.$store.state.appKey,
            customerId: _this.customerId,
            nickName: _this.nickName,
            headUrl: _this.avatarUrl
          },
          method: 'POST',
          header: {
            'content-type': 'application/json'
          },
          success: (res) => {
            if (res.data.state == "success") {
              uni.reLaunch({//信息更新成功后跳转到小程序首页
                url: '/pages/index/index'
              });
            }
          }
          
        });
      }
    },
    onLoad() {//默认加载
      this.login();
    }
  }
</script>

4.最终效果如下:

详解使用uni-app开发微信小程序之登录模块 

详解使用uni-app开发微信小程序之登录模块

wx_login.png图:

详解使用uni-app开发微信小程序之登录模块

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

Javascript 相关文章推荐
对联广告js flash激活
Oct 19 Javascript
javascript与asp.net(c#)互相调用方法
Dec 13 Javascript
javascript encodeURI和encodeURIComponent的比较
Apr 03 Javascript
js 金额文本框实现代码
Feb 14 Javascript
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
Dec 21 Javascript
Bootstrap每天必学之附加导航(Affix)插件
Apr 25 Javascript
浅谈jquery中next与siblings的区别
Oct 27 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
Jul 27 Javascript
vue实现登陆登出的实现示例
Sep 15 Javascript
ES6知识点整理之Proxy的应用实例详解
Apr 16 Javascript
Vue2.0 ES6语法降级ES5的操作
Oct 30 Javascript
js简单粗暴的发布订阅示例代码
Jan 23 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
May 09 #Javascript
JS原型与继承操作示例
May 09 #Javascript
详解微信小程序回到顶部的两种方式
May 09 #Javascript
jquery登录的异步验证操作示例
May 09 #jQuery
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
May 09 #Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
May 09 #Javascript
vue 引用自定义ttf、otf、在线字体的方法
May 09 #Javascript
You might like
浅谈PHP与C#的值类型指向区别的详解
2013/05/21 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
javascript 自动填写表单的实现方法
2010/04/09 Javascript
Javascript动画的实现原理浅析
2015/03/02 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
JS常用加密编码与算法实例总结
2016/12/22 Javascript
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
2017/09/29 NodeJs
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
es6函数之尾递归用法实例分析
2020/04/25 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
[09:47]2018DOTA2亚洲邀请赛4.5SOLO赛 No[o]ne vs Sumail
2018/04/06 DOTA
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
python使用mysql数据库示例代码
2017/05/21 Python
python删除过期log文件操作实例解析
2018/01/31 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
详解CSS的border边框属性及其在CSS3中的新特性
2016/05/10 HTML / CSS
如何使用html5与css3完成google涂鸦动画
2012/12/16 HTML / CSS
如何查看浏览器对html5的支持情况
2020/12/15 HTML / CSS
全球领先的鞋类零售商:The Walking Company
2016/07/21 全球购物
意大利顶级奢侈品电商:LUISAVIAROMA(支持中文)
2020/05/26 全球购物
Java语言程序设计测试题改错题部分
2014/07/22 面试题
大学生个人总结的自我评价
2013/10/05 职场文书
个人求职简历的自我评价范文
2013/10/09 职场文书
植树节口号
2014/06/21 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL