feat: add max conn UI to user management and forward rules

This commit is contained in:
sagitchu
2026-04-23 16:26:49 +08:00
parent 4d258c2626
commit 9f7a5e8f14
4 changed files with 49 additions and 1 deletions
+4
View File
@@ -20,6 +20,7 @@ export interface UserApiItem {
num: number;
expTime?: number;
flowResetTime?: number;
maxConn?: number;
inFlow?: number;
outFlow?: number;
dailyQuotaGB?: number;
@@ -200,6 +201,7 @@ export interface UserPackageInfoApiData {
num: number;
expTime?: string;
flowResetTime?: number;
maxConn?: number;
[key: string]: unknown;
};
tunnelPermissions: UserTunnelPermissionApiItem[];
@@ -276,6 +278,7 @@ export interface UserMutationPayload {
num?: number;
expTime?: number | string;
flowResetTime?: number;
maxConn?: number;
dailyQuotaGB?: number;
monthlyQuotaGB?: number;
tunnelFlow?: number;
@@ -338,6 +341,7 @@ export interface UserTunnelAssignPayload {
num?: number;
expTime?: number;
flowResetTime?: number;
maxConn?: number;
status?: number;
speedId?: number | null;
tunnels?: Array<{ tunnelId: number; speedId?: number | null }>;
+16
View File
@@ -157,6 +157,7 @@ interface ForwardForm {
interfaceName?: string;
strategy: string;
speedId: number | null;
maxConn?: number;
}
interface ForwardUserGroup {
@@ -1306,6 +1307,7 @@ export default function ForwardPage() {
interfaceName: "",
strategy: "fifo",
speedId: null,
maxConn: 0,
});
const [inIpTouched, setInIpTouched] = useState(false);
@@ -4723,6 +4725,20 @@ export default function ForwardPage() {
</ModalHeader>
<ModalBody>
<div className="space-y-4 pb-4">
<Input
label="最大连接数"
placeholder="0 或空表示不限制"
type="number"
min="0"
value={form.maxConn === 0 ? "" : String(form.maxConn || "")}
onChange={(e) => {
const value = Math.max(Number(e.target.value) || 0, 0);
setForm((prev) => ({ ...prev, maxConn: value }));
}}
description="此设置优先于用户的全局连接数限制。0 表示不限制。"
variant="bordered"
/>
<Input
errorMessage={errors.name}
isInvalid={!!errors.name}
+25
View File
@@ -219,6 +219,7 @@ export default function UserPage() {
num: 10,
expTime: null,
flowResetTime: 0,
maxConn: 0,
});
const [userFormLoading, setUserFormLoading] = useState(false);
const [quotaResetLoading, setQuotaResetLoading] = useState(false);
@@ -514,6 +515,7 @@ export default function UserPage() {
num: 10,
expTime: null,
flowResetTime: 0,
maxConn: 0,
groupIds: [],
});
onUserModalOpen();
@@ -1516,6 +1518,28 @@ export default function UserPage() {
setUserForm((prev) => ({ ...prev, flow: value }));
}}
/>
<Input
label="最大连接数"
placeholder="0 或空表示不限制"
type="number"
min="0"
value={userForm.maxConn === 0 ? "" : String(userForm.maxConn || "")}
onChange={(e) => {
const value = Math.max(Number(e.target.value) || 0, 0);
setUserForm((prev) => ({ ...prev, maxConn: value }));
}}
/>
<Input
label="最大连接数"
placeholder="0 或空表示不限制"
type="number"
min="0"
value={userForm.maxConn === 0 ? "" : String(userForm.maxConn || "")}
onChange={(e) => {
const value = Math.max(Number(e.target.value) || 0, 0);
setUserForm((prev) => ({ ...prev, maxConn: value }));
}}
/>
<Input
isRequired
label="规则数量"
@@ -1926,6 +1950,7 @@ export default function UserPage() {
<TableColumn>规则数量</TableColumn>
<TableColumn>状态</TableColumn>
<TableColumn>限速规则</TableColumn>
<TableColumn>最大连接</TableColumn>
<TableColumn>重置时间</TableColumn>
<TableColumn>到期时间</TableColumn>
<TableColumn>操作</TableColumn>
+4 -1
View File
@@ -44,6 +44,7 @@ export interface UserForm {
num: number;
expTime: Date | null;
flowResetTime: number;
maxConn?: number;
groupIds?: number[];
}
@@ -56,7 +57,8 @@ export interface UserTunnel {
flow: number; // 流量限制(GB)
num: number; // 转发数量
expTime: number; // 过期时间戳
flowResetTime: number; // 流量重置日期
flowResetTime: number;
maxConn?: number; // 流量重置日期
speedId?: number | null; // 限速规则ID
speedLimitName?: string; // 限速规则名称
inFlow?: number; // 下载流量(字节)
@@ -70,6 +72,7 @@ export interface UserTunnelForm {
num: number;
expTime: Date | null;
flowResetTime: number;
maxConn?: number;
speedId: number | null;
}