From 19606301de21ea37dab66306f4b4d3aae839399d Mon Sep 17 00:00:00 2001 From: seaHi Date: Sat, 26 Sep 2026 15:01:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=90=8E=E5=8F=B0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=B8=8E=E6=A0=87=E7=AD=BE=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=86=E9=A1=B5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增可复用的后台分页组件 `Pagination.svelte` - 文件管理 (`/admin/files`) 服务端查询增加分页逻辑(默认 24 条/页),前端接入分页导航 - 标签管理 (`/admin/tags`) 服务端查询增加分页逻辑(默认 20 条/页),前端接入分页导航 --- src/lib/components/admin/Pagination.svelte | 60 ++++++++++++++++++++++ src/routes/admin/files/+page.server.ts | 27 ++++++++-- src/routes/admin/files/+page.svelte | 7 +++ src/routes/admin/tags/+page.server.ts | 23 +++++++-- src/routes/admin/tags/+page.svelte | 6 +++ 5 files changed, 114 insertions(+), 9 deletions(-) create mode 100644 src/lib/components/admin/Pagination.svelte diff --git a/src/lib/components/admin/Pagination.svelte b/src/lib/components/admin/Pagination.svelte new file mode 100644 index 0000000..5c25aa4 --- /dev/null +++ b/src/lib/components/admin/Pagination.svelte @@ -0,0 +1,60 @@ + + +{#if totalPages > 1} + +{/if} + + diff --git a/src/routes/admin/files/+page.server.ts b/src/routes/admin/files/+page.server.ts index 1680a84..8aa78bc 100644 --- a/src/routes/admin/files/+page.server.ts +++ b/src/routes/admin/files/+page.server.ts @@ -11,30 +11,49 @@ type Attachment = { created_at: string; }; -export const load: PageServerLoad = async ({ platform }) => { +export const load: PageServerLoad = async ({ url, platform }) => { const db = platform?.env.DB; - if (!db) return { files: [], r2Domain: '' }; + if (!db) + return { files: [], pagination: { page: 1, totalPages: 0, totalItems: 0 }, r2Domain: '' }; + + const page = Number(url.searchParams.get('page')) || 1; + const limit = 24; + const offset = (page - 1) * limit; try { const domainResult = await db .prepare('SELECT value FROM settings WHERE key = ?') .bind('r2.public_domain') .first<{ value: string }>(); + + const countResult = await db + .prepare('SELECT COUNT(*) as count FROM attachments') + .first<{ count: number }>(); + const totalItems = countResult?.count || 0; + const totalPages = Math.ceil(totalItems / limit); + const { results } = await db .prepare( `SELECT id, filename, key, mime_type, size, created_at FROM attachments - ORDER BY created_at DESC` + ORDER BY created_at DESC + LIMIT ? OFFSET ?` ) + .bind(limit, offset) .all(); return { files: results, + pagination: { page, totalPages, totalItems }, r2Domain: domainResult?.value || 'https://assets.yourdomain.com' }; } catch (cause) { console.error('Error fetching attachments:', cause); - return { files: [], r2Domain: 'https://assets.yourdomain.com' }; + return { + files: [], + pagination: { page: 1, totalPages: 0, totalItems: 0 }, + r2Domain: 'https://assets.yourdomain.com' + }; } }; diff --git a/src/routes/admin/files/+page.svelte b/src/routes/admin/files/+page.svelte index ecc5fb3..348b198 100644 --- a/src/routes/admin/files/+page.svelte +++ b/src/routes/admin/files/+page.svelte @@ -7,6 +7,7 @@ import { addToast } from '$lib/stores/toast.svelte'; import { confirmState } from '$lib/stores/confirm.svelte'; import { prepareUpload } from '$lib/uploads'; + import Pagination from '$lib/components/admin/Pagination.svelte'; let { data, form } = $props<{ data: PageData; form: ActionData }>(); @@ -213,6 +214,12 @@ {/if} + +