feat: 完成前端展示网站核心功能开发

 新增功能:
- 增强照片展示页面,支持3种视图模式(网格/瀑布流/列表)
- 实现分页加载和无限滚动功能
- 完整的搜索和过滤系统,支持实时搜索、标签筛选、排序
- 新增分类浏览页面,提供分类统计和预览
- 新增标签云页面,热度可视化显示
- 面包屑导航和页面间无缝跳转

🎨 用户体验优化:
- 响应式设计,完美适配移动端和桌面端
- 智能loading状态和空状态处理
- 悬停效果和交互动画
- 视觉化统计仪表盘

 性能优化:
- 图片懒加载和智能分页
- 优化的组件渲染和状态管理
- 构建大小优化(187kB gzipped)

📝 更新任务进度文档,完成率达到32.5%

Phase 3核心功能基本完成,前端展示网站达到完全可用状态。
This commit is contained in:
xujiang
2025-07-11 12:27:36 +08:00
parent af222afc33
commit 9046befcf1
8 changed files with 1383 additions and 87 deletions

View File

@ -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({