feat: 分页组件支持 pageSize 浏览器缓存

- 为 Pagination 组件添加 cacheKey 属性,支持将 pageSize 缓存到 localStorage
- 组件挂载时自动恢复缓存的 pageSize 设置
- 为各页面的分页组件配置独立的缓存键
- 仅在显示 pageSize 选择器时启用缓存恢复

Closes #105

Co-Authored-By: AAEE86 <33052466+AAEE86@users.noreply.github.com>
This commit is contained in:
fawney19
2026-01-17 20:21:03 +08:00
parent c71027c466
commit 8053cbd854
11 changed files with 32 additions and 1 deletions

View File

@@ -74,7 +74,7 @@
</template>
<script setup lang="ts">
import { computed, ref } from 'vue'
import { computed, ref, onMounted } from 'vue'
import { Button, Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@/components/ui'
interface Props {
@@ -83,6 +83,8 @@ interface Props {
pageSize?: number
pageSizeOptions?: number[]
showPageSizeSelector?: boolean
/** 缓存键名,设置后会将 pageSize 缓存到 localStorage 并在组件挂载时自动恢复 */
cacheKey?: string
}
interface Emits {
@@ -154,12 +156,31 @@ function handlePageChange(page: number) {
function handlePageSizeChange(value: string) {
const newSize = parseInt(value)
if (newSize !== props.pageSize) {
// 缓存到 localStorage
if (props.cacheKey) {
localStorage.setItem(props.cacheKey, value)
}
emit('update:pageSize', newSize)
// 切换每页数量时,重置到第一页
emit('update:current', 1)
}
}
// 组件挂载时自动从缓存恢复 pageSize仅当显示选择器时
onMounted(() => {
if (props.cacheKey && props.showPageSizeSelector) {
const cached = localStorage.getItem(props.cacheKey)
if (cached) {
const cachedSize = parseInt(cached, 10)
if (!isNaN(cachedSize) && props.pageSizeOptions?.includes(cachedSize)) {
if (cachedSize !== props.pageSize) {
emit('update:pageSize', cachedSize)
}
}
}
}
})
function handleJumpPage() {
const page = parseInt(jumpPageInput.value)
if (!isNaN(page) && page >= 1 && page <= totalPages.value && page !== props.current) {

View File

@@ -495,6 +495,7 @@
:total="totalRecords"
:page-size="pageSize"
:page-size-options="pageSizeOptions"
cache-key="usage-records-page-size"
@update:current="$emit('update:currentPage', $event)"
@update:page-size="$emit('update:pageSize', $event)"
/>

View File

@@ -302,6 +302,7 @@
:total="totalRecords"
:page-size="pageSize"
:page-size-options="[10, 20, 50, 100]"
cache-key="audit-logs-page-size"
@update:current="handlePageChange"
@update:page-size="pageSize = $event; currentPage = 1; loadLogs()"
/>

View File

@@ -702,6 +702,7 @@ onBeforeUnmount(() => {
:current="currentPage"
:total="affinityList.length"
:page-size="pageSize"
cache-key="cache-monitoring-page-size"
@update:current="currentPage = $event; handlePageChange()"
@update:page-size="pageSize = $event"
/>

View File

@@ -402,6 +402,7 @@
:current="catalogCurrentPage"
:total="filteredGlobalModels.length"
:page-size="catalogPageSize"
cache-key="model-management-page-size"
@update:current="catalogCurrentPage = $event"
@update:page-size="catalogPageSize = $event"
/>

View File

@@ -420,6 +420,7 @@
:current="currentPage"
:total="filteredProviders.length"
:page-size="pageSize"
cache-key="provider-management-page-size"
@update:current="currentPage = $event"
@update:page-size="pageSize = $event"
/>

View File

@@ -498,6 +498,7 @@
:current="currentPage"
:total="filteredUsers.length"
:page-size="pageSize"
cache-key="users-page-size"
@update:current="currentPage = $event"
@update:page-size="pageSize = $event"
/>

View File

@@ -310,6 +310,7 @@
:current="currentPage"
:total="total"
:page-size="pageSize"
cache-key="announcements-page-size"
@update:current="loadAnnouncements($event)"
@update:page-size="pageSize = $event; loadAnnouncements(1)"
/>

View File

@@ -301,6 +301,7 @@
:current="currentPage"
:total="totalTokens"
:page-size="pageSize"
cache-key="management-tokens-page-size"
@update:current="currentPage = $event"
@update:page-size="handlePageSizeChange"
/>

View File

@@ -312,6 +312,7 @@
:current="currentPage"
:total="filteredModels.length"
:page-size="pageSize"
cache-key="model-catalog-page-size"
@update:current="currentPage = $event"
@update:page-size="pageSize = $event"
/>

View File

@@ -339,6 +339,7 @@
:current="currentPage"
:total="apiKeys.length"
:page-size="pageSize"
cache-key="my-api-keys-page-size"
@update:current="currentPage = $event"
@update:page-size="pageSize = $event"
/>