feat(frontend): 统一 Gemini 四种授权方式的用量窗口显示格式

**统一显示规则:**
- 第一行:授权方式简称 + 用户等级(如有)
- 后续内容:
  - 有分模型限额:显示各模型的用量进度条和窗口时间
  - 无限额/无分模型:显示「无限流」

**具体改动:**

1. AI Studio OAuth
   - 第一行:「AI Studio」
   - 后续:「无限流」

2. GCP Code Assist OAuth
   - 第一行:「CLI Free/Pro/Ultra」
   - 后续:Pro/Flash 模型进度条(保持现状)

3. Google One OAuth
   - 第一行:「G1 Personal/Free/Pro/...」
   - 后续:「无限流」(暂无配额追踪)

4. API Key
   - 第一行:「Gemini」徽章
   - 后续:「无限流」或「限流 XX」

**文件修改:**
- AccountUsageCell.vue: 区分 Code Assist 和其他类型的显示逻辑
- AccountQuotaInfo.vue: 改为两行布局,统一样式
- i18n: 添加 rateLimit.unlimited 翻译(中文「无限流」/英文「Unlimited」)
This commit is contained in:
IanShaw027
2026-01-04 10:22:02 +08:00
parent 537af60e33
commit 552118eb7f
4 changed files with 33 additions and 24 deletions

View File

@@ -1,28 +1,29 @@
<template>
<div v-if="shouldShowQuota" class="flex items-center gap-2">
<!-- Tier Badge -->
<span :class="['badge text-xs px-2 py-0.5 rounded font-medium', tierBadgeClass]">
{{ tierLabel }}
</span>
<div v-if="shouldShowQuota">
<!-- First line: Platform + Tier Badge -->
<div class="mb-1 flex items-center gap-1">
<span :class="['badge text-xs px-2 py-0.5 rounded font-medium', tierBadgeClass]">
{{ tierLabel }}
</span>
</div>
<!-- 限流状态 -->
<span
v-if="!isRateLimited"
class="text-xs text-gray-400 dark:text-gray-500"
>
{{ t('admin.accounts.gemini.rateLimit.ok') }}
</span>
<span
v-else
:class="[
'text-xs font-medium',
isUrgent
? 'text-red-600 dark:text-red-400 animate-pulse'
: 'text-amber-600 dark:text-amber-400'
]"
>
{{ t('admin.accounts.gemini.rateLimit.limited', { time: resetCountdown }) }}
</span>
<!-- Usage status: unlimited flow or rate limit -->
<div class="text-xs text-gray-400 dark:text-gray-500">
<span v-if="!isRateLimited">
{{ t('admin.accounts.gemini.rateLimit.unlimited') }}
</span>
<span
v-else
:class="[
'font-medium',
isUrgent
? 'text-red-600 dark:text-red-400 animate-pulse'
: 'text-amber-600 dark:text-amber-400'
]"
>
{{ t('admin.accounts.gemini.rateLimit.limited', { time: resetCountdown }) }}
</span>
</div>
</div>
</template>

View File

@@ -229,6 +229,7 @@
</span>
</div>
<!-- Usage data or unlimited flow -->
<div class="space-y-1">
<div v-if="loading" class="space-y-1">
<div class="flex items-center gap-1">
@@ -240,7 +241,8 @@
<div v-else-if="error" class="text-xs text-red-500">
{{ error }}
</div>
<div v-else-if="geminiUsageAvailable" class="space-y-1">
<!-- Code Assist: show model usage bars -->
<div v-else-if="isGeminiCodeAssist && geminiUsageAvailable" class="space-y-1">
<UsageProgressBar
v-if="usageInfo?.gemini_pro_daily"
:label="t('admin.accounts.usageWindow.geminiProDaily')"
@@ -263,6 +265,10 @@
* {{ t('admin.accounts.gemini.quotaPolicy.simulatedNote') || 'Simulated quota' }}
</p>
</div>
<!-- AI Studio & Google One: show unlimited flow -->
<div v-else class="text-xs text-gray-400">
{{ t('admin.accounts.gemini.rateLimit.unlimited') }}
</div>
</div>
</template>

View File

@@ -1347,6 +1347,7 @@ export default {
},
rateLimit: {
ok: 'Not rate limited',
unlimited: 'Unlimited',
limited: 'Rate limited {time}',
now: 'now'
}

View File

@@ -1484,6 +1484,7 @@ export default {
},
rateLimit: {
ok: '未限流',
unlimited: '无限流',
limited: '限流 {time}',
now: '现在'
}