Przeglądaj źródła

feat(gameShield): 优化游戏盾配置并添加新功能

-重构旧格式处理逻辑,增加对 UDP 会话超时的动态设置
- 更新数据结构,增加 Domain 字段并调整 SdkIp 和 MaxBandwidth
- 新增编辑和删除游戏盾后端配置的功能
- 优化游戏盾规则创建流程,使用域名替代应用名
- 修复游戏盾后端配置的保存逻辑,根据代理地址自动设置类型
fusu 3 miesięcy temu
rodzic
commit
4a8738db2a

+ 1 - 0
api/v1/GameShield.go

@@ -38,6 +38,7 @@ type GetGameShieldRequiredResponse struct {
 	Backend   string
 	Cookie    string
 	RuleId    int
+	Domain    string
 }
 
 type KeyAndFieldResponse struct {

+ 12 - 9
api/v1/gameShieldBackend.go

@@ -7,16 +7,17 @@ type GameShieldBackendRequest struct {
 	SourceMachineIP string    `json:"source_machineIP" form:"source_machineIP"`
 	Protocol        string    `json:"protocol" form:"protocol"`
 	ProxyAddr       string    `json:"proxy_addr" form:"proxy_addr"`
+	KeySort         int       `json:"key_sort" form:"key_sort"`
 	ConnectPort     string    `json:"connect_port" form:"connect_port" binding:"required"`
 	SdkPort         string    `json:"sdk_port" form:"sdk_port"`
-	PublicIp        string    `json:"public_ip" form:"public_ip"`
+	SdkIp           string    `json:"sdk_ip" form:"sdk_ip"`
 	Type            string    `json:"type" form:"type"`
+	MaxBandwidth    string    `json:"max_bandwidth" form:"max_bandwidth"`
 	CreatedAt       time.Time `json:"created_at" form:"created_at"`
 	UpdatedAt       time.Time `json:"updated_at" form:"updated_at"`
 }
 
 type GameShieldBackendArrayRequest struct {
-	AppName string                     `json:"app_name" form:"app_name" binding:"required"`
 	Items   []GameShieldBackendRequest `json:"items" form:"items"`
 	Uid     int                        `json:"uid" form:"uid" binding:"required"`
 	Checked int                        `json:"checked" form:"checked"`
@@ -24,11 +25,13 @@ type GameShieldBackendArrayRequest struct {
 }
 
 type SendGameShieldBackend struct {
-	Addr              []string `json:"addr" form:"addr"`
-	Protocol          string   `json:"protocol" form:"protocol"`
-	ProxyAddr         string   `json:"proxy_addr" form:"proxy_addr"`
-	SdkPort           int      `json:"sdk_port" form:"sdk_port"`
-	UdpSessionTimeout string   `json:"udp_session_timeout" form:"udp_session_timeout"`
-	SdkIp             string   `json:"sdk_ip" form:"sdk_ip"`
-	AgentAddr         string   `json:"agent_addr" form:"agent_addr"`
+	Addr              []string `json:"addr,omitempty" form:"addr"`
+	Protocol          string   `json:"protocol,omitempty" form:"protocol"`
+	ProxyAddr         string   `json:"proxy_addr,omitempty" form:"proxy_addr"`
+	SdkPort           int      `json:"sdk_port,omitempty" form:"sdk_port"`
+	UdpSessionTimeout string   `json:"udp_session_timeout,omitempty" form:"udp_session_timeout"`
+	SdkIp             string   `json:"sdk_ip,omitempty" form:"sdk_ip"`
+	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"`
 }

+ 30 - 0
internal/handler/gameshieldbackend.go

@@ -41,3 +41,33 @@ func (h *GameShieldBackendHandler) AddGameShieldBackend(ctx *gin.Context) {
 	}
 	v1.HandleSuccess(ctx, res)
 }
+
+func (h *GameShieldBackendHandler) EditGameShieldBackend(ctx *gin.Context) {
+	req := new(v1.GameShieldBackendArrayRequest)
+	if err := ctx.ShouldBind(req); err != nil {
+		v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, err.Error())
+		return
+	}
+	defaults.SetDefaults(req)
+	res, err := h.gameShieldBackendService.EditGameShieldBackend(ctx, req)
+	if err != nil {
+		v1.HandleError(ctx, http.StatusInternalServerError, err, err.Error())
+		return
+	}
+	v1.HandleSuccess(ctx, res)
+}
+
+func (h *GameShieldBackendHandler) DeleteGameShieldBackend(ctx *gin.Context) {
+	req := new(v1.GameShieldBackendArrayRequest)
+	if err := ctx.ShouldBind(req); err != nil {
+		v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, err.Error())
+		return
+	}
+	defaults.SetDefaults(req)
+	res, err := h.gameShieldBackendService.DeleteGameShieldBackend(ctx, req)
+	if err != nil {
+		v1.HandleError(ctx, http.StatusInternalServerError, err, err.Error())
+		return
+	}
+	v1.HandleSuccess(ctx, res)
+}

