当前位置: 首页 > news >正文

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

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

需求描述

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

思路解析

PC 扫码原理?

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

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

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

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

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

前端功能实现

如何生成二维码图片?

  • 二维码内容是一段字符串,可以使用uuid 作为二维码的唯一标识;
  • 使用qrcode插件 import QRCode from 'qrcode'; 把uuid变为二维码展示给用户

 

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

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

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

export default {
  name: "qrCode",
  data() {
    return {
      codeStatus: 1, // 1- 未扫码 2-扫码通过 3-过期
      effectiveTime: 30, // 有效时间
      qrCodeTimer: null // 有效时长计时器
      uid: '',
      time: ''
    };
  },
  methods: {
    // 轮询获取二维码状态
    getQcodeStatus() {
      if(!this.qsCodeTimer) {
        this.qrCodeTimer = setInterval(()=> {
          // 二维码过期
          if(this.effectiveTime <=0) {
            this.codeStatus = 3
            clearInterval(this.qsCodeTimer)
            this.qsCodeTimer = null
            return
          }
          this.effectiveTime--
        }, 1000)
      }
    },
    // 刷新二维码
    refreshCode() {
      this.codeStatus = 1
      this.effectiveTime = 30
      this.qsCodeTimer = null
      this.generateORCode()
    }
  },

 

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

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

  • 定时轮询:间隔1s 或特定时段发送请求,通过调用setInterval(), clearInterval()来停止;
  • 长轮询:前端判断接收到的返回结果,若二维码仍未被扫描,则会继续发送查询请求,直至状态发生变化(失效或扫码成功)
  • Websocket:前端在生成二维码后,会与后端建立连接,一旦后端发现二维码状态变化,可直接通过建立的连接主动推送信息给前端。

使用长轮询实现:

// 获取后台状态
   async checkQRcodeStatus() {
      const res = await checkQRcode({
        uid: this.uid,
        time: this.time
      })
      if(res && res.code == 200) {
        let codeStatus - res.codeStatus
        this.codeStatus =  codeStatus
        let loginData = res.loginData
        switch(codeStatus) {
          case 3:
             console.log("二维码过期")
             clearInterval(this.qsCodeTimer)
             this.qsCodeTimer = null
             this.effectiveTime = 0
           break;
           case 2:
             console.log("扫码通过")
             clearInterval(this.qsCodeTimer)
             this.qsCodeTimer = null
             this.$emit("login", loginData)
           break;
           case 1:
             console.log("未扫码")
             this.effectiveTime > 0  && this.checkQRcodeStatus()
           break;
           default:
           break;
        }
      } 
   },

 

相关文章:

  • Spring事务、事务隔离级别、事务传播机制
  • 前端图片压缩方案及代码实现
  • layui框架学习(1:布局)
  • ArrayList扩容机制~
  • 数据挖掘,计算机网络、操作系统刷题笔记36
  • 如何在IDEA中使用Maven构建Java项目?Maven的使用详细解读
  • 【stl -- 常用算法】
  • python图像处理(图像缩放)
  • 电商项目之同一笔单多次收款成功
  • OpenFeign总结
  • 【Linux】基础IO --- 系统级文件接口、文件描述符表、文件控制块、fd分配规则、重定向…
  • 计算机网络01_---软考高级系统架构师010
  • 【Linux】冯诺依曼体系结构与操作系统概念理解
  • 【c语言进阶】枚举与联合体的基本知识大全
  • Python与Matlab混合编程案例
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • bearychat的java client
  • CAP 一致性协议及应用解析
  • CentOS 7 防火墙操作
  • DataBase in Android
  • js中forEach回调同异步问题
  • magento 货币换算
  • PermissionScope Swift4 兼容问题
  • Python十分钟制作属于你自己的个性logo
  • React组件设计模式(一)
  • Twitter赢在开放,三年创造奇迹
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 从0到1:PostCSS 插件开发最佳实践
  • 搭建gitbook 和 访问权限认证
  • 大整数乘法-表格法
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 携程小程序初体验
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #Ubuntu(修改root信息)
  • #图像处理
  • (2022 CVPR) Unbiased Teacher v2
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Java数据结构)ArrayList
  • (二)JAVA使用POI操作excel
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • .NET 中 GetProcess 相关方法的性能
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • @font-face 用字体画图标
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • []error LNK2001: unresolved external symbol _m
  • [BJDCTF2020]The mystery of ip1