diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx
index 836daa7..f8f5dd3 100644
--- a/src/components/Dashboard.jsx
+++ b/src/components/Dashboard.jsx
@@ -1,9 +1,10 @@
 import React, {useEffect, useState} from 'react';
-import {useNavigate, useLocation, useParams} from 'react-router-dom';
-// import { getUserInfo } from '../api/auth';  
-import {createTorrent, getTorrents} from '../api/torrent';
+import {useNavigate, useLocation, useParams} from 'react-router-dom';  
+import {createTorrent, getTorrents, searchTorrents} from '../api/torrent';
 import './Dashboard.css';
-import {createPost, getPosts, getPostDetail} from '../api/helpPost';
+import {createPost, getPosts, getPostDetail, searchPosts} from '../api/helpPost';
+import { getUserInfo, isAdmin } from '../api/auth';
+import { api } from '../api/auth'; 
 
 
 const Dashboard = ({onLogout}) => {
@@ -45,6 +46,12 @@
     const [filteredResources, setFilteredResources] = useState(torrentPosts);
     const [isAdmin, setIsAdmin] = useState(false);
 
+    // 新增搜索状态
+    const [announcementSearch, setAnnouncementSearch] = useState('');
+    const [shareSearch, setShareSearch] = useState('');
+    const [requestSearch, setRequestSearch] = useState('');
+    const [helpSearch, setHelpSearch] = useState('');
+
 
     const activeTab = tab || 'announcement'; // 如果没有tab参数，则默认为announcement
     // 从location.state中初始化状态
@@ -118,6 +125,90 @@
         // 其他公告...
     ]);
 
+    // 公告区搜索处理
+    const handleSearchAnnouncement = (e) => {
+        setAnnouncementSearch(e.target.value);
+    };
+
+    // 修改后的搜索函数
+    const handleSearchShare = async () => {
+        try {
+            setTorrentLoading(true);
+            const response = await searchTorrents(shareSearch, 1);
+            if (response.data.code === 200) {
+                setTorrentPosts(response.data.data.records);
+                const total = response.data.data.total;
+                setTotalPages(Math.ceil(total / 5));
+                setCurrentPage(1);
+            } else {
+                setTorrentError(response.data.message || '搜索失败');
+            }
+        } catch (err) {
+            setTorrentError(err.message || '搜索失败');
+        } finally {
+            setTorrentLoading(false);
+        }
+    };
+
+    const handleResetShareSearch = async () => {
+        setShareSearch('');
+        setSelectedFilters(
+            Object.keys(filterCategories).reduce((acc, category) => {
+                acc[category] = 'all';
+                return acc;
+            }, {})
+        );
+        await fetchTorrentPosts(1, true);
+    };
+
+    // 求种区搜索处理
+    const handleSearchRequest = (e) => {
+        setRequestSearch(e.target.value);
+    };
+
+    // 添加搜索函数
+    const handleSearchHelp = async () => {
+        try {
+        setHelpLoading(true);
+        const response = await searchPosts(helpSearch, currentPage);
+        if (response.data.code === 200) {
+            const postsWithCounts = await Promise.all(
+            response.data.data.records.map(async (post) => {
+                try {
+                const detailResponse = await getPostDetail(post.id);
+                if (detailResponse.data.code === 200) {
+                    return {
+                    ...post,
+                    replyCount: detailResponse.data.data.post.replyCount || 0,
+                    isLiked: false
+                    };
+                }
+                return post;
+                } catch (err) {
+                console.error(`获取帖子${post.id}详情失败:`, err);
+                return post;
+                }
+            })
+            );
+            setHelpPosts(postsWithCounts);
+            setTotalPages(Math.ceil(response.data.data.total / 5));
+        } else {
+            setHelpError(response.data.message || '搜索失败');
+        }
+        } catch (err) {
+        setHelpError(err.message || '搜索失败');
+        } finally {
+        setHelpLoading(false);
+        }
+    };
+    
+    // 添加重置搜索函数
+    const handleResetHelpSearch = async () => {
+        setHelpSearch('');
+        await fetchHelpPosts(1); // 重置到第一页
+    };
+
+
 
     const handleAnnouncementClick = (announcement, e) => {
         if (!e.target.closest('.exclude-click')) {
@@ -205,20 +296,41 @@
         }
       };
 