+ 3 - 2
internal/model/gameshieldbackend.go

@@ -5,14 +5,15 @@ import "time"
 type GameShieldBackend struct {
 	Id              int `gorm:"primary"`
 	HostId          int `gorm:"not null"`
-	Key             int
+	KeySort         int
 	SourceMachineIP string ``
 	Protocol        string `gorm:"not null"`
 	ProxyAddr       string `gorm:"null"`
 	ConnectPort     string `gorm:"not null"`
 	SdkPort         string
-	PublicIp        string `gorm:"null"`
+	SdkIp           string `gorm:"null"`
 	Type            string
+	MaxBandwidth    string
 	CreatedAt       time.Time
 	UpdatedAt       time.Time
 }

+ 11 - 0
internal/repository/gameshield.go

@@ -19,6 +19,7 @@ type GameShieldRepository interface {
 	GetGameShieldRuleIdByAppName(ctx context.Context, appName string) (int, error)
 	UpdateGameShieldByHostId(ctx context.Context, gameShield *model.GameShield) error
 	GetGameShieldByHostId(ctx context.Context, hostId int) (*model.GameShield, error)
+	GetHostById(ctx context.Context, id int) (string, error)
 }
 
 func NewGameShieldRepository(
@@ -150,3 +151,13 @@ func (r *gameShieldRepository) GetGameShieldByHostId(ctx context.Context, hostId
 	}
 	return &res, nil
 }
+
+func (r *gameShieldRepository) GetHostById(ctx context.Context, id int) (string, error) {
+	var res string
+	if err := r.DB(ctx).Table("shd_host").
+		Where("id = ?", id).
+		Pluck("domain", &res).Error; err != nil {
+		return "", err
+	}
+	return res, nil
+}

+ 2 - 2
internal/repository/gameshieldbackend.go

