From c63440435ec28513815590e3dc418cd30d39b49f Mon Sep 17 00:00:00 2001 From: kevin Date: Fri, 10 Jul 2026 13:44:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=AF=8F=E7=94=A8=E6=88=B7=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E8=BF=9E=E6=8E=A5=E6=95=B0=E6=94=B9=E4=B8=BA=E5=8F=AF?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=EF=BC=8C=E9=BB=98=E8=AE=A4=2030?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 maxConnsPerUser 从硬编码常量(3)改为数据库动态配置项,管理员可在 /admin/vpn 隧道设置中调整,保存后对新连接立即生效。 - model/vpn.go: VpnSetting 新增 MaxConnsPerUser 字段,gorm default:30 - db/db.go: 种子数据设默认 30;旧库回填 0 值为 30 - vpn/tunnel.go: 删除 maxConnsPerUser 常量,改读 VPN.Settings(),兜底 30 - handler/vpn.go: API 响应/请求结构体新增字段,校验范围 1-1000 - VpnView.vue: 隧道设置表单新增"每用户最大连接数"输入框 - zh.ts/en.ts: 新增 maxConnsPerUser 文案,更新首页多设备描述 - docs/client-development.md: 更新常量表为可配置项 --- docs/client-development.md | 2 +- frontend/src/locales/en.ts | 3 ++- frontend/src/locales/zh.ts | 3 ++- frontend/src/views/VpnView.vue | 6 ++++++ internal/db/db.go | 25 +++++++++++++++++-------- internal/handler/vpn.go | 10 ++++++++++ internal/model/vpn.go | 1 + internal/vpn/tunnel.go | 9 ++++++--- 8 files changed, 45 insertions(+), 14 deletions(-) diff --git a/docs/client-development.md b/docs/client-development.md index 9bab12f..f9d5239 100644 --- a/docs/client-development.md +++ b/docs/client-development.md @@ -780,7 +780,7 @@ ip6tables -t nat -A POSTROUTING -s -o <物理网卡> -j MASQUERA | `readyTimeout` | 30s | 等待 ready 超时 | `internal/vpn/tunnel.go:19` | | `pingPeriod` | 30s | Ping 周期 | `internal/vpn/tunnel.go:20` | | `maxMessageSize` | 1 MB | 单消息上限 | `internal/vpn/tunnel.go:21` | -| `maxConnsPerUser` | 3 | 单用户并发连接上限 | `internal/vpn/tunnel.go:22` | +| `maxConnsPerUser` | 30(可配置) | 单用户并发连接上限 | `internal/model/vpn.go` (`VpnSetting.MaxConnsPerUser`) | | `tokenExpire` | 24h | JWT 有效期 | `internal/middleware/auth.go:15` | | 登录限流 | 5/min·IP | `/api/login` 限流 | `internal/middleware/ratelimit.go:76` | | 密码认证限流 | 5/min·(IP+用户名) | WebSocket 密码认证限流 | `internal/vpn/auth.go:15,41` | diff --git a/frontend/src/locales/en.ts b/frontend/src/locales/en.ts index c077f45..37b8880 100644 --- a/frontend/src/locales/en.ts +++ b/frontend/src/locales/en.ts @@ -133,6 +133,7 @@ export default { serverConfigTunIp: 'Server Configures TUN IP', autoConfig: 'Auto', manual: 'Manual', + maxConnsPerUser: 'Max Connections Per User', saveSettings: 'Save Settings', saveSuccess: 'Saved successfully', user: 'User', @@ -168,7 +169,7 @@ export default { 'Admin and user roles with full user CRUD, enable/disable, and password changes, plus self-protection rules.', multiDevice: 'Multi-Device Concurrent', multiDeviceDesc: - 'Up to 3 concurrent connections per user with automatic tunnel IP assignment.', + 'Supports multi-device concurrent connections per user, configurable in admin panel.', dualStack: 'IPv4/IPv6 Dual-Stack', dualStackDesc: 'Supports both IPv4 and IPv6 subnets with NAT dual-stack forwarding and anti-spoofing.', diff --git a/frontend/src/locales/zh.ts b/frontend/src/locales/zh.ts index dec89d1..7ac506c 100644 --- a/frontend/src/locales/zh.ts +++ b/frontend/src/locales/zh.ts @@ -132,6 +132,7 @@ export default { serverConfigTunIp: '服务端配置 TUN IP', autoConfig: '自动配置', manual: '手动', + maxConnsPerUser: '每用户最大连接数', saveSettings: '保存设置', saveSuccess: '保存成功', user: '用户', @@ -165,7 +166,7 @@ export default { userManageDesc: '管理员与普通角色,支持用户增删改、启用禁用与改密,内置自保护规则。', multiDevice: '多设备并发', - multiDeviceDesc: '每用户最多 3 个并发连接,自动分配隧道 IP 地址。', + multiDeviceDesc: '每用户支持多设备并发连接,可在管理后台配置上限。', dualStack: 'IPv4/IPv6 双栈', dualStackDesc: '同时支持 IPv4 与 IPv6 子网,NAT 双栈转发与源地址反欺骗。', reservation: '静态 IP 预留', diff --git a/frontend/src/views/VpnView.vue b/frontend/src/views/VpnView.vue index e7f786f..e80bcc1 100644 --- a/frontend/src/views/VpnView.vue +++ b/frontend/src/views/VpnView.vue @@ -16,6 +16,7 @@ interface Settings { allow_client_to_client: boolean do_local_ip_config: boolean do_remote_ip_config: boolean + max_conns_per_user: number } interface ClientInfo { user_id: number @@ -83,6 +84,7 @@ const form = ref({ allow_client_to_client: false, do_local_ip_config: true, do_remote_ip_config: true, + max_conns_per_user: 30, }) async function fetchSettings() { @@ -403,6 +405,10 @@ onMounted(() => { +
+ + +