2019年01月22日 19:51
原创作品,转载时请务必以超链接形式标明文章原始出处,否则将追究法律责任。

最近搞了一下微信小程序,其实挺简单的。首先我们需要下载一个微信开发者工具,本地测试阶段的时候我们也不需要注册微信appID。先看图。

image.png

看到没,这个就是登录界面。输入用户名和密码,调用api登录。我们先看一下开发环境,微信开发者工具。


image.png

其实这个工具做的挺烂的,刚开始的时候复制粘贴都不支持,让人大跌眼镜。后来重启了几回,才没有这种现象了。


今天我们就来看一下登录界面的代码实现。

<import src="../../components/customtoast/customtoast.wxml" />
<template is="toast" data="{{ ..._toast_ }}" />
<view class="container2">
<view class="login-icon">
<image class="login-img" src="../../images/loginLog.jpg"></image>
</view>
<form bindsubmit="doLogin" report-submit='true'>
<view class="login-from">
<!--手机号码-->
<view class="inputView">
<image class="nameImage" src="../../images/zhanghao.png"></image>
<label class="loginLab">用户名:</label>
<input class="inputText" placeholder='请输入手机号' value='{{userNo}}' type='text' bindinput="userNoChanged" maxlength='20' />
</view>
<view class="line"></view>
<view class="inputView">
<image class="nameImage" src="../../images/yanzhengma.png"></image>
<span class="loginLab">密
<text decode="{{true}}" space="{{true}}">&nbsp;&nbsp;&nbsp;</text>码:</span>
<input class="inputText" placeholder='请输入密码' type='password' value='{{userPassword}}' bindinput="userPasswordChanged" maxlength='50' />
</view>

<view class="loginBtnView">
<button class="login-btn" form-type="submit">登录</button>
</view>
</view>
</form>
</view>
<loading hidden="{{submitTipHidden}}">
提交中...
</loading>

在这里,我们引入一个自定义toast组件。因为微信的toast组件实在是太桑眼了,自带一个对号。

其实看这个代码有点像vue的绑定,其实就是一些绑定语法。页面主要是绑定用户名和密码两个输入框,不过让我难过的是,双向绑定必须通过bindinput方法实现,看一下js逻辑实现部分。

var appInstance = getApp();
Page({
  /**
   * 页面的初始数据
   */
  data: {
    userNo: '', //手机号码
    userPassword: '', //密码
    code: null,
    submitTipHidden: true, //提交提醒是否隐藏标识
    isSubmited: false, //是不是已经提交标识
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function(options) {
    wx.getStorage({
      key: 'customerInfo',
      success: function(res) {
        if (res.data && res.data.UserNo) {
          wx.redirectTo({
            url: '../index/index'
          });
        }
      }
    });
    //toast组件实例
    new appInstance.ToastPannel();
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function() {

  },

  /** 
   * 生命周期函数--监听页面显示
   */
  onShow: function() {
    this.setData({
      currentDate: appInstance.Util.formatTime(new Date())
    });
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function() {

  },

  /**
   * 检查手机号码
   */
  checkUserNo: function(userNo) {
    if (!/^1[34578]\d{9}$/.test(userNo)) {
      return false;
    }
    return true;
  },

  /**
   * 登录
   */
  doLogin: function(e) {
    var _this = this;
    //检查手机号码
    if (!_this.data.userNo) {
      return this.show('请输入用户名');
    }

    if (!this.checkUserNo(_this.data.userNo)) {
      return this.show('用户名必须为手机号');
    }
    //检查密码是否为空
    if (!_this.data.userPassword) {
      return this.show('密码不能为空');
    }

    _this.setData({
      submitTipHidden: false,
      isSubmited: true,
    });

    //调用接口wx.login()获取临时登录凭证(code)
    wx.login({
      success: function(callback) {
        if (callback.code) {
          _this.data.code = callback.code;
          let requestUrl = appInstance.AppConstant.OAUTH2_ACCESSTOKEN_URL +
            `&username=${_this.data.userNo}&password=${_this.data.userPassword}`;

          //调用api
          appInstance.HTTP.wxRequest({
            url: requestUrl,
            method: 'POST',
            data: {
              grant_type: "password",
              username: _this.data.userNo,
              password: _this.data.userPassword,
              client_id: appInstance.AppConstant.CLIENTID
            },
            header: {
              'content-type': 'application/x-www-form-urlencoded'
            }
          }).then(res => {
            _this.setData({
              submitTipHidden: true,
              isSubmited: false
            });
            if (res && !res.error) {
              appInstance.Util.setStorage("tokenInfo", res);
              _this.doUserLogin(res.access_token);
            } else {
              _this.show("用户名或者密码不正确");
            }
          }).catch(err => {
            _this.setData({
              submitTipHidden: true,
              isSubmited: false
            });
            return _this.show("发生异常,App认证失败");
          })
        } else {
          _this.setData({
            submitTipHidden: true,
            isSubmited: false
          });
          return _this.show("微信身份验证失败");
        }
      }
    });
  },
  doUserLogin: function(access_token) {
    var _this = this;
    _this.setData({
      submitTipHidden: false,
      isSubmited: true,
    });

    appInstance.HTTP.wxRequest({
      url: appInstance.AppConstant.CUSTOMERURL,
      method: 'GET',
      data: {
        userNo: _this.data.userNo,
        password: _this.data.userPassword
      },
      header: {
        'content-type': 'application/json',
        'authorization': 'bearer ' + access_token
      }
    }).then(res => {
      _this.setData({
        submitTipHidden: true,
        isSubmited: false
      });

      appInstance.Util.setStorage('customerInfo', res);
      wx.redirectTo({
        url: '../index/index'
      });
    })
  },
  userNoChanged(event) {
    this.data.userNo = event.detail.value;
  },
  userPasswordChanged(event) {
    this.data.userPassword = event.detail.value;
  },
})

关于刚才的绑定,有userNoChanged,需要我们手动赋值,真的是让人无语。点击登录按钮以后,我们用用户名和密码去请求access_token和refresh_token。关于token的获取请参阅我的另一篇文章http://www.51mordern.com/tech_article/page/Njg=

好的,获取到token以后,我们就拿着access_token去调用api获取user信息。获取到user信息以后,我们把它放到本地存储wxStorage中,这个storage也许就是localStorage。登录成功后,就跳转至主页。

Screenshot_20190122-201409.jpg

上面的页面就是真机调试,图像呢是抓取微信的图像。好了今天就到这里,如果你一点基础都没得,赶紧学学再来。


发表评论
匿名  
用户评论
暂无评论