1.生成一个实例对象,包含高度等
Go
复制代码
var digitDriver = &base64Captcha.DriverString{
Height: 32,//验证码高度
Width: 100,//验证码宽度
NoiseCount: 0,//验证码的噪声点
ShowLineOptions: 2,//显示是否有分割线
Length: 4,//生成验证码的长度
Source: "abcdefghijklmnopqrstuvwxyz",//验证码中包含的字符合集
BgColor: &color.RGBA{R: 3, G: 102, B: 214, A: 125},//验证码背景颜色
Fonts: []string{"wqy-microhei.ttc"},//验证码使用的字体
}
2.创建一个用于储存的仓库
Go
复制代码
var store = base64Captcha.DefaultMemStore //store不但存储id和对应验证码还包含了Get,Verify两个方法后续会用到
3.生成验证码
Go
复制代码
func CaptchaGenerate() (string, string, string, error) {
driver := digitDriver.ConvertFonts()//为了处理字体
b := base64Captcha.NewCaptcha(driver, store)//使用NewCaptcha这个方法接收两个参数来生成验证码
id, b64s, hcode, err := b.Generate()//调用Generate方法得到此验证码的id,base64编码,验证码本身
if err != nil {
fmt.Println("Error generating captcha:", err)
return "", "", "", err
}
return id, b64s, hcode, nil
}
4.验证用户输入的验证码
Go
复制代码
func GetCodeAnswer(id, code string) bool {
//调用Verify方法,输入前端传来的验证码的id,以及前端传来的用户输入的验证码,参数false表示在比对完成时不删除存储的验证码
return store.Verify(id, strings.ToLower(code), false)
}
5.写一个接口用于返回前端
Go
复制代码
func RidCode(c *gin.Context) {
//获取验证码
id, b64, hcode, _ := CaptchaGenerate()//用于生成验证码的方法
if id == "" || b64 == " " {
pkg.ResponseError(c, 400)//响应失败
fmt.Println("RidCode Login() err")
return
}
code := map[string]any{//返回给前端的map结构
"Id": id,//验证码id
"Hcode": hcode,//验证码本身
"B64": b64,//base64编码,前端根据这个来生成图片
}
pkg.ResponseSuccess(c, code)//响应成功
}
6.总代码
Go
复制代码
package userService
import (
"fmt"
"github.com/mojocn/base64Captcha"
"image/color"
"strings"
)
var digitDriver = &base64Captcha.DriverString{
Height: 32,
Width: 100,
NoiseCount: 0,
ShowLineOptions: 2,
Length: 4,
Source: "abcdefghijklmnopqrstuvwxyz",
BgColor: &color.RGBA{R: 3, G: 102, B: 214, A: 125},
Fonts: []string{"wqy-microhei.ttc"},
}
var store = base64Captcha.DefaultMemStore
// CaptchaGenerate 生成验证码
func CaptchaGenerate() (string, string, string, error) {
driver := digitDriver.ConvertFonts()
b := base64Captcha.NewCaptcha(driver, store)
id, b64s, hcode, err := b.Generate()
if err != nil {
fmt.Println("Error generating captcha:", err)
return "", "", "", err
}
return id, b64s, hcode, nil
}
// GetCodeAnswer 验证验证码
func GetCodeAnswer(id, code string) bool {
return store.Verify(id, strings.ToLower(code), false)
}
//接口
func RidCode(c *gin.Context) {
//获取验证码
id, b64, hcode, _ := CaptchaGenerate()
if id == "" || b64 == " " {
pkg.ResponseError(c, 400)
fmt.Println("RidCode Login() err")
return
}
code := map[string]any{
"Id": id,
"Hcode": hcode,
"B64": b64,
}
pkg.ResponseSuccess(c, code)
}