From f6e7a8922abde7376dba2bdce8e6da863ddee31e Mon Sep 17 00:00:00 2001 From: caadiq Date: Tue, 23 Dec 2025 12:45:40 +0900 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=EC=84=B1=EB=8A=A5=20=EB=AA=A8?= =?UTF-8?q?=EB=8B=88=ED=84=B0=EB=A7=81=20API=20=EC=97=B0=EB=8F=99=20?= =?UTF-8?q?=EB=B0=8F=20UI=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TPS, MSPT, 메모리 사용량 실시간 표시 - CPU → MSPT로 변경 (서버 틱 처리 시간) - formatStatusForClient에 성능 필드 추가 - 모바일 성능 UI 반응형 레이아웃 (1열/3열) - 타이틀 '관리자 콘솔'로 통일 --- backend/lib/minecraft.js | 8 +++++++ frontend/src/pages/Admin.jsx | 46 +++++++++++++++++++++++------------- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/backend/lib/minecraft.js b/backend/lib/minecraft.js index 7569d2c..4a0667a 100644 --- a/backend/lib/minecraft.js +++ b/backend/lib/minecraft.js @@ -47,6 +47,10 @@ function formatStatusForClient(modStatus, motdData) { version: "Unknown", icon: null, uptime: "오프라인", + tps: 0, + mspt: 0, + memoryUsedMb: 0, + memoryMaxMb: 0, }; } @@ -81,6 +85,10 @@ function formatStatusForClient(modStatus, motdData) { difficulty: modStatus.difficulty || "알 수 없음", gameRules: modStatus.gameRules || {}, mods: modStatus.mods || [], + tps: modStatus.tps || 0, + mspt: modStatus.mspt || 0, + memoryUsedMb: modStatus.memoryUsedMb || 0, + memoryMaxMb: modStatus.memoryMaxMb || 0, }; } diff --git a/frontend/src/pages/Admin.jsx b/frontend/src/pages/Admin.jsx index d1ab11e..30158bb 100644 --- a/frontend/src/pages/Admin.jsx +++ b/frontend/src/pages/Admin.jsx @@ -131,11 +131,11 @@ export default function Admin({ isMobile = false }) { const [whitelistRemoveTarget, setWhitelistRemoveTarget] = useState(null); // 삭제 확인 다이얼로그용 const [whitelistLoading, setWhitelistLoading] = useState(false); - // 성능 모니터링 상태 (더미) + // 성능 모니터링 상태 (소켓에서 업데이트) const [serverPerformance, setServerPerformance] = useState({ - tps: 19.8, - cpu: 35.2, - memory: { used: 2150, max: 4096 }, + tps: 0, + mspt: 0, + memory: { used: 0, max: 0 }, }); // 권한 확인 @@ -568,6 +568,17 @@ export default function Admin({ isMobile = false }) { }; setDifficulty(difficultyMap[status.difficulty] || 'normal'); } + // 성능 모니터링 데이터 업데이트 + if (status?.tps !== undefined || status?.memoryUsedMb !== undefined) { + setServerPerformance(prev => ({ + tps: status.tps ?? prev.tps, + mspt: status.mspt ?? prev.mspt, + memory: { + used: status.memoryUsedMb ?? prev.memory.used, + max: status.memoryMaxMb ?? prev.memory.max + } + })); + } }); // 월드 정보에서 시간/날씨 가져오기 @@ -825,7 +836,7 @@ export default function Admin({ isMobile = false }) {
-

관리자

+

관리자 콘솔

@@ -835,7 +846,7 @@ export default function Admin({ isMobile = false }) { {/* 데스크탑용 타이틀 */} {!isMobile && (
-

관리자 페이지

+

관리자 콘솔

서버 관리 및 설정

)} @@ -872,7 +883,7 @@ export default function Admin({ isMobile = false }) { {/* 서버 성능 모니터링 */}

📊 서버 성능

-
+
{/* TPS */}
@@ -895,24 +906,24 @@ export default function Admin({ isMobile = false }) {
- {/* CPU */} + {/* MSPT */}
- CPU + MSPT - {serverPerformance.cpu.toFixed(0)}% + {serverPerformance.mspt.toFixed(1)}ms
@@ -922,16 +933,17 @@ export default function Admin({ isMobile = false }) {
메모리 - {(serverPerformance.memory.used / 1024).toFixed(1)}GB + {(serverPerformance.memory.used / 1024).toFixed(1)}GB / {(serverPerformance.memory.max / 1024).toFixed(1)}GB
0.9 ? 'bg-red-400' : (serverPerformance.memory.used / serverPerformance.memory.max) > 0.7 ? 'bg-yellow-400' : 'bg-mc-diamond' }`} - style={{ width: `${(serverPerformance.memory.used / serverPerformance.memory.max) * 100}%` }} + style={{ width: `${serverPerformance.memory.max === 0 ? 0 : (serverPerformance.memory.used / serverPerformance.memory.max) * 100}%` }} />