Initial commit
This commit is contained in:
280
server/internal/handler/admin_log.go
Normal file
280
server/internal/handler/admin_log.go
Normal file
@@ -0,0 +1,280 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user