重新提交

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':