feat: add server-side admin user pagination and align traffic report accounting

This commit is contained in:
2026-02-17 20:30:02 +08:00
parent 1eae645bfd
commit aed5dfdcb2
4 changed files with 378 additions and 154 deletions

View File

@@ -2698,6 +2698,9 @@
<span>按天用量明细(最近 {{ downloadTrafficReport.days }} 天)</span>
<span v-if="downloadTrafficReport.summary?.peak_day">峰值: {{ formatReportDateLabel(downloadTrafficReport.summary.peak_day.date) }} / {{ formatBytes(downloadTrafficReport.summary.peak_day.bytes_used || 0) }}</span>
</div>
<div style="padding: 8px 12px; border-bottom: 1px solid var(--glass-border); font-size: 12px; color: var(--text-muted);">
说明:预览/在线播放同样计入下载流量OSS 明细来自访问日志,通常有 5-15 分钟延迟。
</div>
<div v-if="downloadTrafficReport.loading && downloadTrafficDailyRowsDesc.length === 0" style="padding: 16px; text-align: center; color: var(--text-muted);">
<i class="fas fa-spinner fa-spin"></i> 报表加载中...
@@ -3522,11 +3525,11 @@
<div class="admin-users-toolbar">
<div class="admin-users-filter admin-users-filter-search">
<label>搜索</label>
<input type="text" v-model.trim="adminUserFilters.keyword" @input="adminUsersPage = 1" placeholder="ID / 用户名 / 邮箱">
<input type="text" v-model.trim="adminUserFilters.keyword" @input="triggerAdminUsersKeywordSearch" placeholder="ID / 用户名 / 邮箱">
</div>
<div class="admin-users-filter">
<label>角色</label>
<select v-model="adminUserFilters.role" @change="adminUsersPage = 1">
<select v-model="adminUserFilters.role" @change="handleAdminUsersFilterChange">
<option value="all">全部</option>
<option value="admin">管理员</option>
<option value="user">普通用户</option>
@@ -3534,7 +3537,7 @@
</div>
<div class="admin-users-filter">
<label>状态</label>
<select v-model="adminUserFilters.status" @change="adminUsersPage = 1">
<select v-model="adminUserFilters.status" @change="handleAdminUsersFilterChange">
<option value="all">全部</option>
<option value="active">正常</option>
<option value="banned">已封禁</option>
@@ -3544,7 +3547,7 @@
</div>
<div class="admin-users-filter">
<label>存储</label>
<select v-model="adminUserFilters.storage" @change="adminUsersPage = 1">
<select v-model="adminUserFilters.storage" @change="handleAdminUsersFilterChange">
<option value="all">全部</option>
<option value="local">当前本地</option>
<option value="oss">当前OSS</option>
@@ -3555,7 +3558,7 @@
</div>
<div class="admin-users-filter">
<label>排序</label>
<select v-model="adminUserFilters.sort" @change="adminUsersPage = 1">
<select v-model="adminUserFilters.sort" @change="handleAdminUsersFilterChange">
<option value="created_desc">注册时间(新到旧)</option>
<option value="created_asc">注册时间(旧到新)</option>
<option value="username_asc">用户名A-Z</option>
@@ -3566,7 +3569,7 @@
</div>
<div class="admin-users-filter admin-users-filter-page-size">
<label>每页</label>
<select v-model.number="adminUsersPageSize" @change="adminUsersPage = 1">
<select v-model.number="adminUsersPageSize" @change="handleAdminUsersPageSizeChange">
<option :value="20">20</option>
<option :value="50">50</option>
<option :value="100">100</option>
@@ -3580,7 +3583,7 @@
</div>
<div class="admin-users-stats">
<span class="admin-users-stat-chip">总用户 {{ adminUsers.length }}</span>
<span class="admin-users-stat-chip">总用户 {{ adminUsersGlobalCount }}</span>
<span class="admin-users-stat-chip">筛选后 {{ adminUsersFilteredCount }}</span>
<span class="admin-users-stat-chip">正常 {{ adminUserStats.active }}</span>
<span class="admin-users-stat-chip">封禁 {{ adminUserStats.banned }}</span>
@@ -3611,7 +3614,7 @@
</tr>
</thead>
<tbody>
<tr v-for="u in adminUsersPaged" :key="u.id" style="border-bottom: 1px solid #eee;">
<tr v-for="u in adminUsers" :key="u.id" style="border-bottom: 1px solid #eee;">
<td style="padding: 10px;">{{ u.id }}</td>
<td style="padding: 10px; overflow: hidden;">
<div style="overflow: hidden; text-overflow: ellipsis; white-space: nowrap;" :title="u.username" v-html="getHighlightedText(u.username, adminUserFilters.keyword)"></div>
@@ -3703,7 +3706,7 @@
<div class="admin-users-pagination" v-if="adminUsersFilteredCount > 0">
<div class="admin-users-pagination-info">
显示 {{ adminUsersPageStart }}-{{ adminUsersPageEnd }} 条,共 {{ adminUsersFilteredCount }} 条(总 {{ adminUsers.length }} 条)
显示 {{ adminUsersPageStart }}-{{ adminUsersPageEnd }} 条,共 {{ adminUsersFilteredCount }} 条(总 {{ adminUsersGlobalCount }} 条)
</div>
<div class="admin-users-pagination-actions">
<button class="btn btn-secondary" @click="setAdminUsersPage(1)" :disabled="adminUsersCurrentPage <= 1">
@@ -3724,7 +3727,7 @@
<div v-else class="admin-users-empty-state">
<i class="fas fa-users-slash"></i>
<span v-if="adminUsers.length > 0">没有符合当前筛选条件的用户</span>
<span v-if="adminUsersGlobalCount > 0">没有符合当前筛选条件的用户</span>
<span v-else>暂无用户数据</span>
</div>
</template>