在《使用uView UI+UniApp开发微信小程序》的随笔中,介绍了基于uView UI+UniApp开发微信小程序的一些基础知识和准备工作,其中也大概介绍了一下基本的登录过程,本篇随笔详细介绍一下微信小程序的相关登录处理以及登录后设置用户身份信息,并跳转到相应页面的处理过程。

1、令牌判断和登录方式

在之前介绍过,在业务系统中,我们需要根据登录用户的身份获取对应的数据,如果用户没有登录,这些信息是无法获到的,那么我们可以在app.vue中判断用户是否登录,然后跳转到对应的页面,如下所示。

也就是系统启动的进入的时候,我们需要对系统用户的身份做一次判断,判断token是否存在,并且是否有效(因为token是有时效的)。

我们先来介绍下如何如何判断token是否存在的处理过程,由于token本身在登陆的时候,设置了存储,因此只需要通过uView的token获取操作即可读取出来,并进行判断即可。

我们只需要简单判断this.vuex_token 是否存在值即可,因为this.vuex_token是由于uView在加载Mixin的时候,已经自动映射了存储的键值,因此我们可以通过this.vuex_token访问到对应的值。

如果是简单的判断,我们在app.vue的如下代码即可处理

<script>
export default {
globalData: {
username: ''
},
onLaunch() {
//如果用户没有登录或令牌失效,跳转到登录界面
// console.log(this.vuex_token)
if(!this.vuex_token) {
this.$u.route({
url: 'pages/template/login/password'
});
} else {
uni.switchTab({
url: '/pages/example/myinfo'
});
}
},
}
</script>

不过我们需要通过判断它的时限有效性,那么通过判断失效日期进行处理,如下代码所示。

<script>
export default {
onLaunch() {
//如果用户没有登录或令牌失效,跳转到登录界面
// console.log(this.vuex_token)
console.log(this.$u.http.config.baseUrl)
var authed = this.checkToken()
if(!authed) {
this.$u.route({
url: '/pages/task/login/index'
});
} else {
this.$u.route({
type:'tab',
url: 'pages/task/login/myinfo'
})
}
},
methods: {
checkToken() {
if(this.vuex_token && this.vuex_user) {
var expired = new Date(this.vuex_user.expired) //token过期时间
const now = Date.now()
if(expired - now > 0) {
return true
}
}
return false
}
}
}
</script>

其中expired是我们获取到token的时间,并加上token的失效时间的。

我们这里使用了一个checkToken的函数,用来判断是否正常登录并且有效的,如果令牌无效,那么跳转到登陆界面,否则直接跳到个人信息页面下。

我们先来看看登录界面,我们这里提供了几种登录方式,账号密码登录、短信验证码登陆、微信授权登录几种方式。

这几种不同的登录方式,都是在验证成功后,需要获取用户的身份信息,并设置到Storage存储中去,逻辑上有相同之处。

2、登录的处理逻辑

用户登录的时候,需要输入用户名,密码,构建相关的参数后,进行登录处理,处理过程代码如下所示。

submit() {
this.$refs.uForm.validate(valid => {
if (valid) {
this.$u.api.User.login(this.model).then(data => {
// 登陆成功跳转到Tab页面
uni.switchTab({
url: '/pages/task/login/myinfo'
});
});
} else {
console.log('验证失败');
}
});
},

其中 this.$u.api.User 是用户API接口的统一调用方式,其中http.api.js的代码如下所示。

import User from '../api/user.js'
import Task from '../api/task.js' const install = (Vue, vm) => { // 将各个定义的接口名称,统一放进对象挂载到vm.$u.api(因为vm就是this,也即this.$u.api)下
vm.$u.api = { // 将 vm 对象传递到模块中
User: User(vm),
Task: Task(vm)
}
} export default { install }

其中api/user.js里面定义了访问远程WebAPI的操作,同时也是我们封装一些处理逻辑的操作函数,我们可以通过ES6的Promise进行封装一个简单的登录函数。

由于我们这里登录过程,除了用户名密码外,还需要appid、时间戳以及签名参数等信息组合,因此构建参数比较多一点。

登录成功后,我们就调用resolve的执行即可,如果失败,调用reject的处理。

这样我们就可以直接通过Promise的操作处理登录成功后的操作了,如下代码所示。

