首页数据增加缓存

This commit is contained in:
mtvpls
2025-12-31 20:19:24 +08:00
parent e0a4b6bcbd
commit 4c603d3fd9
+56 -23
View File
@@ -73,18 +73,51 @@ function HomeClient() {
}, [announcement]); }, [announcement]);
useEffect(() => { useEffect(() => {
const fetchRecommendData = async () => { const CACHE_DURATION = 60 * 60 * 1000; // 1小时
try {
setLoading(true);
// 并行获取热门电影、热门剧集、热门综艺、番剧日历和热播短剧 const getCache = (key: string) => {
const [moviesData, tvShowsData, varietyShowsData, bangumiCalendarData] = try {
await Promise.all([ const cached = localStorage.getItem(key);
getDoubanCategories({ if (!cached) return null;
kind: 'movie', const { data, timestamp } = JSON.parse(cached);
category: '热门', return { data, expired: Date.now() - timestamp > CACHE_DURATION };
type: '全部', } catch {
}), return null;
}
};
const setCache = (key: string, data: any) => {
try {
localStorage.setItem(key, JSON.stringify({ data, timestamp: Date.now() }));
} catch {}
};
const moviesCache = getCache('homepage_movies');
const tvShowsCache = getCache('homepage_tvshows');
const varietyCache = getCache('homepage_variety');
const bangumiCache = getCache('homepage_bangumi');
const duanjuCache = getCache('homepage_duanju');
const upcomingCache = getCache('homepage_upcoming');
if (moviesCache?.data) setHotMovies(moviesCache.data);
if (tvShowsCache?.data) setHotTvShows(tvShowsCache.data);
if (varietyCache?.data) setHotVarietyShows(varietyCache.data);
if (bangumiCache?.data) setBangumiCalendarData(bangumiCache.data);
if (duanjuCache?.data) setHotDuanju(duanjuCache.data);
if (upcomingCache?.data) setUpcomingContent(upcomingCache.data);
const hasCache = moviesCache || tvShowsCache || varietyCache || bangumiCache || duanjuCache || upcomingCache;
if (hasCache) setLoading(false);
const needsRefresh = !moviesCache || moviesCache.expired || !tvShowsCache || tvShowsCache.expired ||
!varietyCache || varietyCache.expired || !bangumiCache || bangumiCache.expired ||
!duanjuCache || duanjuCache.expired || !upcomingCache || upcomingCache.expired;
if (needsRefresh) {
(async () => {
try {
const [moviesData, tvShowsData, varietyShowsData, bangumiCalendarData] = await Promise.all([
getDoubanCategories({ kind: 'movie', category: '热门', type: '全部' }),
getDoubanCategories({ kind: 'tv', category: 'tv', type: 'tv' }), getDoubanCategories({ kind: 'tv', category: 'tv', type: 'tv' }),
getDoubanCategories({ kind: 'tv', category: 'show', type: 'show' }), getDoubanCategories({ kind: 'tv', category: 'show', type: 'show' }),
GetBangumiCalendarData(), GetBangumiCalendarData(),
@@ -92,57 +125,57 @@ function HomeClient() {
if (moviesData.code === 200) { if (moviesData.code === 200) {
setHotMovies(moviesData.list); setHotMovies(moviesData.list);
setCache('homepage_movies', moviesData.list);
} }
if (tvShowsData.code === 200) { if (tvShowsData.code === 200) {
setHotTvShows(tvShowsData.list); setHotTvShows(tvShowsData.list);
setCache('homepage_tvshows', tvShowsData.list);
} }
if (varietyShowsData.code === 200) { if (varietyShowsData.code === 200) {
setHotVarietyShows(varietyShowsData.list); setHotVarietyShows(varietyShowsData.list);
setCache('homepage_variety', varietyShowsData.list);
} }
setBangumiCalendarData(bangumiCalendarData); setBangumiCalendarData(bangumiCalendarData);
setCache('homepage_bangumi', bangumiCalendarData);
// 获取热播短剧
try { try {
const duanjuResponse = await fetch('/api/duanju/recommends'); const duanjuResponse = await fetch('/api/duanju/recommends');
if (duanjuResponse.ok) { if (duanjuResponse.ok) {
const duanjuResult = await duanjuResponse.json(); const duanjuResult = await duanjuResponse.json();
if (duanjuResult.code === 200 && duanjuResult.data) { if (duanjuResult.code === 200 && duanjuResult.data) {
setHotDuanju(duanjuResult.data); setHotDuanju(duanjuResult.data);
setCache('homepage_duanju', duanjuResult.data);
} }
} }
} catch (error) { } catch (error) {
console.error('获取热播短剧数据失败:', error); console.error('获取热播短剧数据失败:', error);
} }
// 获取即将上映/播出内容(使用后端API缓存)
try { try {
const response = await fetch('/api/tmdb/upcoming'); const response = await fetch('/api/tmdb/upcoming');
if (response.ok) { if (response.ok) {
const result = await response.json(); const result = await response.json();
if (result.code === 200 && result.data) { if (result.code === 200 && result.data) {
// 按上映/播出日期升序排序(最近的排在前面) const sorted = [...result.data].sort((a, b) => {
const sortedContent = [...result.data].sort((a, b) => {
const dateA = new Date(a.release_date || '9999-12-31').getTime(); const dateA = new Date(a.release_date || '9999-12-31').getTime();
const dateB = new Date(b.release_date || '9999-12-31').getTime(); const dateB = new Date(b.release_date || '9999-12-31').getTime();
return dateA - dateB; return dateA - dateB;
}); });
setUpcomingContent(sortedContent); setUpcomingContent(sorted);
setCache('homepage_upcoming', sorted);
} }
} }
} catch (error) { } catch (error) {
console.error('获取TMDB即将上映数据失败:', error); console.error('获取TMDB即将上映数据失败:', error);
} }
setLoading(false);
} catch (error) { } catch (error) {
console.error('获取推荐数据失败:', error); console.error('获取推荐数据失败:', error);
} finally {
setLoading(false); setLoading(false);
} }
}; })();
}
fetchRecommendData();
}, []); }, []);