背景阐明

在我的项目的具体应用过程中咱们很有必要去记录那个用户操作了什么这样的需要。当然实现的形式有很多,明天咱们介绍一下具体怎么在gin框架中利用协成的个性异步去记录用户的的操作行为。在这里先介绍一下我集体给开源的gsadmin我的项目,GS Admin=gin+scui 它是golang 开发的一个企业级后盾。遵循MIT开源协定。前端框架是scui,SCUI基于 Vue3、elementPlus持续性的提供独家组件和丰盛的业务模板帮忙你疾速搭建企业级中后盾前端工作。后端框架是gin,Gin是一个golang的微框架,封装比拟优雅,具备疾速灵便,容错不便等特点。内置了权限治理、用户治理等根底模块儿,还反对了事件服务,不便业务解耦。后续会依据用户的反馈更新内容!

上面来介绍一下实现思路

1、次要性能是在中间件内实现
2、利用中间件来获取用户拜访的门路
3、用拜访门路来匹配数据库内的路由信息
4、收集须要的信息,利用协成的机制异步记录到数据库中或其余须要记录的中央

上面看代码

package middlewareimport (    "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,咱们多多交换