diff --git a/src/App.js b/src/App.js
index 8a6da3d..165caef 100644
--- a/src/App.js
+++ b/src/App.js
@@ -2,14 +2,16 @@
 import AuthPage from './pages/AuthPage/AuthPage';
 import HomePage from './pages/HomePage';
 import FriendMoments from './pages/FriendMoments/FriendMoments';
-import ForumPage from './pages/Forum/ForumPage';
+import ForumPage from './pages/Forum/posts-main/ForumPage';
 import SeedList from './pages/SeedList/SeedList';
-import PostDetailPage from './pages/Forum/PostDetail';
+import PostDetailPage from './pages/Forum/posts-detail/PostDetailPage';
 import { UserProvider } from './context/UserContext';
 import PublishSeed from './pages/PublishSeed/PublishSeed';
 import SeedDetail from './pages/SeedList/SeedDetail/SeedDetail'; 
 import InterestGroup from './pages/InterestGroup/InterestGroup';
 import UserProfile from './pages/UserCenter/UserProfile';
+import CreatePostPage from './pages/Forum/posts-create/CreatePostPage';
+
 
 function App() {
   return (
@@ -20,6 +22,7 @@
         <Route path="/friend-moments" component={FriendMoments} />
         <Route path="/forum" component={ForumPage} />
         <Route path="/forum/post/:postId" component={PostDetailPage} />
+        <Route path="/forum/create-post" element={CreatePostPage} />
         <Route path="/seed-list" component={SeedList} />
         <Route path="/publish-seed" component={PublishSeed} />
         <Route path="/seed/:seed_id" component={SeedDetail} /> {/* 新增路由 */}
diff --git a/src/pages/Forum/ForumPage.jsx b/src/pages/Forum/ForumPage.jsx
deleted file mode 100644
index f51e679..0000000
--- a/src/pages/Forum/ForumPage.jsx
+++ /dev/null
@@ -1,148 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { Link } from 'wouter';
-import axios from 'axios';
-import { GoodTwo, Comment } from '@icon-park/react';
-import Header from '../../components/Header'; 
-import './ForumPage.css';
-
-const API_BASE = process.env.REACT_APP_API_BASE;
-
-const ForumPage = () => {
-  const [posts, setPosts] = useState([]);
-  const [total, setTotal] = useState(0);
-  const [page, setPage] = useState(1);
-  const [size, setSize] = useState(10);
-  const [loading, setLoading] = useState(true);
-  const [errorMsg, setErrorMsg] = useState('');
-
-  const totalPages = Math.ceil(total / size);
-
-  useEffect(() => {
-    const fetchPosts = async () => {
-      setLoading(true);
-      setErrorMsg('');
-      try {
-        const response = await axios.get(`${API_BASE}/echo/forum/posts/getAllPost`, {
-          params: { page, size }
-        });
-        const postsData = response.data.posts || [];
-
-        const userIds = [...new Set(postsData.map(post => post.user_id))];
-        const userProfiles = await Promise.all(
-          userIds.map(async id => {
-            try {
-              const res = await axios.get(`${API_BASE}/echo/user/profile`, {
-                params: { user_id: id }
-              });
-              return { id, profile: res.data };
-            } catch {
-              return { id, profile: { nickname: '未知用户', avatar_url: 'default-avatar.png' } };
-            }
-          })
-        );
-
-        const userMap = {};
-        userProfiles.forEach(({ id, profile }) => {
-          userMap[id] = profile;
-        });
-
-        const postsWithProfiles = postsData.map(post => ({
-          ...post,
-          userProfile: userMap[post.user_id] || { nickname: '未知用户', avatar_url: 'default-avatar.png' }
-        }));
-
-        setPosts(postsWithProfiles);
-        setTotal(response.data.total || 0);
-      } catch (error) {
-        console.error('获取帖子失败:', error);
-        setErrorMsg('加载失败，请稍后重试');
-      } finally {
-        setLoading(false);
-      }
-    };
-    fetchPosts();
-  }, [page, size]);
-
-  const toggleLike = async (postId, liked) => {
-    try {
-      if (liked) {
-        await axios.delete(`${API_BASE}/echo/forum/posts/${postId}/unlike`);
-      } else {
-        await axios.post(`${API_BASE}/echo/forum/posts/${postId}/like`);
-      }
-
-      setPosts(prevPosts =>
-        prevPosts.map(post =>
-          post.id === postId
-            ? {
-                ...post,
-                liked: !liked,
-                likeCount: liked ? post.likeCount - 1 : post.likeCount + 1
-              }
-            : post
-        )
-      );
-    } catch (error) {
-      console.error('点赞操作失败:', error);
-    }
-  };
-
-  return (
-    <div className="forum-page">
-      <Header /> {/* 使用 Header 组件 */}
-      <div className="forum-content">
-        <h2>论坛帖子列表</h2>
-
-        {loading ? (
-          <p>加载中...</p>
-        ) : errorMsg ? (
-          <p className="error-text">{errorMsg}</p>
-        ) : posts.length === 0 ? (
-          <p>暂无帖子。</p>
-        ) : (
-          <div className="post-list">
-            {posts.map(post => (
-              <div key={post.id} className="post-card">
-                <div className="post-card-top">
-                  <div className="user-info">
-                    <img className="avatar" src={post.userProfile.avatar_url} alt="头像" />
-                    <span className="nickname">{post.userProfile.nickname}</span>
-                  </div>
-                  {post.cover_image_url && (
-                    <img className="cover-image" src={post.cover_image_url} alt="封面" />
-                  )}
-                </div>
-                <h3>{post.title}</h3>
-                <p className="post-meta">
-                  发布时间：{new Date(post.created_at).toLocaleString()}
-                </p>
-                <div className="post-actions">
-                  <button
-                    className="icon-btn"
-                    onClick={() => toggleLike(post.id, post.liked)}
-                  >
-                    <GoodTwo theme="outline" size="24" fill={post.liked ? '#f00' : '#fff'} />
-                    <span>{post.likeCount || 0}</span>
-                  </button>
-                  <Link href={`/forum/post/${post.id}`} className="icon-btn">
-                    <Comment theme="outline" size="24" fill="#fff" />
-                    <span>{post.commentCount || 0}</span>
-                  </Link>
-                </div>
-                <Link href={`/forum/post/${post.id}`} className="btn-secondary">查看详情</Link>
-              </div>
-            ))}
-          </div>
-        )}
-
-        <div className="pagination">
-          <button disabled={page === 1} onClick={() => setPage(page - 1)}>上一页</button>
-          <span>第 {page} 页 / 共 {totalPages} 页</span>
-          <button disabled={page === totalPages} onClick={() => setPage(page + 1)}>下一页</button>
-        </div>
-      </div>
-    </div>
-  );
-};
-
-export default ForumPage;
diff --git a/src/pages/Forum/PostDetail.jsx b/src/pages/Forum/PostDetail.jsx
deleted file mode 100644
index f7067bf..0000000
--- a/src/pages/Forum/PostDetail.jsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import React, { useState, useEffect } from'react';
-import axios from 'axios';
-
-const PostDetail = ({ post_id }) => {
-  const [post, setPost] = useState({});
-
-  useEffect(() => {
-    const fetchPost = async () => {
-      try {
-        const response = await axios.get(`/echo/forum/posts/${post_id}`);
-        setPost(response.data);
-      } catch (error) {
-        console.error('Error fetching post detail:', error);
-      }
-    };
-    fetchPost();
-  }, [post_id]);
-
-  return (
-    <div>
-      <h1>{post.title}</h1>
-      <p>作者: {post.author}</p>
-      <p>内容: {post.Postcontent}</p>
-      {post.imgUrl && <img src={post.imgUrl} alt={post.title} />}
-    </div>
-  );
-};
-
-export default PostDetail;
\ No newline at end of file
diff --git a/src/pages/Forum/PostDetailPage.jsx b/src/pages/Forum/PostDetailPage.jsx
deleted file mode 100644
index 6cdabd6..0000000
--- a/src/pages/Forum/PostDetailPage.jsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { useRoute } from 'wouter';
-import axios from 'axios';
-import './PostDetailPage.css';
-
-const API_BASE = process.env.REACT_APP_API_BASE;
-
-const PostDetailPage = () => {
-  const [post, setPost] = useState(null);
-  const [loading, setLoading] = useState(true);
-  const [errorMsg, setErrorMsg] = useState('');
-  
-  // 使用 wouter 的 useRoute 获取 postId 参数
-  const { params } = useRoute('/forum/post/:postId');
-  const postId = params?.postId;
-
-  useEffect(() => {
-    const fetchPostDetail = async () => {
-      setLoading(true);
-      setErrorMsg('');
-      try {
-        const response = await axios.get(`${API_BASE}/echo/forum/posts/${postId}`);
-        setPost(response.data);
-      } catch (error) {
-        console.error('获取帖子详情失败:', error);
-        setErrorMsg('加载失败，请稍后重试');
-      } finally {
-        setLoading(false);
-      }
-    };
-
-    if (postId) {
-      fetchPostDetail();
-    }
-  }, [postId]);
-
-  if (loading) return <p>加载中...</p>;
-  if (errorMsg) return <p className="error-text">{errorMsg}</p>;
-  if (!post) return <p>没有找到该帖子。</p>;
-
-  return (
-    <div className="post-detail-page">
-      <h2>{post.title}</h2>
-      <div className="post-meta">
-        <span>作者：{post.userProfile.nickname}</span>
-        <span>发布时间：{new Date(post.created_at).toLocaleString()}</span>
-      </div>
-      <div className="post-content">
-        <p>{post.content}</p>
-      </div>
-      {post.cover_image_url && (
-        <div className="post-image">
-          <img src={post.cover_image_url} alt="封面" />
-        </div>
-      )}
-    </div>
-  );
-};
-
-export default PostDetailPage;
diff --git a/src/pages/Forum/posts-create/CreatePost.css b/src/pages/Forum/posts-create/CreatePost.css
new file mode 100644
index 0000000..7707a0c
--- /dev/null
+++ b/src/pages/Forum/posts-create/CreatePost.css
@@ -0,0 +1,64 @@
+.create-post-page {
+    display: flex;
+    flex-direction: column;
+    padding: 20px;
+    gap: 20px;
+  }
+  
+  .title-and-button {
+    display: flex;
+    align-items: center;
+    gap: 10px;
+  }
+  
+  .title-input {
+    flex: 1;
+    height: 40px;
+    padding: 0 10px;
+    font-size: 16px;
+  }
+  
+  .submit-button {
+    height: 40px;
+    padding: 0 20px;
+    font-size: 16px;
+    background-color: #409eff;
+    color: white;
+    border: none;
+    border-radius: 4px;
+  }
+  
+  .layout {
+    display: flex;
+    gap: 20px;
+  }
+  
+  .main-content {
+    flex: 3;
+  }
+  
+  .content-editor {
+    width: 100%;
+    height: 650px;
+    padding: 10px;
+    font-size: 16px;
+    border: 1px solid #ccc;
+  }
+  
+  .sidebar-content {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    gap: 20px;
+  }
+  
+  .sidebar-section {
+    background: #f9f9f9;
+    padding: 10px;
+    border-radius: 6px;
+  }
+  
+  .sidebar-section p {
+    margin: 0 0 10px 0;
+  }
+  
\ No newline at end of file
diff --git a/src/pages/Forum/CreatePost.jsx b/src/pages/Forum/posts-create/CreatePost.jsx
similarity index 66%
rename from src/pages/Forum/CreatePost.jsx
rename to src/pages/Forum/posts-create/CreatePost.jsx
index 1ac2d84..a03a836 100644
--- a/src/pages/Forum/CreatePost.jsx
+++ b/src/pages/Forum/posts-create/CreatePost.jsx
@@ -2,10 +2,13 @@
 import React, { useState } from 'react';
 import axios from 'axios';
 
+const API_BASE = process.env.REACT_APP_API_BASE;
+
 const CreatePost = ({ userId }) => {
   const [title, setTitle] = useState('');
   const [content, setContent] = useState('');
-  const [imageUrl, setImageUrl] = useState('');
+  const [imgUrl, setImageUrl] = useState('');
+  const [isAnonymous, setIsAnonymous] = useState(false);
 
   const handleSubmit = async (e) => {
     e.preventDefault();
@@ -13,29 +16,31 @@
     try {
       const postData = {
         title,
-        Postcontent: content,
+        postContent: content,
+        postType: isAnonymous,
       };
 
-      if (imageUrl.trim()) {
-        postData.imgerrul = imageUrl;
+      if (imgUrl.trim()) {
+        postData.imgUrl = imgUrl;
       }
 
       const response = await axios.post(
-        `/echo/forum/posts/${userId}/creatPost`,
+        `${API_BASE}/echo/forum/posts/${userId}/createPost`,
         postData
       );
+      
 
       if (response.status === 201) {
         alert('帖子创建成功！');
-        // 清空表单或跳转页面
         setTitle('');
         setContent('');
         setImageUrl('');
+        setIsAnonymous(false);
       }
     } catch (error) {
-      console.error('帖子创建失败：', error);
+      console.error('帖子创建失败：', error.response?.data || error.message);
       alert('创建失败，请重试');
-    }
+    }    
   };
 
   return (
@@ -63,14 +68,24 @@
           <label>图片 URL（可选）：</label>
           <input
             type="text"
-            value={imageUrl}
+            value={imgUrl}
             onChange={(e) => setImageUrl(e.target.value)}
           />
         </div>
+        <div>
+          <label>
+            <input
+              type="checkbox"
+              checked={isAnonymous}
+              onChange={(e) => setIsAnonymous(e.target.checked)}
+            />
+            匿名发布
+          </label>
+        </div>
         <button type="submit">发布</button>
       </form>
     </div>
   );
 };
 
-export default CreatePost;
+export default CreatePost;
\ No newline at end of file
diff --git a/src/pages/Forum/posts-create/CreatePostPage.jsx b/src/pages/Forum/posts-create/CreatePostPage.jsx
new file mode 100644
index 0000000..ea2505c
--- /dev/null
+++ b/src/pages/Forum/posts-create/CreatePostPage.jsx
@@ -0,0 +1,11 @@
+// src/pages/Forum/posts-create/CreatePostPage.jsx
+import React from 'react';
+import { useUserStore } from '../../store/user';
+import CreatePost from './CreatePost';
+
+const CreatePostPage = () => {
+  const { user } = useUserStore(); // 拿到 user
+  return <CreatePost userId={user?.id} />;
+};
+
+export default CreatePostPage;
diff --git a/src/pages/Forum/PostDetailPage.css b/src/pages/Forum/posts-detail/PostDetailPage.css
similarity index 100%
rename from src/pages/Forum/PostDetailPage.css
rename to src/pages/Forum/posts-detail/PostDetailPage.css
diff --git a/src/pages/Forum/posts-detail/PostDetailPage.jsx b/src/pages/Forum/posts-detail/PostDetailPage.jsx
new file mode 100644
index 0000000..c0f218f
--- /dev/null
+++ b/src/pages/Forum/posts-detail/PostDetailPage.jsx
@@ -0,0 +1,310 @@
+import React, { useState, useEffect } from 'react';
+import { useRoute } from 'wouter';
+import {
+    getPostDetail,
+    getPostComments,
+    likePost,
+    unlikePost,
+    addCommentToPost,
+    replyToComment,
+    likeComment,
+    unlikeComment,
+    getUserInfo
+} from './api';
+import './PostDetailPage.css';
+import axios from 'axios';
+
+const API_BASE = process.env.REACT_APP_API_BASE;
+
+const PostHeader = ({ post }) => {
+    const anonymousAvatar = '/assets/img/anonymous.jpg';
+    return (
+        <div className="post-header">
+            <div className="author-info">
+                <img className="avatar" src={post.isAnonymous? anonymousAvatar : post.userProfile.avatar_url} alt="头像" />
+                <span className="author-name">{post.isAnonymous? '某同学' : post.userProfile.nickname}</span>
+            </div>
+            <h1 className="post-title">{post.title}</h1>
+        </div>
+    );
+};
+
+const PostContent = ({ content }) => {
+    return (
+        <div className="post-content" dangerouslySetInnerHTML={{ __html: content }} />
+    );
+};
+
+const PostActions = ({ post, onLike, onFavorite }) => {
+    return (
+        <div className="post-actions">
+            <div className="action-item" onClick={onLike}>
+                <i className={post.liked? 'liked' : 'unliked'} />
+                <span>{post.likeCount || 0}</span>
+            </div>
+            <div className="action-item" onClick={onFavorite}>
+                <i className={post.favorited? 'favorited' : 'unfavorited'} />
+                <span>{post.favorites || 0}</span>
+            </div>
+        </div>
+    );
+};
+
+const CommentInput = ({ onSubmitComment, isFlag }) => {
+    const [content, setContent] = useState('');
+
+    useEffect(() => {
+        if (isFlag) {
+            setContent('');
+        }
+    }, [isFlag]);
+
+    const handleSubmit = () => {
+        if (content) {
+            onSubmitComment(content);
+        }
+    };
+
+    return (
+        <div className="comment-input">
+            <textarea
+                value={content}
+                onChange={(e) => setContent(e.target.value)}
+                placeholder="写下你的评论..."
+                className="comment-textarea"
+            />
+            <div className="button-container">
+                <button
+                    type="button"
+                    onClick={handleSubmit}
+                    disabled={!content}
+                    className="submit-button"
+                >
+                    发布评论
+                </button>
+            </div>
+        </div>
+    );
+};
+
+const CommentItem = ({ comment, onLikeComment, onReplyComment }) => {
+    const [showReplyInput, setShowReplyInput] = useState(false);
+    const [replyContent, setReplyContent] = useState('');
+
+    const queryUserInfo = async (id) => {
+        if (!id) {
+            return;
+        }
+        try {
+            const userData = await getUserInfo(id);
+            console.log(userData);
+            // 这里可以添加跳转逻辑等，比如根据用户ID跳转到对应个人信息页面
+        } catch (error) {
+            console.error('获取用户信息失败:', error);
+        }
+    };
+
+    const handleLike = () => {
+        onLikeComment(comment);
+    };
+
+    const handleReply = () => {
+        setShowReplyInput(!showReplyInput);
+    };
+
+    const handleSubmitReply = () => {
+        if (replyContent) {
+            onReplyComment(comment, replyContent);
+            setReplyContent('');
+            setShowReplyInput(false);
+        }
+    };
+
+    return (
+        <div className="comment-item">
+            <img className="avatar" src={comment.author.avatar_url} alt="头像" onClick={() => queryUserInfo(comment.author.userId)} />
+            <div className="comment-content">
+                <div className="comment-author">{comment.author.nickname}</div>
+                <div className="comment-text">{comment.content}</div>
+                <div className="comment-actions">
+                    <div className="action-item" onClick={handleLike}>
+                        <i className={comment.liked? 'liked' : 'unliked'} />
+                        <span>{comment.likeCount || 0}</span>
+                    </div>
+                    <button type="button" onClick={handleReply}>回复</button>
+                </div>
+                {showReplyInput && (
+                    <div className="reply-input">
+                        <textarea
+                            value={replyContent}
+                            onChange={(e) => setReplyContent(e.target.value)}
+                            placeholder="写下你的回复..."
+                            className="reply-textarea"
+                        />
+                        <button
+                            type="button"
+                            onClick={handleSubmitReply}
+                            disabled={!replyContent}
+                            className="submit-button"
+                        >
+                            发布回复
+                        </button>
+                    </div>
+                )}
+                {comment.replies && comment.replies.length > 0 && (
+                    <div className="reply-list">
+                        {comment.replies.map(reply => (
+                            <CommentItem
+                                key={reply.id}
+                                comment={reply}
+                                onLikeComment={onLikeComment}
+                                onReplyComment={onReplyComment}
+                            />
+                        ))}
+                    </div>
+                )}
+            </div>
+        </div>
+    );
+};
+
+const CommentsList = ({ comments, onLikeComment, onReplyComment }) => {
+    return (
+        <div className="comments-list">
+            <h2>评论</h2>
+            {comments.map(comment => (
+                <CommentItem
+                    key={comment.id}
+                    comment={comment}
+                    onLikeComment={onLikeComment}
+                    onReplyComment={onReplyComment}
+                />
+            ))}
+        </div>
+    );
+};
+
+const PostDetailPage = () => {
+    const [post, setPost] = useState(null);
+    const [loading, setLoading] = useState(true);
+    const [errorMsg, setErrorMsg] = useState('');
+    const [comments, setComments] = useState([]);
+    const [isFlag, setIsFlag] = useState(false);
+
+    const { params } = useRoute('/forum/post/:postId');
+    const postId = params?.postId;
+
+    useEffect(() => {
+        const fetchPostDetail = async () => {
+            setLoading(true);
+            setErrorMsg('');
+            try {
+                const postDetail = await getPostDetail(postId);
+                const postComments = await getPostComments(postId);
+                setPost(postDetail);
+                setComments(postComments);
+            } catch (error) {
+                console.error('获取帖子详情失败:', error);
+                setErrorMsg('加载失败，请稍后重试');
+            } finally {
+                setLoading(false);
+            }
+        };
+
+        if (postId) {
+            fetchPostDetail();
+        }
+    }, [postId]);
+
+    const handleLike = async () => {
+        if (!post.liked) {
+            try {
+                await likePost(postId);
+                const newPost = { ...post, liked: true, likeCount: post.likeCount + 1 };
+                setPost(newPost);
+            } catch (err) {
+                console.error('点赞失败:', err);
+            }
+        } else {
+            try {
+                await unlikePost(postId);
+                const newPost = { ...post, liked: false, likeCount: post.likeCount - 1 };
+                setPost(newPost);
+            } catch (err) {
+                console.error('取消点赞失败:', err);
+            }
+        }
+    };
+
+    const handleFavorite = () => {
+        const newPost = { ...post, favorited: !post.favorited, favorites: post.favorited? post.favorites - 1 : post.favorites + 1 };
+        setPost(newPost);
+        if (newPost.favorited) {
+            axios.post(`${API_BASE}/echo/forum/posts/${postId}/favorite`).catch(err => {
+                console.error('收藏失败:', err);
+            });
+        } else {
+            axios.delete(`${API_BASE}/echo/forum/posts/${postId}/unfavorite`).catch(err => {
+                console.error('取消收藏失败:', err);
+            });
+        }
+    };
+
+    const likeCommentAction = async (comment) => {
+        if (!comment.liked) {
+            try {
+                await likeComment(comment.id);
+                const newComment = { ...comment, liked: true, likeCount: comment.likeCount + 1 };
+                setComments(comments.map(c => c.id === comment.id? newComment : c));
+            } catch (err) {
+                console.error('点赞评论失败:', err);
+            }
+        } else {
+            try {
+                await unlikeComment(comment.id);
+                const newComment = { ...comment, liked: false, likeCount: comment.likeCount - 1 };
+                setComments(comments.map(c => c.id === comment.id? newComment : c));
+            } catch (err) {
+                console.error('取消点赞评论失败:', err);
+            }
+        }
+    };
+
+    const replyCommentAction = async (comment, replyContent) => {
+        try {
+            await replyToComment(comment.id, replyContent);
+            setIsFlag(true);
+            const commentResponse = await getPostComments(postId);
+            setComments(commentResponse.data);
+        } catch (error) {
+            console.error('回复评论失败:', error);
+        }
+    };
+
+    const addCommentAction = async (content) => {
+        try {
+            await addCommentToPost(postId, content);
+            setIsFlag(true);
+            const commentResponse = await getPostComments(postId);
+            setComments(commentResponse.data);
+        } catch (error) {
+            console.error('添加评论失败:', error);
+        }
+    };
+
+    if (loading) return <p>加载中...</p>;
+    if (errorMsg) return <p className="error-text">{errorMsg}</p>;
+    if (!post) return <p>没有找到该帖子。</p>;
+
+    return (
+        <div className="post-detail-page">
+            <PostHeader post={post} />
+            <PostContent content={post.content} />
+            <PostActions post={post} onLike={handleLike} onFavorite={handleFavorite} />
+            <CommentInput onSubmitComment={addCommentAction} isFlag={isFlag} />
+            <CommentsList comments={comments} onLikeComment={likeCommentAction} onReplyComment={replyCommentAction} />
+        </div>
+    );
+};
+
+export default PostDetailPage;
\ No newline at end of file
diff --git a/src/pages/Forum/posts-detail/api.js b/src/pages/Forum/posts-detail/api.js
new file mode 100644
index 0000000..924cba9
--- /dev/null
+++ b/src/pages/Forum/posts-detail/api.js
@@ -0,0 +1,57 @@
+import axios from 'axios';
+
+const API_BASE = process.env.REACT_APP_API_BASE;
+
+// 获取帖子详情
+export const getPostDetail = async (postId) => {
+    const response = await axios.get(`${API_BASE}/echo/forum/posts/${postId}/getPost`);
+    return response.data;
+};
+
+// 获取帖子评论
+export const getPostComments = async (postId) => {
+    const response = await axios.get(`${API_BASE}/echo/forum/posts/${postId}/getAllComments`);
+    return response.data;
+};
+
+// 点赞帖子
+export const likePost = async (postId) => {
+    const response = await axios.post(`${API_BASE}/echo/forum/posts/${postId}/like`);
+    return response.data;
+};
+
+// 取消点赞帖子
+export const unlikePost = async (postId) => {
+    const response = await axios.delete(`${API_BASE}/echo/forum/posts/${postId}/unlike`);
+    return response.data;
+};
+
+// 添加评论
+export const addCommentToPost = async (postId, content) => {
+    const response = await axios.post(`${API_BASE}/echo/forum/posts/${postId}/comments`, { content });
+    return response.data;
+};
+
+// 回复评论
+export const replyToComment = async (commentId, replyContent) => {
+    const response = await axios.post(`${API_BASE}/echo/forum/comments/${commentId}/reply`, { content: replyContent });
+    return response.data;
+};
+
+// 点赞评论
+export const likeComment = async (commentId) => {
+    const response = await axios.post(`${API_BASE}/echo/forum/comments/${commentId}/like`);
+    return response.data;
+};
+
+// 取消点赞评论
+export const unlikeComment = async (commentId) => {
+    const response = await axios.delete(`${API_BASE}/echo/forum/comments/${commentId}/unlike`);
+    return response.data;
+};
+
+// 获取用户信息
+export const getUserInfo = async (userId) => {
+    const response = await axios.get(`${API_BASE}/user/${userId}/info`);
+    return response.data;
+};
\ No newline at end of file
diff --git a/src/pages/Forum/ForumPage.css b/src/pages/Forum/posts-main/ForumPage.css
similarity index 100%
rename from src/pages/Forum/ForumPage.css
rename to src/pages/Forum/posts-main/ForumPage.css
diff --git a/src/pages/Forum/posts-main/ForumPage.jsx b/src/pages/Forum/posts-main/ForumPage.jsx
new file mode 100644
index 0000000..5c7d622
--- /dev/null
+++ b/src/pages/Forum/posts-main/ForumPage.jsx
@@ -0,0 +1,177 @@
+// import React, { useState, useEffect } from 'react';
+// import { Link } from 'wouter';
+// import axios from 'axios';
+// import { GoodTwo, Comment } from '@icon-park/react';
+// import Header from '../../components/Header'; 
+// import './ForumPage.css';
+
+// const API_BASE = process.env.REACT_APP_API_BASE;
+
+// const ForumPage = () => {
+//   const [posts, setPosts] = useState([]);
+//   const [total, setTotal] = useState(0);
+//   const [page, setPage] = useState(1);
+//   const [size, setSize] = useState(10);
+//   const [loading, setLoading] = useState(true);
+//   const [errorMsg, setErrorMsg] = useState('');
+
+//   const totalPages = Math.ceil(total / size);
+
+//   useEffect(() => {
+//     const fetchPosts = async () => {
+//       setLoading(true);
+//       setErrorMsg('');
+//       try {
+//         const response = await axios.get(`${API_BASE}/echo/forum/posts/getAllPost`, {
+//           params: { page, size }
+//         });
+//         const postsData = response.data.posts || [];
+
+//         const userIds = [...new Set(postsData.map(post => post.user_id))];
+//         const userProfiles = await Promise.all(
+//           userIds.map(async id => {
+//             try {
+//               const res = await axios.get(`${API_BASE}/echo/user/profile`, {
+//                 params: { user_id: id }
+//               });
+//               return { id, profile: res.data };
+//             } catch {
+//               return { id, profile: { nickname: '未知用户', avatar_url: 'default-avatar.png' } };
+//             }
+//           })
+//         );
+
+//         const userMap = {};
+//         userProfiles.forEach(({ id, profile }) => {
+//           userMap[id] = profile;
+//         });
+
+//         const postsWithProfiles = postsData.map(post => ({
+//           ...post,
+//           userProfile: userMap[post.user_id] || { nickname: '未知用户', avatar_url: 'default-avatar.png' }
+//         }));
+
+//         setPosts(postsWithProfiles);
+//         setTotal(response.data.total || 0);
+//       } catch (error) {
+//         console.error('获取帖子失败:', error);
+//         setErrorMsg('加载失败，请稍后重试');
+//       } finally {
+//         setLoading(false);
+//       }
+//     };
+//     fetchPosts();
+//   }, [page, size]);
+
+//   const toggleLike = async (postId, liked) => {
+//     try {
+//       if (liked) {
+//         await axios.delete(`${API_BASE}/echo/forum/posts/${postId}/unlike`);
+//       } else {
+//         await axios.post(`${API_BASE}/echo/forum/posts/${postId}/like`);
+//       }
+
+//       setPosts(prevPosts =>
+//         prevPosts.map(post =>
+//           post.id === postId
+//             ? {
+//                 ...post,
+//                 liked: !liked,
+//                 likeCount: liked ? post.likeCount - 1 : post.likeCount + 1
+//               }
+//             : post
+//         )
+//       );
+//     } catch (error) {
+//       console.error('点赞操作失败:', error);
+//     }
+//   };
+
+//   return (
+//     <div className="forum-page">
+//       <Header /> {/* 使用 Header 组件 */}
+//       <div className="forum-content">
+//         <h2>论坛帖子列表</h2>
+
+//         {loading ? (
+//           <p>加载中...</p>
+//         ) : errorMsg ? (
+//           <p className="error-text">{errorMsg}</p>
+//         ) : posts.length === 0 ? (
+//           <p>暂无帖子。</p>
+//         ) : (
+//           <div className="post-list">
+//             {posts.map(post => (
+//               <div key={post.id} className="post-card">
+//                 <div className="post-card-top">
+//                   <div className="user-info">
+//                     <img className="avatar" src={post.userProfile.avatar_url} alt="头像" />
+//                     <span className="nickname">{post.userProfile.nickname}</span>
+//                   </div>
+//                   {post.cover_image_url && (
+//                     <img className="cover-image" src={post.cover_image_url} alt="封面" />
+//                   )}
+//                 </div>
+//                 <h3>{post.title}</h3>
+//                 <p className="post-meta">
+//                   发布时间：{new Date(post.created_at).toLocaleString()}
+//                 </p>
+//                 <div className="post-actions">
+//                   <button
+//                     className="icon-btn"
+//                     onClick={() => toggleLike(post.id, post.liked)}
+//                   >
+//                     <GoodTwo theme="outline" size="24" fill={post.liked ? '#f00' : '#fff'} />
+//                     <span>{post.likeCount || 0}</span>
+//                   </button>
+//                   <Link href={`/forum/post/${post.id}`} className="icon-btn">
+//                     <Comment theme="outline" size="24" fill="#fff" />
+//                     <span>{post.commentCount || 0}</span>
+//                   </Link>
+//                 </div>
+//                 <Link href={`/forum/post/${post.id}`} className="btn-secondary">查看详情</Link>
+//               </div>
+//             ))}
+//           </div>
+//         )}
+
+//         <div className="pagination">
+//           <button disabled={page === 1} onClick={() => setPage(page - 1)}>上一页</button>
+//           <span>第 {page} 页 / 共 {totalPages} 页</span>
+//           <button disabled={page === totalPages} onClick={() => setPage(page + 1)}>下一页</button>
+//         </div>
+//       </div>
+//     </div>
+//   );
+// };
+
+// export default ForumPage;
+
+import React, { useState } from 'react';
+import Header from '../../../components/Header';
+import SearchBar from './components/SearchBar';
+import CreatePostButton from './components/CreatePostButton';
+import PostList from './components/PostList';
+import './ForumPage.css';
+
+const ForumPage = () => {
+  const [searchQuery, setSearchQuery] = useState('');
+
+  const handleSearch = (query) => {
+    setSearchQuery(query);
+  };
+
+  return (
+    <div className="forum-page">
+      <Header />
+      <div className="toolbar">
+        <SearchBar onSearch={handleSearch} />
+        <CreatePostButton />
+      </div>
+      <PostList search={searchQuery} />
+    </div>
+  );
+};
+
+export default ForumPage;
+
diff --git a/src/pages/Forum/posts-main/components/CreatePostButton.css b/src/pages/Forum/posts-main/components/CreatePostButton.css
new file mode 100644
index 0000000..c118c7a
--- /dev/null
+++ b/src/pages/Forum/posts-main/components/CreatePostButton.css
@@ -0,0 +1,11 @@
+.create-post {
+    display: flex;
+    justify-content: center;
+    margin: 20px 0;
+  }
+  
+  .create-post-button {
+    display: flex;
+    align-items: center;
+  }
+  
\ No newline at end of file
diff --git a/src/pages/Forum/posts-main/components/CreatePostButton.jsx b/src/pages/Forum/posts-main/components/CreatePostButton.jsx
new file mode 100644
index 0000000..0632173
--- /dev/null
+++ b/src/pages/Forum/posts-main/components/CreatePostButton.jsx
@@ -0,0 +1,22 @@
+import React from 'react';
+import { useLocation } from 'wouter';
+import { Edit } from '@icon-park/react';
+import './CreatePostButton.css';
+
+const CreatePostButton = () => {
+  const [, navigate] = useLocation();
+
+  const goToCreatePost = () => {
+    navigate('/forum/create-post');
+  };
+
+  return (
+    <div className="create-post">
+      <button onClick={goToCreatePost} className="create-btn">
+        <Edit theme="outline" size="18" /> 发帖
+      </button>
+    </div>
+  );
+};
+
+export default CreatePostButton;
diff --git a/src/pages/Forum/posts-main/components/PostList.css b/src/pages/Forum/posts-main/components/PostList.css
new file mode 100644
index 0000000..d855c07
--- /dev/null
+++ b/src/pages/Forum/posts-main/components/PostList.css
@@ -0,0 +1,12 @@
+.post-list {
+    display: flex;
+    flex-direction: column;
+    gap: 16px;
+  }
+  
+  .post-card {
+    border: 1px solid #eee;
+    padding: 16px;
+    border-radius: 8px;
+  }
+  
\ No newline at end of file
diff --git a/src/pages/Forum/posts-main/components/PostList.jsx b/src/pages/Forum/posts-main/components/PostList.jsx
new file mode 100644
index 0000000..fa33dd5
--- /dev/null
+++ b/src/pages/Forum/posts-main/components/PostList.jsx
@@ -0,0 +1,126 @@
+import React, { useEffect, useState } from 'react';
+import axios from 'axios';
+import { Link } from 'wouter';
+import { GoodTwo, Comment } from '@icon-park/react';
+import './PostList.css';
+
+const API_BASE = process.env.REACT_APP_API_BASE;
+
+const PostList = ({ search }) => {
+  const [posts, setPosts] = useState([]);
+  const [page, setPage] = useState(1);
+  const [total, setTotal] = useState(0);
+  const [loading, setLoading] = useState(true);
+  const [errorMsg, setErrorMsg] = useState('');
+
+  const size = 10;
+  const totalPages = Math.ceil(total / size);
+
+  useEffect(() => {
+    const fetchPosts = async () => {
+      setLoading(true);
+      setErrorMsg('');
+      try {
+        const res = await axios.get(`${API_BASE}/echo/forum/posts/getAllPost`, {
+          params: { page, size }
+        });
+
+        const postsData = res.data.posts || [];
+        const userIds = [...new Set(postsData.map(p => p.user_id))];
+
+        const profiles = await Promise.all(userIds.map(async id => {
+          try {
+            const r = await axios.get(`${API_BASE}/echo/user/profile`, {
+              params: { user_id: id }
+            });
+            return { id, profile: r.data };
+          } catch {
+            return { id, profile: { nickname: '未知用户', avatar_url: 'default-avatar.png' } };
+          }
+        }));
+
+        const userMap = {};
+        profiles.forEach(({ id, profile }) => { userMap[id] = profile; });
+
+        const postsWithProfiles = postsData
+          .filter(post => post.title.includes(search))
+          .map(post => ({
+            ...post,
+            userProfile: userMap[post.user_id] || {}
+          }));
+
+        setPosts(postsWithProfiles);
+        setTotal(res.data.total || 0);
+      } catch (err) {
+        console.error('加载失败:', err);
+        setErrorMsg('加载失败，请稍后重试');
+      } finally {
+        setLoading(false);
+      }
+    };
+
+    fetchPosts();
+  }, [page, search]);
+
+  const toggleLike = async (postId, liked) => {
+    try {
+      if (liked) await axios.delete(`${API_BASE}/echo/forum/posts/${postId}/unlike`);
+      else await axios.post(`${API_BASE}/echo/forum/posts/${postId}/like`);
+
+      setPosts(posts =>
+        posts.map(post =>
+          post.id === postId
+            ? { ...post, liked: !liked, likeCount: liked ? post.likeCount - 1 : post.likeCount + 1 }
+            : post
+        )
+      );
+    } catch (err) {
+      console.error('点赞失败:', err);
+    }
+  };
+
+  return (
+    <div className="post-list">
+      {loading ? <p>加载中...</p> :
+        errorMsg ? <p className="error-text">{errorMsg}</p> :
+          posts.length === 0 ? <p>暂无帖子。</p> :
+            posts.map(post => (
+              <div key={post.id} className="post-card">
+                <div className="post-card-top">
+                  <div className="user-info">
+                    <img className="avatar" src={post.userProfile.avatar_url} alt="头像" />
+                    <span className="nickname">{post.userProfile.nickname}</span>
+                  </div>
+                  {post.cover_image_url && (
+                    <img className="cover-image" src={post.cover_image_url} alt="封面" />
+                  )}
+                </div>
+                <h3>{post.title}</h3>
+                <p className="post-meta">
+                  发布时间：{new Date(post.created_at).toLocaleString()}
+                </p>
+                <div className="post-actions">
+                  <button className="icon-btn" onClick={() => toggleLike(post.id, post.liked)}>
+                    <GoodTwo theme="outline" size="24" fill={post.liked ? '#f00' : '#fff'} />
+                    <span>{post.likeCount}</span>
+                  </button>
+                  <Link href={`/forum/post/${post.id}`} className="icon-btn">
+                    <Comment theme="outline" size="24" fill="#fff" />
+                    <span>{post.commentCount}</span>
+                  </Link>
+                </div>
+                <Link href={`/forum/post/${post.id}`} className="btn-secondary">查看详情</Link>
+              </div>
+            ))
+      }
+
+      <div className="pagination">
+        <button disabled={page === 1} onClick={() => setPage(page - 1)}>上一页</button>
+        <span>第 {page} 页 / 共 {totalPages} 页</span>
+        <button disabled={page === totalPages} onClick={() => setPage(page + 1)}>下一页</button>
+      </div>
+    </div>
+  );
+};
+
+export default PostList;
diff --git a/src/pages/Forum/posts-main/components/SearchBar.css b/src/pages/Forum/posts-main/components/SearchBar.css
new file mode 100644
index 0000000..b74f9d2
--- /dev/null
+++ b/src/pages/Forum/posts-main/components/SearchBar.css
@@ -0,0 +1,7 @@
+.search-bar {
+    display: flex;
+    align-items: center;
+    gap: 10px;
+    margin-bottom: 20px;
+  }
+  
\ No newline at end of file
diff --git a/src/pages/Forum/posts-main/components/SearchBar.jsx b/src/pages/Forum/posts-main/components/SearchBar.jsx
new file mode 100644
index 0000000..52b873d
--- /dev/null
+++ b/src/pages/Forum/posts-main/components/SearchBar.jsx
@@ -0,0 +1,28 @@
+import React, { useState } from 'react';
+import './SearchBar.css';
+
+const SearchBar = ({ onSearch }) => {
+  const [query, setQuery] = useState('');
+
+  const handleSearch = () => onSearch(query);
+  const handleReset = () => {
+    setQuery('');
+    onSearch('');
+  };
+
+  return (
+    <div className="search-bar">
+      <input
+        type="text"
+        value={query}
+        onChange={e => setQuery(e.target.value)}
+        placeholder="标题"
+        className="search-input"
+      />
+      <button onClick={handleSearch} className="search-btn">搜索</button>
+      <button onClick={handleReset} className="search-btn">重置</button>
+    </div>
+  );
+};
+
+export default SearchBar;
diff --git a/src/pages/store/user.js b/src/pages/store/user.js
new file mode 100644
index 0000000..60c8658
--- /dev/null
+++ b/src/pages/store/user.js
@@ -0,0 +1,16 @@
+// src/store/user.js
+import { createContext, useContext, useState } from 'react';
+
+const UserContext = createContext();
+
+export const UserProvider = ({ children }) => {
+  const [user, setUser] = useState({ id: '1', name: '测试用户' }); // 这里可以是默认值或从 localStorage 加载
+
+  return (
+    <UserContext.Provider value={{ user, setUser }}>
+      {children}
+    </UserContext.Provider>
+  );
+};
+
+export const useUserStore = () => useContext(UserContext);
