You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package captcha
import (
"bytes"
"github.com/dchest/captcha"
"github.com/gin-gonic/gin"
"goskeleton/app/global/consts"
"goskeleton/app/global/variable"
"goskeleton/app/utils/response"
"net/http"
"path"
"time"
)
type Captcha struct{}
// 生成验证码ID
func (c *Captcha) GenerateId(context *gin.Context) {
// 设置验证码的数字长度(个数)
var length = variable.ConfigYml.GetInt("Captcha.length")
var captchaId, imgUrl, refresh, verify string
captchaId = captcha.NewLen(length)
imgUrl = "/captcha/" + captchaId + ".png"
refresh = imgUrl + "?reload=1"
verify = "/captcha/" + captchaId + "/这里替换为正确的验证码进行验证"
response.Success(context, "验证码信息", gin.H{
"id": captchaId,
"img_url": imgUrl,
"refresh": refresh,
"verify": verify,
})
}
// 获取验证码图像
func (c *Captcha) GetImg(context *gin.Context) {
captchaIdKey := variable.ConfigYml.GetString("Captcha.captchaId")
captchaId := context.Param(captchaIdKey)
_, file := path.Split(context.Request.URL.Path)
ext := path.Ext(file)
id := file[:len(file)-len(ext)]
if ext == "" || captchaId == "" {
response.Fail(context, consts.CaptchaGetParamsInvalidCode, consts.CaptchaGetParamsInvalidMsg, "")
return
}
if context.Query("reload") != "" {
captcha.Reload(id)
}
context.Header("Cache-Control", "no-cache, no-store, must-revalidate")
context.Header("Pragma", "no-cache")
context.Header("Expires", "0")
var vBytes bytes.Buffer
if ext == ".png" {
context.Header("Content-Type", "image/png")
// 设置实际业务需要的验证码图片尺寸(宽 X 高captcha.StdWidth, captcha.StdHeight 为默认值,请自行修改为具体数字即可
_ = captcha.WriteImage(&vBytes, id, captcha.StdWidth, captcha.StdHeight)
http.ServeContent(context.Writer, context.Request, id+ext, time.Time{}, bytes.NewReader(vBytes.Bytes()))
}
}
// 校验验证码
func (c *Captcha) CheckCode(context *gin.Context) {
captchaIdKey := variable.ConfigYml.GetString("Captcha.captchaId")
captchaValueKey := variable.ConfigYml.GetString("Captcha.captchaValue")
captchaId := context.Param(captchaIdKey)
value := context.Param(captchaValueKey)
if captchaId == "" || value == "" {
response.Fail(context, consts.CaptchaCheckParamsInvalidCode, consts.CaptchaCheckParamsInvalidMsg, "")
return
}
if captcha.VerifyString(captchaId, value) {
response.Success(context, consts.CaptchaCheckOkMsg, "")
} else {
response.Fail(context, consts.CaptchaCheckFailCode, consts.CaptchaCheckFailMsg, "")
}
}