mirror of
https://github.com/Sagit-chu/flvx.git
synced 2026-10-03 09:06:36 +08:00
增加流量不重置功能,ping改为tcpping
This commit is contained in:
@@ -260,7 +260,7 @@ export default function AdminLayout({
|
||||
<Logo size={28} />
|
||||
<div>
|
||||
<h1 className="text-base font-bold text-foreground">哆啦A梦</h1>
|
||||
<p className="text-xs text-default-500">v1.0.7</p>
|
||||
<p className="text-xs text-default-500">v1.0.8</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -341,7 +341,8 @@ export default function DashboardPage() {
|
||||
};
|
||||
|
||||
const formatResetTime = (resetDay?: number): string => {
|
||||
if (!resetDay) return '';
|
||||
if (resetDay === undefined || resetDay === null) return '';
|
||||
if (resetDay === 0) return '不重置';
|
||||
|
||||
const now = new Date();
|
||||
const currentDay = now.getDate();
|
||||
@@ -592,7 +593,7 @@ export default function DashboardPage() {
|
||||
<p className="text-xs text-default-500 truncate">
|
||||
{userInfo.flow === 99999 ? '无限制' : `${calculateUsagePercentage('flow').toFixed(1)}%`}
|
||||
</p>
|
||||
{userInfo.flowResetTime && (
|
||||
{(userInfo.flowResetTime !== undefined && userInfo.flowResetTime !== null) && (
|
||||
<div className="text-xs text-default-500 flex items-center gap-1">
|
||||
<svg className="w-3 h-3" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z" clipRule="evenodd" />
|
||||
@@ -682,7 +683,7 @@ export default function DashboardPage() {
|
||||
<span className={`px-2 py-1 rounded-md text-xs font-medium border ${tunnelExpStatus.bg} ${tunnelExpStatus.color}`}>
|
||||
{tunnelExpStatus.text}
|
||||
</span>
|
||||
{tunnel.flowResetTime && (
|
||||
{(tunnel.flowResetTime !== undefined && tunnel.flowResetTime !== null) && (
|
||||
<span className="text-xs text-default-500">
|
||||
{formatResetTime(tunnel.flowResetTime)}
|
||||
</span>
|
||||
|
||||
@@ -74,6 +74,7 @@ interface DiagnosisResult {
|
||||
nodeName: string;
|
||||
nodeId: string;
|
||||
targetIp: string;
|
||||
targetPort?: number;
|
||||
message?: string;
|
||||
averageTime?: number;
|
||||
packetLoss?: number;
|
||||
@@ -1075,14 +1076,18 @@ export default function ForwardPage() {
|
||||
</div>
|
||||
<div className="text-small text-default-500 flex items-center gap-1">
|
||||
<span className="flex-shrink-0">目标地址:</span>
|
||||
<code className="font-mono truncate min-w-0" title={result.targetIp}>{result.targetIp}</code>
|
||||
<code className="font-mono truncate min-w-0" title={`${result.targetIp}${result.targetPort ? ':' + result.targetPort : ''}`}>
|
||||
{result.targetIp}{result.targetPort ? ':' + result.targetPort : ''}
|
||||
</code>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<div className="space-y-2">
|
||||
<div className="text-small text-default-500 flex items-center gap-1">
|
||||
<span className="flex-shrink-0">目标地址:</span>
|
||||
<code className="font-mono truncate min-w-0" title={result.targetIp}>{result.targetIp}</code>
|
||||
<code className="font-mono truncate min-w-0" title={`${result.targetIp}${result.targetPort ? ':' + result.targetPort : ''}`}>
|
||||
{result.targetIp}{result.targetPort ? ':' + result.targetPort : ''}
|
||||
</code>
|
||||
</div>
|
||||
<Alert
|
||||
color="danger"
|
||||
|
||||
@@ -67,6 +67,7 @@ interface DiagnosisResult {
|
||||
nodeName: string;
|
||||
nodeId: string;
|
||||
targetIp: string;
|
||||
targetPort: number;
|
||||
message?: string;
|
||||
averageTime?: number;
|
||||
packetLoss?: number;
|
||||
@@ -974,13 +975,13 @@ export default function TunnelPage() {
|
||||
</div>
|
||||
</div>
|
||||
<div className="text-small text-default-500">
|
||||
目标地址: <code className="font-mono">{result.targetIp}</code>
|
||||
目标地址: <code className="font-mono">{result.targetIp}:{result.targetPort}</code>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<div className="space-y-2">
|
||||
<div className="text-small text-default-500">
|
||||
目标地址: <code className="font-mono">{result.targetIp}</code>
|
||||
目标地址: <code className="font-mono">{result.targetIp}:{result.targetPort}</code>
|
||||
</div>
|
||||
<Alert
|
||||
color="danger"
|
||||
|
||||
@@ -126,7 +126,7 @@ export default function UserPage() {
|
||||
flow: 100,
|
||||
num: 10,
|
||||
expTime: null,
|
||||
flowResetTime: 1
|
||||
flowResetTime: 0
|
||||
});
|
||||
const [userFormLoading, setUserFormLoading] = useState(false);
|
||||
|
||||
@@ -142,7 +142,7 @@ export default function UserPage() {
|
||||
flow: 100,
|
||||
num: 10,
|
||||
expTime: null,
|
||||
flowResetTime: 1,
|
||||
flowResetTime: 0,
|
||||
speedId: null
|
||||
});
|
||||
const [assignLoading, setAssignLoading] = useState(false);
|
||||
@@ -253,7 +253,7 @@ export default function UserPage() {
|
||||
flow: 100,
|
||||
num: 10,
|
||||
expTime: null,
|
||||
flowResetTime: 1
|
||||
flowResetTime: 0
|
||||
});
|
||||
onUserModalOpen();
|
||||
};
|
||||
@@ -269,7 +269,7 @@ export default function UserPage() {
|
||||
flow: user.flow,
|
||||
num: user.num,
|
||||
expTime: user.expTime ? new Date(user.expTime) : null,
|
||||
flowResetTime: user.flowResetTime || 1
|
||||
flowResetTime: user.flowResetTime ?? 0
|
||||
});
|
||||
onUserModalOpen();
|
||||
};
|
||||
@@ -338,7 +338,7 @@ export default function UserPage() {
|
||||
flow: 100,
|
||||
num: 10,
|
||||
expTime: null,
|
||||
flowResetTime: 1,
|
||||
flowResetTime: 0,
|
||||
speedId: null
|
||||
});
|
||||
onTunnelModalOpen();
|
||||
@@ -370,7 +370,7 @@ export default function UserPage() {
|
||||
flow: 100,
|
||||
num: 10,
|
||||
expTime: null,
|
||||
flowResetTime: 1,
|
||||
flowResetTime: 0,
|
||||
speedId: null
|
||||
});
|
||||
loadUserTunnels(currentUser.id);
|
||||
@@ -592,7 +592,7 @@ export default function UserPage() {
|
||||
</div>
|
||||
<div className="flex justify-between text-sm">
|
||||
<span className="text-default-600">重置日期</span>
|
||||
<span className="text-xs">每月{user.flowResetTime || 1}号</span>
|
||||
<span className="text-xs">{user.flowResetTime === 0 ? '不重置' : `每月${user.flowResetTime}号`}</span>
|
||||
</div>
|
||||
{user.expTime && (
|
||||
<div className="flex justify-between text-sm">
|
||||
@@ -716,6 +716,9 @@ export default function UserPage() {
|
||||
setUserForm(prev => ({ ...prev, flowResetTime: Number(value) }));
|
||||
}}
|
||||
>
|
||||
<SelectItem key="0" textValue="不重置">
|
||||
不重置
|
||||
</SelectItem>
|
||||
{Array.from({ length: 31 }, (_, i) => i + 1).map(day => (
|
||||
<SelectItem key={day.toString()} textValue={`每月${day}号(0点重置)`}>
|
||||
每月{day}号(0点重置)
|
||||
@@ -836,6 +839,9 @@ export default function UserPage() {
|
||||
setTunnelForm(prev => ({ ...prev, flowResetTime: Number(value) }));
|
||||
}}
|
||||
>
|
||||
<SelectItem key="0" textValue="不重置">
|
||||
不重置
|
||||
</SelectItem>
|
||||
{Array.from({ length: 31 }, (_, i) => i + 1).map(day => (
|
||||
<SelectItem key={day.toString()} textValue={`每月${day}号(0点重置)`}>
|
||||
每月{day}号(0点重置)
|
||||
@@ -919,7 +925,7 @@ export default function UserPage() {
|
||||
{userTunnel.speedLimitName || '不限速'}
|
||||
</Chip>
|
||||
</TableCell>
|
||||
<TableCell>每月{userTunnel.flowResetTime}号</TableCell>
|
||||
<TableCell>{userTunnel.flowResetTime === 0 ? '不重置' : `每月${userTunnel.flowResetTime}号`}</TableCell>
|
||||
<TableCell>{formatDate(userTunnel.expTime)}</TableCell>
|
||||
<TableCell>
|
||||
<div className="flex items-center gap-2">
|
||||
@@ -1012,6 +1018,9 @@ export default function UserPage() {
|
||||
setEditTunnelForm(prev => prev ? { ...prev, flowResetTime: Number(value) } : null);
|
||||
}}
|
||||
>
|
||||
<SelectItem key="0" textValue="不重置">
|
||||
不重置
|
||||
</SelectItem>
|
||||
{Array.from({ length: 31 }, (_, i) => i + 1).map(day => (
|
||||
<SelectItem key={day.toString()} textValue={`每月${day}号(0点重置)`}>
|
||||
每月{day}号(0点重置)
|
||||
|
||||
Reference in New Issue
Block a user