69 lines
1.7 KiB
Go
69 lines
1.7 KiB
Go
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) == code {
|
||
return true
|
||
}
|
||
return
|
||
}
|