刷新验证码
This commit is contained in:
7
controllers/controller.go
Normal file
7
controllers/controller.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package controllers
|
||||
|
||||
import "git.rosy.net.cn/jx-print/globals"
|
||||
|
||||
func init() {
|
||||
globals.SugarLogger.Debugf("test init ...")
|
||||
}
|
||||
10
controllers/user_controller.go
Normal file
10
controllers/user_controller.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/jx-print/utils"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func RefreshCode(c *gin.Context){
|
||||
utils.Captcha(c,4)
|
||||
}
|
||||
14
globals/globals.go
Normal file
14
globals/globals.go
Normal file
@@ -0,0 +1,14 @@
|
||||
package globals
|
||||
|
||||
import (
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
var (
|
||||
SugarLogger *zap.SugaredLogger
|
||||
)
|
||||
|
||||
func init() {
|
||||
logger, _ := zap.NewDevelopment()
|
||||
SugarLogger = logger.Sugar()
|
||||
}
|
||||
49
main.go
49
main.go
@@ -1,5 +1,52 @@
|
||||
package jx_print
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
_ "git.rosy.net.cn/jx-print/controllers"
|
||||
"git.rosy.net.cn/jx-print/model"
|
||||
"git.rosy.net.cn/jx-print/routers"
|
||||
"github.com/gin-contrib/sessions"
|
||||
"github.com/gin-contrib/sessions/cookie"
|
||||
"github.com/gin-gonic/gin"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
gin.DisableConsoleColor()
|
||||
|
||||
r := gin.New()
|
||||
r.Use(session(model.SessionKey))
|
||||
// LoggerWithFormatter middleware will write the logs to gin.DefaultWriter
|
||||
// By default gin.DefaultWriter = os.Stdout
|
||||
r.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
|
||||
|
||||
// your custom format
|
||||
return fmt.Sprintf("%s - [%s] \"%s %s %d \" %s\"\n",
|
||||
param.ClientIP,
|
||||
param.TimeStamp.Format(time.RFC3339),
|
||||
param.Method,
|
||||
param.Path,
|
||||
param.StatusCode,
|
||||
param.ErrorMessage,
|
||||
)
|
||||
}))
|
||||
r.Use(gin.Recovery())
|
||||
routers.Init(r)
|
||||
r.Run()
|
||||
}
|
||||
// 中间件,处理session
|
||||
func session(keyPairs string) gin.HandlerFunc {
|
||||
store := sessionConfig()
|
||||
return sessions.Sessions(keyPairs, store)
|
||||
}
|
||||
func sessionConfig() sessions.Store {
|
||||
sessionMaxAge := 3600
|
||||
sessionSecret := model.SessionKey
|
||||
var store sessions.Store
|
||||
store = cookie.NewStore([]byte(sessionSecret))
|
||||
store.Options(sessions.Options{
|
||||
MaxAge: sessionMaxAge, //seconds
|
||||
Path: "/",
|
||||
})
|
||||
return store
|
||||
}
|
||||
15
model/model.go
Normal file
15
model/model.go
Normal file
@@ -0,0 +1,15 @@
|
||||
package model
|
||||
|
||||
import "time"
|
||||
|
||||
const (
|
||||
SessionKey = "jxCode"
|
||||
)
|
||||
|
||||
type ModelIDCULD struct {
|
||||
ID int `json:"id"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
LastOperator string `json:"last_operator"`
|
||||
DeletedAt time.Time `json:"deleted_at"`
|
||||
}
|
||||
13
routers/router.go
Normal file
13
routers/router.go
Normal file
@@ -0,0 +1,13 @@
|
||||
package routers
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/jx-print/controllers"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func Init(r *gin.Engine){
|
||||
v2 := r.Group("/v2")
|
||||
//user
|
||||
user := v2.Group("/user")
|
||||
user.POST("/refreshCode",controllers.RefreshCode)
|
||||
}
|
||||
2
services/user.go
Normal file
2
services/user.go
Normal file
@@ -0,0 +1,2 @@
|
||||
package services
|
||||
|
||||
68
utils/utils.go
Normal file
68
utils/utils.go
Normal file
@@ -0,0 +1,68 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"git.rosy.net.cn/jx-print/model"
|
||||
"github.com/dchest/captcha"
|
||||
"github.com/gin-contrib/sessions"
|
||||
"github.com/gin-gonic/gin"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
func Captcha(c *gin.Context, length ...int) {
|
||||
l := captcha.DefaultLen
|
||||
w, h := 107, 36
|
||||
if len(length) == 1 {
|
||||
l = length[0]
|
||||
}
|
||||
if len(length) == 2 {
|
||||
w = length[1]
|
||||
}
|
||||
if len(length) == 3 {
|
||||
h = length[2]
|
||||
}
|
||||
captchaId := captcha.NewLen(l)
|
||||
session := sessions.Default(c)
|
||||
session.Set(model.SessionKey, captchaId)
|
||||
_ = session.Save()
|
||||
_ = Serve(c.Writer, c.Request, captchaId, ".png", "zh", false, w, h)
|
||||
}
|
||||
|
||||
func CaptchaVerify(c *gin.Context, code string) bool {
|
||||
session := sessions.Default(c)
|
||||
if captchaId := session.Get(model.SessionKey); captchaId != nil {
|
||||
session.Delete(model.SessionKey)
|
||||
_ = session.Save()
|
||||
if captcha.VerifyString(captchaId.(string), code) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
func Serve(w http.ResponseWriter, r *http.Request, id, ext, lang string, download bool, width, height int) error {
|
||||
w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
|
||||
w.Header().Set("Pragma", "no-cache")
|
||||
w.Header().Set("Expires", "0")
|
||||
|
||||
var content bytes.Buffer
|
||||
switch ext {
|
||||
case ".png":
|
||||
w.Header().Set("Content-Type", "image/png")
|
||||
_ = captcha.WriteImage(&content, id, width, height)
|
||||
case ".wav":
|
||||
w.Header().Set("Content-Type", "audio/x-wav")
|
||||
_ = captcha.WriteAudio(&content, id, lang)
|
||||
default:
|
||||
return captcha.ErrNotFound
|
||||
}
|
||||
|
||||
if download {
|
||||
w.Header().Set("Content-Type", "application/octet-stream")
|
||||
}
|
||||
http.ServeContent(w, r, id+ext, time.Time{}, bytes.NewReader(content.Bytes()))
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user