package models import ( "fmt" "time" "simple_portal/database" ) // LoginLog 表示一条登录日志记录。 type LoginLog struct { ID int `json:"id"` AdminID *int `json:"admin_id"` Username string `json:"username"` IP string `json:"ip"` UserAgent string `json:"user_agent"` Success bool `json:"success"` CreatedAt time.Time `json:"created_at"` } // CreateLoginLog 插入一条登录日志。 func CreateLoginLog(adminID *int, username, ip, userAgent string, success bool) error { _, err := database.DB.Exec( "INSERT INTO login_logs (admin_id, username, ip, user_agent, success, created_at) VALUES (?, ?, ?, ?, ?, ?)", adminID, username, ip, userAgent, success, time.Now().Format("2006-01-02 15:04:05"), ) if err != nil { return fmt.Errorf("failed to create login log: %w", err) } return nil } // LoginLogCount 返回登录日志总数。 func LoginLogCount() (int, error) { var count int err := database.DB.QueryRow("SELECT COUNT(*) FROM login_logs").Scan(&count) if err != nil { return 0, fmt.Errorf("failed to count login logs: %w", err) } return count, nil } // GetLoginLogs 分页获取登录日志,倒序排列。 func GetLoginLogs(page, pageSize int) ([]LoginLog, int, error) { total, err := LoginLogCount() if err != nil { return nil, 0, err } offset := (page - 1) * pageSize if offset < 0 { offset = 0 } rows, err := database.DB.Query( "SELECT id, admin_id, username, ip, user_agent, success, created_at FROM login_logs ORDER BY created_at DESC LIMIT ? OFFSET ?", pageSize, offset, ) if err != nil { return nil, 0, fmt.Errorf("failed to query login logs: %w", err) } defer rows.Close() var logs []LoginLog for rows.Next() { var l LoginLog if err := rows.Scan(&l.ID, &l.AdminID, &l.Username, &l.IP, &l.UserAgent, &l.Success, &l.CreatedAt); err != nil { return nil, 0, fmt.Errorf("failed to scan login log: %w", err) } logs = append(logs, l) } return logs, total, nil }