最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue?PC前端掃碼登錄功能實(shí)現(xiàn)

 更新時(shí)間:2022年12月29日 10:33:26   作者:前端碎碎念  
最近在做APP客戶端掃描PC端二維碼登錄,于是記錄一下實(shí)現(xiàn)過(guò)程,下面這篇文章主要給大家介紹了關(guān)于Vue?PC前端掃碼登錄功能實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

需求描述

目前大多數(shù)PC端應(yīng)用都有配套的移動(dòng)端APP,如微信,淘寶等,通過(guò)使用手機(jī)APP上的掃一掃功能去掃頁(yè)面二維碼圖片進(jìn)行登錄,使得用戶登錄操作更方便,安全,快捷。

思路解析

PC 掃碼原理?

掃碼登錄功能涉及到網(wǎng)頁(yè)端、服務(wù)器和手機(jī)端,三端之間交互大致步驟如下:

  • 網(wǎng)頁(yè)端展示二維碼,同時(shí)不斷的向服務(wù)端發(fā)送請(qǐng)求詢問(wèn)該二維碼的狀態(tài);
  • 手機(jī)端掃描二維碼,讀取二維碼成功后,跳轉(zhuǎn)至確認(rèn)登錄頁(yè),若用戶確認(rèn)登錄,則服務(wù)器修改二維碼狀態(tài),并返回用戶登錄信息;
  • 網(wǎng)頁(yè)端收到服務(wù)器端二維碼狀態(tài)改變,則跳轉(zhuǎn)登錄后頁(yè)面;
  • 若超過(guò)一定時(shí)間用戶未操作,網(wǎng)頁(yè)端二維碼失效,需要重新刷新生成新的二維碼。

前端功能實(shí)現(xiàn)

如何生成二維碼圖片?

  • 二維碼內(nèi)容是一段字符串,可以使用uuid 作為二維碼的唯一標(biāo)識(shí);
  • 使用qrcode插件 import QRCode from 'qrcode'; 把uuid變?yōu)槎S碼展示給用戶
import {v4 as uuidv4} from "uuid"
import QRCode from "qrcodejs2"
 let timeStamp = new Date().getTime() // 生成時(shí)間戳,用于后臺(tái)校驗(yàn)有效期
 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 = ''

如何控制二維碼的時(shí)效性?

使用前端計(jì)時(shí)器setInterval, 初始化有效時(shí)間effectiveTime, 倒計(jì)時(shí)失效后重新刷新二維碼

