diff --git a/internal/db/models/server_dao.go b/internal/db/models/server_dao.go index 5a6fed1c..e117fdd6 100644 --- a/internal/db/models/server_dao.go +++ b/internal/db/models/server_dao.go @@ -903,6 +903,22 @@ func (this *ServerDAO) ListEnabledServersMatch(tx *dbs.Tx, offset int64, size in query.Desc("IF(FIND_IN_SET(bandwidthTime, :times), bandwidthBytes, 0)") query.Param("times", strings.Join(times, ",")) query.DescPk() + case "requestsAsc": + query.Asc("IF(FIND_IN_SET(bandwidthTime, :times), countRequests, 0)") + query.Param("times", strings.Join(times, ",")) + query.DescPk() + case "requestsDesc": + query.Desc("IF(FIND_IN_SET(bandwidthTime, :times), countRequests, 0)") + query.Param("times", strings.Join(times, ",")) + query.DescPk() + case "attackRequestsAsc": + query.Asc("IF(FIND_IN_SET(bandwidthTime, :times), countAttackRequests, 0)") + query.Param("times", strings.Join(times, ",")) + query.DescPk() + case "attackRequestsDesc": + query.Desc("IF(FIND_IN_SET(bandwidthTime, :times), countAttackRequests, 0)") + query.Param("times", strings.Join(times, ",")) + query.DescPk() default: query.DescPk() } @@ -913,6 +929,8 @@ func (this *ServerDAO) ListEnabledServersMatch(tx *dbs.Tx, offset int64, size in for _, server := range result { if len(server.BandwidthTime) > 0 && !lists.ContainsString(times, server.BandwidthTime) { server.BandwidthBytes = 0 + server.CountRequests = 0 + server.CountAttackRequests = 0 } } @@ -2737,7 +2755,7 @@ func (this *ServerDAO) FindUserServerClusterIds(tx *dbs.Tx, userId int64) ([]int // UpdateServerBandwidth 更新服务带宽 // fullTime YYYYMMDDHHII -func (this *ServerDAO) UpdateServerBandwidth(tx *dbs.Tx, serverId int64, fullTime string, bandwidthBytes int64) error { +func (this *ServerDAO) UpdateServerBandwidth(tx *dbs.Tx, serverId int64, fullTime string, bandwidthBytes int64, countRequests int64, countAttackRequests int64) error { if serverId <= 0 { return nil } @@ -2758,13 +2776,19 @@ func (this *ServerDAO) UpdateServerBandwidth(tx *dbs.Tx, serverId int64, fullTim Pk(serverId). Set("bandwidthTime", fullTime). Set("bandwidthBytes", bandwidthBytes). + Set("countRequests", countRequests). + Set("countAttackRequests", countAttackRequests). UpdateQuickly() } else { return this.Query(tx). Pk(serverId). Set("bandwidthTime", fullTime). Set("bandwidthBytes", dbs.SQL("bandwidthBytes+:bytes")). + Set("countRequests", dbs.SQL("countRequests+:countRequests")). + Set("countAttackRequests", dbs.SQL("countAttackRequests+:countAttackRequests")). Param("bytes", bandwidthBytes). + Param("countRequests", countRequests). + Param("countAttackRequests", countAttackRequests). UpdateQuickly() } } diff --git a/internal/db/models/server_dao_test.go b/internal/db/models/server_dao_test.go index 0e6107d0..9815b4a7 100644 --- a/internal/db/models/server_dao_test.go +++ b/internal/db/models/server_dao_test.go @@ -326,7 +326,7 @@ func TestServerDAO_FindBool(t *testing.T) { func TestServerDAO_UpdateServerBandwidth(t *testing.T) { var dao = models.NewServerDAO() var tx *dbs.Tx - err := dao.UpdateServerBandwidth(tx, 1, timeutil.FormatTime("YmdHi", time.Now().Unix()/300*300), 1024) + err := dao.UpdateServerBandwidth(tx, 1, timeutil.FormatTime("YmdHi", time.Now().Unix()/300*300), 1024, 1, 0) if err != nil { t.Fatal(err) } diff --git a/internal/db/models/server_model.go b/internal/db/models/server_model.go index 73c6cde4..106785c2 100644 --- a/internal/db/models/server_model.go +++ b/internal/db/models/server_model.go @@ -2,6 +2,57 @@ package models import "github.com/iwind/TeaGo/dbs" +const ( + ServerField_Id dbs.FieldName = "id" // ID + ServerField_IsOn dbs.FieldName = "isOn" // 是否启用 + ServerField_UserId dbs.FieldName = "userId" // 用户ID + ServerField_AdminId dbs.FieldName = "adminId" // 管理员ID + ServerField_Type dbs.FieldName = "type" // 服务类型 + ServerField_Name dbs.FieldName = "name" // 名称 + ServerField_Description dbs.FieldName = "description" // 描述 + ServerField_PlainServerNames dbs.FieldName = "plainServerNames" // 扁平化域名列表 + ServerField_ServerNames dbs.FieldName = "serverNames" // 域名列表 + ServerField_AuditingAt dbs.FieldName = "auditingAt" // 审核提交时间 + ServerField_AuditingServerNames dbs.FieldName = "auditingServerNames" // 审核中的域名 + ServerField_IsAuditing dbs.FieldName = "isAuditing" // 是否正在审核 + ServerField_AuditingResult dbs.FieldName = "auditingResult" // 审核结果 + ServerField_Http dbs.FieldName = "http" // HTTP配置 + ServerField_Https dbs.FieldName = "https" // HTTPS配置 + ServerField_Tcp dbs.FieldName = "tcp" // TCP配置 + ServerField_Tls dbs.FieldName = "tls" // TLS配置 + ServerField_Unix dbs.FieldName = "unix" // Unix配置 + ServerField_Udp dbs.FieldName = "udp" // UDP配置 + ServerField_WebId dbs.FieldName = "webId" // WEB配置 + ServerField_ReverseProxy dbs.FieldName = "reverseProxy" // 反向代理配置 + ServerField_GroupIds dbs.FieldName = "groupIds" // 分组ID列表 + ServerField_Config dbs.FieldName = "config" // 服务配置,自动生成 + ServerField_ConfigMd5 dbs.FieldName = "configMd5" // Md5 + ServerField_ClusterId dbs.FieldName = "clusterId" // 集群ID + ServerField_IncludeNodes dbs.FieldName = "includeNodes" // 部署条件 + ServerField_ExcludeNodes dbs.FieldName = "excludeNodes" // 节点排除条件 + ServerField_Version dbs.FieldName = "version" // 版本号 + ServerField_CreatedAt dbs.FieldName = "createdAt" // 创建时间 + ServerField_State dbs.FieldName = "state" // 状态 + ServerField_DnsName dbs.FieldName = "dnsName" // DNS名称 + ServerField_TcpPorts dbs.FieldName = "tcpPorts" // 所包含TCP端口 + ServerField_UdpPorts dbs.FieldName = "udpPorts" // 所包含UDP端口 + ServerField_SupportCNAME dbs.FieldName = "supportCNAME" // 允许CNAME不在域名名单 + ServerField_TrafficLimit dbs.FieldName = "trafficLimit" // 流量限制 + ServerField_TrafficDay dbs.FieldName = "trafficDay" // YYYYMMDD + ServerField_TrafficMonth dbs.FieldName = "trafficMonth" // YYYYMM + ServerField_TotalDailyTraffic dbs.FieldName = "totalDailyTraffic" // 日流量 + ServerField_TotalMonthlyTraffic dbs.FieldName = "totalMonthlyTraffic" // 月流量 + ServerField_TrafficLimitStatus dbs.FieldName = "trafficLimitStatus" // 流量限制状态 + ServerField_TotalTraffic dbs.FieldName = "totalTraffic" // 总流量 + ServerField_UserPlanId dbs.FieldName = "userPlanId" // 所属套餐ID + ServerField_LastUserPlanId dbs.FieldName = "lastUserPlanId" // 上一次使用的套餐 + ServerField_Uam dbs.FieldName = "uam" // UAM设置 + ServerField_BandwidthTime dbs.FieldName = "bandwidthTime" // 带宽更新时间,YYYYMMDDHHII + ServerField_BandwidthBytes dbs.FieldName = "bandwidthBytes" // 最近带宽峰值 + ServerField_CountAttackRequests dbs.FieldName = "countAttackRequests" // 最近攻击请求数 + ServerField_CountRequests dbs.FieldName = "countRequests" // 最近总请求数 +) + // Server 服务 type Server struct { Id uint32 `field:"id"` // ID @@ -50,6 +101,8 @@ type Server struct { Uam dbs.JSON `field:"uam"` // UAM设置 BandwidthTime string `field:"bandwidthTime"` // 带宽更新时间,YYYYMMDDHHII BandwidthBytes uint64 `field:"bandwidthBytes"` // 最近带宽峰值 + CountAttackRequests uint64 `field:"countAttackRequests"` // 最近攻击请求数 + CountRequests uint64 `field:"countRequests"` // 最近总请求数 } type ServerOperator struct { @@ -99,6 +152,8 @@ type ServerOperator struct { Uam any // UAM设置 BandwidthTime any // 带宽更新时间,YYYYMMDDHHII BandwidthBytes any // 最近带宽峰值 + CountAttackRequests any // 最近攻击请求数 + CountRequests any // 最近总请求数 } func NewServerOperator() *ServerOperator { diff --git a/internal/rpc/services/service_server.go b/internal/rpc/services/service_server.go index 3e64b3ce..568f0d0b 100644 --- a/internal/rpc/services/service_server.go +++ b/internal/rpc/services/service_server.go @@ -1301,6 +1301,14 @@ func (this *ServerService) ListEnabledServersMatch(ctx context.Context, req *pb. order = "trafficOutAsc" } else if req.TrafficOutDesc { order = "trafficOutDesc" + } else if req.RequestsAsc { + order = "requestsAsc" + } else if req.RequestsDesc { + order = "requestsDesc" + } else if req.AttackRequestsAsc { + order = "attackRequestsAsc" + } else if req.AttackRequestsDesc { + order = "attackRequestsDesc" } servers, err := models.SharedServerDAO.ListEnabledServersMatch(tx, req.Offset, req.Size, req.ServerGroupId, req.Keyword, req.UserId, req.NodeClusterId, req.AuditingFlag, utils.SplitStrings(req.ProtocolFamily, ","), order) @@ -1418,11 +1426,13 @@ func (this *ServerService) ListEnabledServersMatch(ctx context.Context, req *pb. Id: int64(server.ClusterId), Name: clusterName, }, - ServerGroups: pbGroups, - UserId: int64(server.UserId), - User: pbUser, - BandwidthTime: server.BandwidthTime, - BandwidthBytes: int64(server.BandwidthBytes), + ServerGroups: pbGroups, + UserId: int64(server.UserId), + User: pbUser, + BandwidthTime: server.BandwidthTime, + BandwidthBytes: int64(server.BandwidthBytes), + CountRequests: int64(server.CountRequests), + CountAttackRequests: int64(server.CountAttackRequests), }) } diff --git a/internal/rpc/services/service_server_bandwidth_stat.go b/internal/rpc/services/service_server_bandwidth_stat.go index bb943e8c..7a7d3e0b 100644 --- a/internal/rpc/services/service_server_bandwidth_stat.go +++ b/internal/rpc/services/service_server_bandwidth_stat.go @@ -65,12 +65,12 @@ func init() { for _, stat := range m { // 更新服务的带宽峰值 if stat.ServerId > 0 { - err := models.SharedServerBandwidthStatDAO.UpdateServerBandwidth(tx, stat.UserId, stat.ServerId, stat.NodeRegionId, stat.Day, stat.TimeAt, stat.Bytes, stat.TotalBytes, stat.CachedBytes, stat.AttackBytes, stat.CountRequests, stat.CountCachedRequests, stat.CountAttackRequests) + err = models.SharedServerBandwidthStatDAO.UpdateServerBandwidth(tx, stat.UserId, stat.ServerId, stat.NodeRegionId, stat.Day, stat.TimeAt, stat.Bytes, stat.TotalBytes, stat.CachedBytes, stat.AttackBytes, stat.CountRequests, stat.CountCachedRequests, stat.CountAttackRequests) if err != nil { remotelogs.Error("ServerBandwidthStatService", "dump bandwidth stats failed: "+err.Error()) } - err = models.SharedServerDAO.UpdateServerBandwidth(tx, stat.ServerId, stat.Day+stat.TimeAt, stat.Bytes) + err = models.SharedServerDAO.UpdateServerBandwidth(tx, stat.ServerId, stat.Day+stat.TimeAt, stat.Bytes, stat.CountRequests, stat.CountAttackRequests) if err != nil { remotelogs.Error("ServerBandwidthStatService", "update server bandwidth failed: "+err.Error()) }