71 lines
1.6 KiB
Go
71 lines
1.6 KiB
Go
package middleware
|
||
|
||
import (
|
||
"strings"
|
||
"time"
|
||
|
||
"github.com/eryajf-world/go-ldap-admin/config"
|
||
"github.com/eryajf-world/go-ldap-admin/model"
|
||
"github.com/eryajf-world/go-ldap-admin/public/tools"
|
||
"github.com/eryajf-world/go-ldap-admin/service/isql"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// 操作日志channel
|
||
var OperationLogChan = make(chan *model.OperationLog, 30)
|
||
|
||
func OperationLogMiddleware() gin.HandlerFunc {
|
||
return func(c *gin.Context) {
|
||
// 开始时间
|
||
startTime := time.Now()
|
||
|
||
// 处理请求
|
||
c.Next()
|
||
|
||
// 结束时间
|
||
endTime := time.Now()
|
||
|
||
// 执行耗时
|
||
timeCost := endTime.Sub(startTime).Milliseconds()
|
||
|
||
// 获取当前登录用户
|
||
var username string
|
||
ctxUser, exists := c.Get("user")
|
||
if !exists {
|
||
username = "未登录"
|
||
}
|
||
user, ok := ctxUser.(model.User)
|
||
if !ok {
|
||
username = "未登录"
|
||
}
|
||
username = user.Username
|
||
|
||
// 获取访问路径
|
||
path := strings.TrimPrefix(c.FullPath(), "/"+config.Conf.System.UrlPathPrefix)
|
||
// 请求方式
|
||
method := c.Request.Method
|
||
|
||
// 获取接口描述
|
||
api := new(model.Api)
|
||
_ = isql.Api.Find(tools.H{"path": path, "method": method}, api)
|
||
|
||
operationLog := model.OperationLog{
|
||
Username: username,
|
||
Ip: c.ClientIP(),
|
||
IpLocation: "",
|
||
Method: method,
|
||
Path: path,
|
||
Remark: api.Remark,
|
||
Status: c.Writer.Status(),
|
||
StartTime: startTime,
|
||
TimeCost: timeCost,
|
||
//UserAgent: c.Request.UserAgent(),
|
||
}
|
||
|
||
// 最好是将日志发送到rabbitmq或者kafka中
|
||
// 这里是发送到channel中,开启3个goroutine处理
|
||
OperationLogChan <- &operationLog
|
||
}
|
||
}
|