feat: 完成前端展示网站核心功能开发
✨ 新增功能: - 增强照片展示页面,支持3种视图模式(网格/瀑布流/列表) - 实现分页加载和无限滚动功能 - 完整的搜索和过滤系统,支持实时搜索、标签筛选、排序 - 新增分类浏览页面,提供分类统计和预览 - 新增标签云页面,热度可视化显示 - 面包屑导航和页面间无缝跳转 🎨 用户体验优化: - 响应式设计,完美适配移动端和桌面端 - 智能loading状态和空状态处理 - 悬停效果和交互动画 - 视觉化统计仪表盘 ⚡ 性能优化: - 图片懒加载和智能分页 - 优化的组件渲染和状态管理 - 构建大小优化(187kB gzipped) 📝 更新任务进度文档,完成率达到32.5% Phase 3核心功能基本完成,前端展示网站达到完全可用状态。
This commit is contained in:
@ -133,6 +133,58 @@ export const usePhotos = () => {
|
||||
})
|
||||
}
|
||||
|
||||
// 分页获取照片
|
||||
export const usePhotosPaginated = (page: number = 1, pageSize: number = 12) => {
|
||||
return useQuery({
|
||||
queryKey: [...queryKeys.photos, 'paginated', page, pageSize],
|
||||
queryFn: async (): Promise<{ photos: Photo[], total: number, hasMore: boolean }> => {
|
||||
if (process.env.NEXT_PUBLIC_USE_REAL_API === 'true') {
|
||||
const response: any = await api.get(`/photos?page=${page}&page_size=${pageSize}`)
|
||||
const photos = response?.photos || []
|
||||
const total = response?.total || 0
|
||||
const transformedPhotos = await Promise.all(photos.map(transformPhoto))
|
||||
return {
|
||||
photos: transformedPhotos,
|
||||
total,
|
||||
hasMore: (page * pageSize) < total
|
||||
}
|
||||
} else {
|
||||
// 使用Mock API - 模拟分页
|
||||
const allPhotos: any[] = await api.get('/photos')
|
||||
const startIndex = (page - 1) * pageSize
|
||||
const endIndex = startIndex + pageSize
|
||||
const paginatedPhotos = allPhotos.slice(startIndex, endIndex)
|
||||
const transformedPhotos = await Promise.all(paginatedPhotos.map(transformPhoto))
|
||||
return {
|
||||
photos: transformedPhotos,
|
||||
total: allPhotos.length,
|
||||
hasMore: endIndex < allPhotos.length
|
||||
}
|
||||
}
|
||||
},
|
||||
staleTime: 5 * 60 * 1000,
|
||||
})
|
||||
}
|
||||
|
||||
// 无限滚动照片查询
|
||||
export const useInfinitePhotos = (pageSize: number = 12) => {
|
||||
return useQuery({
|
||||
queryKey: [...queryKeys.photos, 'infinite'],
|
||||
queryFn: async (): Promise<Photo[]> => {
|
||||
if (process.env.NEXT_PUBLIC_USE_REAL_API === 'true') {
|
||||
// 获取所有照片用于前端分页
|
||||
const response: any = await api.get('/photos?page=1&page_size=200')
|
||||
const photos = response?.photos || []
|
||||
return Promise.all(photos.map(transformPhoto))
|
||||
} else {
|
||||
const photos: any[] = await api.get('/photos')
|
||||
return Promise.all(photos.map(transformPhoto))
|
||||
}
|
||||
},
|
||||
staleTime: 5 * 60 * 1000,
|
||||
})
|
||||
}
|
||||
|
||||
// 获取单张照片
|
||||
export const usePhoto = (id: number) => {
|
||||
return useQuery({
|
||||
|
||||
Reference in New Issue
Block a user