this.$u.api.User.login(this.model).then(data => {
uni.switchTab({
url: '/pages/task/login/myinfo'
});
});

而其中setUserToken函数,主要是便于重用的目的抽取出来,因为设置令牌和用户信息,是其他两个登录方式(短信登陆、微信登陆)所通用的操作。

短信验证码的登录方式也是类似,需要后端配合判断短信的有效性即可,前端先调用后端的发送短信操作,如下代码所示

//发送短信验证码
var params = { PhoneNumber: this.tel }
this.$u.api.User.SendPhoneLoginSmsCode(params).then(res => {
if(res.success) {
this.$u.toast(`验证码已发送至手机 ${this.tel},请注意查收!`)
this.$u.route({
url: 'pages/task/login/code',
params: {
mobile:this.tel
}
});
} else {
this.$u.toast('发送出现错误:' + res.errorMessage)
}
})

而前端调用的函数也就是在api/user.js中简单封装一下对API的调用即可。

SendPhoneLoginSmsCode(data) { // 发送登录动态码
return vm.$u.post('/api/framework/User/SendPhoneLoginSmsCode', data)
},

发送的后端代码如下所示,主要就是放在缓存中一段时间供验证即可。

        /// <summary>
/// 发送登录动态码
/// </summary>
/// <returns></returns>
[AllowAnonymous]
public CommonResult SendPhoneLoginSmsCode(PhoneCaptchaModel model)
{
//获取随机6位数字动态验证码
var code = RandomChinese.GetRandomNumber(6); //使用自定义模板处理短信发送
string message = string.Format(ConfigData.MySmsCodeTemplate, code);
var smsSender = new MySmsSender();
var result = smsSender.Send(model.PhoneNumber, message);
if (result.Success)
{
var cacheKey = model.PhoneNumber;//以手机号码作为键存储验证码缓存
var cacheItem = new SmsLoginCodeCacheItem { Code = code, PhoneNumber = model.PhoneNumber }; var cache = CacheManagerHelper.GetCacheItem(cacheKey, () =>
{
return cacheItem;
}, TimeSpan.FromMinutes(ConfigData.SmsCodeExpiredMinutes));
} return result;
}

验证的时候,只需要判断缓存里面是否存在记录和对应验证码是否匹配即可,如果顺利通过,那么构建用户的token信息返回给前端就是。

如果前端发送验证码成功,那么登陆界面跳转到等待输入验证码的界面,如下所示。

输入正确的验证码即可顺利登陆,否则过期则要求重新发送短信验证码。

submit() {
var params = { mobile: this.mobile, smscode: this.smscode };
console.log(params);
this.$u.api.User.dynamiclogin(params)
.then(res => {
this.$u.toast('验证成功'); uni.switchTab({
url: '/pages/task/login/myinfo'
});
})
.catch(error => {
console.log('验证失败' + error);
this.$u.toast(error);
});
},

如果顺利登陆,则跳转到我的页面里面去,展示一些常用的信息汇总,以及常见处理操作。

这里面涉及一个退出登录的操作,主要就是注销当前用户的身份,只要清空身份信息,并跳转到登录首页即可。

logout() {
this.$u.vuex('vuex_token', null) // 重置
this.$u.vuex('vuex_user', null) // 重置
this.$u.toast('退出成功,请重新登录!')
this.second = 0
setTimeout(()=> {
this.$u.route({ url: '/pages/task/login/index' })
}, 1500)
},

鉴于篇幅原因,先介绍到这里,关于微信授权登陆及绑定的操作过程,后续再介绍。

