重新提交
Change-Id: I41d894c30f6945402022f7309d52d9dfc0ff4c79
diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx
index 40bd19d..61111f3 100644
--- a/src/components/Dashboard.jsx
+++ b/src/components/Dashboard.jsx
@@ -7,8 +7,10 @@
import { message } from 'antd'; // 用于显示提示消息
import { getAnnouncements,getLatestAnnouncements,getAnnouncementDetail } from '../api/announcement';
import { getAllDiscounts } from '../api/administer';
- import { getUserInfo, isAdmin } from '../api/auth';
+import { getUserInfo, isAdmin } from '../api/auth';
import { api } from '../api/auth';
+import { getRecommendations, markRecommendationShown, markRecommendationClicked } from '../api/recommend';
+
const Dashboard = ({onLogout}) => {
@@ -67,6 +69,10 @@
const [shareSearch, setShareSearch] = useState('');
const [requestSearch, setRequestSearch] = useState('');
const [helpSearch, setHelpSearch] = useState('');
+ const [recommendations, setRecommendations] = useState([]);
+ const [recommendLoading, setRecommendLoading] = useState(false);
+ const [recommendError, setRecommendError] = useState(null);
+
const activeTab = tab || 'announcement'; // 如果没有tab参数,则默认为announcement
@@ -99,6 +105,7 @@
if (activeTab === 'announcement') {
fetchAnnouncements();
fetchDiscountsForCarousel();
+ fetchRecommendations();
}
}, [activeTab]);
@@ -143,6 +150,23 @@
}
};
+ const handleRecommendClick = async (torrent) => {
+ try {
+ // 标记为已点击
+ await markRecommendationClicked(torrent.id);
+
+ // 导航到种子详情页
+ navigate(`/torrent/${torrent.id}`, {
+ state: {
+ fromTab: 'announcement',
+ scrollPosition: window.scrollY
+ }
+ });
+ } catch (error) {
+ console.error('标记推荐点击失败:', error);
+ }
+ };
+
// 公告区搜索处理
const handleSearchAnnouncement = (e) => {
@@ -515,7 +539,7 @@
const response = (shareSearch && !isReset)
? await searchTorrents(shareSearch, page)
- : await api.get('http://localhost:8088/torrent', { params });
+ : await api.get('/torrent', { params });
if (response.data.code === 200) {
setTorrentPosts(response.data.data.records);
@@ -614,7 +638,26 @@
} finally {
setHelpLoading(false);
}
- };
+ };
+
+ const fetchRecommendations = async () => {
+ try {
+ setRecommendLoading(true);
+ const response = await getRecommendations(5);
+ if (response.code === 200) {
+ setRecommendations(response.data || []);
+
+ // 标记这些推荐为已显示
+ response.data.forEach(torrent => {
+ markRecommendationShown(torrent.id);
+ });
+ }
+ } catch (error) {
+ setRecommendError(error.message || '获取推荐失败');
+ } finally {
+ setRecommendLoading(false);
+ }
+ };
useEffect(() => {
@@ -719,7 +762,7 @@
}
// 调用API获取筛选结果
- const response = await api.get('http://localhost:8088/torrent', { params });
+ const response = await api.get('/torrent', { params });
if (response.data.code === 200) {
setTorrentPosts(response.data.data.records);
@@ -857,6 +900,45 @@
</div>
))}
</div>
+ {/* 新增的为你推荐区域 */}
+ <div className="recommend-section">
+ <h2 className="section-title">为你推荐</h2>
+
+ {recommendLoading && <div className="loading">加载推荐中...</div>}
+ {recommendError && <div className="error">{recommendError}</div>}
+
+ <div className="recommend-grid">
+ {recommendations.map(torrent => (
+ <div
+ key={torrent.id}
+ className="recommend-card"
+ onClick={() => handleRecommendClick(torrent)}
+ >
+ <div className="card-poster">
+ <div className="poster-image gray-bg">
+ {torrent.torrentName.charAt(0)}
+ </div>
+ </div>
+ <div className="card-info">
+ <h3 className="card-title">{torrent.torrentName}</h3>
+ <p className="card-meta">
+ {torrent.resolution} | {torrent.region} | {torrent.category}
+ </p>
+ <p className="card-subtitle">字幕: {torrent.subtitle}</p>
+ </div>
+ <div className="card-stats">
+ <span className="stat">👍 {torrent.likeCount || 0}</span>
+ </div>
+ </div>
+ ))}
+
+ {!recommendLoading && recommendations.length === 0 && (
+ <div className="no-recommendations">
+ 暂无推荐,请先下载一些资源以获取个性化推荐
+ </div>
+ )}
+ </div>
+ </div>
</div>
);
case 'share':