前言
大家好,我是作曲家种太阳
上一篇,我们讲了如何接入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中加入
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函数
ps:把 验证码分到base的路由组里
最后-验证结果环节
(1).测试redis设置值和取值
在 main.go中加入
打印出test的value值就说明redis没问题
ps: Redis.Set()第三个位置参数是过期时间,time.Second是一秒
你可以试试吧注释的time.sleep()函数打开,看是否能打印数据
(2).测试图形验证码接口
postman打开:http://192.168.0.125:8022/v1/base/captcha
当返回id,和base64验证码就成功了~
base64码转图片网址
ps: 你也可以写一个img的html标签来写渲染base64图形验证码
(3).重新验证login接口 (因为之前改了PasswordLoginForm结构体)
如果这系列的文章对你有有用,请点赞和留言吧~