mirror of
https://github.com/go-eagle/eagle.git
synced 2025-10-06 09:06:55 +08:00
92 lines
2.2 KiB
Go
92 lines
2.2 KiB
Go
package web
|
||
|
||
import (
|
||
"net/http"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/gorilla/sessions"
|
||
"github.com/spf13/viper"
|
||
|
||
"github.com/go-eagle/eagle/pkg/errcode"
|
||
"github.com/go-eagle/eagle/pkg/flash"
|
||
"github.com/go-eagle/eagle/pkg/log"
|
||
)
|
||
|
||
// Resp web response struct
|
||
type Resp struct {
|
||
Code int `json:"code"`
|
||
Message string `json:"message"`
|
||
Data interface{} `json:"data"`
|
||
}
|
||
|
||
// Response json response
|
||
func Response(c *gin.Context, err error, data interface{}) {
|
||
code, message := errcode.DecodeErr(err)
|
||
|
||
// always return http.StatusOK
|
||
c.JSON(http.StatusOK, Resp{
|
||
Code: code,
|
||
Message: message,
|
||
Data: data,
|
||
})
|
||
}
|
||
|
||
// Redirect redirect to another path
|
||
func Redirect(c *gin.Context, redirectPath, errMsg string) {
|
||
flash.SetMessage(c.Writer, errMsg)
|
||
c.Redirect(http.StatusMovedPermanently, redirectPath)
|
||
c.Abort()
|
||
}
|
||
|
||
// Store It is recommended to use an authentication key with 32 or 64 bytes.
|
||
// The encryption key, if set, must be either 16, 24, or 32 bytes to select
|
||
// AES-128, AES-192, or AES-256 modes.
|
||
var Store = sessions.NewCookieStore([]byte(viper.GetString("cookie.secret")))
|
||
|
||
// SetLoginCookie set login cookie to session
|
||
func SetLoginCookie(ctx *gin.Context, userID uint64) {
|
||
Store.Options.HttpOnly = true
|
||
|
||
session := GetCookieSession(ctx)
|
||
session.Options = &sessions.Options{
|
||
Domain: "",
|
||
MaxAge: 86400,
|
||
Path: "/",
|
||
HttpOnly: true,
|
||
}
|
||
// 浏览器关闭,cookie删除,否则保存30天(github.com/gorilla/sessions 包的默认值)
|
||
val := ctx.DefaultPostForm("remember_me", "0")
|
||
log.Infof("[handler] remember_me val: %s", val)
|
||
if val == "1" {
|
||
session.Options.MaxAge = 86400 * 30
|
||
}
|
||
|
||
session.Values["user_id"] = userID
|
||
|
||
req := Request(ctx)
|
||
resp := ResponseWriter(ctx)
|
||
err := session.Save(req, resp)
|
||
if err != nil {
|
||
log.Warnf("[handler] set login cookie, %v", err)
|
||
}
|
||
}
|
||
|
||
// GetCookieSession get cookie
|
||
func GetCookieSession(ctx *gin.Context) *sessions.Session {
|
||
session, err := Store.Get(ctx.Request, "")
|
||
if err != nil {
|
||
log.Warnf("[handler] store get err, %v", err)
|
||
}
|
||
return session
|
||
}
|
||
|
||
// Request return a request
|
||
func Request(ctx *gin.Context) *http.Request {
|
||
return ctx.Request
|
||
}
|
||
|
||
// ResponseWriter return a response writer
|
||
func ResponseWriter(ctx *gin.Context) http.ResponseWriter {
|
||
return ctx.Writer
|
||
}
|