go实现QR订阅的几种方法

news/2024/11/20 12:08:42/文章来源:https://www.cnblogs.com/iruan/p/18556585

1.基于HTTP协议

1.1返回图片地址

通过qrcode生成二维码图片到static目录下,然后返回二维码图片的地址,返回的地址可以使用base64加密也可以直接返回。
controller层

func QrSignHandler(c *gin.Context) {qr_url, err := logic.Generate_Qr()if err != nil {c.JSON(10005, err)return}c.JSON(200, gin.H{"qrCodeUrl": "/"+qr_url, //返回绝对路径})
}//DosignHandler 验证扫码的签到
func DosignHandler(c *gin.Context) {// 获取参数token:=c.Param("token")// 验证token是否存在if err:=logic.VerifyToken(token);err!=nil {c.JSON(502,gin.H{"msg": err.Error(),})}else {c.JSON(200,gin.H{"msg":"签到成功"})}}

logic层

func Generate_Qr() (sign_url string, err error) {//1. 生成二维码tokentoken, err := generate_token()if err != nil {return "", err}//2.使用redis存储tokenerr = redis.QRsign(token)//3. 调用第三方 API生成二维码并返回Urlsign_url, err = generateQr_url(token)return
}
func VerifyToken(token string) error {//验证tokenreturn redis.VerifyQrToken(token)
}func generate_token() (string, error) {b := make([]byte, 32)_, err := rand.Read(b)if err != nil {return "", err}return base64.URLEncoding.EncodeToString(b), nil
}// generateQr_url 生成qr
func generateQr_url(token string) (string, error) {//生成内容Qr_content := "http://127.0.0.1:8080/api/v1/qr/" + tokenfmt.Println("签到:",Qr_content)//二维码保存位置qr_root := "static/qrcodes/"qr_file_path := qr_root + token + ".png"defer delfile(qr_root,qr_file_path)// 创建二维码并保存err := qrcode.WriteFile(Qr_content, qrcode.Medium, 256, qr_file_path)if err != nil {zap.L().Error("创建二维码失败!", zap.Error(err))return "", err}return qr_file_path, nil}// delfile 删除多余的二维码
func delfile(dir string,newqr string)  {err:= filepath.Walk(dir, func(path string, info fs.FileInfo, err error) error {if  err!=nil {return err}if !info.IsDir(){if filepath.Clean(path) != filepath.Clean(newqr) {zap.L().Info("我要删除二维码了!",zap.Any("遍历的path:",path),zap.Any("新生成的tokenqr:",newqr))return os.Remove(path)}}return nil})if err!=nil {zap.L().Error("删除二维码失败!",zap.Error(err))return}
}

dao层

package redisimport ("context""errors""time""github.com/go-redis/redis/v8"
)func QRsign(token string) error {err := Rdb.Set(context.Background(), "Sign_Token", token, 10*time.Second).Err()if err != nil {return err}return nil
}func VerifyQrToken(token string) error {//验证token是否存在和是否过期result, err := Rdb.Get(context.Background(), "Sign_Token").Result()if err != nil {if err == redis.Nil {return errors.New("二维码已过期")}return err}if result != token {return errors.New("二维码不存在")}return nil}

1.2 返回图片的base64内容

由于1.1的方法需要在服务器生成二维码图片,导致会消耗服务器资源。尽管已经采用了及时删除图片策略,但交互还是繁琐
使用qrcode.Encode把二维码图片内容编码成byte类型的数据,再传给前端,前端直接使用img标签就可以解码,当然需要将byte进行base64编码再返回。
controller层

// QrsignBybyteHandler 通过二维码的字节内容返回func QrsignBybyteHandler(c *gin.Context) {data_byte, err := logic.Generate_Qr_By_byte()if err != nil {zap.L().Error("Generate_Qr_By_byte err:", zap.Error(err))return}base64data := base64.RawStdEncoding.EncodeToString(data_byte)c.JSON(200, gin.H{"data": base64data})
}

logic层

func Generate_Qr_By_byte() ([]byte, error) {//1. 生成二维码tokentoken, err := generate_token()if err != nil {return nil, err}//2.使用redis存储tokenerr = redis.QRsign(token)//3.使用qrcode的encoding方法return qrcode.Encode("http://127.0.0.1:8080/api/v1/qr/"+token, qrcode.Medium, 256)}

2.基于websockts协议

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/837276.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

考研打卡(23)

开局(23) 开始时间 2024-11-20 11:07:52 结束时间 2024-11-20 12:01:50十一点醒了数据结构已知 10 个元素 (54,28,16,34,73,62,95,60,26,43) , 按照依次插入的方法生成一棵二叉排序树,查找值为 62 的结点所需比较次数为_____(复旦大学 2014年) A 2 B 3 C 4 D 5B…

apache直接打印php代码或直接下载问题

在/etc/httpd/conf/httpd.conf中的添加圈出的代码:下载问题,直接执行,然后重启apache: yum install mod_php

Java易混知识点列表比较

前前后后遇到了一些容易混淆的知识点,特地做了表格专栏捋清思路类一级成员与实例成员类一级成员 实例成员属于 类本身 类创建的实例对象举例 static(变量/方法/初始化块)、内部类 普通成员直接访问 类名.member 对象.memberclass superc{int i=5;void show(){System.out.pri…

新兴数据仓库设计与实践手册:从分层架构到实际应用(二)

本手册将分为三部分发布,以帮助读者逐步深入理解数据仓库的设计与实践。第一部分介绍数据仓库的整体架构概述; 第二部分深入讨论ETL在数仓中的应用理论,ODS层的具体实现与应用; 第三部分将围绕DW数据仓库层、ADS层和数据仓库的整体趋势展开;通过这样的结构,您可以系统地学…

【跟着阿舜学音乐-笔记】1.14代理和弦

三和弦代理和弦 代理和弦是指两个和弦从功能上能够相互替代,彼此代替对方执行相互的功能。 这意味着互为代理和弦的两个和弦在功能上有一定的互通性,这就是1.12提到的——拥有两个以上共同音的称为代理和弦。 同时,这种功能上的共通性也有着一定的强弱,在同属关系下,关系大…

TCP/UDP套接字基础编程及拓展

本文章旨在进行TCP/UDP基础套接字编程并在其基础上进行更新拓展。一、环境 1.1 客户端:windows宿主机 1.2 服务器端:Linux虚拟机 1.3 注意事项 测试套接字编程通信时,先确保C/S能互相ping通,且双方主机防火墙允许目的端口号为“创建的端口号”的数据包通过。 二、代码 2…

6款Win电脑高效实用办公软件推荐

作为打工人,是不是总觉得工作效率提不上去呢?今天我就来给大家分享 6 款办公超实用的软件,让你的工作事半功倍! 一、WPS 比office更适合职场小白上手的办公软件!它涵盖了文字、表格、演示等多种功能。写文档时,丰富的模板库能让你快速找到灵感,各种排版和编辑工具一应俱…

bladeX物联网平台私库操作处理步骤

(一)获取对方私库代码并上传到自己的gitlab 步骤 1: 克隆对方的私有仓库 首先,您需要在本地计算机上克隆对方的私有仓库。这通常需要使用HTTPS或SSH URL,并且可能需要身份验证(如用户名和密码、SSH密钥等)。# 假设您已经配置了SSH密钥或知道HTTPS的用户名和密码 git cl…

震撼推荐!性能测试全攻略:零基础也能玩转性能测试!

1、提起性能测试,你的第一反应是什么? 当提到性能测试,你的第一反应是什么?是不屑一顾,认为它很简单,没发展前途、没技术含量?还是觉得它太难了,高不可攀,每当遇到系统的疑难杂症时,抓耳挠腮,无从下手? 很多IT从业人员,认为"性能测试仅仅只是测试的工作,会用…

不同类型的OA办公系统分别有什么作用?

不知道大家有没有发现,在不知不觉间,OA(Office Automation)办公系统的应用已经发展得越来越广泛,可以说是涉及到工作的方方面面。你们想过这是为什么吗? 因为OA办公系统不仅提高了工作效率,还优化了企业的管理流程。随着科技的不断进步,OA办公系统的类型也日益丰富,满…

React+AntD Table支持下拉分页和自定义输入分页条数

实例支持在下拉分页框内输入分页条数来实现自定义分页代码usePageSizeSelect.jsimport {useEffect, useState} from "react"; import Bus from "../../utils/eventBus";export function usePageSizeSelect() {const onInputKeyDown = (e) => {const tem…