|
|
|
|
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, "")
|
|
|
|
|
}
|
|
|
|
|
}
|