picgo/corelib/captcha/captcha.go

69 lines
1.7 KiB
Go
Raw Normal View History

package captcha
import (
"image"
"os"
"path/filepath"
"picgo/configs"
"picgo/corelib"
"strings"
)
// GenerateCaptcha 图形验证码
func GenerateCaptcha(cid string) (img *image.RGBA, err error) {
// 字体路径
dir, err := os.Getwd()
if err != nil {
return
}
var fontPath = filepath.Join(dir, "corelib", "captcha", "fonts")
// 随机字体
var fontNames = []string{"DENNEthree-dee", "3Dumb"}
fontName := RandChooseOne(fontNames)
// 随机模式
var modes = []int{0, 1}
mode := RandChooseOne(modes)
// 生成图片验证码
captchaLen := configs.Settings.Captcha.Length
w := configs.Settings.Captcha.Width
h := configs.Settings.Captcha.Hight
cp := NewCaptcha(w, h, captchaLen)
cp.SetFontPath(fontPath) //指定字体目录
cp.SetFontName(fontName) //指定字体名字
cp.SetMode(mode) //1设置为简单的数学算术运算公式 其他为普通字符串
code, img := cp.OutPut()
// 备注code 存储到redis并在使用时取出验证
corelib.Logger.Infoln("图片验证码: ", code)
// 配置文件中获取过期时间
exp := configs.Settings.Captcha.Expire
// 缓存生成的验证码
if err = SetCode(cid, code, int64(exp)); err != nil {
return
}
//core.Logger.Infoln("验证结果:", Verify(cid, code))
return
}
// Verify 验证
func Verify(id string, code string) (ok bool) {
ok = false
var (
err error
redisCode string
)
// 验证字符串是否合法
if code == "" || !corelib.IsCaptcha(code) {
return
}
code = strings.ToLower(code)
// redis取验证码
if redisCode, err = GetCode(id); err != nil {
return
}
// redis存储验证码和用户输入验证码对比
if strings.ToLower(redisCode) == strings.ToLower(code) {
return true
}
return
}