package middleware
//amdin操作日志
import (
.
.
.
"bytes"
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"strings"
)
type bodyLogWriter struct {
gin.ResponseWriter
bodyBuf *bytes.Buffer
}
func (w bodyLogWriter) Write(b []byte) (int, error) {
w.bodyBuf.Write(b)
return w.ResponseWriter.Write(b)
}
var CommonLogInterceptor = commonLogInterceptor()
/*
1 使用goroutine和channel实现操作日志的入库保存,尽可能的不影响主程序
2 goroutine协程,提高并发量
3 channel通道
*/
func commonLogInterceptor() gin.HandlerFunc {
return func(c *gin.Context) {
adminLogs(c)
}
}
//获得每次请求返回的code和message
func adminLogs(c *gin.Context) {
if admin, _ := c.Get("admin"); admin != nil {
method := c.Request.Method
url := c.Request.URL.Path
strBody := ""
var blw bodyLogWriter
blw = bodyLogWriter{bodyBuf: bytes.NewBufferString(""), ResponseWriter: c.Writer}
c.Writer = blw
c.Next()
if method != "GET" {
strBody = strings.Trim(blw.bodyBuf.String(), "\n")
go func(strBody string) {
var returnJson api.ReturnJson
json.Unmarshal([]byte(strBody), &returnJson)
message := fmt.Sprintf("%v", returnJson.Message)
adminInfo := admin.(**service.RunningClaims)
adminId := (*adminInfo).ID
adminName := (*adminInfo).Account
var log = model.AdminLog{
AdminId: adminId,
AdminName: adminName,
Method: method,
Url: url,
Ip: util.RemoteIP(c.Request),
Code: returnJson.Code,
Message: message,
}
model.CreateLog(log)
}(strBody)
}
}
}
package model
type AdminLog struct {
ID int `json:"id"`
AdminId uint `json:"admin_id"`
AdminName string `json:"admin_name"`
Method string `json:"method"`
Ip string `json:"ip"`
Url string `json:"url"`
Code int `json:"code"`
Message string `json:"message"`
}
func CreateLog(log AdminLog) {
DB.Create(&log)
}
package server
import (
.
.
.
"os"
"github.com/gin-gonic/gin"
)
// NewRouter 路由配置
func NewRouter() *gin.Engine {
r := gin.Default()
// 其他中间件
.
.
.
// 路由
v1 := r.Group("/api/v1")
{
v1.POST("login", api.Login)
auth := v1.Group("")
//登录校验中间件
auth.Use(middleware.AuthRequired())
//关键代码:权限角色校验
auth.Use(middleware.AuthCheckMiddleware)
//操作日志
auth.Use(middleware.CommonLogInterceptor)
{
.
.
.
// 获取所有学校
{
auth.GET("/school/", api.GetSchoolInfo)
}
.
.
.
}
}
return r
}
如果有更好的实现思路,或者项目合作,可以私信我或者在文章底部留言。