Files
ai_dianshang/server/internal/handler/admin_log.go
2025-11-17 14:11:46 +08:00

280 lines
6.8 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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