sys_captcha.go 2.1 KB

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