diff --git a/vite-frontend/src/api/index.ts b/vite-frontend/src/api/index.ts index acdc7aa..c97ddc4 100644 --- a/vite-frontend/src/api/index.ts +++ b/vite-frontend/src/api/index.ts @@ -217,6 +217,8 @@ export const pauseForwardService = (forwardId: number) => Network.post("/forward/pause", { id: forwardId }); export const resumeForwardService = (forwardId: number) => Network.post("/forward/resume", { id: forwardId }); +export const resetForwardFlow = (forwardId: number) => + Network.post("/forward/reset-flow", { id: forwardId }); // 转发诊断操作 export const diagnoseForward = (forwardId: number) => diff --git a/vite-frontend/src/pages/forward.tsx b/vite-frontend/src/pages/forward.tsx index 10d2a6c..f7fc3ba 100644 --- a/vite-frontend/src/pages/forward.tsx +++ b/vite-frontend/src/pages/forward.tsx @@ -69,6 +69,7 @@ import { getNodeList, pauseForwardService, resumeForwardService, + resetForwardFlow, diagnoseForward, updateForwardOrder, getConfigByName, @@ -230,7 +231,7 @@ const FORWARD_GROUPED_TABLE_COLUMN_CLASS = { strategy: "w-[100px]", totalFlow: "w-[120px]", status: "w-[100px]", - actions: "w-[144px] text-right", + actions: "w-[176px] text-right", } as const; const normalizeForwardUserName = (userName?: string): string => { @@ -764,6 +765,7 @@ const SortableTableRow = ({ handleEdit, handleDelete, handleDiagnose, + handleResetFlow, showAddressModal, formatFlow, }: any) => { @@ -919,6 +921,29 @@ const SortableTableRow = ({ /> + handleResetFlow(forward)} + > + + + + + handleResetFlow(forward)} + > + + + + (null); + const [forwardToResetFlow, setForwardToResetFlow] = useState( + null, + ); const [currentDiagnosisForward, setCurrentDiagnosisForward] = useState(null); const [diagnosisResult, setDiagnosisResult] = @@ -2171,7 +2225,8 @@ export default function ForwardPage() { maxConn: forward.maxConn ?? 0, proxyProtocol: forward.proxyProtocol ?? 0, proxyProtocolReceive: forward.proxyProtocolReceive ?? 0, - proxyProtocolSend: forward.proxyProtocolSend ?? forward.proxyProtocol ?? 0, + proxyProtocolSend: + forward.proxyProtocolSend ?? forward.proxyProtocol ?? 0, }); setErrors({}); setModalOpen(true); @@ -2183,6 +2238,46 @@ export default function ForwardPage() { setDeleteModalOpen(true); }; + const handleResetFlow = (forward: Forward) => { + if ((forward.inFlow || 0) + (forward.outFlow || 0) <= 0) return; + + setForwardToResetFlow(forward); + setResetFlowModalOpen(true); + }; + + const handleResetFlowModalOpenChange = (isOpen: boolean) => { + if (resetFlowLoading) return; + + setResetFlowModalOpen(isOpen); + if (!isOpen) { + setForwardToResetFlow(null); + } + }; + + const confirmResetFlow = async () => { + if (!forwardToResetFlow) return; + + setResetFlowLoading(true); + try { + const res = await resetForwardFlow(forwardToResetFlow.id); + + if (res.code !== 0) { + toast.error(res.msg || "流量清零失败"); + + return; + } + + toast.success("规则流量已清零"); + setResetFlowModalOpen(false); + setForwardToResetFlow(null); + await refreshForwardList(false); + } catch { + toast.error("流量清零失败"); + } finally { + setResetFlowLoading(false); + } + }; + // 确认删除规则 const confirmDelete = async () => { if (!forwardToDelete) return; @@ -3957,7 +4052,7 @@ export default function ForwardPage() { - + 诊断 + + + + } + variant="flat" + onPress={() => handleResetFlow(forward)} + > + 清零 + 策略 用量 状态 - + 操作 @@ -4321,6 +4442,7 @@ export default function ForwardPage() { handleDelete={handleDelete} handleDiagnose={handleDiagnose} handleEdit={handleEdit} + handleResetFlow={handleResetFlow} handleServiceToggle={handleServiceToggle} hasMultipleAddresses={hasMultipleAddresses} selectMode={selectMode} @@ -4616,6 +4738,7 @@ export default function ForwardPage() { handleDelete={handleDelete} handleDiagnose={handleDiagnose} handleEdit={handleEdit} + handleResetFlow={handleResetFlow} handleServiceToggle={ handleServiceToggle } @@ -5172,6 +5295,59 @@ export default function ForwardPage() { + {/* 规则流量清零确认模态框 */} + + + {(onClose) => ( + <> + + + 确认流量清零 + + + + + 确定要清零规则{" "} + + "{forwardToResetFlow?.name}" + {" "} + 当前显示的上传和下载流量吗? + + + 此操作不可撤销,但不会影响用户总流量、用户隧道配额和历史统计。 + + + + + 取消 + + + 确认清零 + + + > + )} + + + {/* 地址列表弹窗 */}
+ 确定要清零规则{" "} + + "{forwardToResetFlow?.name}" + {" "} + 当前显示的上传和下载流量吗? +
+ 此操作不可撤销,但不会影响用户总流量、用户隧道配额和历史统计。 +