-    // 获取Torrent帖子列表
-    const fetchTorrentPosts = async (page = 1) => {
-        setTorrentLoading(true);
-        try {
-            const response = await getTorrents(page);
-            setTorrentPosts(response.data.data.records);
-            setTotalPages(Math.ceil(response.data.data.total / 5)); // 假设每页5条
-            setCurrentPage(page);
-        } catch (err) {
-            setTorrentError(err.message);
-        } finally {
-            setTorrentLoading(false);
+
+const fetchTorrentPosts = async (page = 1, isReset = false) => {
+    setTorrentLoading(true);
+    try {
+        const params = {
+            page,
+            size: 5
+        };
+        
+        // 如果有筛选条件且不是重置操作
+        if (!isReset && Object.values(selectedFilters).some(v => v !== 'all')) {
+            if (selectedFilters.type !== 'all') params.category = selectedFilters.type;
+            if (selectedFilters.subtitle !== 'all') params.subtitle = selectedFilters.subtitle;
+            if (selectedFilters.region !== 'all') params.region = selectedFilters.region;
+            if (selectedFilters.resolution !== 'all') params.resolution = selectedFilters.resolution;
         }
-    };
+        
+        const response = (shareSearch && !isReset) 
+            ? await searchTorrents(shareSearch, page)
+            : await api.get('http://localhost:8088/torrent', { params });
+            
+        if (response.data.code === 200) {
+            setTorrentPosts(response.data.data.records);
+            const total = response.data.data.total;
+            setTotalPages(Math.ceil(total / 5));
+            setCurrentPage(page);
+        } else {
+            setTorrentError(response.data.message);
+        }
+    } catch (err) {
+        setTorrentError(err.message);
+    } finally {
+        setTorrentLoading(false);
+    }
+};
 
     // 在useEffect中调用
     useEffect(() => {
@@ -276,7 +388,7 @@
     }, [activeTab, currentPage]); // 添加 currentPage 作为依赖
 
 
-    // 分类维度配置
+        // 分类维度配置
     const filterCategories = {
         type: {
             label: '类型',
@@ -285,28 +397,50 @@
                 '电影': '电影',
                 '电视剧': '电视剧',
                 '动漫': '动漫',
-                '综艺': '综艺'
+                '综艺': '综艺',
+                '音乐': '音乐',
+                '其他': '其他'
             }
         },
         subtitle: {
             label: '字幕',
             options: {
                 'all': '全部',
-                'yes': '有字幕',
-                'no': '无字幕'
+                '无需字幕': '无需字幕',
+                '暂无字幕': '暂无字幕',
+                '自带中文字幕': '自带中文字幕',
+                '自带双语字幕(含中文)': '自带双语字幕(含中文)',
+                '附件中文字幕': '附件中文字幕',
+                '附件双语字幕': '附件双语字幕'
             }
         },
         region: {
             label: '地区',
             options: {
                 'all': '全部',
-                'cn': '大陆',
-                'us': '欧美',
-                'jp': '日本'
+                '中国': '中国',
+                '英国': '英国',
+                '美国': '美国',
+                '日本': '日本',
+                '韩国': '韩国',
+                '其他': '其他'
+            }
+        },
+        resolution: {
+            label: '分辨率',
+            options: {
+                'all': '全部',
+                '4K': '4K',
+                '2K': '2K',
+                '1080P': '1080P',
+                '720P': '720P',
+                'SD': 'SD',
+                '无损音源': '无损音源',
+                '杜比全景声': '杜比全景声',
+                '其他': '其他'
             }
         }
     };
-
     const [selectedFilters, setSelectedFilters] = useState(
         location.state?.savedFilters ||
         Object.keys(filterCategories).reduce((acc, category) => {
@@ -315,27 +449,54 @@
         }, {})
     );
 
-
-// 处理筛选条件变更
+    // 处理筛选条件变更
     const handleFilterSelect = (category, value) => {
         setSelectedFilters(prev => ({
             ...prev,
-            [category]: prev[category] === value ? null : value // 点击已选中的则取消
+            [category]: prev[category] === value ? 'all' : value
         }));
     };
 
