|
|
|
|
|
<div class="grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-4"> |
|
|
|
|
|
<div class="bg-white overflow-hidden shadow rounded-lg"> |
|
|
<div class="p-5"> |
|
|
<div class="flex items-center"> |
|
|
<div class="flex-shrink-0"> |
|
|
<svg class="h-6 w-6 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.485M7 17h.01" /> |
|
|
</svg> |
|
|
</div> |
|
|
<div class="ml-5 w-0 flex-1"> |
|
|
<dl> |
|
|
<dt class="text-sm font-medium text-gray-500 truncate">Token 总数</dt> |
|
|
<dd class="text-2xl font-bold text-gray-900">{{ stats.total_tokens }}</dd> |
|
|
</dl> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="bg-white overflow-hidden shadow rounded-lg"> |
|
|
<div class="p-5"> |
|
|
<div class="flex items-center"> |
|
|
<div class="flex-shrink-0"> |
|
|
<svg class="h-6 w-6 text-green-400" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" /> |
|
|
</svg> |
|
|
</div> |
|
|
<div class="ml-5 w-0 flex-1"> |
|
|
<dl> |
|
|
<dt class="text-sm font-medium text-gray-500 truncate">已启用</dt> |
|
|
<dd class="flex items-baseline"> |
|
|
<div class="text-2xl font-bold text-green-600">{{ stats.enabled_tokens }}</div> |
|
|
{% if stats.total_tokens > 0 %} |
|
|
<div class="ml-2 flex items-baseline text-sm font-semibold text-green-600"> |
|
|
{{ "%.0f"|format(stats.enabled_tokens / stats.total_tokens * 100) }}% |
|
|
</div> |
|
|
{% endif %} |
|
|
</dd> |
|
|
</dl> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="bg-white overflow-hidden shadow rounded-lg"> |
|
|
<div class="p-5"> |
|
|
<div class="flex items-center"> |
|
|
<div class="flex-shrink-0"> |
|
|
<svg class="h-6 w-6 text-blue-400" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" /> |
|
|
</svg> |
|
|
</div> |
|
|
<div class="ml-5 w-0 flex-1"> |
|
|
<dl> |
|
|
<dt class="text-sm font-medium text-gray-500 truncate">认证用户</dt> |
|
|
<dd class="flex items-baseline"> |
|
|
<div class="text-2xl font-bold text-blue-600">{{ stats.user_tokens }}</div> |
|
|
{% if stats.guest_tokens > 0 %} |
|
|
<div class="ml-2 flex items-baseline text-sm font-semibold text-yellow-600"> |
|
|
<svg class="h-4 w-4 mr-0.5" fill="currentColor" viewBox="0 0 20 20"> |
|
|
<path fill-rule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clip-rule="evenodd" /> |
|
|
</svg> |
|
|
{{ stats.guest_tokens }} 个匿名 |
|
|
</div> |
|
|
{% endif %} |
|
|
</dd> |
|
|
</dl> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="bg-white overflow-hidden shadow rounded-lg"> |
|
|
<div class="p-5"> |
|
|
<div class="flex items-center"> |
|
|
<div class="flex-shrink-0"> |
|
|
{% if stats.total_requests > 0 %} |
|
|
{% set success_rate = (stats.successful_requests / stats.total_requests * 100) %} |
|
|
{% if success_rate >= 80 %} |
|
|
<svg class="h-6 w-6 text-green-400" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6" /> |
|
|
</svg> |
|
|
{% elif success_rate >= 50 %} |
|
|
<svg class="h-6 w-6 text-yellow-400" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6" /> |
|
|
</svg> |
|
|
{% else %} |
|
|
<svg class="h-6 w-6 text-red-400" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 17h8m0 0v-8m0 8l-8-8-4 4-6-6" /> |
|
|
</svg> |
|
|
{% endif %} |
|
|
{% else %} |
|
|
<svg class="h-6 w-6 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z" /> |
|
|
</svg> |
|
|
{% endif %} |
|
|
</div> |
|
|
<div class="ml-5 w-0 flex-1"> |
|
|
<dl> |
|
|
<dt class="text-sm font-medium text-gray-500 truncate">总成功率</dt> |
|
|
<dd> |
|
|
{% if stats.total_requests > 0 %} |
|
|
{% set success_rate = (stats.successful_requests / stats.total_requests * 100) %} |
|
|
<div class="text-2xl font-bold {{ 'text-green-600' if success_rate >= 80 else ('text-yellow-600' if success_rate >= 50 else 'text-red-600') }}"> |
|
|
{{ "%.1f"|format(success_rate) }}% |
|
|
</div> |
|
|
<div class="mt-1 text-xs text-gray-500"> |
|
|
{{ stats.successful_requests }} / {{ stats.total_requests }} 请求 |
|
|
</div> |
|
|
{% else %} |
|
|
<div class="text-2xl font-bold text-gray-400">N/A</div> |
|
|
<div class="mt-1 text-xs text-gray-500">暂无请求</div> |
|
|
{% endif %} |
|
|
</dd> |
|
|
</dl> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|