package controller import ( "net/http" "ezops/model" "github.com/gin-gonic/gin" "gorm.io/gorm" ) // LoginLogHandler 登录日志处理器 // Logan.Li type LoginLogHandler struct { db *gorm.DB } // NewLoginLogHandler 创建登录日志处理器 func NewLoginLogHandler(db *gorm.DB) *LoginLogHandler { return &LoginLogHandler{db: db} } // ListLoginLogs 登录日志列表 // GET /api/v1/login-logs?username=&status=&page=&page_size= func (h *LoginLogHandler) ListLoginLogs(c *gin.Context) { var req model.LoginLogQuery if err := c.ShouldBindQuery(&req); err != nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: err.Error()}) return } if req.Page <= 0 { req.Page = 1 } if req.PageSize <= 0 { req.PageSize = 20 } query := h.db.Model(&model.LoginLog{}) if req.Username != "" { query = query.Where("username LIKE ?", "%"+req.Username+"%") } if req.Status != "" { query = query.Where("status = ?", req.Status) } if req.StartTime != "" { query = query.Where("created_at >= ?", req.StartTime) } if req.EndTime != "" { query = query.Where("created_at <= ?", req.EndTime) } var total int64 if err := query.Count(&total).Error; err != nil { c.JSON(http.StatusInternalServerError, model.Response{Code: 500, Message: "查询失败"}) return } var logs []model.LoginLog if err := query.Order("id DESC"). Offset((req.Page - 1) * req.PageSize). Limit(req.PageSize). Find(&logs).Error; err != nil { c.JSON(http.StatusInternalServerError, model.Response{Code: 500, Message: "查询失败"}) return } c.JSON(http.StatusOK, model.Response{Code: 200, Data: model.ListResponse{ List: logs, Total: total, }}) }