From 158a9b9a3156b9907dc61f4414542fb633cac8de Mon Sep 17 00:00:00 2001 From: shaw Date: Sun, 14 Sep 2025 11:59:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96API=20Key=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E5=88=9B=E5=BB=BA=E5=92=8C=E8=B4=A6=E6=88=B7=E9=99=90?= =?UTF-8?q?=E6=B5=81=E7=8A=B6=E6=80=81=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 bedrockAccountId 和 rateLimitCost 字段到批量创建 API Key 功能 - 格式化 claudeAccountService 中的日志输出 - 改进账户视图中会话进度条样式,限流状态显示红色 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- src/routes/admin.js | 4 ++++ src/services/claudeAccountService.js | 8 ++++++-- web/admin-spa/src/views/AccountsView.vue | 22 +++++++++++++++++++--- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/routes/admin.js b/src/routes/admin.js index 718bc198..162610a2 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -688,10 +688,12 @@ router.post('/api-keys/batch', authenticateAdmin, async (req, res) => { claudeConsoleAccountId, geminiAccountId, openaiAccountId, + bedrockAccountId, permissions, concurrencyLimit, rateLimitWindow, rateLimitRequests, + rateLimitCost, enableModelRestriction, restrictedModels, enableClientRestriction, @@ -735,10 +737,12 @@ router.post('/api-keys/batch', authenticateAdmin, async (req, res) => { claudeConsoleAccountId, geminiAccountId, openaiAccountId, + bedrockAccountId, permissions, concurrencyLimit, rateLimitWindow, rateLimitRequests, + rateLimitCost, enableModelRestriction, restrictedModels, enableClientRestriction, diff --git a/src/services/claudeAccountService.js b/src/services/claudeAccountService.js index 94454200..f61eb8b7 100644 --- a/src/services/claudeAccountService.js +++ b/src/services/claudeAccountService.js @@ -1200,9 +1200,13 @@ class ClaudeAccountService { accountData.schedulable = 'true' delete accountData.rateLimitAutoStopped logger.info(`✅ Auto-resuming scheduling for account ${accountId} after rate limit cleared`) - logger.info(`📊 Account ${accountId} state after recovery: schedulable=${accountData.schedulable}`) + logger.info( + `📊 Account ${accountId} state after recovery: schedulable=${accountData.schedulable}` + ) } else { - logger.info(`ℹ️ Account ${accountId} did not need auto-resume: autoStopped=${accountData.rateLimitAutoStopped}, schedulable=${accountData.schedulable}`) + logger.info( + `ℹ️ Account ${accountId} did not need auto-resume: autoStopped=${accountData.rateLimitAutoStopped}, schedulable=${accountData.schedulable}` + ) } await redis.setClaudeAccount(accountId, accountData) diff --git a/web/admin-spa/src/views/AccountsView.vue b/web/admin-spa/src/views/AccountsView.vue index 779d140d..79ca5a3c 100644 --- a/web/admin-spa/src/views/AccountsView.vue +++ b/web/admin-spa/src/views/AccountsView.vue @@ -585,7 +585,10 @@
@@ -872,7 +875,7 @@
@@ -2009,13 +2012,26 @@ const formatRelativeTime = (dateString) => { } // 获取会话窗口进度条的样式类 -const getSessionProgressBarClass = (status) => { +const getSessionProgressBarClass = (status, account = null) => { // 根据状态返回不同的颜色类,包含防御性检查 if (!status) { // 无状态信息时默认为蓝色 return 'bg-gradient-to-r from-blue-500 to-indigo-600' } + // 检查账号是否处于限流状态 + const isRateLimited = + account && + (account.isRateLimited || + account.status === 'rate_limited' || + (account.rateLimitStatus && account.rateLimitStatus.isRateLimited) || + account.rateLimitStatus === 'limited') + + // 如果账号处于限流状态,显示红色 + if (isRateLimited) { + return 'bg-gradient-to-r from-red-500 to-red-600' + } + // 转换为小写进行比较,避免大小写问题 const normalizedStatus = String(status).toLowerCase()