fix
wangpengfei
2023-09-05 20acdf9648c20c4b1e0b03af98bd0010bab66f7b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package system
 
import (
    "time"
 
    "github.com/gin-gonic/gin"
    "github.com/mojocn/base64Captcha"
    "go.uber.org/zap"
    "srm/global"
    "srm/model/common/response"
    systemRes "srm/model/system/response"
)
 
// 当开启多服务器部署时,替换下面的配置,使用redis共享存储验证码
// var store = captcha.NewDefaultRedisStore()
var store = base64Captcha.DefaultMemStore
 
type BaseApi struct{}
 
// Captcha
// @Tags      Base
// @Summary   生成验证码
// @Security  ApiKeyAuth
// @accept    application/json
// @Produce   application/json
// @Success   200  {object}  response.Response{data=systemRes.SysCaptchaResponse,msg=string}  "生成验证码,返回包括随机数id,base64,验证码长度,是否开启验证码"
// @Router    /base/captcha [post]
func (b *BaseApi) Captcha(c *gin.Context) {
    // 判断验证码是否开启
    openCaptcha := global.GVA_CONFIG.Captcha.OpenCaptcha               // 是否开启防爆次数
    openCaptchaTimeOut := global.GVA_CONFIG.Captcha.OpenCaptchaTimeOut // 缓存超时时间
    key := c.ClientIP()
    v, ok := global.BlackCache.Get(key)
    if !ok {
        global.BlackCache.Set(key, 1, time.Second*time.Duration(openCaptchaTimeOut))
    }
 
    var oc bool
    if openCaptcha == 0 || openCaptcha < interfaceToInt(v) {
        oc = true
    }
    // 字符,公式,验证码配置
    // 生成默认数字的driver
    driver := base64Captcha.NewDriverDigit(global.GVA_CONFIG.Captcha.ImgHeight, global.GVA_CONFIG.Captcha.ImgWidth, global.GVA_CONFIG.Captcha.KeyLong, 0.7, 80)
    // cp := base64Captcha.NewCaptcha(driver, store.UseWithCtx(c))   // v8下使用redis
    cp := base64Captcha.NewCaptcha(driver, store)
    id, b64s, err := cp.Generate()
    if err != nil {
        global.GVA_LOG.Error("验证码获取失败!", zap.Error(err))
        response.FailWithMessage("验证码获取失败", c)
        return
    }
    response.OkWithDetailed(systemRes.SysCaptchaResponse{
        CaptchaId:     id,
        PicPath:       b64s,
        CaptchaLength: global.GVA_CONFIG.Captcha.KeyLong,
        OpenCaptcha:   oc,
    }, "验证码获取成功", c)
}
 
// 类型转换
func interfaceToInt(v interface{}) (i int) {
    switch v := v.(type) {
    case int:
        i = v
    default:
        i = 0
    }
    return
}