From ef6de130848b90e5776b88201034feaf06935eab Mon Sep 17 00:00:00 2001 From: Gemini Wen Date: Wed, 30 Jul 2025 17:01:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=AA=E8=A1=A8?= =?UTF-8?q?=E7=9B=98=E7=BB=9F=E8=AE=A1=E4=B8=AD=E9=81=97=E6=BC=8F=20Claude?= =?UTF-8?q?=20Console=20=E8=B4=A6=E6=88=B7=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 Claude Console 账户统计信息纳入系统概览,确保仪表盘显示完整的账户状态和健康检查。 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- src/routes/admin.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/routes/admin.js b/src/routes/admin.js index f0a06205..02795e30 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -1261,10 +1261,11 @@ router.get('/accounts/:accountId/usage-stats', authenticateAdmin, async (req, re // 获取系统概览 router.get('/dashboard', authenticateAdmin, async (req, res) => { try { - const [, apiKeys, claudeAccounts, geminiAccounts, todayStats, systemAverages, realtimeMetrics] = await Promise.all([ + const [, apiKeys, claudeAccounts, claudeConsoleAccounts, geminiAccounts, todayStats, systemAverages, realtimeMetrics] = await Promise.all([ redis.getSystemStats(), apiKeyService.getAllApiKeys(), claudeAccountService.getAllAccounts(), + claudeConsoleAccountService.getAllAccounts(), geminiAccountService.getAllAccounts(), redis.getTodayStats(), redis.getSystemAverages(), @@ -1283,6 +1284,8 @@ router.get('/dashboard', authenticateAdmin, async (req, res) => { const activeApiKeys = apiKeys.filter(key => key.isActive).length; const activeClaudeAccounts = claudeAccounts.filter(acc => acc.isActive && acc.status === 'active').length; const rateLimitedClaudeAccounts = claudeAccounts.filter(acc => acc.rateLimitStatus && acc.rateLimitStatus.isRateLimited).length; + const activeClaudeConsoleAccounts = claudeConsoleAccounts.filter(acc => acc.isActive && acc.status === 'active').length; + const rateLimitedClaudeConsoleAccounts = claudeConsoleAccounts.filter(acc => acc.rateLimitStatus && acc.rateLimitStatus.isRateLimited).length; const activeGeminiAccounts = geminiAccounts.filter(acc => acc.isActive && acc.status === 'active').length; const rateLimitedGeminiAccounts = geminiAccounts.filter(acc => acc.rateLimitStatus === 'limited').length; @@ -1290,9 +1293,9 @@ router.get('/dashboard', authenticateAdmin, async (req, res) => { overview: { totalApiKeys: apiKeys.length, activeApiKeys, - totalClaudeAccounts: claudeAccounts.length, - activeClaudeAccounts: activeClaudeAccounts, - rateLimitedClaudeAccounts: rateLimitedClaudeAccounts, + totalClaudeAccounts: claudeAccounts.length + claudeConsoleAccounts.length, + activeClaudeAccounts: activeClaudeAccounts + activeClaudeConsoleAccounts, + rateLimitedClaudeAccounts: rateLimitedClaudeAccounts + rateLimitedClaudeConsoleAccounts, totalGeminiAccounts: geminiAccounts.length, activeGeminiAccounts: activeGeminiAccounts, rateLimitedGeminiAccounts: rateLimitedGeminiAccounts, @@ -1325,7 +1328,7 @@ router.get('/dashboard', authenticateAdmin, async (req, res) => { }, systemHealth: { redisConnected: redis.isConnected, - claudeAccountsHealthy: activeClaudeAccounts > 0, + claudeAccountsHealthy: (activeClaudeAccounts + activeClaudeConsoleAccounts) > 0, geminiAccountsHealthy: activeGeminiAccounts > 0, uptime: process.uptime() },