diff --git a/src/pages/SeedList/SeedDetail/SeedDetail.jsx b/src/pages/SeedList/SeedDetail/SeedDetail.jsx
index 0a3ba4d..10cf65d 100644
--- a/src/pages/SeedList/SeedDetail/SeedDetail.jsx
+++ b/src/pages/SeedList/SeedDetail/SeedDetail.jsx
@@ -1,167 +1,219 @@
 import React, { useEffect, useState } from 'react';
 import axios from 'axios';
-import { useParams } from 'react-router-dom';
+import { useParams } from 'wouter';
 import Header from '../../../components/Header';
 import './SeedDetail.css';
-
+import { useUser } from '../../../context/UserContext';
 
 
 const SeedDetail = () => {
-    const { seed_id } = useParams();
-    const [seed, setSeed] = useState(null);
-    const [error, setError] = useState(null);
-    const [comments, setComments] = useState([]);
-    const [newComment, setNewComment] = useState('');
+  const params = useParams();
+  const seed_id = params.id;
 
-    useEffect(() => {
-        axios
-           .get(`/echo/seeds/${seed_id}`)
-           .then((res) => {
-                if (res.data.status === 'success') {
-                    setSeed(res.data.seed);
-                } else {
-                    setError('未能获取种子信息');
-                }
-            })
-           .catch(() => {
-                setError('获取种子详情失败');
+  const [seed, setSeed] = useState(null);
+  const [coverImage, setCoverImage] = useState(null);
+  const [error, setError] = useState(null);
+  const [comments, setComments] = useState([]);
+  const [newComment, setNewComment] = useState('');
+
+  const { user } = useUser();
+
+
+  // 格式化图片 URL
+  const formatImageUrl = (url) => {
+    if (!url) return '';
+    const filename = url.split('/').pop();
+    return `http://localhost:8080/uploads/torrents/${filename}`;
+  };
+
+  useEffect(() => {
+    if (!seed_id) {
+      setError('无效的种子ID');
+      return;
+    }
+
+    const fetchSeedDetail = async () => {
+      try {
+        const res = await axios.post(`/seeds/info/${seed_id}`);
+        if (res.data.code === 0) {
+          const seedData = res.data.data;
+
+          // 处理封面图
+          let cover = seedData.imageUrl;
+          if (!cover && seedData.imgUrl) {
+            const imgs = seedData.imgUrl
+              .split(',')
+              .map((i) => i.trim())
+              .filter(Boolean);
+            cover = imgs.length > 0 ? formatImageUrl(imgs[0]) : null;
+          }
+          setCoverImage(cover);
+          setSeed(seedData);
+          setError(null);
+        } else {
+          setError('未能获取种子信息');
+        }
+      } catch (err) {
+        console.error('请求种子详情出错:', err);
+        setError('获取种子详情失败');
+      }
+    };
+
+    const fetchComments = async () => {
+      try {
+        const res = await axios.get(`/seeds/${seed_id}/comments`);
+        if (res.data.code === 0) {
+          setComments(res.data.data || []);
+        } else {
+          setComments([]);
+        }
+      } catch {
+        setComments([]);
+      }
+    };
+
+    fetchSeedDetail();
+    fetchComments();
+  }, [seed_id]);
+
+ const handleDownload = async (seedId) => {
+        if (!user || !user.userId) {
+            alert('请先登录再下载种子文件');
+            return;
+        }
+
+        try {
+            const response = await axios.get(`/seeds/${seedId}/download`, {
+                params: {
+                    passkey: user.userId,
+                },
+                responseType: 'blob'
             });
 
-        // 模拟获取评论数据，实际需要调用 API
-        axios.get(`/echo/seeds/${seed_id}/comments`)
-           .then((res) => {
-                if (res.data.status === 'success') {
-                    setComments(res.data.comments);
-                }
-            })
-           .catch(() => {
-                console.log('获取评论失败');
-            });
-    }, [seed_id]);
-
-    const handleDownload = async () => {
-        if (seed) {
-            const peer_id = 'echo-' + Math.random().toString(36).substring(2, 10);
-            const ip = '127.0.0.1';
-            const port = 6881;
-            const uploaded = 0;
-            const downloaded = 0;
-            const left = 0;
-
-            try {
-                const response = await axios.get(`/echo/seeds/${seed.seed_id}/download`, {
-                    params: { peer_id, ip, port, uploaded, downloaded, left },
-                    responseType: 'blob'
-                });
-
-                const blob = new Blob([response.data], { type: 'application/x-bittorrent' });
-                const downloadUrl = URL.createObjectURL(blob);
-                const a = document.createElement('a');
-                a.href = downloadUrl;
-                a.download = `${seed.seed_id}.torrent`;
-                a.click();
-                URL.revokeObjectURL(downloadUrl);
-            } catch (error) {
-                console.error('下载失败:', error);
-                alert('下载失败，请稍后再试。');
-            }
+            const blob = new Blob([response.data], { type: 'application/x-bittorrent' });
+            const downloadUrl = URL.createObjectURL(blob);
+            const a = document.createElement('a');
+            a.href = downloadUrl;
+            a.download = `${seedId}.torrent`;
+            a.click();
+            URL.revokeObjectURL(downloadUrl);
+        } catch (error) {
+            console.error('下载失败:', error);
+            alert('下载失败，请稍后再试。');
         }
     };
 
-    const handleCollect = () => {
-        // 这里可以添加收藏逻辑，调用相应 API
-        alert('已收藏');
-    };
 
-    const handleAddComment = () => {
-        if (newComment.trim()) {
-            // 这里可以添加评论逻辑，调用相应 API
-            setComments([...comments, { content: newComment, user: '用户' }]);
-            setNewComment('');
-        }
-    };
+  const handleCollect = () => {
+    alert('已收藏');
+  };
 
-    if (error) {
-        return (
-            <div className="seed-detail-page">
-                <Header />
-                <div className="seed-detail">
-                    <p className="error-text">{error}</p>
-                </div>
-            </div>
-        );
+  const handleAddComment = () => {
+    if (newComment.trim()) {
+      setComments([...comments, { content: newComment, user: '用户' }]);
+      setNewComment('');
     }
+  };
 
-    if (!seed) {
-        return (
-            <div className="seed-detail-page">
-                <Header />
-                <div className="seed-detail">
-                    <p>加载中...</p>
-                </div>
-            </div>
-        );
-    }
-
+  if (error) {
     return (
-        <div className="seed-detail-page">
-            <Header />
-            <div className="seed-detail">
-                <h1>{seed.title}</h1>
-                <div className="seed-header-container">
-                    <div className="seed-info">
-                        <div className="seed-basic-info">
-                            <p><strong>分类：</strong>{seed.category}</p>
-                            <p><strong>发布时间：</strong>{new Date(seed.upload_time).toLocaleString()}</p>
-                            <p><strong>标签：</strong>{seed.tags.join(' / ')}</p>
-                            <p><strong>简介：</strong>{seed.description}</p>
-                            <p><strong>大小：</strong>{seed.size} GB</p>
-                            <p><strong>分辨率：</strong>{seed.resolution}</p>
-                            <p><strong>片长：</strong>{seed.duration}</p>
-                            <p><strong>地区：</strong>{seed.region}</p>
-                            <p><strong>下载次数：</strong>{seed.downloads}</p>
-                        </div>
-                        {(seed.category === '电影' || seed.category === '电视剧') && (
-                            <div className="seed-media-info">
-                                <p><strong>导演：</strong>{seed.director}</p>
-                                <p><strong>编剧：</strong>{seed.writer}</p>
-                                <p><strong>主演：</strong>{seed.actors.join(' / ')}</p>
-                            </div>
-                        )}
-                    </div>
-                    <img src={seed.cover_url} alt={seed.title} className="cover-image" />
-                </div>
-                <div className="action-buttons">
-                    <button className="btn" onClick={handleDownload}>下载</button>
-                    <button className="btn" onClick={handleCollect}>收藏</button>             
-                </div>
-                <hr className="divider" />
-                {/* 评论部分 */}
-                <h3>评论区</h3>
-                <div className="comments-section">
-                    <div className="comments-list">
-                        {comments.map((comment, index) => (
-                            <div key={index} className="comment">
-                                <p className="comment-user">{comment.user}</p>
-                                <p className="comment-content">{comment.content}</p>
-                            </div>
-                        ))}
-                    </div>
-                    <div className="add-comment-form">
-                        <textarea
-                            placeholder="输入你的评论..."
-                            value={newComment}
-                            onChange={(e) => setNewComment(e.target.value)}
-                        />
-                        <div className="comment-options">
-                        <button className="btn" onClick={handleAddComment}>发布评论</button>
-                        </div>
-                    </div>
-                </div>
-            </div>
+      <div className="seed-detail-page">
+        <Header />
+        <div className="seed-detail">
+          <p className="error-text">{error}</p>
         </div>
+      </div>
     );
+  }
+
+  if (!seed) {
+    return (
+      <div className="seed-detail-page">
+        <Header />
+        <div className="seed-detail">
+          <p>加载中...</p>
+        </div>
+      </div>
+    );
+  }
+
+  const tags = seed.tags
+    ? Array.isArray(seed.tags)
+      ? seed.tags
+      : typeof seed.tags === 'string'
+      ? seed.tags.split(',').map((t) => t.trim())
+      : []
+    : [];
+
+  const actors = seed.actors
+    ? Array.isArray(seed.actors)
+      ? seed.actors
+      : typeof seed.actors === 'string'
+      ? seed.actors.split(',').map((a) => a.trim())
+      : []
+    : [];
+
+  return (
+    <div className="seed-detail-page">
+      <Header />
+      <div className="seed-detail">
+        <h1>{seed.title}</h1>
+        <div className="seed-header-container">
+          <div className="seed-info">
+            <div className="seed-basic-info">
+              <p><strong>分类：</strong>{seed.category || '未知'}</p>
+              <p><strong>发布时间：</strong>{seed.upload_time ? new Date(seed.upload_time).toLocaleString() : '未知'}</p>
+              <p><strong>标签：</strong>{tags.join(' / ')}</p>
+              <p><strong>简介：</strong>{seed.description || '无'}</p>
+              <p><strong>大小：</strong>{seed.size || '未知'}</p>
+              <p><strong>分辨率：</strong>{seed.resolution || '未知'}</p>
+              <p><strong>片长：</strong>{seed.duration || '未知'}</p>
+              <p><strong>地区：</strong>{seed.region || '未知'}</p>
+              <p><strong>下载次数：</strong>{seed.downloads ?? 0}</p>
+            </div>
+            {(seed.category === '电影' || seed.category === '电视剧') && (
+              <div className="seed-media-info">
+                <p><strong>导演：</strong>{seed.director || '未知'}</p>
+                <p><strong>编剧：</strong>{seed.writer || '未知'}</p>
+                <p><strong>主演：</strong>{actors.join(' / ')}</p>
+              </div>
+            )}
+          </div>
+          <img
+            src={coverImage || '/default-cover.png'}
+            alt={seed.title}
+            className="cover-image"
+          />
+        </div>
+        <div className="action-buttons">
+          <button className="btn" onClick={() => handleDownload(seed.id)}>下载</button>
+          <button className="btn" onClick={handleCollect}>收藏</button>
+        </div>
+        <hr className="divider" />
+        <h3>评论区</h3>
+        <div className="comments-section">
+          <div className="comments-list">
+            {comments.map((comment, index) => (
+              <div key={index} className="comment">
+                <p className="comment-user">{comment.user}</p>
+                <p className="comment-content">{comment.content}</p>
+              </div>
+            ))}
+          </div>
+          <div className="add-comment-form">
+            <textarea
+              placeholder="输入你的评论..."
+              value={newComment}
+              onChange={(e) => setNewComment(e.target.value)}
+            />
+            <div className="comment-options">
+              <button className="btn" onClick={handleAddComment}>发布评论</button>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  );
 };
 
 export default SeedDetail;
-    
\ No newline at end of file
