共计 1430 个字符,预计需要花费 4 分钟才能阅读完成。
背景阐明
在我的项目的具体应用过程中咱们很有必要去记录那个用户操作了什么这样的需要。当然实现的形式有很多,明天咱们介绍一下具体怎么在 gin 框架中利用协成的个性异步去记录用户的的操作行为。在这里先介绍一下我集体给开源的 gsadmin 我的项目,GS Admin=gin+scui 它是 golang 开发的一个企业级后盾。遵循 MIT 开源协定。前端框架是 scui,SCUI 基于 Vue3、elementPlus 持续性的提供独家组件和丰盛的业务模板帮忙你疾速搭建企业级中后盾前端工作。后端框架是 gin,Gin 是一个 golang 的微框架,封装比拟优雅,具备疾速灵便,容错不便等特点。内置了权限治理、用户治理等根底模块儿,还反对了事件服务,不便业务解耦。后续会依据用户的反馈更新内容!
上面来介绍一下实现思路
1、次要性能是在中间件内实现
2、利用中间件来获取用户拜访的门路
3、用拜访门路来匹配数据库内的路由信息
4、收集须要的信息,利用协成的机制异步记录到数据库中或其余须要记录的中央
上面看代码
package middleware
import (
"encoding/json"
"github.com/gin-gonic/gin"
"github.com/sonhineboy/gsadmin/service/app/models"
"github.com/sonhineboy/gsadmin/service/app/repositorys"
"github.com/sonhineboy/gsadmin/service/global"
)
func OperationLog() gin.HandlerFunc {return func(c *gin.Context) {cCp := c.Copy()
go func() {
var (doData []byte
log models.OperationLog
)
method := c.Request.Method
// 参数
if method == "GET" {doData, _ = json.Marshal(cCp.Request.URL.Query())
}
if method == "POST" {doData, _ = cCp.GetRawData()
}
claims, ok := repositorys.GetCustomClaims(c)
if ok == true {
log.UserId = claims.Id
log.UserName = claims.Name
} else {log.UserId = 0}
var where = make(map[string]interface{})
var d models.MenuApiList
db := global.Db.Model(&models.MenuApiList{})
where["url"] = cCp.Request.URL.Path
db.Preload("Menu").Where(where).First(&d)
log.Method = cCp.Request.Method
log.DoData = string(doData)
log.Ip = cCp.ClientIP()
title, ok := d.Menu.Meta["title"]
if ok {log.PathName = title.(string)
}
log.UrlPath = cCp.Request.URL.Path
global.Db.Create(&log)
}()
c.Next()}
}
演示地址
喜爱我的分享或者我的项目的多点点 star, 咱们多多交换
正文完