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)) } }