拆分服务器地址配置为独立字段,支持CDN优选IP故障切换,新增重置数据库按钮

- model: ServerURL → Protocol/Host/ServerIPs/Port/Path 五个字段
- db: 自动迁移旧 server_url 列到新表结构
- ui: 配置窗口改为横向分组布局,保存失败时不再关闭窗口
- transport: 支持 TLS SNI + Host 头覆盖以连接 CDN 边缘节点
- session: CDN IP 列表连接失败自动切换到下一个
- 新增重置数据库按钮,一键清空所有配置
This commit is contained in:
2026-07-06 20:58:11 +08:00
parent 32471e25b0
commit 96278fdf37
12 changed files with 469 additions and 72 deletions
+19 -6
View File
@@ -51,6 +51,8 @@ func (a *App) buildMainWindow() fyne.CanvasObject {
editBtn := widget.NewButton(i18n.T("BtnEdit"), a.onEditProfile)
deleteBtn := widget.NewButton(i18n.T("BtnDelete"), a.onDeleteProfile)
resetDBBtn := widget.NewButton(i18n.T("BtnResetDB"), a.onResetDB)
buttons := container.NewGridWithColumns(2,
a.connectBtn, a.disconnectBtn,
)
@@ -63,6 +65,7 @@ func (a *App) buildMainWindow() fyne.CanvasObject {
a.profileSelect,
buttons,
profileButtons,
resetDBBtn,
statusCard,
)
}
@@ -109,15 +112,25 @@ func (a *App) onConnect() {
return
}
p := a.currentProfile
serverURL := p.BuildServerURL()
sniHost := ""
serverIPs := p.GetServerIPList()
if len(serverIPs) > 0 {
sniHost = p.Host
}
// Build and send the start command.
cfg := ipc.ClientConfig{
ServerURL: a.currentProfile.ServerURL,
Username: a.currentProfile.Username,
ServerURL: serverURL,
SNIHost: sniHost,
ServerIPs: serverIPs,
Username: p.Username,
Password: password,
AuthMode: string(a.currentProfile.AuthMode),
RoutingMode: string(a.currentProfile.RoutingMode),
CustomCIDRs: splitCIDRs(a.currentProfile.CustomCIDRs),
MTUOverride: a.currentProfile.MTUOverride,
AuthMode: string(p.AuthMode),
RoutingMode: string(p.RoutingMode),
CustomCIDRs: splitCIDRs(p.CustomCIDRs),
MTUOverride: p.MTUOverride,
}
if err := ipc.SendStart(client, cfg); err != nil {
fyne.Do(func() {