feat(app): 添加流量统计功能和服务器配置管理
All checks were successful
Build Multi-Platform Binaries / build-frontend (push) Successful in 38s
Build Multi-Platform Binaries / build-binaries (amd64, linux, client, true) (push) Successful in 1m47s
Build Multi-Platform Binaries / build-binaries (amd64, darwin, server, false) (push) Successful in 1m48s
Build Multi-Platform Binaries / build-binaries (amd64, windows, client, true) (push) Successful in 1m29s
Build Multi-Platform Binaries / build-binaries (amd64, linux, server, true) (push) Successful in 1m53s
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, client, true) (push) Successful in 1m14s
Build Multi-Platform Binaries / build-binaries (amd64, windows, server, true) (push) Successful in 1m40s
Build Multi-Platform Binaries / build-binaries (arm64, darwin, server, false) (push) Successful in 1m36s
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, server, true) (push) Successful in 1m51s
Build Multi-Platform Binaries / build-binaries (arm64, linux, client, true) (push) Successful in 1m17s
Build Multi-Platform Binaries / build-binaries (arm64, linux, server, true) (push) Successful in 1m50s
Build Multi-Platform Binaries / build-binaries (arm64, windows, server, false) (push) Successful in 1m18s
All checks were successful
Build Multi-Platform Binaries / build-frontend (push) Successful in 38s
Build Multi-Platform Binaries / build-binaries (amd64, linux, client, true) (push) Successful in 1m47s
Build Multi-Platform Binaries / build-binaries (amd64, darwin, server, false) (push) Successful in 1m48s
Build Multi-Platform Binaries / build-binaries (amd64, windows, client, true) (push) Successful in 1m29s
Build Multi-Platform Binaries / build-binaries (amd64, linux, server, true) (push) Successful in 1m53s
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, client, true) (push) Successful in 1m14s
Build Multi-Platform Binaries / build-binaries (amd64, windows, server, true) (push) Successful in 1m40s
Build Multi-Platform Binaries / build-binaries (arm64, darwin, server, false) (push) Successful in 1m36s
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, server, true) (push) Successful in 1m51s
Build Multi-Platform Binaries / build-binaries (arm64, linux, client, true) (push) Successful in 1m17s
Build Multi-Platform Binaries / build-binaries (arm64, linux, server, true) (push) Successful in 1m50s
Build Multi-Platform Binaries / build-binaries (arm64, windows, server, false) (push) Successful in 1m18s
- 在WebServer中添加TrafficStore存储接口 - 将Web配置从根级别移动到Server.Web子结构下 - 移除Web配置中的BindAddr字段并调整默认值逻辑 - 在前端HomeView中替换模拟流量数据显示真实统计数据 - 添加流量统计API接口(/traffic/stats和/traffic/hourly) - 实现SQLite数据库流量统计表创建和CRUD操作 - 在Relay包中添加带流量统计的数据转发功能 - 在设置页面添加服务器配置编辑和保存功能 - 创建流量统计处理器和相关数据模型定义
This commit is contained in:
@@ -42,10 +42,9 @@ func (h *ConfigHandler) Get(c *gin.Context) {
|
||||
HeartbeatTimeout: cfg.Server.HeartbeatTimeout,
|
||||
},
|
||||
Web: dto.WebConfigInfo{
|
||||
Enabled: cfg.Web.Enabled,
|
||||
BindAddr: cfg.Web.BindAddr,
|
||||
BindPort: cfg.Web.BindPort,
|
||||
Username: cfg.Web.Username,
|
||||
Enabled: cfg.Server.Web.Enabled,
|
||||
BindPort: cfg.Server.Web.BindPort,
|
||||
Username: cfg.Server.Web.Username,
|
||||
Password: "****",
|
||||
},
|
||||
}
|
||||
@@ -93,15 +92,12 @@ func (h *ConfigHandler) Update(c *gin.Context) {
|
||||
|
||||
// 更新 Web 配置
|
||||
if req.Web != nil {
|
||||
cfg.Web.Enabled = req.Web.Enabled
|
||||
if req.Web.BindAddr != "" {
|
||||
cfg.Web.BindAddr = req.Web.BindAddr
|
||||
}
|
||||
cfg.Server.Web.Enabled = req.Web.Enabled
|
||||
if req.Web.BindPort > 0 {
|
||||
cfg.Web.BindPort = req.Web.BindPort
|
||||
cfg.Server.Web.BindPort = req.Web.BindPort
|
||||
}
|
||||
cfg.Web.Username = req.Web.Username
|
||||
cfg.Web.Password = req.Web.Password
|
||||
cfg.Server.Web.Username = req.Web.Username
|
||||
cfg.Server.Web.Password = req.Web.Password
|
||||
}
|
||||
|
||||
if err := h.app.SaveConfig(); err != nil {
|
||||
|
||||
@@ -14,6 +14,7 @@ type AppInterface interface {
|
||||
GetConfigPath() string
|
||||
SaveConfig() error
|
||||
GetJSPluginStore() db.JSPluginStore
|
||||
GetTrafficStore() db.TrafficStore
|
||||
}
|
||||
|
||||
// ServerInterface 服务端接口
|
||||
|
||||
76
internal/server/router/handler/traffic.go
Normal file
76
internal/server/router/handler/traffic.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// TrafficHandler 流量统计处理器
|
||||
type TrafficHandler struct {
|
||||
app AppInterface
|
||||
}
|
||||
|
||||
// NewTrafficHandler 创建流量统计处理器
|
||||
func NewTrafficHandler(app AppInterface) *TrafficHandler {
|
||||
return &TrafficHandler{app: app}
|
||||
}
|
||||
|
||||
// GetStats 获取流量统计
|
||||
// @Summary 获取流量统计
|
||||
// @Description 获取24小时和总流量统计
|
||||
// @Tags 流量
|
||||
// @Produce json
|
||||
// @Security Bearer
|
||||
// @Success 200 {object} Response
|
||||
// @Router /api/traffic/stats [get]
|
||||
func (h *TrafficHandler) GetStats(c *gin.Context) {
|
||||
store := h.app.GetTrafficStore()
|
||||
|
||||
// 获取24小时流量
|
||||
in24h, out24h, err := store.Get24HourTraffic()
|
||||
if err != nil {
|
||||
InternalError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
// 获取总流量
|
||||
inTotal, outTotal, err := store.GetTotalTraffic()
|
||||
if err != nil {
|
||||
InternalError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
Success(c, gin.H{
|
||||
"traffic_24h": gin.H{
|
||||
"inbound": in24h,
|
||||
"outbound": out24h,
|
||||
},
|
||||
"traffic_total": gin.H{
|
||||
"inbound": inTotal,
|
||||
"outbound": outTotal,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
// GetHourly 获取每小时流量
|
||||
// @Summary 获取每小时流量
|
||||
// @Description 获取最近N小时的流量记录
|
||||
// @Tags 流量
|
||||
// @Produce json
|
||||
// @Security Bearer
|
||||
// @Param hours query int false "小时数" default(24)
|
||||
// @Success 200 {object} Response
|
||||
// @Router /api/traffic/hourly [get]
|
||||
func (h *TrafficHandler) GetHourly(c *gin.Context) {
|
||||
hours := 24
|
||||
|
||||
store := h.app.GetTrafficStore()
|
||||
records, err := store.GetHourlyTraffic(hours)
|
||||
if err != nil {
|
||||
InternalError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
Success(c, gin.H{
|
||||
"records": records,
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user