DeployHelper/internal/middleware/login_log.go

71 lines
1.5 KiB
Go
Raw Normal View History

2025-08-01 16:38:08 +08:00
package middleware
import (
"ego/internal/model"
"ego/internal/service"
"ego/internal/util"
"ego/pkg/logger"
"time"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
"gorm.io/gorm"
)
// LoginLogMiddleware 登录日志中间件
func LoginLogMiddleware(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
// 只处理登录请求
if c.Request.URL.Path != "/api/v1/user/login" {
c.Next()
return
}
// 执行登录逻辑
c.Next()
// 登录成功
recordLoginLog(c, db)
}
}
// recordLoginLog 记录登录日志
func recordLoginLog(c *gin.Context, db *gorm.DB) {
// 获取User-Agent
userAgent := c.GetHeader("User-Agent")
// 获取当前时间
now := time.Now()
var status, msg string
if c.GetString("status") == "1" {
status = "1"
msg = "登录成功"
} else {
status = "0"
msg = c.GetString("msg")
}
// 创建登录日志
loginLog := model.SysLoginLog{
UserId: c.GetString("account"),
IpAddr: c.ClientIP(),
LoginLocation: "", // TODO: 需要集成IP地理位置查询服务
Browser: userAgent,
Os: util.ParseUserAgent(userAgent),
Status: status,
Msg: msg,
LoginTime: &now,
UpdateTime: &now,
CreateTime: &now,
}
sequenceService := service.SysSequenceServiceBuilder(loginLog.TableName())
id, err := sequenceService.GenerateId()
if err != nil {
logger.Error(c, "生成日志ID失败", zap.Error(err))
return
}
loginLog.Id = id
if err := db.Create(&loginLog).Error; err != nil {
logger.Error(c, "记录登录日志失败!", zap.Error(err))
}
}