From dd396d31b51e2b78156c28c95129930653a92b99 Mon Sep 17 00:00:00 2001 From: robin Date: Sat, 14 Feb 2026 23:23:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EdgeAPI/internal/installers/installer_base.go | 51 +++++++++++++++++++ EdgeAPI/internal/installers/installer_node.go | 4 +- .../installers/installer_ns_node_plus.go | 4 +- .../web/actions/default/servers/create.go | 4 +- .../settingutils/advanced_helper_plus.go | 11 +++- .../web/views/@default/servers/create.js | 5 -- EdgeUser/web/views/@default/@layout.css | 6 +++ EdgeUser/web/views/@default/@layout.html | 20 +++++--- 8 files changed, 84 insertions(+), 21 deletions(-) diff --git a/EdgeAPI/internal/installers/installer_base.go b/EdgeAPI/internal/installers/installer_base.go index ea4a237..ca482b8 100644 --- a/EdgeAPI/internal/installers/installer_base.go +++ b/EdgeAPI/internal/installers/installer_base.go @@ -146,6 +146,57 @@ func (this *BaseInstaller) LookupLatestInstaller(filePrefix string) (string, err return result, nil } +// LookupLatestInstallerForTarget 按目标系统优先选择安装包: +// 1) Linux 且识别到发行版时,优先 filePrefix-{distroTag}-v*.zip(如 ubuntu22.04 / amzn2023) +// 2) 回退 filePrefix-v*.zip(通用包) +func (this *BaseInstaller) LookupLatestInstallerForTarget(filePrefix string, env *Env) (string, error) { + if env != nil && env.OS == "linux" { + distroTag, err := this.detectLinuxDistroTag() + if err != nil { + return "", err + } + if len(distroTag) > 0 { + zipFile, err := this.LookupLatestInstaller(filePrefix + "-" + distroTag) + if err != nil { + return "", err + } + if len(zipFile) > 0 { + return zipFile, nil + } + } + } + return this.LookupLatestInstaller(filePrefix) +} + +// detectLinuxDistroTag 识别远端 Linux 发行版标签(用于选择发行版定制安装包)。 +// 当前支持:ubuntu22.04 / amzn2023;其他系统返回空字符串(回退通用包)。 +func (this *BaseInstaller) detectLinuxDistroTag() (string, error) { + if this.client == nil { + return "", nil + } + + releaseData, stderr, err := this.client.Exec("cat /etc/os-release") + if err != nil { + return "", fmt.Errorf("read /etc/os-release failed: %w, stderr: %s", err, stderr) + } + if len(strings.TrimSpace(releaseData)) == 0 { + return "", nil + } + + releaseMap := parseOSRelease(releaseData) + id := strings.ToLower(strings.TrimSpace(releaseMap["ID"])) + versionID := strings.TrimSpace(releaseMap["VERSION_ID"]) + + switch { + case id == "ubuntu" && strings.HasPrefix(versionID, "22.04"): + return "ubuntu22.04", nil + case id == "amzn" && strings.HasPrefix(versionID, "2023"): + return "amzn2023", nil + default: + return "", nil + } +} + // InstallHelper 上传安装助手 func (this *BaseInstaller) InstallHelper(targetDir string, role nodeconfigs.NodeRole) (env *Env, err error) { var uname = this.uname() diff --git a/EdgeAPI/internal/installers/installer_node.go b/EdgeAPI/internal/installers/installer_node.go index f0a8d92..d0e6de3 100644 --- a/EdgeAPI/internal/installers/installer_node.go +++ b/EdgeAPI/internal/installers/installer_node.go @@ -47,12 +47,12 @@ func (this *NodeInstaller) Install(dir string, params interface{}, installStatus // 上传安装文件 var filePrefix = "edge-node-" + env.OS + "-" + env.Arch - zipFile, err := this.LookupLatestInstaller(filePrefix) + zipFile, err := this.LookupLatestInstallerForTarget(filePrefix, env) if err != nil { return err } if len(zipFile) == 0 { - return errors.New("can not find installer file for " + env.OS + "/" + env.Arch) + return errors.New("can not find installer file for " + env.OS + "/" + env.Arch + ", expected '" + filePrefix + "-v*.zip' or distro-specific '" + filePrefix + "-{ubuntu22.04|amzn2023}-v*.zip'") } var targetZip = "" var firstCopyErr error diff --git a/EdgeAPI/internal/installers/installer_ns_node_plus.go b/EdgeAPI/internal/installers/installer_ns_node_plus.go index 3226806..cc23d56 100644 --- a/EdgeAPI/internal/installers/installer_ns_node_plus.go +++ b/EdgeAPI/internal/installers/installer_ns_node_plus.go @@ -49,12 +49,12 @@ func (this *NSNodeInstaller) Install(dir string, params interface{}, installStat // 上传安装文件 filePrefix := "edge-dns-" + env.OS + "-" + env.Arch - zipFile, err := this.LookupLatestInstaller(filePrefix) + zipFile, err := this.LookupLatestInstallerForTarget(filePrefix, env) if err != nil { return err } if len(zipFile) == 0 { - return errors.New("can not find installer file for " + env.OS + "/" + env.Arch) + return errors.New("can not find installer file for " + env.OS + "/" + env.Arch + ", expected '" + filePrefix + "-v*.zip' or distro-specific '" + filePrefix + "-{ubuntu22.04|amzn2023}-v*.zip'") } var targetZip = "" var firstCopyErr error diff --git a/EdgeAdmin/internal/web/actions/default/servers/create.go b/EdgeAdmin/internal/web/actions/default/servers/create.go index 562451a..567a300 100644 --- a/EdgeAdmin/internal/web/actions/default/servers/create.go +++ b/EdgeAdmin/internal/web/actions/default/servers/create.go @@ -300,9 +300,7 @@ func (this *CreateAction) RunPost(params struct { if err != nil { this.Fail("源站地址解析失败:" + err.Error()) } - if len(originConfigs) == 0 { - this.FailField("emptyOrigin", "请添加至少一个源站地址") - } + // 允许不填源站,保存时统一提示 var originRefs = []*serverconfigs.OriginRef{} for _, originConfig := range originConfigs { diff --git a/EdgeAdmin/internal/web/actions/default/settings/settingutils/advanced_helper_plus.go b/EdgeAdmin/internal/web/actions/default/settings/settingutils/advanced_helper_plus.go index a4485f7..6bdf7ee 100644 --- a/EdgeAdmin/internal/web/actions/default/settings/settingutils/advanced_helper_plus.go +++ b/EdgeAdmin/internal/web/actions/default/settings/settingutils/advanced_helper_plus.go @@ -50,8 +50,15 @@ func (this *AdvancedHelper) BeforeAction(actionPtr actions.ActionWrapper) (goNex } // 外层始终显示「日志数据库」与「ClickHouse 配置」两个标签,不随点击变化 path := action.Request.URL.Path - tabbar.Add("日志数据库(MySQL)", "", "/db", "", (path == "/db" || strings.HasPrefix(path, "/db/")) && path != "/db/clickhouse") - tabbar.Add("日志数据库(ClickHouse)", "", "/db/clickhouse", "", path == "/db/clickhouse") + langCode := strings.ToLower(configloaders.FindAdminLangForAction(actionPtr)) + mysqlTabName := "Log Databases (MySQL)" + clickHouseTabName := "Log Databases (ClickHouse)" + if strings.HasPrefix(langCode, "zh") { + mysqlTabName = "日志数据库(MySQL)" + clickHouseTabName = "日志数据库(ClickHouse)" + } + tabbar.Add(mysqlTabName, "", "/db", "", (path == "/db" || strings.HasPrefix(path, "/db/")) && path != "/db/clickhouse") + tabbar.Add(clickHouseTabName, "", "/db/clickhouse", "", path == "/db/clickhouse") if teaconst.IsPlus { // 目前仅在调试模式下使用 if Tea.IsTesting() { diff --git a/EdgeAdmin/web/views/@default/servers/create.js b/EdgeAdmin/web/views/@default/servers/create.js index 0637135..c2bbc6d 100644 --- a/EdgeAdmin/web/views/@default/servers/create.js +++ b/EdgeAdmin/web/views/@default/servers/create.js @@ -17,11 +17,6 @@ Tea.context(function () { teaweb.warn(err.messages[0], function () { that.$refs.serverNameBox.addServerName() }) - } else if (err.param == "emptyOrigin") { - isFiltered = true - teaweb.warn(err.messages[0], function () { - that.addOrigin() - }) } }) diff --git a/EdgeUser/web/views/@default/@layout.css b/EdgeUser/web/views/@default/@layout.css index 34283f6..30b7d37 100644 --- a/EdgeUser/web/views/@default/@layout.css +++ b/EdgeUser/web/views/@default/@layout.css @@ -383,6 +383,12 @@ body.expanded .main { .top-nav .item.red { color: red !important; } +.top-nav .item .hover-span span { + display: none; +} +.top-nav .item:hover .hover-span span { + display: inline; +} /** 顶部菜单 **/ .top-secondary-menu { position: fixed; diff --git a/EdgeUser/web/views/@default/@layout.html b/EdgeUser/web/views/@default/@layout.html index 9308a1c..01eadcc 100644 --- a/EdgeUser/web/views/@default/@layout.html +++ b/EdgeUser/web/views/@default/@layout.html @@ -73,21 +73,27 @@