From c712624930b37dafd1fe4e5e0440980813838c65 Mon Sep 17 00:00:00 2001 From: "web@ppanel" Date: Fri, 13 Dec 2024 14:51:55 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(node):=20Add=20NodeStatus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/dashboard/server/node-status.tsx | 94 +++++++++++++++++++ .../admin/app/dashboard/server/node-table.tsx | 17 +--- apps/admin/locales/zh-CN/server.json | 4 + apps/admin/services/admin/typings.d.ts | 27 ++++-- apps/admin/services/common/typings.d.ts | 27 ++++-- apps/user/services/common/typings.d.ts | 27 ++++-- apps/user/services/user/typings.d.ts | 27 ++++-- 7 files changed, 181 insertions(+), 42 deletions(-) create mode 100644 apps/admin/app/dashboard/server/node-status.tsx diff --git a/apps/admin/app/dashboard/server/node-status.tsx b/apps/admin/app/dashboard/server/node-status.tsx new file mode 100644 index 0000000..f441582 --- /dev/null +++ b/apps/admin/app/dashboard/server/node-status.tsx @@ -0,0 +1,94 @@ +'use client'; + +import { formatDate } from '@repo/ui/utils'; +import { Badge } from '@shadcn/ui/badge'; +import { Progress } from '@shadcn/ui/progress'; +import { ScrollArea } from '@shadcn/ui/scroll-area'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@shadcn/ui/tooltip'; +import { useTranslations } from 'next-intl'; + +export function formatPercentage(value: number): string { + return `${(value * 100).toFixed(1)}%`; +} + +export function NodeStatusCell({ status }: { status: API.NodeStatus }) { + const t = useTranslations('server.node'); + + const { + last_at, + online_users, + status: serverStatus, + } = status || { + online_users: [], + status: { + cpu: 0, + mem: 0, + disk: 0, + updated_at: 0, + }, + last_at: 0, + }; + const isOnline = last_at > 0; + const badgeVariant = isOnline ? 'default' : 'destructive'; + const badgeText = isOnline ? t('normal') : t('abnormal'); + const onlineCount = Array.isArray(online_users) ? online_users.length : 0; + + return ( + + + +
+ {badgeText} + + {t('onlineCount')}: {onlineCount} + +
+
+ +
+ <> +
+
+
+ CPU + {formatPercentage(serverStatus?.cpu ?? 0)} +
+ +
+
+
+ {t('memory')} + {formatPercentage(serverStatus?.mem ?? 0)} +
+ +
+
+
+ {t('disk')} + {formatPercentage(serverStatus?.disk ?? 0)} +
+ +
+
+
+ {t('lastUpdated')}: {formatDate(serverStatus?.updated_at ?? 0)} +
+ {isOnline && online_users.length > 0 && ( +
+

{t('onlineUsers')}

+ + {online_users.map((user, index) => ( +
+ {user.ip} (UID: {user.uid}) +
+ ))} +
+
+ )} + +
+
+
+
+ ); +} diff --git a/apps/admin/app/dashboard/server/node-table.tsx b/apps/admin/app/dashboard/server/node-table.tsx index a3953d6..adf139a 100644 --- a/apps/admin/app/dashboard/server/node-table.tsx +++ b/apps/admin/app/dashboard/server/node-table.tsx @@ -21,6 +21,7 @@ import { useQuery } from '@tanstack/react-query'; import { useTranslations } from 'next-intl'; import { useRef, useState } from 'react'; import NodeForm from './node-form'; +import { NodeStatusCell } from './node-status'; export default function NodeTable() { const t = useTranslations('server.node'); @@ -109,23 +110,11 @@ export default function NodeTable() { ); }, }, - { - accessorKey: 'last', + accessorKey: 'status', header: t('status'), cell: ({ row }) => { - const { last } = row.original; - - return last ? ( - <> - {t('normal')} - - {t('onlineCount')}: {last.count} - - - ) : ( - {t('abnormal')} - ); + return ; }, }, { diff --git a/apps/admin/locales/zh-CN/server.json b/apps/admin/locales/zh-CN/server.json index bb41e92..54f84ab 100644 --- a/apps/admin/locales/zh-CN/server.json +++ b/apps/admin/locales/zh-CN/server.json @@ -40,6 +40,10 @@ "edit": "编辑", "editNode": "编辑节点", "enable": "启用", + "memory": "内存", + "disk": "磁盘", + "lastUpdated": "最后更新", + "onlineUsers": "在线用户", "form": { "allowInsecure": "允许不安全", "cancel": "取消", diff --git a/apps/admin/services/admin/typings.d.ts b/apps/admin/services/admin/typings.d.ts index ab0d2c1..64e07d1 100644 --- a/apps/admin/services/admin/typings.d.ts +++ b/apps/admin/services/admin/typings.d.ts @@ -487,6 +487,17 @@ declare namespace API { node_push_interval: number; }; + type NodeStatus = { + online_users: OnlineUser[]; + status: ServerStatus; + last_at: number; + }; + + type OnlineUser = { + uid: number; + ip: string; + }; + type Order = { id: number; user_id: number; @@ -541,11 +552,6 @@ declare namespace API { enable: boolean; }; - type Push = { - push_at: number; - count: number; - }; - type RegisterConfig = { stop_register: boolean; enable_trial: boolean; @@ -590,7 +596,7 @@ declare namespace API { enable: boolean; created_at: number; updated_at: number; - last: Push; + status: NodeStatus; }; type ServerGroup = { @@ -601,6 +607,13 @@ declare namespace API { updated_at: number; }; + type ServerStatus = { + cpu: number; + mem: number; + disk: number; + updated_at: number; + }; + type Shadowsocks = { method: string; port: number; @@ -687,7 +700,7 @@ declare namespace API { type TransportConfig = { path: string; host: string; - server_name: string; + service_name: string; }; type Trojan = { diff --git a/apps/admin/services/common/typings.d.ts b/apps/admin/services/common/typings.d.ts index 6edb027..a7bea0e 100644 --- a/apps/admin/services/common/typings.d.ts +++ b/apps/admin/services/common/typings.d.ts @@ -139,6 +139,17 @@ declare namespace API { node_push_interval: number; }; + type NodeStatus = { + online_users: OnlineUser[]; + status: ServerStatus; + last_at: number; + }; + + type OnlineUser = { + uid: number; + ip: string; + }; + type Order = { id: number; user_id: number; @@ -193,11 +204,6 @@ declare namespace API { enable: boolean; }; - type Push = { - push_at: number; - count: number; - }; - type RegisterConfig = { stop_register: boolean; enable_trial: boolean; @@ -258,7 +264,7 @@ declare namespace API { enable: boolean; created_at: number; updated_at: number; - last: Push; + status: NodeStatus; }; type ServerGroup = { @@ -269,6 +275,13 @@ declare namespace API { updated_at: number; }; + type ServerStatus = { + cpu: number; + mem: number; + disk: number; + updated_at: number; + }; + type Shadowsocks = { method: string; port: number; @@ -351,7 +364,7 @@ declare namespace API { type TransportConfig = { path: string; host: string; - server_name: string; + service_name: string; }; type Trojan = { diff --git a/apps/user/services/common/typings.d.ts b/apps/user/services/common/typings.d.ts index 6edb027..a7bea0e 100644 --- a/apps/user/services/common/typings.d.ts +++ b/apps/user/services/common/typings.d.ts @@ -139,6 +139,17 @@ declare namespace API { node_push_interval: number; }; + type NodeStatus = { + online_users: OnlineUser[]; + status: ServerStatus; + last_at: number; + }; + + type OnlineUser = { + uid: number; + ip: string; + }; + type Order = { id: number; user_id: number; @@ -193,11 +204,6 @@ declare namespace API { enable: boolean; }; - type Push = { - push_at: number; - count: number; - }; - type RegisterConfig = { stop_register: boolean; enable_trial: boolean; @@ -258,7 +264,7 @@ declare namespace API { enable: boolean; created_at: number; updated_at: number; - last: Push; + status: NodeStatus; }; type ServerGroup = { @@ -269,6 +275,13 @@ declare namespace API { updated_at: number; }; + type ServerStatus = { + cpu: number; + mem: number; + disk: number; + updated_at: number; + }; + type Shadowsocks = { method: string; port: number; @@ -351,7 +364,7 @@ declare namespace API { type TransportConfig = { path: string; host: string; - server_name: string; + service_name: string; }; type Trojan = { diff --git a/apps/user/services/user/typings.d.ts b/apps/user/services/user/typings.d.ts index 2f7290f..3bd0944 100644 --- a/apps/user/services/user/typings.d.ts +++ b/apps/user/services/user/typings.d.ts @@ -156,6 +156,17 @@ declare namespace API { node_push_interval: number; }; + type NodeStatus = { + online_users: OnlineUser[]; + status: ServerStatus; + last_at: number; + }; + + type OnlineUser = { + uid: number; + ip: string; + }; + type Order = { id: number; user_id: number; @@ -234,11 +245,6 @@ declare namespace API { order_no: string; }; - type Push = { - push_at: number; - count: number; - }; - type QueryAnnouncementParams = { page: number; size: number; @@ -391,7 +397,7 @@ declare namespace API { enable: boolean; created_at: number; updated_at: number; - last: Push; + status: NodeStatus; }; type ServerGroup = { @@ -402,6 +408,13 @@ declare namespace API { updated_at: number; }; + type ServerStatus = { + cpu: number; + mem: number; + disk: number; + updated_at: number; + }; + type Shadowsocks = { method: string; port: number; @@ -490,7 +503,7 @@ declare namespace API { type TransportConfig = { path: string; host: string; - server_name: string; + service_name: string; }; type Trojan = {