package handler import ( "strconv" "time" "github.com/gin-gonic/gin" "gorm.io/gorm" "dianshang/internal/service" "dianshang/pkg/response" ) type AdminLogHandler struct { db *gorm.DB logService *service.LogService } func NewAdminLogHandler(db *gorm.DB, logService *service.LogService) *AdminLogHandler { return &AdminLogHandler{ db: db, logService: logService, } } // GetLoginLogs 获取登录日志列表 func (h *AdminLogHandler) GetLoginLogs(c *gin.Context) { page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10")) userID := c.Query("user_id") startDate := c.Query("start_date") endDate := c.Query("end_date") ip := c.Query("ip") // 构建过滤条件 filters := make(map[string]interface{}) if userID != "" { if id, err := strconv.ParseUint(userID, 10, 32); err == nil { filters["user_id"] = uint(id) } } if startDate != "" { if t, err := time.Parse("2006-01-02", startDate); err == nil { filters["start_date"] = t } } if endDate != "" { if t, err := time.Parse("2006-01-02", endDate); err == nil { filters["end_date"] = t } } if ip != "" { filters["ip"] = ip } logs, pagination, err := h.logService.GetLoginLogList(page, pageSize, filters) if err != nil { response.ErrorWithMessage(c, response.ERROR, err.Error()) return } response.Success(c, gin.H{ "list": logs, "pagination": pagination, }) } // GetOperationLogs 获取操作日志列表 func (h *AdminLogHandler) GetOperationLogs(c *gin.Context) { page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10")) userID := c.Query("user_id") action := c.Query("action") resource := c.Query("resource") startDate := c.Query("start_date") endDate := c.Query("end_date") // 构建过滤条件 filters := make(map[string]interface{}) if userID != "" { if id, err := strconv.ParseUint(userID, 10, 32); err == nil { filters["user_id"] = uint(id) } } if action != "" { filters["action"] = action } if resource != "" { filters["resource"] = resource } if startDate != "" { if t, err := time.Parse("2006-01-02", startDate); err == nil { filters["start_date"] = t } } if endDate != "" { if t, err := time.Parse("2006-01-02", endDate); err == nil { filters["end_date"] = t } } logs, pagination, err := h.logService.GetOperationLogList(page, pageSize, filters) if err != nil { response.ErrorWithMessage(c, response.ERROR, err.Error()) return } response.Success(c, gin.H{ "list": logs, "pagination": pagination, }) } // GetLoginStatistics 获取登录统计 func (h *AdminLogHandler) GetLoginStatistics(c *gin.Context) { startDate := c.DefaultQuery("start_date", "") endDate := c.DefaultQuery("end_date", "") stats, err := h.logService.GetLoginStatistics(startDate, endDate) if err != nil { response.ErrorWithMessage(c, response.ERROR, err.Error()) return } response.Success(c, stats) } // GetOperationStatistics 获取操作统计 func (h *AdminLogHandler) GetOperationStatistics(c *gin.Context) { startDate := c.DefaultQuery("start_date", "") endDate := c.DefaultQuery("end_date", "") stats, err := h.logService.GetOperationStatistics(startDate, endDate) if err != nil { response.ErrorWithMessage(c, response.ERROR, err.Error()) return } response.Success(c, stats) } // CleanOldLogs 清理旧日志 func (h *AdminLogHandler) CleanOldLogs(c *gin.Context) { var req struct { Days int `json:"days" binding:"required,min=1"` } if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "请求参数错误") return } err := h.logService.CleanOldLogs(req.Days) if err != nil { response.ErrorWithMessage(c, response.ERROR, err.Error()) return } response.Success(c, nil) } // ExportLogs 导出日志 func (h *AdminLogHandler) ExportLogs(c *gin.Context) { logType := c.Query("type") // login 或 operation startDate := c.Query("start_date") endDate := c.Query("end_date") if logType == "" { response.BadRequest(c, "请指定日志类型") return } // 构建过滤条件 filters := make(map[string]interface{}) if startDate != "" { if t, err := time.Parse("2006-01-02", startDate); err == nil { filters["start_date"] = t } } if endDate != "" { if t, err := time.Parse("2006-01-02", endDate); err == nil { filters["end_date"] = t } } var data interface{} var err error var filename string switch logType { case "login": data, _, err = h.logService.GetLoginLogList(1, 10000, filters) filename = "login_logs_" + time.Now().Format("20060102150405") + ".xlsx" case "operation": data, _, err = h.logService.GetOperationLogList(1, 10000, filters) filename = "operation_logs_" + time.Now().Format("20060102150405") + ".xlsx" default: response.BadRequest(c, "无效的日志类型") return } if err != nil { response.ErrorWithMessage(c, response.ERROR, err.Error()) return } // 设置响应头 c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") c.Header("Content-Disposition", "attachment; filename="+filename) // 这里应该生成Excel文件,暂时返回JSON格式 response.Success(c, data) } // GetLogDetail 获取日志详情 func (h *AdminLogHandler) GetLogDetail(c *gin.Context) { logType := c.Param("type") // login 或 operation idStr := c.Param("id") id, err := strconv.ParseUint(idStr, 10, 32) if err != nil { response.BadRequest(c, "无效的日志ID") return } var data interface{} switch logType { case "login": data, err = h.logService.GetLoginLogByID(uint(id)) case "operation": data, err = h.logService.GetOperationLogByID(uint(id)) default: response.BadRequest(c, "无效的日志类型") return } if err != nil { response.ErrorWithMessage(c, response.ERROR, err.Error()) return } response.Success(c, data) } // GetLogSummary 获取日志概览 func (h *AdminLogHandler) GetLogSummary(c *gin.Context) { summary := make(map[string]interface{}) // 获取今日登录次数 todayLoginCount, err := h.logService.GetTodayLoginCount() if err == nil { summary["today_login_count"] = todayLoginCount } // 获取今日操作次数 todayOperationCount, err := h.logService.GetTodayOperationCount() if err == nil { summary["today_operation_count"] = todayOperationCount } // 获取在线用户数(最近30分钟有登录记录的用户) onlineUserCount, err := h.logService.GetOnlineUserCount() if err == nil { summary["online_user_count"] = onlineUserCount } // 获取最近7天登录趋势 loginTrend, err := h.logService.GetLoginTrend(7) if err == nil { summary["login_trend"] = loginTrend } // 获取最近7天操作趋势 operationTrend, err := h.logService.GetOperationTrend(7) if err == nil { summary["operation_trend"] = operationTrend } response.Success(c, summary) }