@@ -42,14 +42,14 @@ func (r *gameShieldBackendRepository) AddGameShieldBackend(ctx context.Context,
 }
 
 func (r *gameShieldBackendRepository) EditGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendRequest) error {
-	if err := r.DB(ctx).Where("id = ?", req.Id).Updates(req).Error; err != nil {
+	if err := r.DB(ctx).Model(&model.GameShieldBackend{}).Where("id = ?", req.Id).Updates(req).Error; err != nil {
 		return err
 	}
 	return nil
 }
 
 func (r *gameShieldBackendRepository) DeleteGameShieldBackend(ctx context.Context, id int64) error {
-	if err := r.DB(ctx).Delete(&model.GameShieldBackend{}, id).Error; err != nil {
+	if err := r.DB(ctx).Delete(&model.GameShieldBackend{}, id).Where("id = ?", id).Error; err != nil {
 		return err
 	}
 	return nil

+ 2 - 0
internal/server/http.go

@@ -101,6 +101,8 @@ func NewHTTPServer(
 			noAuthRouter.POST("/udpLimit/edit", udpLimitHandler.EditUdpLimit)
 			noAuthRouter.POST("/udpLimit/delete", udpLimitHandler.DeleteUdpLimit)
 			noAuthRouter.POST("/gameShieldBackend/add", gameShieldBackendHandler.AddGameShieldBackend)
+			noAuthRouter.POST("/gameShieldBackend/edit", gameShieldBackendHandler.EditGameShieldBackend)
+			noAuthRouter.POST("/gameShieldBackend/delete", gameShieldBackendHandler.DeleteGameShieldBackend)
 		}
 		// Non-strict permission routing group
 		noStrictAuthRouter := v1.Group("/").Use(middleware.NoStrictAuth(jwt, logger))

+ 19 - 10
internal/service/formatter.go

@@ -86,20 +86,26 @@ func (service *formatterService) FormatPort(ctx context.Context, req interface{}
 
 func (service *formatterService) OldFormat(ctx context.Context, req *[]model.GameShieldBackend) (map[string]v1.SendGameShieldBackend, error) {
 	res := make(map[string]v1.SendGameShieldBackend)
+	var UdpSessionTimeout string
 	for _, v := range *req {
 		addr := fmt.Sprintf("%s:%s", v.SourceMachineIP, v.ConnectPort)
 		sdkPort, err := strconv.Atoi(v.SdkPort)
 		if err != nil {
 			return nil, err
 		}
-		keyName := fmt.Sprintf("key%d", v.Key)
+		if v.Protocol == "udp" {
+			UdpSessionTimeout = "300s"
+		} else {
+			UdpSessionTimeout = ""
+		}
+		keyName := fmt.Sprintf("key%d", v.KeySort)
 		res[keyName] = v1.SendGameShieldBackend{
 			Addr:              []string{addr},
 			Protocol:          v.Protocol,
 			ProxyAddr:         v.ProxyAddr,
 			SdkPort:           sdkPort,
-			UdpSessionTimeout: "300s",
-			SdkIp:             v.PublicIp,
+			UdpSessionTimeout: UdpSessionTimeout,
+			SdkIp:             v.SdkIp,
 		}
 	}
 	return res, nil
@@ -123,15 +129,10 @@ func (service *formatterService) TidyFormatBackendData(ctx context.Context, req
 		if protocol == "" {
 			continue // 跳过没有有效协议的配置
 		}
-
 		// 获取端口数组
 		conPorts := service.FormatPort(ctx, item.ConnectPort)
 		sdkPorts := service.FormatPort(ctx, item.SdkPort)
 
-		if len(conPorts) != len(sdkPorts) {
-			return nil, fmt.Errorf("源端口和目标端口数量不匹配")
-		}
-
 		// 处理每一对端口
 		for i := 0; i < len(conPorts); i++ {
 			keyCounter++
@@ -156,6 +157,7 @@ func (service *formatterService) TidyFormatBackendData(ctx context.Context, req
 					itemMap.AgentAddr = fmt.Sprintf("%s:%s", sourceIP, "23350")
 				}
 				itemMap.ProxyAddr = userIp + ":32353"
+
 			} else {
 				itemMap.ProxyAddr = ""
 				itemMap.UdpSessionTimeout = "300s"
@@ -163,11 +165,18 @@ func (service *formatterService) TidyFormatBackendData(ctx context.Context, req
 			if item.Type == "mobile" {
 				itemMap.SdkIp = "127.0.0.1"
 			} else {
-				itemMap.SdkIp = item.PublicIp
+				itemMap.SdkIp = item.SdkIp
 			}
 
+			if item.MaxBandwidth == "1" {
+				itemMap.MaxBandwidth = "50m"
+			} else {
+				itemMap.MaxBandwidth = ""
+			}
 			// 设置SDK端口 - 使用数组中的具体端口
-			itemMap.SdkPort = sdkPorts[i]
+			if len(sdkPorts) != 0 {
+				itemMap.SdkPort = sdkPorts[i]
+			}
 
 			output[key] = itemMap
 		}

+ 21 - 9
internal/service/gameshieldbackend.go

@@ -17,7 +17,7 @@ type GameShieldBackendService interface {
 	GameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, int, error)
 	AddGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error)
 	EditGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error)
-	DeleteGameShieldBackend(ctx context.Context, id int64) error
+	DeleteGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error)
 	GetGameShieldRequired(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (*v1.GetGameShieldRequiredResponse, int, error)
 }
 
@@ -89,6 +89,7 @@ func (s *gameShieldBackendService) GetGameShieldRequired(ctx context.Context, re
 	if err != nil {
 		return nil, 0, err
 	}
+	res.Domain, err = s.gameShieldRepository.GetHostById(ctx, req.HostId)
 	return &res, count, nil
 }
 func (s *gameShieldBackendService) GetGameShieldBackend(ctx context.Context, id int64) (*model.GameShieldBackend, error) {
@@ -104,12 +105,12 @@ func (s *gameShieldBackendService) GameShieldBackend(ctx context.Context, req *v
 	if err != nil {
 		return "", 0, err
 	}
-	tokenUrl := s.Url + "admin/info/rule/edit?&__goadmin_edit_pk=" + strconv.Itoa(require.RuleId) + "_" + req.AppName
+	tokenUrl := s.Url + "admin/info/rule/edit?&__goadmin_edit_pk=" + strconv.Itoa(require.RuleId) + "_" + require.Domain
 	tokens, err := s.crawlerService.GetFormTokens(ctx, tokenUrl, require.Cookie)
 	if err != nil {
 		return "", 0, err
 	}
-	dunName := strconv.Itoa(req.Uid) + "_" + strconv.FormatInt(time.Now().Unix(), 10) + "_" + req.AppName
+	dunName := strconv.Itoa(req.Uid) + "_" + strconv.FormatInt(time.Now().Unix(), 10) + "_" + require.Domain
 	formData := map[string]interface{}{
 		"app_name":             dunName,
 		"gateway_group_id":     4,
@@ -170,11 +171,17 @@ func (s *gameShieldBackendService) EditGameShieldBackend(ctx context.Context, re
 	return res, nil
 }
 
-func (s *gameShieldBackendService) DeleteGameShieldBackend(ctx context.Context, id int64) error {
-	if err := s.gameShieldBackendRepository.DeleteGameShieldBackend(ctx, id); err != nil {
-		return err
+func (s *gameShieldBackendService) DeleteGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error) {
+	for _, v := range req.Items {
+		if err := s.gameShieldBackendRepository.DeleteGameShieldBackend(ctx, int64(v.Id)); err != nil {
+			return "", err
+		}
 	}
-	return nil
+	res, _, err := s.GameShieldBackend(ctx, req)
+	if err != nil {
+		return "", err
+	}
+	return res, nil
 }
 
 func (s *gameShieldBackendService) SaveGameShieldBackend(ctx context.Context, req map[string]v1.SendGameShieldBackend, hostId int) error {
@@ -185,15 +192,20 @@ func (s *gameShieldBackendService) SaveGameShieldBackend(ctx context.Context, re
 		if err != nil {
 			return err
 		}
+		if v.ProxyAddr == "127.0.0.1" {
+			v.Type = "mobile"
+		} else {
+			v.Type = "pc"
+		}
 		if err := s.gameShieldBackendRepository.AddGameShieldBackend(ctx,
 			&model.GameShieldBackend{
 				HostId:          hostId,
-				Key:             key,
+				KeySort:         key,
 				SourceMachineIP: parts[0],
 				Protocol:        v.Protocol,
 				ProxyAddr:       v.ProxyAddr,
 				ConnectPort:     parts[1],
-				PublicIp:        v.SdkIp,
+				SdkIp:           v.SdkIp,
 				SdkPort:         strconv.Itoa(v.SdkPort),
 				// 可以添加其他字段
 			}); err != nil {