Преглед на файлове

feat(gameShield): 增加主机名配置并优化 SDK端口检查

- 在 GameShieldBackend 模型中添加 Host 字段
- 优化 formatter.go 中的主机名设置逻辑
- 实现 TCP/HTTP 和 UDP 协议的 SDK 端口重复检查
- 更新 API 和服务层相关代码,支持新的主机名配置
fusu преди 3 месеца
родител
ревизия
5945f983f8
променени са 4 файла, в които са добавени 37 реда и са изтрити 6 реда
  1. 2 0
      api/v1/gameShieldBackend.go
  2. 1 0
      internal/model/gameshieldbackend.go
  3. 30 6
      internal/service/formatter.go
  4. 4 0
      internal/service/gameshieldbackend.go

+ 2 - 0
api/v1/gameShieldBackend.go

@@ -14,6 +14,7 @@ type GameShieldBackendRequest struct {
 	Type            string    `json:"type" form:"type"`
 	MaxBandwidth    *int      `json:"max_bandwidth" form:"max_bandwidth"`
 	Checked         string    `json:"checked" form:"checked"`
+	Host            string    `json:"host" form:"host" binding:"required"`
 	CreatedAt       time.Time `json:"created_at" form:"created_at"`
 	UpdatedAt       time.Time `json:"updated_at" form:"updated_at"`
 }
@@ -34,4 +35,5 @@ type SendGameShieldBackend struct {
 	AgentAddr         string   `json:"agent_addr,omitempty" form:"agent_addr"`
 	Type              string   `json:"type,omitempty" form:"type"`
 	MaxBandwidth      string   `json:"max_bandwidth,omitempty" form:"max_bandwidth"`
+	Host              string   `json:"host,omitempty" form:"host"`
 }

+ 1 - 0
internal/model/gameshieldbackend.go

@@ -14,6 +14,7 @@ type GameShieldBackend struct {
 	SdkIp           string `gorm:"null"`
 	Type            string
 	MaxBandwidth    int `gorm:"not null;type:tinyint"`
+	Host            string
 	CreatedAt       time.Time
 	UpdatedAt       time.Time
 }

+ 30 - 6
internal/service/formatter.go

@@ -135,6 +135,7 @@ func (service *formatterService) OldFormat(ctx context.Context, req *[]model.Gam
 			UdpSessionTimeout: UdpSessionTimeout,
 			SdkIp:             v.SdkIp,
 			MaxBandwidth:      MaxBandwidth,
+			Host:              v.Host,
 		}
 	}
 	return res, nil
@@ -180,10 +181,10 @@ func (service *formatterService) TidyFormatBackendData(ctx context.Context, req
 				Type:     item.Type,
 			}
 
-			//// 设置主机名(如果存在)
-			//if item.Host != "" {
-			//	itemMap["host"] = item.Host
-			//}
+			// 设置主机名(如果存在)
+			if item.Protocol == "http" && item.Host != "" {
+				itemMap.Host = item.Host
+			}
 
 			// 根据协议设置不同属性
 			if protocol != "udp" {
@@ -252,13 +253,16 @@ func (service *formatterService) ValidateBackendData(ctx context.Context, data m
 		return fmt.Errorf("获取配置限制失败: %w", err)
 	}
 
-	// 提取源机IP
+	// 提取源机IP和SDK端口
 	sourceIPs := make(map[string]bool)
 	ruleEntriesCount := int64(0)
 	maxBandwidthCount := int64(0)
 
-	for _, item := range data {
+	// 分协议检查SDK端口
+	tcpHttpPorts := make(map[int]bool) // TCP和HTTP共用
+	udpPorts := make(map[int]bool)     // UDP单独使用
 
+	for _, item := range data {
 		// 计算规则条目数
 		ruleEntriesCount += int64(len(item.Addr))
 
@@ -269,10 +273,30 @@ func (service *formatterService) ValidateBackendData(ctx context.Context, data m
 				sourceIPs[parts[0]] = true
 			}
 		}
+
 		// 计算最大带宽设置数
 		if item.MaxBandwidth != "" {
 			maxBandwidthCount++
 		}
+
+		// 根据协议类型检查SDK端口重复
+		if item.SdkPort != 0 {
+			// 根据协议字段来判断SDK端口是否重复
+			switch strings.ToUpper(item.Protocol) {
+			case "TCP", "HTTP":
+				if tcpHttpPorts[item.SdkPort] {
+					return fmt.Errorf("TCP/HTTP SDK端口%d重复,每个端口只能配置一次", item.SdkPort)
+				}
+				tcpHttpPorts[item.SdkPort] = true
+			case "UDP":
+				if udpPorts[item.SdkPort] {
+					return fmt.Errorf("UDP SDK端口%d重复,每个端口只能配置一次", item.SdkPort)
+				}
+				udpPorts[item.SdkPort] = true
+			default:
+				return fmt.Errorf("不支持的协议类型: %s", item.Protocol)
+			}
+		}
 	}
 
 	// 验证源机数量

+ 4 - 0
internal/service/gameshieldbackend.go

@@ -280,6 +280,9 @@ func (s *gameShieldBackendService) SaveGameShieldBackend(ctx context.Context, re
 		} else {
 			v.MaxBandwidth = "0"
 		}
+		if v.Protocol != "http" {
+			v.Host = ""
+		}
 		if err := s.gameShieldBackendRepository.AddGameShieldBackend(ctx,
 			&model.GameShieldBackend{
 				HostId:          hostId,
@@ -292,6 +295,7 @@ func (s *gameShieldBackendService) SaveGameShieldBackend(ctx context.Context, re
 				SdkPort:         strconv.Itoa(v.SdkPort),
 				Type:            v.Type,
 				MaxBandwidth:    cast.ToInt(v.MaxBandwidth),
+				Host:            v.Host,
 				// 可以添加其他字段
 			}); err != nil {
 			return err