YiTao/controller/captcha_controller.go

158 lines
4.8 KiB
Go
Raw Permalink Normal View History

2024-11-09 14:59:27 +08:00
package controller
import (
"strconv"
"yitao/util"
"github.com/kataras/iris/v12/mvc"
)
// TEMP : Auth
type CaptchaController struct {
BaseController
}
func (m *CaptchaController) BeforeActivation(b mvc.BeforeActivation) {
{
// 普通图片验证码
b.Handle("GET", "/img", "GetIMG")
b.Handle("GET", "/img/gen", "ImgGen")
b.Handle("GET", "/img/{key:string}", "GetImgByKey")
b.Handle("GET", "/img/validate/{key:string}", "ImgValidate")
}
{
// 高级点击验证码
b.Handle("GET", "/click/gen", "ClickGen")
b.Handle("POST", "/click/{key:string}/submit", "ClickSubmit")
}
}
// 获取验证码信息
// @Summary Captcha Img Generate
// @Description 获取一张图片验证码的标识符
// @Tags captcha api
// @Accept json
// @Produce json
// @Success 200 {object} map[string]interface{} "{"key": "ASDFGHJK"}"
// @Failure 400 {object} map[string]interface{} "{"msg": "错误信息","code":0}"
// @Router /api/captcha/img/gen [get]
func (con *CaptchaController) ImgGen() map[string]interface{} {
hs := con.Ctx.URLParam("h")
var h int = 120
if hs != "" {
h, _ = strconv.Atoi(hs)
}
ws := con.Ctx.URLParam("w")
var w int = 40
if ws != "" {
w, _ = strconv.Atoi(ws)
}
code, img := con.Service.Captcha.GetIMGWithHW(4, true, h, w)
key := util.RandString(8)
// 保存到文件
util.SaveToFile("./temp/captcha/img/"+key+".png", img)
// 保存到数据库
con.Service.Captcha.SaveToDB(key, code)
return map[string]interface{}{
// 打开这个注释就能在 api 里看到答案了
//"code": code,
"key": key,
}
}
// 验证码本体
func (con *CaptchaController) GetIMG() {
_, img := con.Service.Captcha.GetIMG(4, true)
con.Ctx.Write(img)
}
// 通过 key 获取验证码图片
// @Summary Captcha Img Get
// @Description 通过 key 获取验证码图片
// @Tags captcha api
// @Accept json
// @Produce png
// @Param key path string true "验证码标识符"
// @Success 200 {object} []byte "IMG"
// @Failure 400 {object} map[string]interface{} "{"msg": "错误信息","code":0}"
// @Router /api/captcha/img/{key} [get]
func (con *CaptchaController) GetImgByKey(key string) {
b, err := util.ReadFromFile("./temp/captcha/img/" + key + ".png")
if err != nil {
con.Ctx.Write([]byte("error"))
} else {
con.Ctx.ResponseWriter().Header().Add("content-type", "image/png")
con.Ctx.Write(b)
}
// 读取完直接删了,都是一次性的
util.DeleteFile("./temp/captcha/img/" + key + ".png")
}
// 验证码有效性
// @Summary Captcha Img Validate
// @Description 图片验证码校验(一般情况下后端校验)
// @Tags captcha api
// @Accept json
// @Produce json
// @Param key path string true "验证码标识符"
// @Param code query string true "验证码"
// @Success 200 {object} map[string]interface{} "{"msg": "正确信息","code":0}"
// @Failure 400 {object} map[string]interface{} "{"msg": "错误信息","code":0}"
// @Router /api/captcha/img/validate/{key} [get]
func (con *CaptchaController) ImgValidate(key string) mvc.Result {
input := con.Ctx.URLParam("code")
e := con.Service.Captcha.Validate(key, input)
con.Service.Captcha.Delete(key)
if e.Error() {
return e.Response()
} else {
// 好像ecode不出错就返回正确似乎
return e.Response()
}
}
// @Summary Captcha Click Generate
// @Description 生成按次序点击验证码
// @Tags captcha api
// @Accept json
// @Produce json
// @Success 200 {object} map[string]interface{} "{"key": "验证码标识符","master":"主图用户点击图base64","subimg":"子图文字次序图base64"}"
// @Failure 400 {object} map[string]interface{} "{"msg": "错误信息","code":0}"
// @Router /api/captcha/click/gen [get]
func (con *CaptchaController) ClickGen() mvc.Result {
key, img1, img2 := con.Service.Captcha.GetClick()
return mvc.Response{
Object: map[string]interface{}{
"key": key,
"master": img1,
"subimg": img2,
},
}
}
// @Summary Captcha Click Validate
// @Description 校验按次序点击验证码
// @Tags captcha api
// @Accept json
// @Produce json
// @Param key path string true "验证码标识符"
// @Param key formData string true "15,851;458,18;58,15;x,y; #用户点击的坐标集合"
// @Success 200 {object} map[string]interface{} "{"flag": true|false}"
// @Failure 400 {object} map[string]interface{} "{"msg": "错误信息","code":0}"
// @Router /api/captcha/click/{key}/submit [post]
func (con *CaptchaController) ClickSubmit(key string) mvc.Result {
input := con.Ctx.PostValue("data")
f := con.Service.Captcha.ClickValidate(key, input)
return mvc.Response{
Object: map[string]interface{}{
"flag": f,
},
}
}