feat: 每用户最大连接数改为可配置,默认 30
将 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: 更新常量表为可配置项
This commit is contained in:
@@ -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.',
|
||||
|
||||
@@ -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 预留',
|
||||
|
||||
@@ -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<Settings>({
|
||||
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(() => {
|
||||
<option :value="false">{{ t('vpn.manual') }}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">{{ t('vpn.maxConnsPerUser') }}</label>
|
||||
<input v-model.number="form.max_conns_per_user" type="number" min="1" max="1000" class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center gap-4 mt-6">
|
||||
<button
|
||||
|
||||
Reference in New Issue
Block a user