mirror of
https://github.com/Sagit-chu/flvx.git
synced 2026-09-28 15:46:38 +08:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a5c33c68d9 | |||
| 325baa8adc | |||
| 28568244bb | |||
| 3f374df724 | |||
| 9b923a2d0b | |||
| d9f28f53c7 | |||
| 1d08a1ccfc | |||
| db25ba2cbe |
@@ -54,6 +54,7 @@ import { Switch } from "@/shadcn-bridge/heroui/switch";
|
||||
import { Alert } from "@/shadcn-bridge/heroui/alert";
|
||||
import { Progress } from "@/shadcn-bridge/heroui/progress";
|
||||
import { Checkbox } from "@/shadcn-bridge/heroui/checkbox";
|
||||
import { Accordion, AccordionItem } from "@/shadcn-bridge/heroui/accordion";
|
||||
import {
|
||||
createForward,
|
||||
getForwardList,
|
||||
@@ -4729,20 +4730,6 @@ 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}
|
||||
@@ -4755,37 +4742,7 @@ export default function ForwardPage() {
|
||||
}
|
||||
/>
|
||||
|
||||
{isAdmin && (
|
||||
<Select
|
||||
label="规则限速"
|
||||
placeholder="不限速"
|
||||
selectedKeys={
|
||||
selectedSpeedId !== null
|
||||
? [selectedSpeedId.toString()]
|
||||
: []
|
||||
}
|
||||
variant="bordered"
|
||||
onSelectionChange={(keys) => {
|
||||
const selectedKey = Array.from(keys)[0] as
|
||||
| string
|
||||
| undefined;
|
||||
|
||||
setForm((prev) => ({
|
||||
...prev,
|
||||
speedId: selectedKey ? Number(selectedKey) : null,
|
||||
}));
|
||||
}}
|
||||
>
|
||||
{availableSpeedLimits.map((speedLimit) => (
|
||||
<SelectItem
|
||||
key={speedLimit.id.toString()}
|
||||
textValue={speedLimit.name}
|
||||
>
|
||||
{speedLimit.name}
|
||||
</SelectItem>
|
||||
))}
|
||||
</Select>
|
||||
)}
|
||||
|
||||
|
||||
<Select
|
||||
description={
|
||||
@@ -4914,7 +4871,61 @@ export default function ForwardPage() {
|
||||
<SelectItem key="hash">哈希模式 - IP哈希</SelectItem>
|
||||
</Select>
|
||||
)}
|
||||
</div>
|
||||
<Accordion className="px-0" variant="light">
|
||||
<AccordionItem
|
||||
key="advanced"
|
||||
aria-label="高级设置"
|
||||
title={<span className="text-small text-default-500 font-medium">高级设置</span>}
|
||||
>
|
||||
<div className="space-y-4 pb-2">
|
||||
<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"
|
||||
/>
|
||||
{isAdmin && (
|
||||
<Select
|
||||
label="规则限速"
|
||||
placeholder="不限速"
|
||||
selectedKeys={
|
||||
selectedSpeedId !== null
|
||||
? [selectedSpeedId.toString()]
|
||||
: []
|
||||
}
|
||||
variant="bordered"
|
||||
onSelectionChange={(keys) => {
|
||||
const selectedKey = Array.from(keys)[0] as
|
||||
| string
|
||||
| undefined;
|
||||
|
||||
setForm((prev) => ({
|
||||
...prev,
|
||||
speedId: selectedKey ? Number(selectedKey) : null,
|
||||
}));
|
||||
}}
|
||||
>
|
||||
{availableSpeedLimits.map((speedLimit) => (
|
||||
<SelectItem
|
||||
key={speedLimit.id.toString()}
|
||||
textValue={speedLimit.name}
|
||||
>
|
||||
{speedLimit.name}
|
||||
</SelectItem>
|
||||
))}
|
||||
</Select>
|
||||
)}
|
||||
</div>
|
||||
</AccordionItem>
|
||||
</Accordion>
|
||||
</div>
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<Button variant="light" onPress={onClose}>
|
||||
|
||||
@@ -1529,17 +1529,6 @@ export default function UserPage() {
|
||||
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="规则数量"
|
||||
|
||||
@@ -2,8 +2,9 @@ import { clearSession } from "@/utils/session";
|
||||
|
||||
/**
|
||||
* 安全退出登录函数
|
||||
* 清除登录相关数据,但保留用户偏好设置(如主题)
|
||||
* 清除登录相关数据,并强制刷新跳转到首页
|
||||
*/
|
||||
export const safeLogout = () => {
|
||||
clearSession();
|
||||
window.location.href = "/";
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user