diff --git a/src/pages/SeedList/SeedList.jsx b/src/pages/SeedList/SeedList.jsx
new file mode 100644
index 0000000..0e9badf
--- /dev/null
+++ b/src/pages/SeedList/SeedList.jsx
@@ -0,0 +1,154 @@
+import React, { useState, useEffect } from 'react';
+import axios from 'axios';
+import { Link } from 'wouter';
+import logo from '../../assets/logo.png';
+import Recommend from './Recommend/Recommend'; // 导入Recommend组件
+import './SeedList.css';
+
+const SeedList = () => {
+    const [seeds, setSeeds] = useState([]);
+    const [filteredSeeds, setFilteredSeeds] = useState([]);
+    const [loading, setLoading] = useState(true);
+    const [searchTerm, setSearchTerm] = useState('');
+    const [selectedTag, setSelectedTag] = useState('全部');
+    const [sortOption, setSortOption] = useState('最新');
+    const [activeTab, setActiveTab] = useState('种子列表'); // 用于控制激活的标签
+
+    const TAGS = ['猜你喜欢', '电影', '电视剧','动漫','音乐', '游戏','综艺', '软件', '体育','学习','纪录片','其他'];
+
+    useEffect(() => {
+        const fetchSeeds = async () => {
+            try {
+                const response = await axios.get('/echo/seeds');
+                setSeeds(response.data);
+                setFilteredSeeds(response.data);
+            } catch (error) {
+                console.error('获取种子列表失败:', error);
+            } finally {
+                setLoading(false);
+            }
+        };
+
+        fetchSeeds();
+    }, []);
+
+    useEffect(() => {
+        let filtered = seeds;
+
+        if (searchTerm) {
+            filtered = filtered.filter(seed =>
+                seed.name.toLowerCase().includes(searchTerm.toLowerCase())
+            );
+        }
+
+        if (selectedTag !== '全部') {
+            filtered = filtered.filter(seed =>
+                seed.tags && seed.tags.includes(selectedTag)
+            );
+        }
+
+        switch (sortOption) {
+            case '最新':
+                filtered.sort((a, b) => new Date(b.uploadTime) - new Date(a.uploadTime));
+                break;
+            case '最热':
+                filtered.sort((a, b) => (b.downloadCount || 0) - (a.downloadCount || 0));
+                break;
+            case '文件大小':
+                filtered.sort((a, b) => (b.size || 0) - (a.size || 0));
+                break;
+            default:
+                break;
+        }
+
+        setFilteredSeeds([...filtered]);
+    }, [searchTerm, selectedTag, sortOption, seeds]);
+
+    return (
+        <div className="main-page">
+            <header className="header">
+                <div className="logo-and-name">
+                    <img src={logo} alt="网站logo" className="logo" />
+                    <span className="site-name">Echo</span>
+                </div>
+                <div className="user-and-message">
+                    <img src="user-avatar.png" alt="用户头像" className="user-avatar" />
+                    <span className="message-center">消息</span>
+                </div>
+            </header>
+
+            <nav className="nav">
+                <Link to="/friend-moments" className="nav-item">好友动态</Link>
+                <Link to="/forum" className="nav-item">论坛</Link>
+                <Link to="/interest-groups" className="nav-item">兴趣小组</Link>
+                <Link to="/seed-list" className="nav-item active">种子列表</Link>
+                <Link to="/publish-seed" className="nav-item">发布种子</Link>
+            </nav>
+
+            {/* 导航部分：点击不同标签时改变 activeTab */}
+            <div className="controls">
+                <input
+                    type="text"
+                    placeholder="搜索种子..."
+                    value={searchTerm}
+                    onChange={(e) => setSearchTerm(e.target.value)}
+                    className="search-input"
+                />
+                <select value={sortOption} onChange={(e) => setSortOption(e.target.value)} className="sort-select">
+                    <option value="最新">最新</option>
+                    <option value="最热">最热</option>
+                    <option value="文件大小">文件大小</option>
+                </select>
+            </div>
+
+            <div className="tag-filters">
+                {TAGS.map((tag) => (
+                    <button
+                        key={tag}
+                        className={`tag-button ${selectedTag === tag ? 'active-tag' : ''}`}
+                        onClick={() => {
+                            setSelectedTag(tag);
+                            setActiveTab(tag); // 添加这一行来更新 activeTab 状态
+                        }}
+                    >
+                        {tag}
+                    </button>
+                ))}
+            </div>
+
+            {/* 显示不同页面，根据activeTab */}
+            <div className="seed-list-content">
+                {activeTab === '猜你喜欢' ? (
+                    <Recommend /> // 显示推荐页面
+                ) : loading ? (
+                    <p>加载中...</p>
+                ) : filteredSeeds.length === 0 ? (
+                    <p>未找到符合条件的种子。</p>
+                ) : (
+                    <div className="seed-cards">
+                        {filteredSeeds.map((seed, index) => (
+                            <div key={index} className="seed-card">
+                                <div className="seed-card-header">
+                                    <h3>{seed.name}</h3>
+                                </div>
+                                <div className="seed-card-body">
+                                    <p><strong>大小:</strong> {seed.size || '未知'}</p>
+                                    <p><strong>上传者:</strong> {seed.uploader || '匿名'}</p>
+                                    <p><strong>时间:</strong> {seed.uploadTime || '未知'}</p>
+                                    <p><strong>下载数:</strong> {seed.downloadCount ?? 0}</p>
+                                </div>
+                                <div className="seed-card-actions">
+                                    <button className="btn-primary">下载</button>
+                                    <Link href={`/seed/${seed.id}`} className="btn-secondary">详情</Link>
+                                    <button className="btn-outline">收藏</button>
+                                </div>
+                            </div>
+                        ))}
+                    </div>
+                )}
+            </div>
+        </div>
+    );
+};
+
+export default SeedList;
