Files
SeeyonFileSystem/server/controller/monitor_controller.go
2026-07-10 17:33:33 +08:00

145 lines
3.4 KiB
Go

package controller
import (
"fmt"
"seeyon-filesystem/middleware"
"seeyon-filesystem/repository"
"seeyon-filesystem/utils"
"github.com/gin-gonic/gin"
)
// GetSystemLogs 获取系统运行日志
// GET /api/admin/monitor/logs?limit=200
func (c *MonitorController) GetSystemLogs(ctx *gin.Context) {
limit := 200
if l, err := parseIntQuery(ctx, "limit"); err == nil && l > 0 {
limit = l
}
if limit > 2000 {
limit = 2000
}
entries := utils.LogBuf.Get(limit)
utils.Success(ctx, gin.H{
"total": utils.LogBuf.Count(),
"entries": entries,
})
}
// MonitorController 监控控制器
type MonitorController struct {
fileRepo *repository.FileRepository
}
func NewMonitorController() *MonitorController {
return &MonitorController{
fileRepo: repository.NewFileRepository(),
}
}
// GetTrafficStats 获取流量统计
// GET /api/admin/monitor/traffic
func (c *MonitorController) GetTrafficStats(ctx *gin.Context) {
info := middleware.GetTrafficInfo()
utils.Success(ctx, info)
}
// GetRecentRequests 获取最近请求记录
// GET /api/admin/monitor/requests?limit=50
func (c *MonitorController) GetRecentRequests(ctx *gin.Context) {
limit := 50
if l, err := parseIntQuery(ctx, "limit"); err == nil && l > 0 {
limit = l
}
if limit > 500 {
limit = 500
}
requests := middleware.GetRecentRequests(limit)
utils.Success(ctx, requests)
}
// GetStorageStats 获取存储统计(按策略分组)
// GET /api/admin/monitor/storage
func (c *MonitorController) GetStorageStats(ctx *gin.Context) {
stats, err := c.fileRepo.GetPolicyStats()
if err != nil {
utils.ServerError(ctx, "查询失败")
return
}
global, _ := c.fileRepo.GetGlobalStats()
utils.Success(ctx, gin.H{
"policies": stats,
"global": global,
})
}
// ========== IP 黑名单管理 ==========
// GetBlacklist 获取IP黑名单
// GET /api/admin/blacklist
func (c *MonitorController) GetBlacklist(ctx *gin.Context) {
ips := middleware.IPBlacklist.GetBlockedIPs()
utils.Success(ctx, gin.H{
"enabled": middleware.IPBlacklist.IsEnabled(),
"ips": ips,
})
}
// SetBlacklist 设置IP黑名单(全量替换)
// PUT /api/admin/blacklist
func (c *MonitorController) SetBlacklist(ctx *gin.Context) {
var req struct {
Enabled bool `json:"enabled"`
IPs []string `json:"ips"`
}
if err := ctx.ShouldBindJSON(&req); err != nil {
utils.BadRequest(ctx, "参数错误")
return
}
middleware.IPBlacklist.SetEnabled(req.Enabled)
if req.IPs != nil {
middleware.IPBlacklist.SetBlockedIPs(req.IPs)
}
utils.SuccessWithMessage(ctx, "黑名单已更新", nil)
}
// AddBlockedIP 添加封禁IP
// POST /api/admin/blacklist
func (c *MonitorController) AddBlockedIP(ctx *gin.Context) {
var req struct {
IP string `json:"ip" binding:"required"`
}
if err := ctx.ShouldBindJSON(&req); err != nil {
utils.BadRequest(ctx, "参数错误")
return
}
middleware.IPBlacklist.AddBlockedIP(req.IP)
utils.SuccessWithMessage(ctx, "已添加", nil)
}
// RemoveBlockedIP 移除封禁IP
// DELETE /api/admin/blacklist/:ip
func (c *MonitorController) RemoveBlockedIP(ctx *gin.Context) {
ip := ctx.Param("ip")
middleware.IPBlacklist.RemoveBlockedIP(ip)
utils.SuccessWithMessage(ctx, "已移除", nil)
}
// parseIntQuery 解析查询参数中的整数
func parseIntQuery(ctx *gin.Context, key string) (int, error) {
val := ctx.Query(key)
if val == "" {
return 0, nil
}
var result int
_, err := fmt.Sscanf(val, "%d", &result)
return result, err
}