gin框架利用中间件记录用户操作行为

sonhineboy · · 2148 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

### 背景说明 在项目的具体使用过程中我们很有必要去记录那个用户操作了什么这样的需求。当然实现的方式有很多,今天我们介绍一下具体怎么在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/

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2148 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传