10篇带你手摸手封装gin框架(7)- redis接入与图形验证码

前言

大家好,我是作曲家种太阳
上一篇,我们讲了如何接入gorm,并编写了一个获取用户列表的接口
这一篇,我们来对接redis并编写一个返回图形验证码的接口

1. 介绍

redis是nosql数据库,常用作数据缓存
安装:

docker run -p 6379:6379 -d redis:latest redis-server

docker container update --restart=always 容器名字
复制代码

安装go的redis库

    go get github.com/go-redis/redis
复制代码

(2).图形验证码 是为了防爬虫节流的一个手段,生成一个base64码返回给前端

2. 初始化redis链接

(1). 添加redis驱动的全局变量

在 global/globalVar中添加:

    Redis  *redis.Client
复制代码

(2).编写初始化redis链接

在 initialize/redis 中添加

package initialize

import (
	"fmt"
	"github.com/fatih/color"
	"github.com/go-redis/redis"
	"go_gin/global"
)

func InitRedis() {
	addr := fmt.Sprintf("%s:%d", global.Settings.RedisInfo.Host, global.Settings.RedisInfo.Port)
	// 生成redis客户端
	global.Redis = redis.NewClient(&redis.Options{
		Addr:     addr,
		Password: "", // no password set
		DB:       0,  // use default DB
	})
	// 链接redis
	_, err := global.Redis.Ping().Result()
	if err != nil {
		color.Red("[InitRedis] 链接redis异常:")
		color.Yellow(err.Error())
	}
}
复制代码

ps: global.Settings.RedisInfo是yaml中redis配置 \

(3).测试

在 main.go 导入InitRedis

//6. 初始化redis
initialize.InitRedis()
复制代码

启动main.go,没有报错说明redis链接就成功啦~

2. 需求分析

图形验证码一般是在登录的时候加入
所以我们重新定义一下 PasswordLoginForm 结构体,加上captcha(验证码),captcha_id(验证码id)
在 forms/user.go 中 PasswordLoginForm 结构体修改成:

package forms

type PasswordLoginForm struct {
	Mobile    string `form:"mobile" json:"mobile" binding:"required,mobile"` //手机号码格式有规范可寻, 自定义validator
	PassWord  string `form:"password" json:"password" binding:"required,min=3,max=20"`
	Captcha   string `form:"captcha" json:"captcha" binding:"required,min=5,max=5"` // 验证码
	CaptchaId string `form:"captcha_id" json:"captcha_id" binding:"required"`       // 验证码id
}
复制代码

注意几个点:
1. Captcha的最大值和最小值都为5,应为后续设置获取验证码的位数是5
2. PasswordLoginForm修改后,login的接口就必须传入验证码和验证id,否则报错

3.获取图形验证码接口

(1).安装 base64Captcha 库

"github.com/mojocn/base64Captcha"
复制代码

(2).在controller/catpcha.go中编写

package controller

import (
	"github.com/gin-gonic/gin"
	"github.com/mojocn/base64Captcha"
	"go.uber.org/zap"
	"go_gin/Response"
	"net/http"
)
// base64Captcha  缓存对象
var store = base64Captcha.DefaultMemStore
// GetCaptcha 获取验证码
func GetCaptcha(ctx *gin.Context) {
	//
	driver := base64Captcha.NewDriverDigit(80, 240, 5, 0.7, 80)
	cp := base64Captcha.NewCaptcha(driver, store)
	// b64s是图片的base64编码
	id, b64s, err := cp.Generate()
	if err != nil {
		zap.S().Errorf("生成验证码错误,:%s ", err.Error())
		Response.Err(ctx, http.StatusInternalServerError, 500, "生成验证码错误", "")
		return
	}
	Response.Success(ctx, 200, "生成验证码成功", gin.H{
		"captchaId": id,
		"picPath":   b64s,
	})
}
复制代码

ps: base64Captcha.NewDriverDigit可以根据参数调节验证码参数

5.校验图形验证码

生成图形验证码肯定得校验功能
在 controller/user.go中加入
image.png
ps:

4.给验证码接口添加路由

(1).在 router/base.go 添加

package router

import (
	"github.com/gin-gonic/gin"
	"go_gin/controller"
)

// InitBaseRouter 图形验证码的路由
func InitBaseRouter(Router *gin.RouterGroup) {
	BaseRouter := Router.Group("base")
	{
		BaseRouter.GET("captcha", controller.GetCaptcha)
	}

}
复制代码

(2). 在initialize/router中添加 InitBaseRouter函数

image.png

ps:把 验证码分到base的路由组里

最后-验证结果环节

(1).测试redis设置值和取值

在 main.go中加入
image.png
打印出test的value值就说明redis没问题
ps: Redis.Set()第三个位置参数是过期时间,time.Second是一秒
你可以试试吧注释的time.sleep()函数打开,看是否能打印数据
(2).测试图形验证码接口
postman打开:http://192.168.0.125:8022/v1/base/captcha

image.png

当返回id,和base64验证码就成功了~
base64码转图片网址

image.png
ps: 你也可以写一个img的html标签来写渲染base64图形验证码

(3).重新验证login接口 (因为之前改了PasswordLoginForm结构体)
image.png

如果这系列的文章对你有有用,请点赞和留言吧~

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享