feat: 全协议一键安装 + 国内GitHub镜像加速 + 中英文i18n国际化

后端:
- binmgr.go: 新增 detectChina() 国内/海外自动判断(ipinfo.io)
- binmgr.go: 国内自动走 gh-proxy.com 镜像加速 GitHub 下载
- binmgr.go: 新增 InstallViaPackageManager() 包管理器一键安装
- binmgr.go: 新增 GetDeploySpec()/ProtocolAlias() 导出函数
- api.go: installBinary 支持全部7个协议(FRP/WireGuard/OpenVPN/IPSec/IKEv2/L2TP/StrongSwan)
- api.go: 策略: GitHub下载失败 → 自动降级包管理器安装

前端:
- 安装 vue-i18n@9, 支持中英文切换
- 新增 locales/zh-CN.json + en-US.json (548个翻译key, 17个模块)
- 新增 i18n.js 配置, localStorage 持久化语言偏好
- Layout.vue 右上角语言切换下拉菜单
- 所有17个Vue文件中文文本转为 $t() 调用
- Element Plus 组件语言跟随切换
- TunnelWizard: 所有协议显示「一键安装」按钮(带loading)
- 前端构建零错误
This commit is contained in:
opsx-tools committed 2026-07-23 03:01:46 +08:00
1 parent 1e2f8ef24f
commit 021d012478
25 files changed
+2313 -746

No files matched your search

+37 -6
View File
@@ -7,6 +7,7 @@ import (
"encoding/base64"
"encoding/json"
"fmt"
"log"
"net"
"net/http"
"os"
@@ -610,17 +611,47 @@ func (s *Server) listBinaryStatus(c *gin.Context) {
// installBinary 下载部署协议二进制(FRP / OpenVPN 支持从 GitHub Release 下载)
func (s *Server) installBinary(c *gin.Context) {
name := c.Param("name")
if name != "frp" && name != "openvpn" {
c.JSON(400, gin.H{"error": "仅 FRP / OpenVPN 支持平台自动下载部署,其他协议请使用系统包管理器安装"})
// 合法协议白名单
validProtocols := map[string]bool{
"frp": true, "openvpn": true, "wireguard": true,
"strongswan": true, "ipsec": true, "ikev2": true, "l2tp": true,
}
if !validProtocols[name] {
c.JSON(400, gin.H{"error": fmt.Sprintf("不支持的协议: %s", name)})
return
}
version, err := binmgr.DownloadBinary(name)
// 先检查是否已安装
st := binmgr.CheckBinary(binmgr.ProtocolAlias(name))
if st.Installed {
c.JSON(200, gin.H{"ok": true, "version": st.Version, "message": "已安装", "source": st.Source})
return
}
// 策略1:支持 GitHub 下载的协议(FRP / OpenVPN)先尝试下载
if _, canDownload := binmgr.GetDeploySpec(name); canDownload {
version, err := binmgr.DownloadBinary(name)
if err == nil {
store.Audit(c.GetString("username"), "install_binary", name, version)
c.JSON(200, gin.H{"ok": true, "version": version, "method": "download"})
return
}
// GitHub 下载失败,降级到包管理器
log.Printf("[install] %s GitHub 下载失败(%v),尝试包管理器安装", name, err)
}
// 策略2:系统包管理器一键安装
output, err := binmgr.InstallViaPackageManager(name)
if err != nil {
c.JSON(500, gin.H{"error": err.Error()})
c.JSON(500, gin.H{"error": err.Error(), "output": output})
return
}
store.Audit(c.GetString("username"), "install_binary", name, version)
c.JSON(200, gin.H{"ok": true, "version": version})
// 安装成功,重新检测
st = binmgr.CheckBinary(binmgr.ProtocolAlias(name))
store.Audit(c.GetString("username"), "install_binary", name, st.Version)
c.JSON(200, gin.H{"ok": true, "version": st.Version, "method": "package_manager", "output": output})
}
// binaryInstallHint 获取协议的系统包安装命令