Files
x_admin/server/middleware/log.go
2024-08-16 01:03:54 +08:00

144 lines
3.7 KiB
Go

package middleware
import (
"fmt"
"net/url"
"strings"
"time"
"x_admin/config"
"x_admin/core"
"x_admin/core/response"
"x_admin/model/system_model"
"x_admin/util"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"go.uber.org/zap"
)
// requestType 请求参数类
type requestType string
const (
RequestFile requestType = "file" // 文件类型
RequestDefault requestType = "default" // 默认数据类型
)
// RecordLog 记录系统日志信息中间件
func RecordLog(title string, reqTypes ...requestType) gin.HandlerFunc {
reqType := RequestDefault
if len(reqTypes) > 0 {
reqType = reqTypes[0]
}
return func(c *gin.Context) {
// 开始时间
startTime := time.Now()
// 异常信息
errStr := ""
var status uint8 = 1 // 1=成功, 2=失败
args := ""
// 请求方式
reqMethod := c.Request.Method
// 获取请求参数
if reqMethod == "POST" {
// POST请求
if reqType == RequestFile {
// 文件类型
var filenames []string
form, err := c.MultipartForm()
// 校验错误
if response.IsFailWithResp(c, response.CheckErr(err, "RecordLog MultipartForm err")) {
c.Abort()
return
}
// 获取文件列表
for _, files := range form.File {
for _, file := range files {
filenames = append(filenames, file.Filename)
}
}
args = strings.Join(filenames, ",")
} else {
//默认类型
var formParams map[string]interface{}
err := c.ShouldBindBodyWith(&formParams, binding.JSON)
if err == nil {
val, err := util.ToolsUtil.ObjToJson(&formParams)
// 校验错误
if response.IsFailWithResp(c, response.CheckErr(err, "RecordLog POST Marshal err")) {
c.Abort()
return
}
args = val
}
}
} else if reqMethod == "GET" {
// GET请求
query := c.Request.URL.RawQuery
if query != "" {
args, _ = url.QueryUnescape(query)
}
}
// 处理异常
defer func() {
if r := recover(); r != nil {
errStr = fmt.Sprintf("%+v", r)
status = 2
// 结束时间
endTime := time.Now()
// 执行时间(毫秒)
taskTime := endTime.UnixMilli() - startTime.UnixMilli()
// 获取当前的用户
adminId := config.AdminConfig.GetAdminId(c)
urlPath := c.Request.URL.Path
ip := c.ClientIP()
method := c.HandlerName()
err := core.GetDB().Create(&system_model.SystemLogOperate{
AdminId: adminId, Type: reqMethod, Title: title, Ip: ip,
Url: urlPath, Method: method, Args: args, Error: errStr, Status: status,
StartTime: util.NullTimeUtil.ParseTime(startTime),
EndTime: util.NullTimeUtil.ParseTime(endTime),
TaskTime: taskTime,
}).Error
response.CheckErr(err, "RecordLog recover Create err")
core.Logger.WithOptions(zap.AddCallerSkip(2)).Infof(
"RecordLog recover: err=[%+v]", r)
panic(r)
}
}()
// 执行方法
c.Next()
if config.Config.GinMode != "release" {
return
}
if len(c.Errors) > 0 {
errStr = c.Errors.String()
status = 2
}
// 结束时间
endTime := time.Now()
// 执行时间(毫秒)
taskTime := endTime.UnixMilli() - startTime.UnixMilli()
// 获取当前的用户
adminId := config.AdminConfig.GetAdminId(c)
urlPath := c.Request.URL.Path
ip := c.ClientIP()
method := c.HandlerName()
err := core.GetDB().Create(&system_model.SystemLogOperate{
AdminId: adminId,
Type: reqMethod,
Title: title,
Ip: ip,
Url: urlPath,
Method: method,
Args: args,
Error: errStr,
Status: status,
StartTime: util.NullTimeUtil.ParseTime(startTime),
EndTime: util.NullTimeUtil.ParseTime(endTime),
TaskTime: taskTime,
}).Error
response.CheckErr(err, "RecordLog Create err")
}
}