diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx
index 97a01cc..836daa7 100644
--- a/src/components/Dashboard.jsx
+++ b/src/components/Dashboard.jsx
@@ -3,7 +3,7 @@
 // import { getUserInfo } from '../api/auth';  
 import {createTorrent, getTorrents} from '../api/torrent';
 import './Dashboard.css';
-import {createPost, getPosts} from '../api/helpPost';
+import {createPost, getPosts, getPostDetail} from '../api/helpPost';
 
 
 const Dashboard = ({onLogout}) => {
@@ -34,6 +34,8 @@
     const [helpError, setHelpError] = useState(null);
     const [currentPage, setCurrentPage] = useState(1);
     const [totalPages, setTotalPages] = useState(1);
+    const [likedPosts,setLikedPosts] = useState({});
+
 
     // 添加状态
     const [torrentPosts, setTorrentPosts] = useState([]);
@@ -179,28 +181,29 @@
     const handlePostSubmit = async (e) => {
         e.preventDefault();
         try {
-            const username = localStorage.getItem('username');
-            const response = await createPost(
-                postTitle,
-                postContent,
-                username
-            );
-
-            if (response.data.code === 200) {
-                // 刷新帖子列表
-                await fetchHelpPosts();
-                // 重置表单
-                setShowPostModal(false);
-                setPostTitle('');
-                setPostContent('');
-                setSelectedImage(null);
-            } else {
-                setHelpError(response.data.message || '发帖失败');
-            }
+          const username = localStorage.getItem('username');
+          const response = await createPost(
+            postTitle,
+            postContent,
+            username,
+            selectedImage
+          );
+          
+          if (response.data.code === 200) {
+            // 刷新帖子列表
+            await fetchHelpPosts(currentPage);
+            // 重置表单
+            setShowPostModal(false);
+            setPostTitle('');
+            setPostContent('');
+            setSelectedImage(null);
+          } else {
+            setHelpError(response.data.message || '发帖失败');
+          }
         } catch (err) {
-            setHelpError(err.message || '发帖失败');
+          setHelpError(err.message || '发帖失败');
         }
-    };
+      };
 
     // 获取Torrent帖子列表
     const fetchTorrentPosts = async (page = 1) => {
@@ -232,20 +235,40 @@
     const fetchHelpPosts = async (page = 1) => {
         setHelpLoading(true);
         try {
-            const response = await getPosts(page);
-            if (response.data.code === 200) {
-                setHelpPosts(response.data.data.records);
-                setTotalPages(Math.ceil(response.data.data.total / 5)); // 假设每页5条
-                setCurrentPage(page);
-            } else {
-                setHelpError(response.data.message || '获取求助帖失败');
-            }
+          const response = await getPosts(page);
+          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)); // 假设每页5条
+            setCurrentPage(page);
+          } else {
+            setHelpError(response.data.message || '获取求助帖失败');
+          }
         } catch (err) {
-            setHelpError(err.message || '获取求助帖失败');
+          setHelpError(err.message || '获取求助帖失败');
         } finally {
-            setHelpLoading(false);
+          setHelpLoading(false);
         }
-    };
+      };
+
+
     useEffect(() => {
         if (activeTab === 'help') {
             fetchHelpPosts(currentPage);
