139 lines
4.3 KiB
Go
139 lines
4.3 KiB
Go
package controller
|
||
|
||
import (
|
||
"time"
|
||
|
||
"be.ems/src/framework/config"
|
||
"be.ems/src/framework/constants/cachekey"
|
||
"be.ems/src/framework/constants/captcha"
|
||
"be.ems/src/framework/database/redis"
|
||
"be.ems/src/framework/logger"
|
||
"be.ems/src/framework/utils/parse"
|
||
"be.ems/src/framework/vo/result"
|
||
systemService "be.ems/src/modules/system/service"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/mojocn/base64Captcha"
|
||
)
|
||
|
||
// 实例化控制层 CaptchaController 结构体
|
||
var NewCaptcha = &CaptchaController{
|
||
sysConfigService: systemService.NewSysConfigImpl,
|
||
}
|
||
|
||
// 验证码操作处理
|
||
//
|
||
// PATH /
|
||
type CaptchaController struct {
|
||
// 参数配置服务
|
||
sysConfigService systemService.ISysConfig
|
||
}
|
||
|
||
// 获取验证码
|
||
//
|
||
// GET /captchaImage
|
||
//
|
||
// @Tags common
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Success 200 {object} object "Response Results"
|
||
// @Security TokenAuth
|
||
// @Summary Get CAPTCHA
|
||
// @Description Get CAPTCHA
|
||
// @Router /captchaImage [get]
|
||
func (s *CaptchaController) Image(c *gin.Context) {
|
||
// 从数据库配置获取验证码开关 true开启,false关闭
|
||
captchaEnabledStr := s.sysConfigService.SelectConfigValueByKey("sys.account.captchaEnabled")
|
||
captchaEnabled := parse.Boolean(captchaEnabledStr)
|
||
if !captchaEnabled {
|
||
c.JSON(200, result.Ok(map[string]any{
|
||
"captchaEnabled": captchaEnabled,
|
||
}))
|
||
return
|
||
}
|
||
|
||
// 生成唯一标识
|
||
verifyKey := ""
|
||
data := map[string]any{
|
||
"captchaEnabled": captchaEnabled,
|
||
"uuid": "",
|
||
"img": "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
|
||
}
|
||
|
||
// 从数据库配置获取验证码类型 math 数值计算 char 字符验证
|
||
captchaType := s.sysConfigService.SelectConfigValueByKey("sys.account.captchaType")
|
||
if captchaType == captcha.TYPE_MATH {
|
||
math := config.Get("mathCaptcha").(map[string]any)
|
||
driverCaptcha := &base64Captcha.DriverMath{
|
||
//Height png height in pixel.
|
||
Height: math["height"].(int),
|
||
// Width Captcha png width in pixel.
|
||
Width: math["width"].(int),
|
||
//NoiseCount text noise count.
|
||
NoiseCount: math["noise"].(int),
|
||
//ShowLineOptions := OptionShowHollowLine | OptionShowSlimeLine | OptionShowSineLine .
|
||
ShowLineOptions: base64Captcha.OptionShowHollowLine,
|
||
}
|
||
if math["color"].(bool) {
|
||
//BgColor captcha image background color (optional)
|
||
driverCaptcha.BgColor = parse.Color(math["background"].(string))
|
||
}
|
||
// 验证码生成
|
||
id, question, answer := driverCaptcha.GenerateIdQuestionAnswer()
|
||
// 验证码表达式解析输出
|
||
item, err := driverCaptcha.DrawCaptcha(question)
|
||
if err != nil {
|
||
logger.Infof("Generate Id Question Answer %s %s : %v", captchaType, question, err)
|
||
} else {
|
||
data["uuid"] = id
|
||
data["img"] = item.EncodeB64string()
|
||
expiration := captcha.EXPIRATION * time.Second
|
||
verifyKey = cachekey.CAPTCHA_CODE_KEY + id
|
||
redis.SetByExpire("", verifyKey, answer, expiration)
|
||
}
|
||
}
|
||
if captchaType == captcha.TYPE_CHAR {
|
||
char := config.Get("charCaptcha").(map[string]any)
|
||
driverCaptcha := &base64Captcha.DriverString{
|
||
//Height png height in pixel.
|
||
Height: char["height"].(int),
|
||
// Width Captcha png width in pixel.
|
||
Width: char["width"].(int),
|
||
//NoiseCount text noise count.
|
||
NoiseCount: char["noise"].(int),
|
||
//Length random string length.
|
||
Length: char["size"].(int),
|
||
//Source is a unicode which is the rand string from.
|
||
Source: char["chars"].(string),
|
||
//ShowLineOptions := OptionShowHollowLine | OptionShowSlimeLine | OptionShowSineLine .
|
||
ShowLineOptions: base64Captcha.OptionShowHollowLine,
|
||
}
|
||
if char["color"].(bool) {
|
||
//BgColor captcha image background color (optional)
|
||
driverCaptcha.BgColor = parse.Color(char["background"].(string))
|
||
}
|
||
// 验证码生成
|
||
id, question, answer := driverCaptcha.GenerateIdQuestionAnswer()
|
||
// 验证码表达式解析输出
|
||
item, err := driverCaptcha.DrawCaptcha(question)
|
||
if err != nil {
|
||
logger.Infof("Generate Id Question Answer %s %s : %v", captchaType, question, err)
|
||
} else {
|
||
data["uuid"] = id
|
||
data["img"] = item.EncodeB64string()
|
||
expiration := captcha.EXPIRATION * time.Second
|
||
verifyKey = cachekey.CAPTCHA_CODE_KEY + id
|
||
redis.SetByExpire("", verifyKey, answer, expiration)
|
||
}
|
||
}
|
||
|
||
// 本地开发下返回验证码结果,方便接口调试
|
||
if config.Env() == "local" {
|
||
text, _ := redis.Get("", verifyKey)
|
||
data["text"] = text
|
||
c.JSON(200, result.Ok(data))
|
||
return
|
||
}
|
||
c.JSON(200, result.Ok(data))
|
||
}
|