From 17701fe1ac7dcc2f97063d545817400b132b73cf Mon Sep 17 00:00:00 2001 From: suyl <770236076@qq.com> Date: Mon, 5 Jul 2021 18:04:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=B7=E6=96=B0=E9=AA=8C=E8=AF=81=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/controller.go | 7 ++++ controllers/user_controller.go | 10 +++++ globals/globals.go | 14 +++++++ main.go | 53 ++++++++++++++++++++++++-- model/model.go | 15 ++++++++ routers/router.go | 13 +++++++ services/user.go | 2 + utils/utils.go | 68 ++++++++++++++++++++++++++++++++++ 8 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 controllers/controller.go create mode 100644 controllers/user_controller.go create mode 100644 globals/globals.go create mode 100644 model/model.go create mode 100644 routers/router.go create mode 100644 services/user.go create mode 100644 utils/utils.go diff --git a/controllers/controller.go b/controllers/controller.go new file mode 100644 index 0000000..a50ec26 --- /dev/null +++ b/controllers/controller.go @@ -0,0 +1,7 @@ +package controllers + +import "git.rosy.net.cn/jx-print/globals" + +func init() { + globals.SugarLogger.Debugf("test init ...") +} diff --git a/controllers/user_controller.go b/controllers/user_controller.go new file mode 100644 index 0000000..4a27dcc --- /dev/null +++ b/controllers/user_controller.go @@ -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) +} diff --git a/globals/globals.go b/globals/globals.go new file mode 100644 index 0000000..7450f0b --- /dev/null +++ b/globals/globals.go @@ -0,0 +1,14 @@ +package globals + +import ( + "go.uber.org/zap" +) + +var ( + SugarLogger *zap.SugaredLogger +) + +func init() { + logger, _ := zap.NewDevelopment() + SugarLogger = logger.Sugar() +} \ No newline at end of file diff --git a/main.go b/main.go index 70fc559..232a23d 100644 --- a/main.go +++ b/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() { - -} \ No newline at end of file + 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 +} diff --git a/model/model.go b/model/model.go new file mode 100644 index 0000000..6cbb397 --- /dev/null +++ b/model/model.go @@ -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"` +} diff --git a/routers/router.go b/routers/router.go new file mode 100644 index 0000000..cb780b6 --- /dev/null +++ b/routers/router.go @@ -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) +} \ No newline at end of file diff --git a/services/user.go b/services/user.go new file mode 100644 index 0000000..ec025b1 --- /dev/null +++ b/services/user.go @@ -0,0 +1,2 @@ +package services + diff --git a/utils/utils.go b/utils/utils.go new file mode 100644 index 0000000..d4a217a --- /dev/null +++ b/utils/utils.go @@ -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 +} \ No newline at end of file