diff --git a/src/pages/Forum/posts-detail/PostDetailPage.jsx b/src/pages/Forum/posts-detail/PostDetailPage.jsx
index a505d88..159bdfa 100644
--- a/src/pages/Forum/posts-detail/PostDetailPage.jsx
+++ b/src/pages/Forum/posts-detail/PostDetailPage.jsx
@@ -1,9 +1,9 @@
-import React, { useEffect, useState } from 'react';
+import React, { useContext, useEffect, useState } from 'react';
 import { useParams } from 'wouter';
 import { GoodTwo, Star } from '@icon-park/react';
 import { getPostDetail, getPostComments, likePost, unlikePost, addCommentToPost, collectPost, uncollectPost } from './api'; // 引入你的 API 函数
 import './PostDetailPage.css';
-import { useUser } from '../../../context/UserContext'; // 注意路径
+import { UserContext, useUser } from '../../../context/UserContext'; // 注意路径
 import Header from '../../../components/Header';
 
 const PostDetailPage = () => {
@@ -20,7 +20,8 @@
   const [replyToUsername, setReplyToUsername] = useState(null);
 
   // 获取当前用户ID（假设从上下文中获取）
-  const { user } = useUser(); // 你需要从用户上下文获取用户 ID
+  const { user } = useContext(UserContext);
+  // const { user } = useUser(); // 你需要从用户上下文获取用户 ID
 
   useEffect(() => {
     const fetchPostDetail = async () => {
@@ -69,7 +70,7 @@
     try {
       if (isLiked) {
         // 取消点赞
-        await unlikePost(postId, user.id);
+        await unlikePost(postId, user.userId);
         setIsLiked(false);
         setPostDetail((prev) => ({
           ...prev,
@@ -77,7 +78,7 @@
         }));
       } else {
         // 点赞
-        await likePost(postId, user.id);
+        await likePost(postId, user.userId);
         setIsLiked(true);
         setPostDetail((prev) => ({
           ...prev,
@@ -100,7 +101,7 @@
     try {
         if (isCollected) {
             // 取消收藏 - 使用原有的collectPost函数，传递action: "cancel"
-            await collectPost(postId, user.id, "cancel");
+            await collectPost(postId, user.userId, "cancel");
             setIsCollected(false);
             setPostDetail((prev) => ({
                 ...prev,
@@ -108,7 +109,7 @@
             }));
         } else {
             // 收藏
-            await collectPost(postId, user.id, "collect");
+            await collectPost(postId, user.userId, "collect");
             setIsCollected(true);
             setPostDetail((prev) => ({
                 ...prev,
@@ -121,40 +122,57 @@
     }
 };
 
-  // 添加评论
+// 添加评论
 const handleAddComment = async () => {
+  // 直接使用组件顶层获取的 user
+  if (!user || !user.userId) {
+    alert('请先登录后再评论');
+    return;
+  }
+
   if (!newComment.trim()) {
     alert('评论内容不能为空');
     return;
   }
 
   try {
+    // 构建评论数据
     const commentPayload = {
       content: newComment,
-      userId: user.id,
+      userId: user.userId, // 使用已获取的用户ID
       isAnonymous: false,
       com_comment_id: replyToCommentId || null,
     };
 
+    // 发送评论请求
     const commentData = await addCommentToPost(postId, commentPayload);
 
-    setComments((prev) => [
-      ...prev,
-      {
-        commentId: (commentData && commentData.commentId) || Date.now(),
-        post_id: postId,
-        userId: user.id,
-        content: newComment,
-        commentTime: new Date().toISOString(),
-        comCommentId: replyToCommentId,
-      },
-    ]);
+    // 更新评论列表
+    const newCommentItem = {
+      commentId: commentData?.commentId || Date.now(),
+      post_id: postId,
+      userId: user.userId,
+      content: newComment,
+      commentTime: new Date().toISOString(),
+      comCommentId: replyToCommentId,
+    };
 
+    setComments((prevComments) => [newCommentItem, ...prevComments]);
+
+    // 重置表单
     setNewComment('');
     setReplyToCommentId(null);
-  } catch (err) {
-    console.error('评论添加失败:', err);
-    alert('评论失败，请稍后再试');
+
+    // alert('评论成功！');
+  } catch (error) {
+    console.error('评论失败:', error);
+    
+    const errorMessage = 
+      error.response?.data?.message || 
+      error.message || 
+      '评论失败，请稍后再试';
+      
+    alert(errorMessage);
   }
 };
 
