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:
1 parent
1e2f8ef24f
commit
021d012478
25 files changed
+2313
-746
No files matched your search
@@ -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 获取协议的系统包安装命令
|
||||
|
||||
Reference in new issue
Block a user