Vue?PC前端掃碼登錄功能實(shí)現(xiàn)
需求描述
目前大多數(shù)PC端應(yīng)用都有配套的移動(dòng)端APP,如微信,淘寶等,通過使用手機(jī)APP上的掃一掃功能去掃頁面二維碼圖片進(jìn)行登錄,使得用戶登錄操作更方便,安全,快捷。
思路解析
PC 掃碼原理?
掃碼登錄功能涉及到網(wǎng)頁端、服務(wù)器和手機(jī)端,三端之間交互大致步驟如下:
- 網(wǎng)頁端展示二維碼,同時(shí)不斷的向服務(wù)端發(fā)送請求詢問該二維碼的狀態(tài);
- 手機(jī)端掃描二維碼,讀取二維碼成功后,跳轉(zhuǎn)至確認(rèn)登錄頁,若用戶確認(rèn)登錄,則服務(wù)器修改二維碼狀態(tài),并返回用戶登錄信息;
- 網(wǎng)頁端收到服務(wù)器端二維碼狀態(tài)改變,則跳轉(zhuǎn)登錄后頁面;
- 若超過一定時(shí)間用戶未操作,網(wǎng)頁端二維碼失效,需要重新刷新生成新的二維碼。
前端功能實(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-掃碼通過 3-過期
effectiveTime: 30, // 有效時(shí)間
qrCodeTimer: null // 有效時(shí)長計(jì)時(shí)器
uid: '',
time: ''
};
},
methods: {
// 輪詢獲取二維碼狀態(tài)
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()
}
},前端如何獲取服務(wù)器二維碼的狀態(tài)?
前端向服務(wù)端發(fā)送二維碼狀態(tài)查詢請求,通常使用輪詢的方式
- 定時(shí)輪詢:間隔1s 或特定時(shí)段發(fā)送請求,通過調(diào)用setInterval(), clearInterval()來停止;
- 長輪詢:前端判斷接收到的返回結(jié)果,若二維碼仍未被掃描,則會(huì)繼續(xù)發(fā)送查詢請求,直至狀態(tài)發(fā)生變化(失效或掃碼成功)
- Websocket:前端在生成二維碼后,會(huì)與后端建立連接,一旦后端發(fā)現(xiàn)二維碼狀態(tài)變化,可直接通過建立的連接主動(dò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("二維碼過期")
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;
}
}
},參考資料:
總結(jié)
到此這篇關(guān)于Vue PC前端掃碼登錄功能實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Vue PC前端掃碼登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue+element項(xiàng)目中過濾輸入框特殊字符小結(jié)
這篇文章主要介紹了vue+element項(xiàng)目中過濾輸入框特殊字符小結(jié),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
Vue觸發(fā)隱藏input file的方法實(shí)例詳解
這篇文章主要介紹了Vue觸發(fā)隱藏input file的方法實(shí)例詳解,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-08-08
vue通過指令(directives)實(shí)現(xiàn)點(diǎn)擊空白處收起下拉框
這篇文章主要介紹了vue通過指令(directives)實(shí)現(xiàn)點(diǎn)擊空白處收起下拉框,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12
關(guān)于vue狀態(tài)過渡transition不起作用的原因解決
這篇文章主要介紹了關(guān)于vue狀態(tài)過渡transition不起作用的原因解決,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04
vue實(shí)現(xiàn)excel文件導(dǎo)入導(dǎo)出操作示例
這篇文章主要為大家介紹了vue實(shí)現(xiàn)excel文件的導(dǎo)入導(dǎo)出實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
vue進(jìn)行下載與處理二進(jìn)制流文件的方法詳解
這篇文章主要為大家詳細(xì)介紹了vue如何實(shí)現(xiàn)將后端返回的二進(jìn)制流進(jìn)行處理并實(shí)現(xiàn)下載,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12