使用uView UI+UniApp开发微信小程序--判断用户是否登录并跳转的更多相关文章

  1. 使用uView UI+UniApp开发微信小程序--微信授权绑定和一键登录系统

    在前面随笔<使用uView UI+UniApp开发微信小程序>和<使用uView UI+UniApp开发微信小程序--判断用户是否登录并跳转>介绍了微信小程序的常规登录处理和验 ...

  2. 使用uView UI+UniApp开发微信小程序

    在前面随笔的介绍中,我们已经为各种框架,已经准备了Web API.Winform端.Bootstrap-Vue的公司动态网站前端.Vue&Element的管理前端等内容,基本都是基于Web A ...

  3. uni-app开发微信小程序引入UI组件库(Vant-weapp)步骤

    uni-app开发微信小程序引入UI组件库(Vant-weapp)步骤 这里以vant-weapp为例 uni-app官方文档介绍引入组件的方法 1. 新建相关目录 根目录下创建 wxcomponen ...

  4. 使用uni-app开发微信小程序

    uni-app 开发微信小程序 前言 9月份,开始开发微信小程序,也曾调研过wepy/mpvue,考虑到后期跨端的需求,最终选择使用了uni-app,本文主要介绍如何使用uni-app搭建小程序项目, ...

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

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

  6. uni-app开发微信小程序的几天时间

    人只有在不断的学习,才能不断的给自己充电,如果我们停止了学习,就像人没有了血脉,就会死亡,近来学习比较忙,压力比较大,整天面对着电脑,敲击代码,从中虽然收获了快乐,但是换来的确实身体的伤痛,最近虽然自 ...

  7. uniapp开发微信小程序跳转出现navigateTo:fail page "pages/user/pages/user/address/address" is not found

    在app.json文件中pages中: ,{ "path" : "pages/user/address/address", "style" ...

  8. 微信小程序判断用户是否需要再次授权获取个人信息

    一.index.js设置如下 //获取用户的授权信息,放到本地缓存中 wx.getSetting({ success: (res) => { if(res.authSetting['scope. ...

  9. mpvue 应用 Vant Weapp框架开发微信小程序

    今天在使用mpvue开发微信小程序的过程中需要实现一个底部上拉选择列表的功能,因为之前做过H5微信公众号的开发,使用的就是有赞的Vant-ui,所以第一时间就想到了有赞的Vant Weapp UI框架 ...

随机推荐

  1. 在 CSS 中表示颜色的hex code方法和rgb方法

    hexadecimal code(十六进制编码),简写为 hex code. 我们通常使用 decimals,也就是十进制数字,它对每一位数字使用符号0到9来表示.Hexadecimals (或 he ...

  2. 冰蝎&哥斯拉 流量特征分析

    1.冰蝎(Behinder) 下载链接:https://github.com/rebeyond/Behinder/releases 截止至我发贴时,冰蝎最新版本是3.0,客户端兼容性有所提升(但仍不是 ...

  3. OSPF的Router-Id

    一.实验拓扑 二.实验编址 三.实验步骤: 1.设置PC的IP等信息 2.启动设备(全选) 3.根据实验编址配置路由器端口IP(先不设置lookback端口) R1: R2: R3: R4: 看一下r ...

  4. 一个系列搞懂YARN(1)——Yarn架构

    前言 几天前和大哥说起了Yarn,大哥问我,你知道Yarn里面怎么进行资源的动态分配回收的吗?我和诚实,说不知道,然后就有了这个系列博文.不同版本的hadoop版本对应的yarn文档会有差别,本文中选 ...

  5. NOIP 模拟 $21\; \rm Game$

    题解 考试的时候遇到了这个题,没多想,直接打了优先队列,但没想到分差竟然不是绝对值,自闭了. 正解: 值域很小,所以我们开个桶,维护当前最大值. 如果新加入的值大于最大值,那么它肯定直接被下一个人选走 ...

  6. Centos7 出现Welcome to emergency mode!【紧急模式】

    Centos7 出现Welcome to emergency mode![紧急模式] 做mount挂载时,修改了  /etc/fstab 文件,导致Centos7重启时出现如下图所示错误:   输入r ...

  7. 11.SpringMVC之HttpMessageConverter

    HttpMessageConverter简介 HTTP 请求和响应的传输是字节流,意味着浏览器和服务器通过字节流进行通信.但是,使用 Spring,controller 类中的方法返回纯 String ...

  8. wpf中INotifyPropertyChanged的用法

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Linq;using Sy ...

  9. WPF 勾选划线

    最近项目需要一个左右侧一对多的划线功能 我们先来看一下效果秃: 主要功能: 支持动态添加 支持复选 支持修改颜色 支持动态宽度 主要实现:事件的传递 应用场景:购物互选,食品搭配,角色互选 数据源 左 ...

  10. 关于MYSQL5.7:Access denied for user 'root'@'localhost' (using password:YES)解决

    这一类解决要提供远程服务,需要进入mysql的my.ini文件中进行修改,但是在win10系统中,my.ini不再放在MYSQL安装目录的根目录中了,需要到一类应用缓存目录中寻找MYSQL的详细配置文 ...