-//应用筛选条件
-    const applyFilters = () => {
-        const result = torrentPosts.filter(resource => {
-            return Object.entries(selectedFilters).every(([category, selectedValue]) => {
-                if (selectedValue === 'all') return true;
-                if (category === 'subtitle') {
-                    return resource.subtitle === (selectedValue === 'yes');
-                }
-                return resource[category] === selectedValue;
-            });
-        });
-        setFilteredResources(result);
+    // 应用筛选条件
+    const applyFilters = async () => {
+        try {
+            setTorrentLoading(true);
+            
+            // 构建查询参数
+            const params = {
+                page: 1, // 从第一页开始
+                size: 5 
+            };
+            
+            // 添加筛选条件
+            if (selectedFilters.type !== 'all') {
+                params.category = selectedFilters.type;
+            }
+            if (selectedFilters.subtitle !== 'all') {
+                params.subtitle = selectedFilters.subtitle;
+            }
+            if (selectedFilters.region !== 'all') {
+                params.region = selectedFilters.region;
+            }
+            if (selectedFilters.resolution !== 'all') {
+                params.resolution = selectedFilters.resolution;
+            }
+            
+            // 调用API获取筛选结果
+            const response = await api.get('http://localhost:8088/torrent', { params });
+            
+            if (response.data.code === 200) {
+                setTorrentPosts(response.data.data.records);
+                setTotalPages(Math.ceil(response.data.data.total / 5));
+                setCurrentPage(1);
+            } else {
+                setTorrentError(response.data.message || '筛选失败');
+            }
+        } catch (err) {
+            setTorrentError(err.message || '筛选失败');
+        } finally {
+            setTorrentLoading(false);
+        }
     };
 
 
@@ -346,43 +507,37 @@
         }
     }, [location.state]);
 
-
-    useEffect(() => {
-        const token = localStorage.getItem('token');
-        if (!token) {
-            navigate('/login');
-            return;
-        }
-
-        /* 保留但注释掉实际的用户信息获取
-          const fetchUserInfo = async () => {
-            try {
-              const response = await getUserInfo(token);
-              if (response.data.code === 200) {
-                setUserInfo(response.data.data);
-              } else {
-                setError('获取用户信息失败');
-              }
-            } catch (err) {
-              setError('获取用户信息失败');
-            } finally {
-              setLoading(false);
-            }
-          };
-
-          fetchUserInfo();
-          */
-
-        // 模拟用户信息
-        setUserInfo({
-            name: localStorage.getItem('username') || '演示用户', // 确保这里读取的是最新值
+    // 在Dashboard.jsx中修改useEffect
+useEffect(() => {
+    const token = localStorage.getItem('token');
+    if (!token) {
+        navigate('/login');
+        return;
+    }
+    
+    const fetchUserInfo = async () => {
+        try {
+          setLoading(true);
+          const backendData = await getUserInfo(); // 调用修改后的方法
+          console.log('后端返回的用户数据:', backendData); // 调试用
+          
+          setUserInfo({
+            name: backendData.username || '演示用户',
             avatar: 'https://via.placeholder.com/40',
-            isAdmin: true
-        });
-        setLoading(false);
-    }, [navigate]);
+            isAdmin: backendData.authority === 'ADMIN' // 检查 authority 是否为 "ADMIN"
+          });
+        } catch (error) {
+          console.error('获取用户信息失败:', error);
+          setError('获取用户信息失败');
+        } finally {
+          setLoading(false);
+        }
+      };
+    
+    fetchUserInfo();
+}, [navigate]);
 
