|
|
package system
|
|
|
|
|
|
import (
|
|
|
"pychr/plugin/upyun"
|
|
|
"time"
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
"github.com/mojocn/base64Captcha"
|
|
|
"go.uber.org/zap"
|
|
|
"pychr/global"
|
|
|
"pychr/model/common/response"
|
|
|
systemRes "pychr/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, answer, err := cp.Generate()
|
|
|
if err != nil {
|
|
|
global.GVA_LOG.Error("验证码获取失败!", zap.Error(err))
|
|
|
response.FailWithMessage("验证码获取失败", c)
|
|
|
return
|
|
|
}
|
|
|
global.GVA_LOG.Debug(answer)
|
|
|
response.OkWithDetailed(systemRes.SysCaptchaResponse{
|
|
|
CaptchaId: id,
|
|
|
PicPath: b64s,
|
|
|
CaptchaLength: global.GVA_CONFIG.Captcha.KeyLong,
|
|
|
OpenCaptcha: oc,
|
|
|
}, "验证码获取成功", c)
|
|
|
}
|
|
|
|
|
|
type GetCDNTokenQuery struct {
|
|
|
Method string `form:"method"`
|
|
|
SaveKey string `form:"saveKey"`
|
|
|
}
|
|
|
|
|
|
type GetCDNTokenData struct {
|
|
|
Authorization string `json:"authorization"`
|
|
|
Bucket string `json:"bucket"`
|
|
|
Method string `json:"method"`
|
|
|
Policy string `json:"policy"`
|
|
|
Expiration int64 `json:"expiration"`
|
|
|
}
|
|
|
|
|
|
// @Tags CDN
|
|
|
// @Security ApiKeyAuth
|
|
|
// @Summary 获取CDN操作令牌
|
|
|
// @Produce json
|
|
|
// @Param method query int false "方法"
|
|
|
// @Param saveKey query int false "保存关键字"
|
|
|
// @Success 200 {object} structure.GetLoginInformationData{}
|
|
|
// @Router /base/cdn/token [get]
|
|
|
func (b *BaseApi) GetCDNToken(c *gin.Context) {
|
|
|
// method := c.Query("method")
|
|
|
// saveKey := c.Query("saveKey")
|
|
|
var (
|
|
|
q = GetCDNTokenQuery{}
|
|
|
data = GetCDNTokenData{}
|
|
|
token upyun.FormAPIToken
|
|
|
)
|
|
|
err := c.ShouldBindQuery(&q)
|
|
|
if err != nil {
|
|
|
response.FailWithMessage(err.Error(), c)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
token, err = upyun.GetUpyunToken(q.Method, q.SaveKey)
|
|
|
if err != nil {
|
|
|
global.GVA_LOG.Error("获取失败!", zap.Error(err))
|
|
|
response.FailWithMessage("获取失败", c)
|
|
|
return
|
|
|
} else {
|
|
|
data.Authorization = token.Authorization
|
|
|
data.Bucket = token.Bucket
|
|
|
data.Method = token.Method
|
|
|
data.Policy = token.Policy
|
|
|
data.Expiration = token.XUpYunExpire
|
|
|
response.OkWithData(data, c)
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 类型转换
|
|
|
func interfaceToInt(v interface{}) (i int) {
|
|
|
switch v := v.(type) {
|
|
|
case int:
|
|
|
i = v
|
|
|
default:
|
|
|
i = 0
|
|
|
}
|
|
|
return
|
|
|
}
|