扫码登录 websocket
# 思路
```
# 一、生成扫码登录二维码
1 下载qrcode.vue模块,导入QrcodeVue组件,value属性放接口地址
2 watch监控切换 生成新的
# 二、websocket监控是否登录
1 下载pnpm add socket.io-client@2.2.0模块
2、组件导入、使用
const stateUuid = ref(uuid())
// 1 创建链接:通过socket.io创建socket对象
const socket = io('http://39.107.231.173:3003')
// 2 加入监控:通过socket对象的emit语法,把uuid传递给服务器(标识写join、触发机制-每次生成新的uuid都得推送一次)
// 3 监控后端推送的登录状态
socket.on('islogin', (res: PostLoginResType) => {
console.log('后端返回的数据', res)
const { state, msg, token, username, roleName, avatar } = res
if (state === 200) {
switch (msg) {
case '等待扫码':
break
case '扫描成功':
document.querySelector('h2')!.innerHTML = '<span style="color:green">扫描成功</span>'
break
case '取消扫码':
document.querySelector('h2')!.innerHTML = '<span style="color:red">你已取消此次登录重试</span>'
break
case '登录成功':
socket.emit('leave')
console.log('登录成功:', res)
save(token, username, roleName, avatar)
ElMessage.success(res.msg)
router.push('/')
break
default:
break
}
} else {
ElMessage.error(msg)
}
// ...
})
// 4 退出监控:通过socket对象的emit语法(表示写leave、触发机制-切换到账号登录或者登录成功)
watch(state, () => {
if (state.value) {
// 账号登录
socket.emit('leave')
} else {
// 扫码登录
// console.log(state.value, state.value ? '账号登录' : '扫码登录')
stateUuid.value = uuid()
// 推送给服务器
socket.emit('join', stateUuid.value)
}
})
```
# 一、动态生成二维码
```
<script src="http://unpkg.com/jquery"></script>
<script src="https://unpkg.com/jquery.qrcode@1.0.3/jquery.qrcode.min.js"></script>
<div id="qrcode"></div>
<script>
function uuid() {
const s = [];
const hexDigits = "0123456789abcdef";
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
s[8] = s[13] = s[18] = s[23] = "-";
const uuid = s.join("");
return new Date().getTime() + "-" + uuid;
}
// 留心:state位置不能变,qrcode实参的text键要用
const state = uuid();
jQuery("#qrcode").qrcode({
render: "canvas",
foreground: "#000",
background: "#FFF",
text: `https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxed58e834201d0894&redirect_uri=http://qf.ft.learv.com/qr/login.html&response_type=code&scope=snsapi_base&state=${state}&connect_redirect=1#wechat_redirect`,
});
</script>
```
# 二、检查用户是否扫码授权登陆
```#
<script src="https://cdn.bootcss.com/socket.io/2.2.0/socket.io.js"></script>
<script>
// 创建 socket 对象
const socket = io("ws://39.107.231.173:3003");
// 首次加入服务器监控队列
// 参数:state 【必须】全球唯一的登录标识
// 留心:state 是上面uuid()函数生成的
socket.emit("join", state);
// 监控服务器推送的登陆信息
// 留心:超过2分钟不扫码登陆二维码就会过期
// 过期推送数据:{meta:{state: 400, msg: "二维码已过期"},data:null}
socket.on("islogin", (res) => {
console.log(res);
// 提示登陆成功
// h5存储
// 重定向跳转
});
</script>
```
标题