-    // 轮播图自动切换效果
+
     useEffect(() => {
         if (activeTab === 'announcement') {
             const timer = setInterval(() => {
@@ -403,6 +558,22 @@
             case 'announcement':
                 return (
                     <div className="content-area" data-testid="announcement-section">
+                        <div className="section-search-container">
+                            <input
+                                type="text"
+                                placeholder="搜索公告..."
+                                value={announcementSearch}
+                                onChange={(e) => setAnnouncementSearch(e.target.value)}
+                                className="section-search-input"
+                                onKeyPress={(e) => e.key === 'Enter' && handleSearchAnnouncement()}
+                            />
+                            <button 
+                                className="search-button"
+                                onClick={handleSearchAnnouncement}
+                            >
+                                搜索
+                            </button>
+                        </div>
                         {/* 轮播图区域 */}
                         <div className="carousel-container">
                             <div className={`carousel-slide ${currentSlide === 0 ? 'active' : ''}`}>
@@ -443,6 +614,31 @@
             case 'share':
                 return (
                     <div className="content-area" data-testid="share-section">
+                        {/* 分享区搜索框 */}
+                        <div className="section-search-container">
+                            <input
+                                type="text"
+                                placeholder="搜索资源..."
+                                value={shareSearch}
+                                onChange={(e) => setShareSearch(e.target.value)}
+                                className="section-search-input"
+                                onKeyPress={(e) => e.key === 'Enter' && handleSearchShare()}
+                            />
+                            <button 
+                                className="search-button"
+                                onClick={handleSearchShare}
+                            >
+                                搜索
+                            </button>
+                            <button 
+                                className="reset-button"
+                                onClick={handleResetShareSearch}  // 使用新的重置函数
+                                style={{marginLeft: '10px'}}
+                            >
+                                重置
+                            </button>
+                        </div>
+
                         {/* 上传按钮 - 添加在筛选区上方 */}
                         <div className="upload-header">
                             <button
@@ -517,19 +713,26 @@
                                                 <option value="动漫">动漫</option>
                                                 <option value="综艺">综艺</option>
                                                 <option value="音乐">音乐</option>
+                                                <option value="其他">其他</option>
                                             </select>
                                         </div>
 
-                                        {/* 新增地区输入框 */}
+                                        {/* 修改后的地区下拉框 */}
                                         <div className="form-group">
                                             <label>地区</label>
-                                            <input
-                                                type="text"
+                                            <select
                                                 value={uploadData.region || ''}
                                                 onChange={(e) => setUploadData({...uploadData, region: e.target.value})}
-                                                placeholder="例如: 美国, 中国, 日本等"
                                                 required
-                                            />
+                                            >
+                                                <option value="">请选择</option>
+                                                <option value="中国">中国</option>
+                                                <option value="英国">英国</option>
+                                                <option value="美国">美国</option>
+                                                <option value="日本">日本</option>
+                                                <option value="韩国">韩国</option>
+                                                <option value="其他">其他</option>
+                                            </select>
                                         </div>
 
                                         {/* 添加分辨率下拉框 */}
@@ -637,7 +840,7 @@
                                         <p className="resource-subtitle">字幕: {torrent.subtitle}</p>
                                     </div>
                                     <div className="resource-stats">
-                                        <span className="stat">{torrent.size}</span>
+                                    <span className="stat">{torrent.size}</span>
                                         <span className="stat">发布者: {torrent.username}</span>
                                     </div>
                                     <button
@@ -653,7 +856,7 @@
                             ))}
                         </div>
 
-                        {/* 分页控件 */}
+                    {totalPages > 1 && (
                         <div className="pagination">
                             <button
                                 onClick={() => fetchTorrentPosts(currentPage - 1)}
@@ -679,12 +882,30 @@
                                 下一页
                             </button>
                         </div>
+                        )}
                     </div>
                 );
             // 在Dashboard.jsx的renderContent函数中修改case 'request'部分
             case 'request':
                 return (
                     <div className="content-area" data-testid="request-section">
+                        {/* 求种区搜索框 */}
+                        <div className="section-search-container">
+                            <input
+                                type="text"
+                                placeholder="搜索求种..."
+                                value={requestSearch}
+                                onChange={(e) => setRequestSearch(e.target.value)}
+                                className="section-search-input"
+                                onKeyPress={(e) => e.key === 'Enter' && handleSearchRequest()}
+                            />
+                            <button 
+                                className="search-button"
+                                onClick={handleSearchRequest}
+                            >
+                                搜索
+                            </button>
+                        </div>
                         {/* 求种区帖子列表 */}
                         <div className="request-list">
                             {[
@@ -734,6 +955,31 @@
             case 'help':
                 return (
                     <div className="content-area" data-testid="help-section">
+                        {/* 求助区搜索框 */}
+                        <div className="section-search-container">
+                            <input
+                                type="text"
+                                placeholder="搜索求助..."
+                                value={helpSearch}
+                                onChange={(e) => setHelpSearch(e.target.value)}
+                                className="section-search-input"
+                                onKeyPress={(e) => e.key === 'Enter' && handleSearchHelp()}
+                            />
+                            <button 
+                                className="search-button"
+                                onClick={handleSearchHelp}
+                            >
+                                搜索
+                            </button>
+                            <button 
+                                className="reset-button"
+                                onClick={handleResetHelpSearch}
+                                style={{marginLeft: '10px'}}
+                            >
+                                重置
+                            </button>
+                        </div>
+
                         {/* 新增发帖按钮 */}
                         <div className="post-header">
                             <button
@@ -891,14 +1137,9 @@
         <div className="dashboard-container" data-testid="dashboard-container">
             {/* 顶部栏 */}
             <div className="top-bar" data-testid="top-bar">
-                {/* 搜索框 */}
-                <div className="search-container">
-                    <input
-                        type="text"
-                        placeholder="搜索种子、用户..."
-                        className="search-input"
-                    />
-                    <button className="search-button">搜索</button>
+                {/* 平台名称替换搜索框 */}
+                <div className="platform-name">
+                    <h2>PT资源站</h2>
                 </div>
 
                 <div className="user-actions">
