280 lines
6.8 KiB
Go
280 lines
6.8 KiB
Go
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)
|
||
} |