diff --git a/.github/ISSUE_TEMPLATE/bug-提交.md b/.github/ISSUE_TEMPLATE/bug-提交.md
deleted file mode 100644
index 531b81a..0000000
--- a/.github/ISSUE_TEMPLATE/bug-提交.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-name: Bug 提交
-about: 提交 bug,让面板变得更好。
-title: "[BUG]"
-labels: ''
-assignees: ''
-
----
-
-**面板版本(二选一)**
-V0 | V1
-
-**描述 bug**
-在这里描述 bug 的相关信息
-
-**屏幕截图**
-有屏幕截图可以帮助更快定位到问题
-
-
-**额外信息**
-可附上其他需要的额外信息
diff --git a/.github/ISSUE_TEMPLATE/功能申请.md b/.github/ISSUE_TEMPLATE/功能申请.md
deleted file mode 100644
index cbf082e..0000000
--- a/.github/ISSUE_TEMPLATE/功能申请.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-name: 功能申请
-about: 描述需求
-title: "[FEAT]"
-labels: ''
-assignees: ''
-
----
-
-**面板版本(二选一)**
-V0 | V1
-
-**需要什么?**
-
-**额外信息**
diff --git a/.github/ISSUE_TEMPLATE/改善建议.md b/.github/ISSUE_TEMPLATE/改善建议.md
deleted file mode 100644
index ed4c5e0..0000000
--- a/.github/ISSUE_TEMPLATE/改善建议.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-name: 改善建议
-about: 交流面板需要改进的地方
-title: "[SUGGEST]"
-labels: ''
-assignees: ''
-
----
-
-**面板版本(二选一)**
-V0 | V1
-
-**需要改进的?**
-*
diff --git a/bun.lockb b/bun.lockb
index f4c650c..373b666 100755
Binary files a/bun.lockb and b/bun.lockb differ
diff --git a/package.json b/package.json
index 3e2a241..09b3c91 100644
--- a/package.json
+++ b/package.json
@@ -19,8 +19,8 @@
"@radix-ui/react-progress": "^1.1.0",
"@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slot": "^1.1.0",
- "@tanstack/react-query": "^5.61.5",
- "@tanstack/react-query-devtools": "^5.61.5",
+ "@tanstack/react-query": "^5.62.0",
+ "@tanstack/react-query-devtools": "^5.62.0",
"@tanstack/react-table": "^8.20.5",
"@types/luxon": "^3.4.2",
"class-variance-authority": "^0.7.1",
@@ -32,7 +32,7 @@
"luxon": "^3.5.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
- "react-i18next": "^15.1.2",
+ "react-i18next": "^15.1.3",
"react-router-dom": "^7.0.1",
"react-use-websocket": "^4.11.1",
"recharts": "^2.13.3",
@@ -41,13 +41,13 @@
"tailwindcss-animate": "^1.0.7"
},
"devDependencies": {
- "@eslint/js": "^9.15.0",
+ "@eslint/js": "^9.16.0",
"@types/node": "^22.10.1",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@vitejs/plugin-react-swc": "^3.7.2",
"autoprefixer": "^10.4.20",
- "eslint": "^9.15.0",
+ "eslint": "^9.16.0",
"eslint-plugin-react-hooks": "^5.0.0",
"eslint-plugin-react-refresh": "^0.4.14",
"globals": "^15.12.0",
diff --git a/src/components/Header.tsx b/src/components/Header.tsx
index a3d4623..fa58d08 100644
--- a/src/components/Header.tsx
+++ b/src/components/Header.tsx
@@ -49,6 +49,7 @@ function Header() {
}
function DashboardLink() {
+ const { t } = useTranslation();
const { data: userData } = useQuery({
queryKey: ["login-user"],
queryFn: () => fetchLoginUser(),
@@ -56,8 +57,6 @@ function DashboardLink() {
refetchOnWindowFocus: true,
});
- if (!userData?.data?.id) return null;
-
return (
);
diff --git a/src/components/ServerCard.tsx b/src/components/ServerCard.tsx
index d077ee1..ab3f00f 100644
--- a/src/components/ServerCard.tsx
+++ b/src/components/ServerCard.tsx
@@ -8,14 +8,16 @@ import { useNavigate } from "react-router-dom";
import { useTranslation } from "react-i18next";
export default function ServerCard({
+ now,
serverInfo,
}: {
+ now: number;
serverInfo: NezhaServer;
}) {
const { t } = useTranslation();
const navigate = useNavigate();
const { name, country_code, online, cpu, up, down, mem, stg } =
- formatNezhaInfo(serverInfo);
+ formatNezhaInfo(now, serverInfo);
const showFlag = true;
diff --git a/src/components/ServerDetailChart.tsx b/src/components/ServerDetailChart.tsx
index 7bb9a81..2f55604 100644
--- a/src/components/ServerDetailChart.tsx
+++ b/src/components/ServerDetailChart.tsx
@@ -77,20 +77,20 @@ export default function ServerDetailChart({
return (
);
}
-function CpuChart({ data }: { data: NezhaServer }) {
+function CpuChart({ now,data }: { now: number;data: NezhaServer }) {
const [cpuChartData, setCpuChartData] = useState([] as cpuChartData[]);
- const { cpu } = formatNezhaInfo(data);
+ const { cpu } = formatNezhaInfo(now,data);
useEffect(() => {
if (data) {
@@ -183,13 +183,13 @@ function CpuChart({ data }: { data: NezhaServer }) {
);
}
-function ProcessChart({ data }: { data: NezhaServer }) {
+function ProcessChart({ now, data }: { now: number; data: NezhaServer }) {
const { t } = useTranslation();
const [processChartData, setProcessChartData] = useState(
[] as processChartData[],
);
- const { process } = formatNezhaInfo(data);
+ const { process } = formatNezhaInfo(now,data);
useEffect(() => {
if (data) {
@@ -276,11 +276,11 @@ function ProcessChart({ data }: { data: NezhaServer }) {
);
}
-function MemChart({ data }: { data: NezhaServer }) {
+function MemChart({ now,data }: { now: number;data: NezhaServer }) {
const { t } = useTranslation();
const [memChartData, setMemChartData] = useState([] as memChartData[]);
- const { mem, swap } = formatNezhaInfo(data);
+ const { mem, swap } = formatNezhaInfo(now,data);
useEffect(() => {
if (data) {
@@ -406,11 +406,11 @@ function MemChart({ data }: { data: NezhaServer }) {
);
}
-function DiskChart({ data }: { data: NezhaServer }) {
+function DiskChart({ now,data }: { now: number;data: NezhaServer }) {
const { t } = useTranslation();
const [diskChartData, setDiskChartData] = useState([] as diskChartData[]);
- const { disk } = formatNezhaInfo(data);
+ const { disk } = formatNezhaInfo(now,data);
useEffect(() => {
if (data) {
@@ -503,13 +503,13 @@ function DiskChart({ data }: { data: NezhaServer }) {
);
}
-function NetworkChart({ data }: { data: NezhaServer }) {
+function NetworkChart({ now,data }: { now: number;data: NezhaServer }) {
const { t } = useTranslation();
const [networkChartData, setNetworkChartData] = useState(
[] as networkChartData[],
);
- const { up, down } = formatNezhaInfo(data);
+ const { up, down } = formatNezhaInfo(now,data);
useEffect(() => {
if (data) {
@@ -632,12 +632,12 @@ function NetworkChart({ data }: { data: NezhaServer }) {
);
}
-function ConnectChart({ data }: { data: NezhaServer }) {
+function ConnectChart({ now,data }: { now: number;data: NezhaServer }) {
const [connectChartData, setConnectChartData] = useState(
[] as connectChartData[],
);
- const { tcp, udp } = formatNezhaInfo(data);
+ const { tcp, udp } = formatNezhaInfo(now,data);
useEffect(() => {
if (data) {
diff --git a/src/components/ServerDetailOverview.tsx b/src/components/ServerDetailOverview.tsx
index 22e1b01..6512b19 100644
--- a/src/components/ServerDetailOverview.tsx
+++ b/src/components/ServerDetailOverview.tsx
@@ -37,7 +37,7 @@ export default function ServerDetailOverview({
return ;
}
- const { name, online, uptime, version } = formatNezhaInfo(server);
+ const { name, online, uptime, version } = formatNezhaInfo(nezhaWsData.now,server);
return (
diff --git a/src/lib/utils.ts b/src/lib/utils.ts
index 4a54168..8414980 100644
--- a/src/lib/utils.ts
+++ b/src/lib/utils.ts
@@ -6,7 +6,7 @@ export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
-export function formatNezhaInfo(serverInfo: NezhaServer) {
+export function formatNezhaInfo(now: number,serverInfo: NezhaServer) {
const lastActiveTime = parseISOTimestamp(serverInfo.last_active);
return {
...serverInfo,
@@ -14,7 +14,7 @@ export function formatNezhaInfo(serverInfo: NezhaServer) {
process: serverInfo.state.process_count || 0,
up: serverInfo.state.net_out_speed / 1024 / 1024 || 0,
down: serverInfo.state.net_in_speed / 1024 / 1024 || 0,
- online: Date.now() - lastActiveTime <= 30000,
+ online: now - lastActiveTime <= 30000,
uptime: serverInfo.state.uptime || 0,
version: serverInfo.host.version || null,
tcp: serverInfo.state.tcp_conn_count || 0,
diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json
index 2a120e3..f5f6349 100644
--- a/src/locales/en/translation.json
+++ b/src/locales/en/translation.json
@@ -1,6 +1,8 @@
{
"nezha": "Nezha Monitoring",
"overview": "Overview",
+ "dashboard": "Dashboard",
+ "login": "Login",
"whereTheTimeIs": "Where the time is",
"info": {
"websocketConnecting": "WebSocket connecting",
diff --git a/src/locales/zh-CN/translation.json b/src/locales/zh-CN/translation.json
index 786323b..3995e5e 100644
--- a/src/locales/zh-CN/translation.json
+++ b/src/locales/zh-CN/translation.json
@@ -1,6 +1,8 @@
{
"nezha": "哪吒监控",
"overview": "概览",
+ "dashboard": "管理后台",
+ "login": "登录",
"whereTheTimeIs": "当前时间",
"info": {
"websocketConnecting": "WebSocket 连接中",
diff --git a/src/locales/zh-TW/translation.json b/src/locales/zh-TW/translation.json
index 296e5c0..9cececf 100644
--- a/src/locales/zh-TW/translation.json
+++ b/src/locales/zh-TW/translation.json
@@ -1,6 +1,8 @@
{
"nezha": "哪吒監控",
"overview": "概覽",
+ "dashboard": "管理後台",
+ "login": "登錄",
"whereTheTimeIs": "目前時間",
"info": {
"websocketConnecting": "WebSocket 連接中",
diff --git a/src/pages/Server.tsx b/src/pages/Server.tsx
index 9ad833a..86f7ba3 100644
--- a/src/pages/Server.tsx
+++ b/src/pages/Server.tsx
@@ -57,10 +57,10 @@ export default function Servers() {
const totalServers = nezhaWsData?.servers?.length || 0;
const onlineServers =
- nezhaWsData?.servers?.filter((server) => formatNezhaInfo(server).online)
+ nezhaWsData?.servers?.filter((server) => formatNezhaInfo(nezhaWsData.now,server).online)
?.length || 0;
const offlineServers =
- nezhaWsData?.servers?.filter((server) => !formatNezhaInfo(server).online)
+ nezhaWsData?.servers?.filter((server) => !formatNezhaInfo(nezhaWsData.now,server).online)
?.length || 0;
const up =
nezhaWsData?.servers?.reduce(
@@ -112,7 +112,7 @@ export default function Servers() {
{showServices && }
{filteredServers.map((serverInfo) => (
-
+
))}