diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx
index 61111f3..e393fcd 100644
--- a/src/components/Dashboard.jsx
+++ b/src/components/Dashboard.jsx
@@ -72,6 +72,9 @@
     const [recommendations, setRecommendations] = useState([]);
     const [recommendLoading, setRecommendLoading] = useState(false);
     const [recommendError, setRecommendError] = useState(null);
+    const [isRecommend, setIsRecommend] = useState(true);
+    const [needNewRecommend, setNeedNewRecommend] = useState(false);
+
 
 
 
@@ -101,18 +104,28 @@
     }
     };
 
+   // 修改 useEffect 钩子
     useEffect(() => {
         if (activeTab === 'announcement') {
             fetchAnnouncements();
             fetchDiscountsForCarousel();
-            fetchRecommendations();
+            
+            // 只在需要时获取推荐
+            if (isRecommend || needNewRecommend) {
+                fetchRecommendations();
+            }
         }
-    }, [activeTab]);
+    }, [activeTab, isRecommend, needNewRecommend]);
+
+    // 添加刷新推荐的功能
+    const handleRefreshRecommendations = () => {
+        setNeedNewRecommend(true);
+    };
 
     const fetchDiscountsForCarousel = async () => {
         try {
             const all = await getAllDiscounts();
-            console.log("返回的折扣数据：", all);
+            // console.log("返回的折扣数据：", all);
             const now = new Date();
 
             // ⚠️ 使用 Date.parse 确保兼容 ISO 格式
@@ -353,19 +366,10 @@
     setIsDownloading(true);
     setDownloadProgress(0);
 
-    try {
-        // 标准化路径
-        const cleanPath = downloadPath
-        .replace(/\\/g, '/')  // 统一使用正斜杠
-        .replace(/\/+/g, '/') // 去除多余斜杠
-        .trim();
-
-        // 确保路径以斜杠结尾
-        const finalPath = cleanPath.endsWith('/') ? cleanPath : cleanPath + '/';
-
+    try {      
         // 发起下载请求
-        await downloadTorrent(selectedTorrent.id, finalPath);
-        
+        await downloadTorrent(selectedTorrent.id, downloadPath);
+        message.success("下载任务已提交");
         // 开始轮询进度
         const interval = setInterval(async () => {
             try {
@@ -374,7 +378,7 @@
                 
                 if (progresses) {
                     // 使用完整的 torrent 文件路径作为键
-                    const torrentPath = selectedTorrent.filePath.replace(/\\/g, '/');
+                    const torrentPath = selectedTorrent.downloadPath.replace(/\\/g, '/');
                     const torrentHash = selectedTorrent.hash;
                     // 查找匹配的进度
                     let foundProgress = null;
@@ -404,7 +408,7 @@
                 } catch (error) {
                     console.error('获取进度失败:', error);
                     // 如果获取进度失败但文件已存在，也视为完成
-                    const filePath = `${finalPath}${selectedTorrent.torrentName || 'downloaded_file'}`;
+                    const filePath = `${downloadPath}${selectedTorrent.torrentName || 'downloaded_file'}`;
                     try {
                     const exists = await checkFileExists(filePath);
                     if (exists) {
@@ -640,24 +644,37 @@
         }
     };
 
-    const fetchRecommendations = async () => {
-        try {
-            setRecommendLoading(true);
-            const response = await getRecommendations(5);
-            if (response.code === 200) {
-            setRecommendations(response.data || []);
+    // 修改 fetchRecommendations 函数
+const fetchRecommendations = async () => {
+    try {
+        setRecommendLoading(true);
+        const response = await getRecommendations(5);
+        
+        if (Array.isArray(response)) {
+            setRecommendations(response);
             
-            // 标记这些推荐为已显示
-            response.data.forEach(torrent => {
-                markRecommendationShown(torrent.id);
-            });
+            if (response.length === 0) {
+                console.warn('暂无推荐内容');
+            } else {
+                // 标记这些推荐为已显示
+                response.forEach(torrent => {
+                    markRecommendationShown(torrent.id);
+                });
             }
-        } catch (error) {
-            setRecommendError(error.message || '获取推荐失败');
-        } finally {
-            setRecommendLoading(false);
+            
+            // 获取成功后重置标志
+            setIsRecommend(false);
+            setNeedNewRecommend(false);
+        } else {
+            console.warn('返回格式异常:', response);
+            setRecommendations([]);
         }
-    };
+    } catch (error) {
+        setRecommendError(error.message || '获取推荐失败');
+    } finally {
+        setRecommendLoading(false);
+    }
+};
 
 
     useEffect(() => {
@@ -798,7 +815,7 @@
         try {
           setLoading(true);
           const backendData = await getUserInfo(); // 调用修改后的方法
-          console.log('后端返回的用户数据:', backendData); // 调试用
+        //   console.log('后端返回的用户数据:', backendData); // 调试用
           
           setUserInfo({
             name: backendData.username || '演示用户',
@@ -902,11 +919,20 @@
                         </div>
                         {/* 新增的为你推荐区域 */}
                         <div className="recommend-section">
-                            <h2 className="section-title">为你推荐</h2>
+                            <div className="section-header">
+                                <h2 className="section-title">为你推荐</h2>
+                                <button 
+                                    className="refresh-btn"
+                                    onClick={handleRefreshRecommendations}
+                                    disabled={recommendLoading}
+                                >
+                                    {recommendLoading ? '刷新中...' : '刷新推荐'}
+                                </button>
+                            </div>
                             
                             {recommendLoading && <div className="loading">加载推荐中...</div>}
                             {recommendError && <div className="error">{recommendError}</div>}
-                            
+    
                             <div className="recommend-grid">
                             {recommendations.map(torrent => (
                                 <div 
@@ -1225,11 +1251,11 @@
             case 'request':
                 return (
                     <div className="content-area" data-testid="request-section">
-                        {/* 求助区搜索框 */}
+                        {/* 求种区搜索框 */}
                         <div className="section-search-container">
                             <input
                                 type="text"
-                                placeholder="搜索求助..."
+                                placeholder="搜索求种..."
                                 value={requestSearch}
                                 onChange={(e) => setRequestSearch(e.target.value)}
                                 className="section-search-input"
