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
diff --git a/src/pages/SeedList/SeedList.jsx b/src/pages/SeedList/SeedList.jsx
index eade11d..be8d13f 100644
--- a/src/pages/SeedList/SeedList.jsx
+++ b/src/pages/SeedList/SeedList.jsx
@@ -1,93 +1,99 @@
 import React, { useState, useEffect } from 'react';
 import { Link } from 'wouter';
 import axios from 'axios';
-import logo from '../../assets/logo.png';
 import Recommend from './Recommend/Recommend';
 import Header from '../../components/Header';  // 引入 Header 组件
 import './SeedList.css';
-
-
+import { useUser } from '../../context/UserContext';
 
 const SeedList = () => {
     const [seeds, setSeeds] = useState([]);
-    const [filteredSeeds, setFilteredSeeds] = useState([]);
     const [loading, setLoading] = useState(true);
     const [searchTerm, setSearchTerm] = useState('');
     const [sortOption, setSortOption] = useState('最新');
     const [activeTab, setActiveTab] = useState('种子列表');
     const [filters, setFilters] = useState({});
     const [selectedFilters, setSelectedFilters] = useState({});
-    const [tagMode, setTagMode] = useState('all');
+    const [tagMode, setTagMode] = useState('any'); // 与接口对应，any / all
     const [errorMsg, setErrorMsg] = useState('');
+    const { user } = useUser();
+
 
     const TAGS = ['猜你喜欢', '电影', '电视剧', '动漫', '音乐', '游戏', '综艺', '软件', '体育', '学习', '纪录片', '其他'];
 
     const CATEGORY_MAP = {
-        '电影': 'movie',
-        '电视剧': 'tv',
-        '动漫': 'anime',
-        '音乐': 'music',
-        '游戏': 'game',
-        '综艺': 'variety',
-        '软件': 'software',
-        '体育': 'sports',
-        '学习': 'education',
-        '纪录片': 'documentary',
-        '其他': 'other'
+        '电影': '电影',
+        '电视剧': '电视剧',
+        '动漫': '动漫',
+        '音乐': '音乐',
+        '游戏': '游戏',
+        '综艺': '综艺',
+        '软件': '软件',
+        '体育': '体育',
+        '学习': '学习',
+        '纪录片': '纪录片',
+        '其他': '其他',
+        '猜你喜欢': '',        
+        '种子列表': '',        
     };
 
     const buildQueryParams = () => {
-        const category = CATEGORY_MAP[activeTab];
+        const category = CATEGORY_MAP[activeTab] || '';
+        const orderKey = sortOption === '最新' ? ['upload_time'] : (sortOption === '最热' ? ['downloads'] : ['upload_time']);
         const params = {
-            category,
-            sort_by: sortOption === '最新' ? 'newest' : sortOption === '最热' ? 'downloads' : undefined,
             page: 1,
-            limit: 20,
-            include_fields: 'seed_id,title,category,tags,size,upload_time,downloads,image_url',
+            size: 20,
+            orderKey,
+            orderDesc: true,
         };
 
-        if (searchTerm.trim()) params.search = searchTerm.trim();
+        if (searchTerm.trim()) {
+            params.title = searchTerm.trim();
+        }
+        if (category) {
+            params.category = category;
+        }
 
         const tags = Object.entries(selectedFilters)
-           .filter(([_, value]) => value!== '不限')
-           .map(([_, value]) => value);
+            .filter(([_, value]) => value !== '不限')
+            .map(([_, value]) => value);
 
         if (tags.length > 0) {
-            params.tags = tags.join(',');
-            params.tag_mode = tagMode;
+            params.tags = tags;
+            params.tagMode = tagMode; // any 或 all
         }
 
         return params;
     };
 
     const fetchSeeds = async () => {
+        if (activeTab === '猜你喜欢') return; 
         setLoading(true);
         setErrorMsg('');
         try {
             const params = buildQueryParams();
-            const queryString = new URLSearchParams(params).toString();
-            const response = await fetch(`/echo/seeds?${queryString}`);
-            const data = await response.json();
+            const response = await axios.post('/seeds/list', params);
+            const data = response.data;
 
-            if (data.status!== 'success') throw new Error(data.message || '获取失败');
-            const seeds = data.seeds || [];
-            setSeeds(seeds);
-            setFilteredSeeds(seeds);
+            if (data.code !== 0) {
+                throw new Error(data.msg || '获取失败');
+            }
+
+            setSeeds(data.data || []);
         } catch (error) {
             console.error('获取种子列表失败:', error);
             setErrorMsg(error.message || '获取失败，请稍后再试。');
             setSeeds([]);
-            setFilteredSeeds([]);
         } finally {
             setLoading(false);
         }
     };
 
     const fetchFilterOptions = async () => {
-        if (activeTab === '猜你喜欢') return;
+        if (activeTab === '猜你喜欢' || !CATEGORY_MAP[activeTab]) return;
         const category = CATEGORY_MAP[activeTab];
         try {
-            const res = await axios.get(`/echo/seed-filters?category=${category}`);
+            const res = await axios.get(`/seed-filters?category=${category}`);
             const filterData = res.data || {};
             setFilters(filterData);
 
@@ -104,28 +110,25 @@
     };
 
     useEffect(() => {
-        if (activeTab!== '猜你喜欢') {
-            fetchFilterOptions();
-        }
+        fetchFilterOptions();
     }, [activeTab]);
 
     useEffect(() => {
-        if (activeTab!== '猜你喜欢') {
-            fetchSeeds();
-        }
+        fetchSeeds();
     }, [activeTab, sortOption, selectedFilters, tagMode, searchTerm]);
 
+    // ✅ 修改后的下载函数
     const handleDownload = async (seedId) => {
-        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;
+        if (!user || !user.userId) {
+            alert('请先登录再下载种子文件');
+            return;
+        }
 
         try {
-            const response = await axios.get(`/echo/seeds/${seedId}/download`, {
-                params: { peer_id, ip, port, uploaded, downloaded, left },
+            const response = await axios.get(`/seeds/${seedId}/download`, {
+                params: {
+                    passkey: user.userId,
+                },
                 responseType: 'blob'
             });
 
@@ -143,22 +146,22 @@
     };
 
     const handleFilterChange = (key, value) => {
-        setSelectedFilters((prev) => ({
-           ...prev,
+        setSelectedFilters(prev => ({
+            ...prev,
             [key]: value
         }));
     };
 
     const clearFilter = (key) => {
-        setSelectedFilters((prev) => ({
-           ...prev,
+        setSelectedFilters(prev => ({
+            ...prev,
             [key]: '不限'
         }));
     };
 
     return (
         <div className="seed-list-container">
-            <Header /> {/* 引用 Header 组件 */}
+            <Header />
 
             <div className="controls">
                 <input
@@ -168,21 +171,29 @@
                     onChange={(e) => setSearchTerm(e.target.value)}
                     className="search-input"
                 />
-                <select value={sortOption} onChange={(e) => setSortOption(e.target.value)} className="sort-select">
+                <select
+                    value={sortOption}
+                    onChange={(e) => setSortOption(e.target.value)}
+                    className="sort-select"
+                >
                     <option value="最新">最新</option>
                     <option value="最热">最热</option>
                 </select>
-                <select value={tagMode} onChange={(e) => setTagMode(e.target.value)} className="tag-mode-select">
+                <select
+                    value={tagMode}
+                    onChange={(e) => setTagMode(e.target.value)}
+                    className="tag-mode-select"
+                >
                     <option value="any">包含任意标签</option>
                     <option value="all">包含所有标签</option>
                 </select>
             </div>
 
             <div className="tag-filters">
-                {TAGS.map((tag) => (
+                {TAGS.map(tag => (
                     <button
                         key={tag}
-                        className={`tag-button ${activeTab === tag? 'active-tag' : ''}`}
+                        className={`tag-button ${activeTab === tag ? 'active-tag' : ''}`}
                         onClick={() => {
                             setActiveTab(tag);
                             setFilters({});
@@ -194,7 +205,7 @@
                 ))}
             </div>
 
-            {activeTab!== '猜你喜欢' && Object.keys(filters).length > 0 && (
+            {activeTab !== '猜你喜欢' && Object.keys(filters).length > 0 && (
                 <div className="filter-bar">
                     {Object.entries(filters).map(([key, options]) => (
                         <div className="filter-group" key={key}>
@@ -203,12 +214,17 @@
                                 value={selectedFilters[key]}
                                 onChange={(e) => handleFilterChange(key, e.target.value)}
                             >
-                                {options.map((opt) => (
+                                {options.map(opt => (
                                     <option key={opt} value={opt}>{opt}</option>
                                 ))}
                             </select>
-                            {selectedFilters[key]!== '不限' && (
-                                <button className="clear-filter-btn" onClick={() => clearFilter(key)}>✕</button>
+                            {selectedFilters[key] !== '不限' && (
+                                <button
+                                    className="clear-filter-btn"
+                                    onClick={() => clearFilter(key)}
+                                >
+                                    ✕
+                                </button>
                             )}
                         </div>
                     ))}
@@ -216,13 +232,13 @@
             )}
 
             <div className="seed-list-content">
-                {activeTab === '猜你喜欢'? (
+                {activeTab === '猜你喜欢' ? (
                     <Recommend />
-                ) : loading? (
+                ) : loading ? (
                     <p>加载中...</p>
-                ) : errorMsg? (
+                ) : errorMsg ? (
                     <p className="error-text">{errorMsg}</p>
-                ) : filteredSeeds.length === 0? (
+                ) : seeds.length === 0 ? (
                     <p>未找到符合条件的种子。</p>
                 ) : (
                     <div className="seed-list-card">
@@ -235,53 +251,99 @@
                             <div className="seed-header-actions">操作</div>
                         </div>
                         <div className="seed-list-body">
-                            {filteredSeeds.map((seed, index) => (
-                                <Link href={`/seed/${seed.seed_id}`} key={index} className="seed-item-link">
-                                    <div className="seed-item">
-                                        {seed.image_url && (
-                                            <img src={seed.image_url} alt={seed.title} className="seed-item-cover" />
-                                        )}
-                                        <div className="seed-item-title">
-                                            <div className="seed-title-row">
-                                                <h3 className="seed-title">{seed.title}</h3>
-                                                <div className="seed-tags">
-                                                    {seed.tags && seed.tags.map((tag, i) => (
-                                                        <span key={i} className="tag-label">{tag}</span>
-                                                    ))}
+                            {seeds.map((seed, index) => {
+                                // 处理 tags 字段，兼容字符串和数组
+                                let tagsArray = [];
+                                if (seed.tags) {
+                                    if (Array.isArray(seed.tags)) {
+                                        tagsArray = seed.tags;
+                                    } else if (typeof seed.tags === 'string') {
+                                        try {
+                                            tagsArray = JSON.parse(seed.tags);
+                                            if (!Array.isArray(tagsArray)) {
+                                                // 解析后不是数组，按逗号分割
+                                                tagsArray = seed.tags.split(',').map(t => t.trim()).filter(t => t);
+                                            }
+                                        } catch {
+                                            // 解析失败，按逗号分割
+                                            tagsArray = seed.tags.split(',').map(t => t.trim()).filter(t => t);
+                                        }
+                                    }
+                                }
+
+                                return (
+                                    
+                                   <Link to={`/seed/${seed.id}`} key={index} className="seed-item-link">
+                                        <div className="seed-item">
+                                            {seed.image_url && (
+                                                <img
+                                                    src={seed.image_url}
+                                                    alt={seed.title}
+                                                    className="seed-item-cover"
+                                                />
+                                            )}
+                                            <div className="seed-item-title">
+                                                <div className="seed-title-row">
+                                                    <h3 className="seed-title">{seed.title}</h3>
+                                                    <div className="seed-tags">
+                                                        {tagsArray.map((tag, i) => (
+                                                            <span key={i} className="tag-label">{tag}</span>
+                                                        ))}
+                                                    </div>
                                                 </div>
                                             </div>
-                                        </div>
-                                        <div className="seed-item-size">{seed.size || '未知'}</div>
-                                        <div className="seed-item-upload-time">{seed.upload_time?.split('T')[0] || '未知'}</div>
-                                        <div className="seed-item-downloads">{seed.downloads?? 0} 次下载</div>
-                                        <div
-                                            className="seed-item-actions"
-                                            onClick={(e) => e.stopPropagation()} // 阻止事件冒泡，避免跳转
-                                        >
-                                            <button
-                                                className="btn-primary"
-                                                onClick={(e) => {
-                                                    e.preventDefault(); // 阻止跳转
-                                                    e.stopPropagation();
-                                                    handleDownload(seed.seed_id);
-                                                }}
+                                            <div className="seed-item-size">{seed.size || '未知'}</div>
+                                            <div className="seed-item-upload-time">{seed.upload_time?.split('T')[0] || '未知'}</div>
+                                            <div className="seed-item-downloads">{seed.downloads ?? 0} 次下载</div>
+                                            <div
+                                                className="seed-item-actions"
+                                                onClick={e => e.stopPropagation()} // 阻止事件冒泡，避免跳转
                                             >
-                                                下载
-                                            </button>
-                                            <button
-                                                className="btn-outline"
-                                                onClick={(e) => {
-                                                    e.preventDefault();
-                                                    e.stopPropagation();
-                                                    // TODO: 收藏操作
-                                                }}
-                                            >
-                                                收藏
-                                            </button>
+                                                <button
+                                                    className="btn-primary"
+                                                    onClick={e => {
+                                                        e.preventDefault();
+                                                        e.stopPropagation();
+                                                        handleDownload(seed.id);
+                                                    }}
+                                                >
+                                                    下载
+                                                </button>
+                                                <button
+    className="btn-outline"
+    onClick={async (e) => {
+        e.preventDefault();
+        e.stopPropagation();
+
+        if (!user || !user.userId) {
+            alert('请先登录再收藏');
+            return;
+        }
+
+        try {
+            const res = await axios.post(`/seeds/${seed.id}/favorite-toggle`, null, {
+                params: { user_id: user.userId },
+            });
+
+            if (res.data.code === 0) {
+                alert('操作成功'); // 你可以改成 toast 或 icon 状态提示
+            } else {
+                alert(res.data.msg || '操作失败');
+            }
+        } catch (err) {
+            console.error('收藏失败:', err);
+            alert('收藏失败，请稍后再试。');
+        }
+    }}
+>
+    收藏
+</button>
+
+                                            </div>
                                         </div>
-                                    </div>
-                                </Link>
-                            ))}
+                                    </Link>
+                                );
+                            })}
                         </div>
                     </div>
                 )}
@@ -291,4 +353,3 @@
 };
 
 export default SeedList;
-    
