71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
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))
|
|
}
|
|
}
|