详解Vue PC端如何实现扫码登录功能

 2792

本篇文章给大家带来了关于Vue的相关知识,其中主要介绍了在PC端实现扫码的原理是什么?怎么生成二维码图片?怎么用Vue实现前端扫码登录?感兴趣的朋友,下面一起来看一下吧,希望对大家有帮助。

需求描述

目前大多数PC端应用都有配套的移动端APP,如微信,淘宝等,通过使用手机APP上的扫一扫功能去扫页面二维码图片进行登录,使得用户登录操作更方便,安全,快捷。

思路解析

PC 扫码原理?

扫码登录功能涉及到网页端、服务器和手机端,三端之间交互大致步骤如下:

网页端展示二维码,同时不断的向服务端发送请求询问该二维码的状态;

手机端扫描二维码,读取二维码成功后,跳转至确认登录页,若用户确认登录,则服务器修改二维码状态,并返回用户登录信息;

网页端收到服务器端二维码状态改变,则跳转登录后页面;

若超过一定时间用户未操作,网页端二维码失效,需要重新刷新生成新的二维码。

前端功能实现

如何生成二维码图片?

二维码内容是一段字符串,可以使用uuid 作为二维码的唯一标识;

使用qrcode插件 import QRCode from 'qrcode'; 把uuid变为二维码展示给用户

  1. import {v4 as uuidv4} from "uuid"
  2. import QRCode from "qrcodejs2"
  3.  let timeStamp = new Date().getTime() // 生成时间戳,用于后台校验有效期
  4.  let uuid = uuidv4()
  5.  let content = `uid=${uid}&timeStamp=${timeStamp}`
  6.  this.$nextTick(()=> {
  7.      const qrcode = new QRCode(this.$refs.qrcode, {
  8.        text: content,
  9.        width: 180,
  10.        height: 180,
  11.        colorDark: "#333333",
  12.        colorlight: "#ffffff",
  13.        correctLevel: QRCode.correctLevel.H,
  14.        render: "canvas"
  15.      })
  16.      qrcode._el.title = ''

如何控制二维码的时效性?

使用前端计时器setInterval, 初始化有效时间effectiveTime, 倒计时失效后重新刷新二维码

  1. export default {
  2.   name: "qrCode",
  3.   data() {
  4.     return {
  5.       codeStatus: 1, // 1- 未扫码 2-扫码通过 3-过期
  6.       effectiveTime: 30, // 有效时间
  7.       qrCodeTimer: null // 有效时长计时器
  8.       uid: '',
  9.       time: ''
  10.     };
  11.   },
  12.  
  13.   methods: {
  14.     // 轮询获取二维码状态
  15.     getQcodeStatus() {
  16.       if(!this.qsCodeTimer) {
  17.         this.qrCodeTimer = setInterval(()=> {
  18.           // 二维码过期
  19.           if(this.effectiveTime <=0) {
  20.             this.codeStatus = 3
  21.             clearInterval(this.qsCodeTimer)
  22.             this.qsCodeTimer = null
  23.             return
  24.           }
  25.           this.effectiveTime--
  26.         }, 1000)
  27.       }
  28.  
  29.     },
  30.     
  31.     // 刷新二维码
  32.     refreshCode() {
  33.       this.codeStatus = 1
  34.       this.effectiveTime = 30
  35.       this.qsCodeTimer = null
  36.       this.generateORCode()
  37.     }
  38.   },

前端如何获取服务器二维码的状态?

前端向服务端发送二维码状态查询请求,通常使用轮询的方式

定时轮询:间隔1s 或特定时段发送请求,通过调用setInterval(), clearInterval()来停止;

长轮询:前端判断接收到的返回结果,若二维码仍未被扫描,则会继续发送查询请求,直至状态发生变化(失效或扫码成功)

Websocket:前端在生成二维码后,会与后端建立连接,一旦后端发现二维码状态变化,可直接通过建立的连接主动推送信息给前端。

使用长轮询实现:

  1. // 获取后台状态
  2. async checkQRcodeStatus() {
  3.   const res = await checkQRcode({
  4.     uid: this.uid,
  5.     time: this.time
  6.   })
  7.   if(res && res.code == 200) {
  8.     let codeStatus - res.codeStatus
  9.     this.codeStatus =  codeStatus
  10.     let loginData = res.loginData
  11.     switch(codeStatus) {
  12.       case 3:
  13.          console.log("二维码过期")
  14.          clearInterval(this.qsCodeTimer)
  15.          this.qsCodeTimer = null
  16.          this.effectiveTime = 0
  17.        break;
  18.        case 2:
  19.          console.log("扫码通过")
  20.          clearInterval(this.qsCodeTimer)
  21.          this.qsCodeTimer = null
  22.          this.$emit("login", loginData)
  23.        break;
  24.        case 1:
  25.          console.log("未扫码")
  26.          this.effectiveTime > 0  && this.checkQRcodeStatus()
  27.        break;
  28.        default:
  29.        break;
  30.     }
  31.   } 
  32. },


TAG标签:
本文网址:https://www.zztuku.com/index.php/detail-13722.html
站长图库 - 详解Vue PC端如何实现扫码登录功能
申明:本文转载于《掘金社区》,如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