This commit is contained in:
unknown
2026-02-04 20:27:13 +08:00
commit 3b042d1dad
9410 changed files with 1488147 additions and 0 deletions

View File

@@ -0,0 +1,297 @@
package serverutils
import (
"encoding/json"
"errors"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/userconfigs"
"github.com/TeaOSLab/EdgeUser/internal/rpc"
"github.com/TeaOSLab/EdgeUser/internal/web/actions/actionutils"
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/lists"
"github.com/iwind/TeaGo/logs"
"github.com/iwind/TeaGo/maps"
"github.com/iwind/TeaGo/types"
"net/http"
"strconv"
)
type ServerHelper struct {
}
func NewServerHelper() *ServerHelper {
return &ServerHelper{}
}
func (this *ServerHelper) BeforeAction(action *actions.ActionObject) {
if action.Request.Method != http.MethodGet {
return
}
action.Data["teaMenu"] = "lb"
// 左侧菜单
this.createLeftMenu(action)
}
func (this *ServerHelper) createLeftMenu(action *actions.ActionObject) {
// 初始化
if !action.Data.Has("leftMenuItemIsDisabled") {
action.Data["leftMenuItemIsDisabled"] = false
}
action.Data["leftMenuItems"] = []maps.Map{}
var mainTab = action.Data["mainTab"]
var secondMenuItem = action.Data["secondMenuItem"]
serverId := action.ParamInt64("serverId")
if serverId == 0 {
return
}
serverIdString := strconv.FormatInt(serverId, 10)
action.Data["serverId"] = serverId
// 读取server信息
rpcClient, err := rpc.SharedRPC()
if err != nil {
logs.Error(err)
return
}
userId := action.Context.GetInt64("userId")
ctx := rpcClient.Context(userId)
serverResp, err := rpcClient.ServerRPC().FindEnabledServer(ctx, &pb.FindEnabledServerRequest{
ServerId: serverId,
IgnoreSSLCerts: true,
})
if err != nil {
logs.Error(err)
return
}
server := serverResp.Server
if server == nil {
logs.Error(errors.New("can not find the server"))
return
}
// 服务管理
serverConfig := &serverconfigs.ServerConfig{}
err = json.Unmarshal(server.Config, serverConfig)
if err != nil {
logs.Error(err)
return
}
// 协议簇
var family = ""
if serverConfig.IsHTTPFamily() {
family = "http"
} else if serverConfig.IsTCPFamily() {
family = "tcp"
} else if serverConfig.IsUDPFamily() {
family = "udp"
}
action.Data["serverFamily"] = family
// TABBAR
var selectedTabbar = action.Data["mainTab"]
tabbar := actionutils.NewTabbar()
tabbar.Add("网站列表", "", "/lb", "", false)
//tabbar.Add("看板", "", "/servers/server/board?serverId="+serverIdString, "dashboard", selectedTabbar == "board")
//tabbar.Add("日志", "", "/servers/server/log?serverId="+serverIdString, "history", selectedTabbar == "log")
//tabbar.Add("统计", "", "/servers/server/stat?serverId="+serverIdString, "chart area", selectedTabbar == "stat")
tabbar.Add("设置", "", "/lb/server?serverId="+serverIdString, "setting", selectedTabbar == "setting")
//tabbar.Add("删除", "", "/servers/server/delete?serverId="+serverIdString, "trash", selectedTabbar == "delete")
actionutils.SetTabbar(action, tabbar)
// 左侧操作子菜单
switch types.String(mainTab) {
case "board":
action.Data["leftMenuItems"] = this.createBoardMenu(types.String(secondMenuItem), serverIdString, serverConfig)
case "log":
action.Data["leftMenuItems"] = this.createLogMenu(types.String(secondMenuItem), serverIdString, serverConfig)
case "stat":
action.Data["leftMenuItems"] = this.createStatMenu(types.String(secondMenuItem), serverIdString, serverConfig)
case "setting":
action.Data["leftMenuItems"] = this.createSettingsMenu(action, types.String(secondMenuItem), serverIdString, serverConfig)
case "delete":
action.Data["leftMenuItems"] = this.createDeleteMenu(action, types.String(secondMenuItem), serverIdString, serverConfig)
}
}
// 看板菜单
func (this *ServerHelper) createBoardMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig) []maps.Map {
menuItems := []maps.Map{}
menuItems = append(menuItems, maps.Map{
"name": "看板",
"url": "/servers/server/board?serverId=" + serverIdString,
"isActive": secondMenuItem == "index",
})
return menuItems
}
// 日志菜单
func (this *ServerHelper) createLogMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig) []maps.Map {
menuItems := []maps.Map{}
menuItems = append(menuItems, maps.Map{
"name": "实时",
"url": "/servers/server/log?serverId=" + serverIdString,
"isActive": secondMenuItem == "index",
})
menuItems = append(menuItems, maps.Map{
"name": "今天",
"url": "/servers/server/log/today?serverId=" + serverIdString,
"isActive": secondMenuItem == "today",
})
menuItems = append(menuItems, maps.Map{
"name": "历史",
"url": "/servers/server/log/history?serverId=" + serverIdString,
"isActive": secondMenuItem == "history",
})
return menuItems
}
// 统计菜单
func (this *ServerHelper) createStatMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig) []maps.Map {
menuItems := []maps.Map{}
menuItems = append(menuItems, maps.Map{
"name": "统计",
"url": "/servers/server/stat?serverId=" + serverIdString,
"isActive": secondMenuItem == "index",
})
return menuItems
}
// 设置菜单
func (this *ServerHelper) createSettingsMenu(action *actions.ActionObject, secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig) (items []maps.Map) {
menuItems := []maps.Map{
{
"name": "基本信息",
"url": "/lb/server/settings/basic?serverId=" + serverIdString,
"isActive": secondMenuItem == "basic",
"isOff": !serverConfig.IsOn,
},
{
"name": "DNS",
"url": "/lb/server/settings/dns?serverId=" + serverIdString,
"isActive": secondMenuItem == "dns",
},
}
// 是否有权限使用套餐
rpcClient, err := rpc.SharedRPC()
var supportPlan = false
if err == nil {
userId := action.Context.GetInt64("userId")
ctx := rpcClient.Context(userId)
userFeatureResp, err := rpcClient.UserRPC().FindUserFeatures(ctx, &pb.FindUserFeaturesRequest{UserId: userId})
if err == nil {
userFeatureCodes := []string{}
for _, feature := range userFeatureResp.Features {
userFeatureCodes = append(userFeatureCodes, feature.Code)
}
supportPlan = lists.ContainsString(userFeatureCodes, userconfigs.UserFeatureCodePlan)
}
}
if serverConfig.IsTCPFamily() {
menuItems = append(menuItems, maps.Map{
"name": "TCP",
"url": "/lb/server/settings/tcp?serverId=" + serverIdString,
"isActive": secondMenuItem == "tcp",
"isOn": serverConfig.TCP != nil && serverConfig.TCP.IsOn && len(serverConfig.TCP.Listen) > 0,
})
menuItems = append(menuItems, maps.Map{
"name": "TLS",
"url": "/lb/server/settings/tls?serverId=" + serverIdString,
"isActive": secondMenuItem == "tls",
"isOn": serverConfig.TLS != nil && serverConfig.TLS.IsOn && len(serverConfig.TLS.Listen) > 0,
})
if supportPlan {
var planName = ""
if serverConfig.UserPlan != nil && serverConfig.UserPlan.PlanId > 0 {
planName = this.findPlanName(serverConfig.UserPlan.PlanId)
}
menuItems = append(menuItems, maps.Map{
"name": "套餐",
"subName": planName,
"url": "/lb/server/settings/plan?serverId=" + serverIdString,
"isActive": secondMenuItem == "plan",
"isOn": serverConfig.UserPlan != nil && serverConfig.UserPlan.IsAvailable(),
})
}
menuItems = append(menuItems, maps.Map{
"name": "源站",
"url": "/lb/server/settings/reverseProxy?serverId=" + serverIdString,
"isActive": secondMenuItem == "reverseProxy",
"isOn": serverConfig.ReverseProxyRef != nil && serverConfig.ReverseProxyRef.IsOn,
})
} else if serverConfig.IsUDPFamily() {
menuItems = append(menuItems, maps.Map{
"name": "UDP",
"url": "/lb/server/settings/udp?serverId=" + serverIdString,
"isActive": secondMenuItem == "udp",
"isOn": serverConfig.UDP != nil && serverConfig.UDP.IsOn && len(serverConfig.UDP.Listen) > 0,
})
if supportPlan {
var planName = ""
if serverConfig.UserPlan != nil && serverConfig.UserPlan.PlanId > 0 {
planName = this.findPlanName(serverConfig.UserPlan.PlanId)
}
menuItems = append(menuItems, maps.Map{
"name": "套餐",
"subName": planName,
"url": "/lb/server/settings/plan?serverId=" + serverIdString,
"isActive": secondMenuItem == "plan",
"isOn": serverConfig.UserPlan != nil && serverConfig.UserPlan.IsAvailable(),
})
}
menuItems = append(menuItems, maps.Map{
"name": "源站",
"url": "/lb/server/settings/reverseProxy?serverId=" + serverIdString,
"isActive": secondMenuItem == "reverseProxy",
"isOn": serverConfig.ReverseProxyRef != nil && serverConfig.ReverseProxyRef.IsOn,
})
}
return menuItems
}
// 删除菜单
func (this *ServerHelper) createDeleteMenu(action *actions.ActionObject, secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig) []maps.Map {
var menuItems = []maps.Map{}
menuItems = append(menuItems, maps.Map{
"name": "删除",
"url": "/servers/server/delete?serverId=" + serverIdString,
"isActive": secondMenuItem == "index",
})
return menuItems
}
// 查找套餐名称
func (this *ServerHelper) findPlanName(planId int64) string {
if planId <= 0 {
return ""
}
rpcClient, err := rpc.SharedRPC()
if err != nil {
logs.Error(err)
return ""
}
planResp, err := rpcClient.PlanRPC().FindBasicPlan(rpcClient.Context(0), &pb.FindBasicPlanRequest{PlanId: planId})
if err != nil {
logs.Error(err)
return ""
}
if planResp.Plan == nil {
return ""
}
return planResp.Plan.Name
}