mirror of
https://gitee.com/xiangheng/x_admin.git
synced 2025-09-26 20:21:19 +08:00
144 lines
3.7 KiB
Go
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")
|
|
}
|
|
}
|