package system import ( "github.com/gin-gonic/gin" "github.com/mojocn/base64Captcha" "github.com/sirupsen/logrus" "go.uber.org/zap" "lc-fangdaosha/global" "lc-fangdaosha/model/common/response" systemResp "lc-fangdaosha/model/system/response" "time" ) // 当开启多服务器部署时,替换下面的配置,使用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=systemResp.SysCaptchaResponse,msg=string} "生成验证码,返回包括随机数id,base64,验证码长度,是否开启验证码" // @Router /base/captcha [get] func (b *BaseApi) Captcha(c *gin.Context) { // 判断验证码是否开启 openCaptcha := global.Config.Captcha.OpenCaptcha openCaptchaTimeOut := global.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.Config.Captcha.ImgHeight, global.Config.Captcha.ImgWidth, global.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 { logrus.Error("验证码获取失败!", zap.Error(err)) response.FailWithMessage("验证码获取失败", c) return } response.OkWithDetailed(systemResp.SysCaptchaResponse{ CaptchaId: id, PicPath: b64s, CaptchaLength: global.Config.Captcha.KeyLong, OpenCaptcha: oc, }, "验证码获取成功", c) } // 类型转换 func interfaceToInt(v interface{}) (i int) { switch v := v.(type) { case int: i = v default: i = 0 } return }