Files
ai_dianshang/server/internal/handler/admin_log.go

280 lines
6.8 KiB
Go
Raw Permalink Normal View History

2025-11-17 14:11:46 +08:00
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)
}