package v1
|
|
import (
|
"aps_crm/conf"
|
"aps_crm/constvar"
|
"aps_crm/model/response"
|
"aps_crm/pkg/contextx"
|
"aps_crm/pkg/convertx"
|
"aps_crm/pkg/ecode"
|
"aps_crm/pkg/logx"
|
"github.com/gin-gonic/gin"
|
"github.com/mojocn/base64Captcha"
|
"time"
|
)
|
|
type BaseApi struct{}
|
|
// Captcha
|
// @Tags Base
|
// @Summary 获取验证码
|
// @Produce application/json
|
// @Success 200 {object} contextx.Response{data=response.LoginResponse} "成功"
|
// @Router /api/base/captcha [post]
|
func (slf *BaseApi) Captcha(c *gin.Context) {
|
ctx, ok := contextx.NewContext(c, nil)
|
if !ok {
|
return
|
}
|
|
// 判断验证码是否开启
|
openCaptcha := conf.Conf.Captcha.OpenCaptcha // 是否开启防爆次数
|
openCaptchaTimeOut := conf.Conf.Captcha.OpenCaptchaTimeOut // 缓存超时时间
|
key := c.ClientIP()
|
v, ok := constvar.BlackCache.Get(key)
|
if !ok {
|
constvar.BlackCache.Set(key, 1, time.Second*time.Duration(openCaptchaTimeOut))
|
}
|
|
var oc bool
|
if openCaptcha == 0 || convertx.InterfaceToInt(v) > openCaptcha { // 0 表示每次登录都需要验证码 或者当前次数已超过防爆次数
|
oc = true
|
}
|
// 字符,公式,验证码配置
|
// 生成默认数字的driver
|
driver := base64Captcha.NewDriverDigit(conf.Conf.Captcha.ImgHeight, conf.Conf.Captcha.ImgWidth, conf.Conf.Captcha.KeyLong, 0.7, 80)
|
cp := base64Captcha.NewCaptcha(driver, store)
|
id, b64s, err := cp.Generate()
|
captcha := store.Get(id, false)
|
logx.Infof("Captcha Generate captchaId:%v captcha:%v", id, captcha)
|
if err != nil {
|
logx.Errorf("Captcha Generate err:%v", err)
|
ctx.Fail(ecode.CaptchaGenerateFailed)
|
return
|
}
|
|
ctx.OkWithDetailed(response.CaptchaResponse{
|
CaptchaId: id,
|
PicPath: b64s,
|
CaptchaLength: conf.Conf.Captcha.KeyLong,
|
OpenCaptcha: oc,
|
})
|
}
|