mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-31 16:26:30 +00:00
Merge pull request #3869 from Birditch/feat/admin-user-role-and-token-ranking
feat(admin): 用户角色管理 + 用户 Token 排行
This commit is contained in:
@@ -109,6 +109,14 @@
|
||||
</button>
|
||||
</div>
|
||||
<div v-show="activeTab === 'usage'">
|
||||
<UserTokenRanking
|
||||
class="mb-4"
|
||||
:start-date="startDate"
|
||||
:end-date="endDate"
|
||||
:filters="breakdownFilters"
|
||||
:model="filters.model"
|
||||
@select-user="handleRankingSelectUser"
|
||||
/>
|
||||
<UsageTable
|
||||
:data="usageLogs"
|
||||
:loading="loading"
|
||||
@@ -167,6 +175,7 @@ import { resolveUsageRequestType, requestTypeToLegacyStream } from '@/utils/usag
|
||||
import AppLayout from '@/components/layout/AppLayout.vue'; import Pagination from '@/components/common/Pagination.vue'; import Select from '@/components/common/Select.vue'; import DateRangePicker from '@/components/common/DateRangePicker.vue'
|
||||
import UsageStatsCards from '@/components/admin/usage/UsageStatsCards.vue'; import UsageFilters from '@/components/admin/usage/UsageFilters.vue'
|
||||
import UsageTable from '@/components/admin/usage/UsageTable.vue'; import UsageExportProgress from '@/components/admin/usage/UsageExportProgress.vue'
|
||||
import UserTokenRanking from '@/components/admin/usage/UserTokenRanking.vue'
|
||||
import UsageCleanupDialog from '@/components/admin/usage/UsageCleanupDialog.vue'
|
||||
import UserBalanceHistoryModal from '@/components/admin/user/UserBalanceHistoryModal.vue'
|
||||
import OpsErrorLogTable from '@/views/admin/ops/components/OpsErrorLogTable.vue'
|
||||
@@ -235,6 +244,12 @@ const handleUserClick = async (userId: number) => {
|
||||
}
|
||||
}
|
||||
|
||||
// Drill down from the per-user token ranking: scope the whole usage view to that user.
|
||||
const handleRankingSelectUser = (userId: number) => {
|
||||
filters.value = { ...filters.value, user_id: userId }
|
||||
applyFilters()
|
||||
}
|
||||
|
||||
const granularityOptions = computed(() => [{ value: 'day', label: t('admin.dashboard.day') }, { value: 'hour', label: t('admin.dashboard.hour') }])
|
||||
// Use local timezone to avoid UTC timezone issues
|
||||
const formatLD = (d: Date) => {
|
||||
|
||||
@@ -163,7 +163,7 @@ describe('admin UsageView distribution metric toggles', () => {
|
||||
UserBalanceHistoryModal: true, AuditLogModal: true, Pagination: true, Select: true,
|
||||
DateRangePicker: true, Icon: true, TokenUsageTrend: true,
|
||||
ModelDistributionChart: ModelDistributionChartStub, GroupDistributionChart: GroupDistributionChartStub,
|
||||
EndpointDistributionChart: true,
|
||||
EndpointDistributionChart: true, UserTokenRanking: true,
|
||||
} },
|
||||
})
|
||||
vi.advanceTimersByTime(120)
|
||||
@@ -201,6 +201,7 @@ describe('admin UsageView distribution metric toggles', () => {
|
||||
TokenUsageTrend: true,
|
||||
ModelDistributionChart: ModelDistributionChartStub,
|
||||
GroupDistributionChart: GroupDistributionChartStub,
|
||||
UserTokenRanking: true,
|
||||
},
|
||||
},
|
||||
})
|
||||
@@ -281,6 +282,7 @@ describe('admin UsageView handleUserClick', () => {
|
||||
ModelDistributionChart: true,
|
||||
GroupDistributionChart: true,
|
||||
EndpointDistributionChart: true,
|
||||
UserTokenRanking: true,
|
||||
},
|
||||
},
|
||||
})
|
||||
@@ -326,7 +328,7 @@ describe('admin UsageView errors tab filter forwarding', () => {
|
||||
UserBalanceHistoryModal: true, AuditLogModal: true, Pagination: true, Select: true,
|
||||
DateRangePicker: true, Icon: true, TokenUsageTrend: true,
|
||||
ModelDistributionChart: true, GroupDistributionChart: true, EndpointDistributionChart: true,
|
||||
OpsErrorLogTable: true, OpsErrorDetailModal: true,
|
||||
UserTokenRanking: true, OpsErrorLogTable: true, OpsErrorDetailModal: true,
|
||||
} },
|
||||
})
|
||||
vi.advanceTimersByTime(120)
|
||||
|
||||
Reference in New Issue
Block a user