diff --git a/src/api/torrent.js b/src/api/torrent.js
index 4a623d7..a6a1663 100644
--- a/src/api/torrent.js
+++ b/src/api/torrent.js
@@ -38,22 +38,16 @@
 
 /**
  * 下载种子文件
- * @param {number} torrentId 种子ID
+ * @param {number} id 种子ID
  * @param {string} downloadPath 下载路径
  */
-export async function downloadTorrent(torrentId, downloadPath) {
-  try {
-    const response = await api.get(`/torrent/downloadTorrent`, {
-      params: {
-        id: torrentId,
-        downloadPath: downloadPath
-      }
-    });
-    return response.data;
-  } catch (error) {
-    console.error('下载种子失败:', error);
-    throw error;
-  }
+export function downloadTorrent(id, downloadPath) {
+  return api.get('/torrent/downloadTorrent', {
+    params: {
+      id,
+      downloadPath
+    }
+  });
 }
 
 /**
diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx
index e393fcd..3476eca 100644
--- a/src/components/Dashboard.jsx
+++ b/src/components/Dashboard.jsx
@@ -1,4 +1,4 @@
-import React, {useEffect, useState} from 'react';
+import React, {useEffect, useState, useRef} from 'react';
 import {useNavigate, useLocation, useParams} from 'react-router-dom';  
 import {createTorrent, getTorrents, downloadTorrent, getDownloadProgress, deleteTorrent, searchTorrents} from '../api/torrent';
 import './Dashboard.css';
@@ -63,6 +63,7 @@
     const [downloadProgress, setDownloadProgress] = useState(0);
     const [isDownloading, setIsDownloading] = useState(false);
     const [downloadPath, setDownloadPath] = useState('D:/studies/ptPlatform/torrent');
+    // const timerRef = useRef(null);
 
     // 新增搜索状态
     const [announcementSearch, setAnnouncementSearch] = useState('');
@@ -360,80 +361,139 @@
     };
 
     // 执行下载
-    const handleDownload = async () => {
-    if (!selectedTorrent || !downloadPath) return;
+    // const handleDownload = async () => {
+    // if (!selectedTorrent || !downloadPath) return;
 
-    setIsDownloading(true);
-    setDownloadProgress(0);
+    // setIsDownloading(true);
+    // setDownloadProgress(0);
 
-    try {      
-        // 发起下载请求
-        await downloadTorrent(selectedTorrent.id, downloadPath);
-        message.success("下载任务已提交");
-        // 开始轮询进度
-        const interval = setInterval(async () => {
-            try {
-                const res = await getDownloadProgress();
-                const progresses = res.data.progresses;
+    // try {      
+    //     // 发起下载请求
+    //     await downloadTorrent(selectedTorrent.id, downloadPath);
+    //     message.success("下载任务已提交");
+    //     // 开始轮询进度
+    //     const interval = setInterval(async () => {
+    //         try {
+    //             const res = await getDownloadProgress();
+    //             const progresses = res.data.progresses;
                 
-                if (progresses) {
-                    // 使用完整的 torrent 文件路径作为键
-                    const torrentPath = selectedTorrent.downloadPath.replace(/\\/g, '/');
-                    const torrentHash = selectedTorrent.hash;
-                    // 查找匹配的进度
-                    let foundProgress = null;
-                    for (const [key, value] of Object.entries(progresses)) {
-                        const normalizedKey = key.replace(/\\/g, '/');
-                        if (normalizedKey.includes(selectedTorrent.hash) || 
-                            normalizedKey.includes(selectedTorrent.torrentName)) {
-                            foundProgress = value;
-                            break;
-                        }
-                    }
-                    if (foundProgress !== null) {
-                        const newProgress = Math.round(foundProgress * 100);
-                        setDownloadProgress(newProgress);
+    //             if (progresses) {
+    //                 // 使用完整的 torrent 文件路径作为键
+    //                 const torrentPath = selectedTorrent.downloadPath.replace(/\\/g, '/');
+    //                 const torrentHash = selectedTorrent.hash;
+    //                 // 查找匹配的进度
+    //                 let foundProgress = null;
+    //                 for (const [key, value] of Object.entries(progresses)) {
+    //                     const normalizedKey = key.replace(/\\/g, '/');
+    //                     if (normalizedKey.includes(selectedTorrent.hash) || 
+    //                         normalizedKey.includes(selectedTorrent.torrentName)) {
+    //                         foundProgress = value;
+    //                         break;
+    //                     }
+    //                 }
+    //                 if (foundProgress !== null) {
+    //                     const newProgress = Math.round(foundProgress * 100);
+    //                     setDownloadProgress(newProgress);
                         
-                        // 检查是否下载完成
-                        if (newProgress >= 100) {
-                        clearInterval(interval);
-                        setIsDownloading(false);
-                        message.success('下载完成！');
-                        setTimeout(() => setShowDownloadModal(false), 2000);
-                        }
-                    } else {
-                        console.log('当前下载进度:', progresses); // 添加日志
-                    }
-                    }
-                } catch (error) {
-                    console.error('获取进度失败:', error);
-                    // 如果获取进度失败但文件已存在，也视为完成
-                    const filePath = `${downloadPath}${selectedTorrent.torrentName || 'downloaded_file'}`;
-                    try {
-                    const exists = await checkFileExists(filePath);
-                    if (exists) {
-                        clearInterval(interval);
-                        setDownloadProgress(100);
-                        setIsDownloading(false);
-                        message.success('下载完成！');
-                        setTimeout(() => setShowDownloadModal(false), 2000);
-                    }
-                    } catch (e) {
-                    console.error('文件检查失败:', e);
-                    }
-                }
-                }, 2000);
+    //                     // 检查是否下载完成
+    //                     if (newProgress >= 100) {
+    //                     clearInterval(interval);
+    //                     setIsDownloading(false);
+    //                     message.success('下载完成！');
+    //                     setTimeout(() => setShowDownloadModal(false), 2000);
+    //                     }
+    //                 } else {
+    //                     console.log('当前下载进度:', progresses); // 添加日志
+    //                 }
+    //                 }
+    //             } catch (error) {
+    //                 console.error('获取进度失败:', error);
+    //                 // 如果获取进度失败但文件已存在，也视为完成
+    //                 const filePath = `${downloadPath}${selectedTorrent.torrentName || 'downloaded_file'}`;
+    //                 try {
+    //                 const exists = await checkFileExists(filePath);
+    //                 if (exists) {
+    //                     clearInterval(interval);
+    //                     setDownloadProgress(100);
+    //                     setIsDownloading(false);
+    //                     message.success('下载完成！');
+    //                     setTimeout(() => setShowDownloadModal(false), 2000);
+    //                 }
+    //                 } catch (e) {
+    //                 console.error('文件检查失败:', e);
+    //                 }
+    //             }
+    //             }, 2000);
 
-        return () => clearInterval(interval);
-    } catch (error) {
-        setIsDownloading(false);
-        if (error.response && error.response.status === 409) {
-        message.error('分享率不足，无法下载此资源');
-        } else {
-        message.error('下载失败: ' + (error.message || '未知错误'));
+    //     return () => clearInterval(interval);
+    // } catch (error) {
+    //     setIsDownloading(false);
+    //     if (error.response && error.response.status === 409) {
+    //     message.error('分享率不足，无法下载此资源');
+    //     } else {
+    //     message.error('下载失败: ' + (error.message || '未知错误'));
+    //     }
+    // }
+    // };
+
+    const handleDownload = async () => {
+        if (!selectedTorrent || !downloadPath) return;
+
+        setIsDownloading(true);
+        // startPollingProgress();
+
+        try {      
+            // 发起下载请求
+            await downloadTorrent(selectedTorrent.id, downloadPath);
+            message.success("下载任务已提交");
+            // setTimeout(() => setShowDownloadModal(false), 2000);
+        } catch (error) {
+            if (error.response && error.response.status === 409) {
+                message.error('分享率不足，无法下载此资源');
+            } else {
+                message.error('下载失败: ' + (error.message || '未知错误'));
+            }
+        }finally{
+            setIsDownloading(false);
         }
-    }
     };
+    
+
+    // const startPollingProgress = () => {
+    //     timerRef.current = setInterval(async () => {
+    //     try {
+    //         const res = await getDownloadProgress();
+    //         if (res.code === 200 && res.data.progresses) {
+    //         const taskProgress = res.data.progresses[selectedTorrent?.id];
+    //         if (taskProgress !== undefined) {
+    //             const percent = Math.floor(taskProgress * 100);
+    //             setDownloadProgress(percent);
+
+    //             if (percent >= 100) {
+    //             clearInterval(timerRef.current);
+    //             message.success("下载完成");
+    //             setTimeout(() => {
+    //                 setIsDownloading(false);
+    //                 setShowDownloadModal(false);
+    //             }, 1500);
+    //             }
+    //         }
+    //         }
+    //     } catch (err) {
+    //         console.error("获取进度失败", err);
+    //     }
+    //     }, 1000);
+    // };
+
+    // const stopPollingProgress = () => {
+    //     clearInterval(timerRef.current);
+    // };
+
+    // useEffect(() => {
+    //     return () => {
+    //     stopPollingProgress();
+    //     };
+    // }, []);
 
     const checkFileExists = async (filePath) => {
         try {
