From 00c8d82fa4e6b65850d831b0c52135e95383e04c Mon Sep 17 00:00:00 2001 From: lzw-723 Date: Sun, 5 Apr 2026 16:57:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E9=80=82=E9=85=8D=E7=85=A7?= =?UTF-8?q?=E7=89=87=E5=88=86=E9=A1=B5api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/lib/api/client.js | 17 ++++++++++++++--- web/src/routes/album/[id]/+page.server.js | 8 +++++--- web/src/routes/album/[id]/+page.svelte | 6 +++++- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/web/src/lib/api/client.js b/web/src/lib/api/client.js index eb7f844..2417f41 100644 --- a/web/src/lib/api/client.js +++ b/web/src/lib/api/client.js @@ -37,10 +37,21 @@ export async function getAlbum(id) { /** * Get photos of an album * @param {number} albumId - * @returns {Promise} + * @param {Object} [options] + * @param {number} [options.page] - 页码(从 1 开始) + * @param {number} [options.size] - 每页数量 + * @returns {Promise} */ -export async function getAlbumPhotos(albumId) { - return fetchApi(`/album/${albumId}/photo`); +export async function getAlbumPhotos(albumId, options = {}) { + const params = new URLSearchParams(); + if (options.page) params.set('page', String(options.page)); + if (options.size) params.set('size', String(options.size)); + + const query = params.toString(); + const endpoint = query + ? `/album/${albumId}/photo?${query}` + : `/album/${albumId}/photo`; + return fetchApi(endpoint); } /** diff --git a/web/src/routes/album/[id]/+page.server.js b/web/src/routes/album/[id]/+page.server.js index 5e41afd..6cf76f2 100644 --- a/web/src/routes/album/[id]/+page.server.js +++ b/web/src/routes/album/[id]/+page.server.js @@ -11,8 +11,8 @@ export async function load({ params, fetch, url }) { try { const [album, photos] = await Promise.all([ fetchApi(`/album/${albumId}`, fetch), - // 如果后端支持分页,传递 page 和 pageSize 参数 - fetchApi(`/album/${albumId}/photo?page=${page}&pageSize=${pageSize}`, fetch) + // 后端使用 size 作为分页参数名 + fetchApi(`/album/${albumId}/photo?page=${page}&size=${pageSize}`, fetch) ]); if (!album) { @@ -25,7 +25,9 @@ export async function load({ params, fetch, url }) { } // 检测后端是否返回了分页信息 - const hasMore = photos?.length === pageSize; + const hasMore = photos?.items + ? (photos.page * photos.size) < photos.total + : photos?.length === pageSize; const totalPhotos = photos?.total ?? photos?.length ?? 0; return { diff --git a/web/src/routes/album/[id]/+page.svelte b/web/src/routes/album/[id]/+page.svelte index 3211564..1b77c7c 100644 --- a/web/src/routes/album/[id]/+page.svelte +++ b/web/src/routes/album/[id]/+page.svelte @@ -105,6 +105,7 @@ currentPage++; try { + // 后端使用 size 作为分页参数名 const response = await fetch( `${page.url.pathname}?page=${currentPage}&pageSize=${PAGE_SIZE}` ); @@ -113,11 +114,14 @@ if (newData.photos) { const newPhotos = newData.photos.items ?? newData.photos; allPhotos = [...allPhotos, ...newPhotos]; - hasMore = newPhotos.length === PAGE_SIZE; + // 根据后端返回的 total 判断是否还有更多 + const total = newData.totalPhotos ?? 0; + hasMore = (currentPage * PAGE_SIZE) < total; displayedCount += BATCH_SIZE; } } catch (error) { console.error('Failed to load more photos:', error); + hasMore = false; } finally { isLoading = false; }