export default {
  name: "qrCode",
  data() {
    return {
      codeStatus: 1, // 1- 未掃碼 2-掃碼通過(guò) 3-過(guò)期
      effectiveTime: 30, // 有效時(shí)間
      qrCodeTimer: null // 有效時(shí)長(zhǎng)計(jì)時(shí)器
      uid: '',
      time: ''
    };
  },

  methods: {
    // 輪詢獲取二維碼狀態(tài)
    getQcodeStatus() {
      if(!this.qsCodeTimer) {
        this.qrCodeTimer = setInterval(()=> {
          // 二維碼過(guò)期
          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()
    }
  },

前端如何獲取服務(wù)器二維碼的狀態(tài)?

前端向服務(wù)端發(fā)送二維碼狀態(tài)查詢請(qǐng)求,通常使用輪詢的方式

  • 定時(shí)輪詢:間隔1s 或特定時(shí)段發(fā)送請(qǐng)求,通過(guò)調(diào)用setInterval(), clearInterval()來(lái)停止;
  • 長(zhǎng)輪詢:前端判斷接收到的返回結(jié)果,若二維碼仍未被掃描,則會(huì)繼續(xù)發(fā)送查詢請(qǐng)求,直至狀態(tài)發(fā)生變化(失效或掃碼成功)
  • Websocket:前端在生成二維碼后,會(huì)與后端建立連接,一旦后端發(fā)現(xiàn)二維碼狀態(tài)變化,可直接通過(guò)建立的連接主動(dòng)推送信息給前端。

使用長(zhǎng)輪詢實(shí)現(xiàn):

 // 獲取后臺(tái)狀態(tài)
    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("二維碼過(guò)期")
              clearInterval(this.qsCodeTimer)
              this.qsCodeTimer = null
              this.effectiveTime = 0
            break;
            case 2:
              console.log("掃碼通過(guò)")
              clearInterval(this.qsCodeTimer)
              this.qsCodeTimer = null
              this.$emit("login", loginData)
            break;
            case 1:
              console.log("未掃碼")
              this.effectiveTime > 0  && this.checkQRcodeStatus()
            break;
            default:
            break;
         }
       } 
    },

參考資料:

總結(jié)

到此這篇關(guān)于Vue PC前端掃碼登錄功能實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Vue PC前端掃碼登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決VUE中document.body.scrollTop為0的問(wèn)題

    解決VUE中document.body.scrollTop為0的問(wèn)題

    今天小編就為大家分享一篇解決VUE中document.body.scrollTop為0的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • vite打包只生成了一個(gè)css和js文件問(wèn)題的解決方法

    vite打包只生成了一個(gè)css和js文件問(wèn)題的解決方法

    今天整了一個(gè)項(xiàng)目,試了下打包,發(fā)下打包后只生成了一個(gè)css文件,和一個(gè)js文件,這樣肯定是不行的,因?yàn)檫@樣這個(gè)文件的包大小很大,第一次訪問(wèn)會(huì)導(dǎo)致白屏問(wèn)題,所以本文給大家介紹了vite打包只生成了一個(gè)css和js文件問(wèn)題的解決方法,需要的朋友可以參考下
    2024-05-05
  • Vue?3?表格時(shí)間監(jiān)控與動(dòng)態(tài)后端請(qǐng)求觸發(fā)詳解?附Demo展示

    Vue?3?表格時(shí)間監(jiān)控與動(dòng)態(tài)后端請(qǐng)求觸發(fā)詳解?附Demo展示

    在Vue3中,使用el-table組件渲染表格數(shù)據(jù),通過(guò)el-table-column指定內(nèi)容,時(shí)間點(diǎn)需前端校準(zhǔn),用getTime()比較,到達(dá)時(shí)觸發(fā)操作,異步API請(qǐng)求可用async/await處理,setInterval實(shí)現(xiàn)定時(shí)監(jiān)控,配合條件判斷防止重復(fù)請(qǐng)求
    2024-09-09
  • vue鼠標(biāo)懸停事件監(jiān)聽(tīng)實(shí)現(xiàn)方法

    vue鼠標(biāo)懸停事件監(jiān)聽(tīng)實(shí)現(xiàn)方法

    頁(yè)面在鼠標(biāo)懸停(不動(dòng))n秒之后,頁(yè)面進(jìn)行相應(yīng)的事件,下面這篇文章主要給大家介紹了關(guān)于vue鼠標(biāo)懸停事件監(jiān)聽(tīng)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Vue瀏覽器緩存sessionStorage+localStorage+Cookie區(qū)別解析

    Vue瀏覽器緩存sessionStorage+localStorage+Cookie區(qū)別解析

    這篇文章主要介紹了Vue瀏覽器緩存sessionStorage+localStorage+Cookie區(qū)別解析,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • vue轉(zhuǎn)electron項(xiàng)目及解決使用fs報(bào)錯(cuò):Module?not?found:?Error:?Can't?resolve?'fs'?in

    vue轉(zhuǎn)electron項(xiàng)目及解決使用fs報(bào)錯(cuò):Module?not?found:?Error:?Can&apo

    這篇文章主要給大家介紹了關(guān)于vue轉(zhuǎn)electron項(xiàng)目及解決使用fs報(bào)錯(cuò):Module?not?found:?Error:?Can‘t?resolve?‘fs‘?in的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • Vue中的同步調(diào)用和異步調(diào)用方式

    Vue中的同步調(diào)用和異步調(diào)用方式

    這篇文章主要介紹了Vue中的同步調(diào)用和異步調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • elementPuls 表格反選實(shí)現(xiàn)示例代碼

    elementPuls 表格反選實(shí)現(xiàn)示例代碼

    這篇文章主要介紹了elementPuls 表格反選實(shí)現(xiàn)示例代碼,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-07-07
  • 在vue中使用export?default導(dǎo)出的class類(lèi)方式

    在vue中使用export?default導(dǎo)出的class類(lèi)方式

    這篇文章主要介紹了在vue中使用export?default導(dǎo)出的class類(lèi)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • vue2中如何更改el-dialog出場(chǎng)動(dòng)畫(huà)(el-dialog彈窗組件)

    vue2中如何更改el-dialog出場(chǎng)動(dòng)畫(huà)(el-dialog彈窗組件)

    el-dialog是一個(gè)十分好用的彈窗組件,但是出場(chǎng)動(dòng)畫(huà)比較單調(diào),于是決定自定義一個(gè)出場(chǎng)動(dòng)畫(huà),本文通過(guò)實(shí)例代碼圖文相結(jié)合給大家敘述下實(shí)現(xiàn)思路,感興趣的朋友一起看看吧
    2022-06-06

最新評(píng)論

福清市| 新竹市| 全南县| 达日县| 和田县| 长汀县| 安顺市| 曲周县| 雅安市| 两当县| 汽车| 延寿县| 微山县| 龙门县| 甘泉县| 五峰| 滦南县| 阜城县| 花莲县| 教育| 汉沽区| 山西省| 万源市| 绥宁县| 微博| 海口市| 夹江县| 无棣县| 兴城市| 阿坝| 兴国县| 鸡东县| 柳林县| 昌都县| 增城市| 淅川县| 邯郸县| 寻乌县| 金堂县| 寿阳县| 淳安县|