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

反射苔藓
• 阅读 1120

背景说明

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

点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
3年前
Linux应急响应(三):挖矿病毒
0x00前言随着虚拟货币的疯狂炒作,利用挖矿脚本来实现流量变现,使得挖矿病毒成为不法分子利用最为频繁的攻击方式。新的挖矿攻击展现出了类似蠕虫的行为,并结合了高级攻击技术,以增加对目标服务器感染的成功率,通过利用永恒之蓝(EternalBlue)、web攻击多种漏洞(如Tomcat弱口令攻击、WeblogicWLS组件漏洞、Jboss
Stella981 Stella981
3年前
Kerberos无约束委派的攻击和防御
 0x00前言简介当ActiveDirectory首次与Windows2000Server一起发布时,Microsoft就提供了一种简单的机制来支持用户通过Kerberos对Web服务器进行身份验证并需要授权用户更新后端数据库服务器上的记录的方案。这通常被称为Kerberosdoublehopissue(双跃点问题),
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
mysql用户
1\.学会能按着需求创建一个帐号2\.知道连接字符串是什么样3\.密码密码怎么恢复mysql用户权限介绍mysql用户管理 !(https://oscimg.oschina.net/oscnet/368d3c1e00a0a9515545c2962660a27a080.png)!(https://oscimg.oschin
Wesley13 Wesley13
3年前
MySQL数据库InnoDB存储引擎Log漫游(1)
作者:宋利兵来源:MySQL代码研究(mysqlcode)0、导读本文介绍了InnoDB引擎如何利用UndoLog和RedoLog来保证事务的原子性、持久性原理,以及InnoDB引擎实现UndoLog和RedoLog的基本思路。00–UndoLogUndoLog是为了实现事务的原子性,
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
sum墨 sum墨
9个月前
《优化接口设计的思路》系列:第三篇—留下用户调用接口的痕迹
接口设计是整个系统设计中非常重要的一环,其中包括限流、权限、入参出参、切面等方面。设计一个好的接口可以帮助我们省去很多不必要的麻烦,从而提升整个系统的稳定性和可扩展性。作为接口设计经验分享的第三篇,我想分享一下如何在用户使用过程中留下操作痕迹。在实际开发中,我会采取一些手段来记录用户操作,例如使用日志记录用户行为,或者在数据库中保存用户操作记录。这些痕迹可以帮助我们快速定位和解决问题,同时也可以为后续数据分析和优化提供有价值的参考。
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(