From efb11b8ee7672f716472ed517ab0a9a7cb3be9da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E6=9C=B1?= <10714957+xiao-zhu245@user.noreply.gitee.com> Date: Wed, 30 Jul 2025 18:37:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AE=89=E8=A3=85=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E7=8E=AF=E5=A2=83=E6=A3=80=E6=B5=8B-=E5=86=85?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/pages/GameDeploymentPage.tsx | 181 ++++++++++++++++++++++-- client/src/utils/api.ts | 4 + server/data/games/installgame.json | 14 +- server/src/routes/gameDeployment.ts | 77 +++++++++- 4 files changed, 255 insertions(+), 21 deletions(-) diff --git a/client/src/pages/GameDeploymentPage.tsx b/client/src/pages/GameDeploymentPage.tsx index 8d801ad..0dbde20 100644 --- a/client/src/pages/GameDeploymentPage.tsx +++ b/client/src/pages/GameDeploymentPage.tsx @@ -145,6 +145,17 @@ const GameDeploymentPage: React.FC = () => { const [showCompatibilityModal, setShowCompatibilityModal] = useState(false) const [compatibilityModalAnimating, setCompatibilityModalAnimating] = useState(false) const [pendingGameInstall, setPendingGameInstall] = useState<{ key: string; info: GameInfo } | null>(null) + + // 内存警告对话框状态 + const [showMemoryWarningModal, setShowMemoryWarningModal] = useState(false) + const [memoryWarningModalAnimating, setMemoryWarningModalAnimating] = useState(false) + const [memoryWarningInfo, setMemoryWarningInfo] = useState<{ + required: number + available: number + message: string + gameKey: string + gameInfo: GameInfo + } | null>(null) // 开服文档相关状态 const [showDocsModal, setShowDocsModal] = useState(false) @@ -1128,7 +1139,7 @@ const GameDeploymentPage: React.FC = () => { }, []) // 打开安装对话框 - const handleInstallGame = (gameKey: string, gameInfo: GameInfo) => { + const handleInstallGame = async (gameKey: string, gameInfo: GameInfo) => { // 检查游戏是否支持当前平台 if (gameInfo.supportedOnCurrentPlatform === false) { addNotification({ @@ -1138,16 +1149,48 @@ const GameDeploymentPage: React.FC = () => { }) return } - + // 检查面板是否兼容当前平台 if (gameInfo.panelCompatibleOnCurrentPlatform === false) { // 显示兼容性确认对话框 setPendingGameInstall({ key: gameKey, info: gameInfo }) setShowCompatibilityModal(true) - setTimeout(() => setCompatibilityModalAnimating(true), 10) + // 使用requestAnimationFrame确保DOM渲染完成后再触发动画 + requestAnimationFrame(() => { + requestAnimationFrame(() => { + setCompatibilityModalAnimating(true) + }) + }) return } - + + // 检查内存需求 + try { + const memoryCheckResponse = await apiClient.checkGameMemory(gameKey) + const memoryWarning = (memoryCheckResponse as any).memoryWarning + if (memoryCheckResponse.success && memoryWarning) { + // 显示内存警告对话框 + setMemoryWarningInfo({ + required: memoryWarning.required, + available: memoryWarning.available, + message: memoryWarning.message, + gameKey, + gameInfo + }) + setShowMemoryWarningModal(true) + // 使用requestAnimationFrame确保DOM渲染完成后再触发动画 + requestAnimationFrame(() => { + requestAnimationFrame(() => { + setMemoryWarningModalAnimating(true) + }) + }) + return + } + } catch (error) { + console.warn('检查内存需求失败,继续安装流程:', error) + // 内存检查失败不应阻止安装流程 + } + // 直接打开安装对话框 openInstallModal(gameKey, gameInfo) } @@ -1158,7 +1201,12 @@ const GameDeploymentPage: React.FC = () => { setInstanceName(gameInfo.game_nameCN) setInstallPath('') setShowInstallModal(true) - setTimeout(() => setInstallModalAnimating(true), 10) + // 使用requestAnimationFrame确保DOM渲染完成后再触发动画 + requestAnimationFrame(() => { + requestAnimationFrame(() => { + setInstallModalAnimating(true) + }) + }) } // 关闭安装对话框 @@ -1178,6 +1226,24 @@ const GameDeploymentPage: React.FC = () => { }, 300) } + // 关闭内存警告对话框 + const handleCloseMemoryWarningModal = () => { + setMemoryWarningModalAnimating(false) + setTimeout(() => { + setShowMemoryWarningModal(false) + setMemoryWarningInfo(null) + }, 300) + } + + // 确认继续安装(忽略内存警告) + const handleContinueInstallation = () => { + if (memoryWarningInfo) { + handleCloseMemoryWarningModal() + // 打开安装对话框 + openInstallModal(memoryWarningInfo.gameKey, memoryWarningInfo.gameInfo) + } + } + // 确认继续安装不兼容的游戏 const handleConfirmIncompatibleInstall = () => { if (pendingGameInstall) { @@ -1343,17 +1409,10 @@ const GameDeploymentPage: React.FC = () => { steamPassword: useAnonymous ? undefined : steamPassword.trim(), steamcmdCommand: fullCommand }) - + if (response.success && response.data?.terminalSessionId) { - addNotification({ - type: 'success', - title: '安装已启动', - message: `${selectedGame.info.game_nameCN} 安装已开始,即将跳转到终端页面...` - }) - // 跳转到终端页面,并将会话ID作为参数传递 - setTimeout(() => { - navigate(`/terminal?sessionId=${response.data.terminalSessionId}`) - }, 1500) // 延迟以便用户看到通知 + // 直接跳转到终端页面 + proceedWithInstallation(response.data) } else { throw new Error(response.message || '安装失败,未返回终端会话ID') } @@ -1367,6 +1426,19 @@ const GameDeploymentPage: React.FC = () => { } } + // 继续安装流程(显示成功通知并跳转) + const proceedWithInstallation = (installData: any) => { + addNotification({ + type: 'success', + title: '安装已启动', + message: `${selectedGame?.info.game_nameCN} 安装已开始,即将跳转到终端页面...` + }) + // 跳转到终端页面,并将会话ID作为参数传递 + setTimeout(() => { + navigate(`/terminal?sessionId=${installData.terminalSessionId}`) + }, 1500) // 延迟以便用户看到通知 + } + // 选择安装路径 const selectInstallPath = async () => { try { @@ -3889,6 +3961,85 @@ const GameDeploymentPage: React.FC = () => { )} + + {/* 内存警告对话框 */} + {showMemoryWarningModal && ( +
+ 系统内存可能不足以运行此游戏 +
++ {memoryWarningInfo.message} +
++ 提示:您仍然可以继续安装,但可能会遇到以下问题: +
+