### 背景说明
在项目的具体使用过程中我们很有必要去记录那个用户操作了什么这样的需求。当然实现的方式有很多,今天我们介绍一下具体怎么在gin框架中利用协成的特性异步去记录用户的的操作行为。在这里先介绍一下我个人给开源的[gsadmin][1]项目,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()
}
}
```
### [演示地址][2]
喜欢我的分享或者项目的多点点star,我们多多交流
[1]: https://kevn.gitee.io/gsadmindoc/
[2]: https://gsadmin.suiyidian.cn/
有疑问加站长微信联系(非本文作者)