diff --git a/Merge/front/src/components/PostDetailJWLLL.jsx b/Merge/front/src/components/PostDetailJWLLL.jsx
index 01f64b5..b0ca84f 100644
--- a/Merge/front/src/components/PostDetailJWLLL.jsx
+++ b/Merge/front/src/components/PostDetailJWLLL.jsx
@@ -1,10 +1,18 @@
-import React, { useState, useEffect, useCallback } from 'react'
+import React, { useState, useEffect, useCallback, useMemo } from 'react'
 import { useParams, useNavigate } from 'react-router-dom'
-import { ArrowLeft, ThumbsUp, MessageCircle, Share2, BookmarkPlus, Heart, Eye } from 'lucide-react'
+import {
+  ArrowLeft,
+  ThumbsUp,
+  MessageCircle,
+  Share2,
+  BookmarkPlus,
+  Heart,
+  Eye,
+} from 'lucide-react'
 import { searchAPI } from '../api/search_jwlll'
 import { getUserInfo } from '../utils/auth'
 import FollowButton from './FollowButton'
-import postsAPI from '../api/posts_api'
+import postsAPI from '../api/posts_api'                // ⇦ 包含 hasLikedPost、likePost、unlikePost
 import MediaPreview from './MediaPreview'
 import '../style/PostDetail.css'
 import dayjs from 'dayjs'
@@ -12,26 +20,34 @@
 export default function PostDetail() {
   const { id } = useParams()
   const navigate = useNavigate()
+
+  // ──────────────── 状态 ────────────────
   const [post, setPost] = useState(null)
   const [loading, setLoading] = useState(true)
   const [error, setError] = useState(null)
+
   const [liked, setLiked] = useState(false)
   const [bookmarked, setBookmarked] = useState(false)
   const [likeCount, setLikeCount] = useState(0)
+
   const [comments, setComments] = useState([])
   const [newComment, setNewComment] = useState('')
   const [showComments, setShowComments] = useState(false)
+
   const [isFollowing, setIsFollowing] = useState(false)
   const [authorInfo, setAuthorInfo] = useState(null)
-  const [previewImg, setPreviewImg] = useState(null)
-  const [commentUserMap, setCommentUserMap] = useState({}) // user_id: username
-  const [commentUserAvatarMap, setCommentUserAvatarMap] = useState({}) // user_id: avatar
-  // 获取当前用户ID
-  const getCurrentUserId = () => {
-    const userInfo = getUserInfo()
-    return userInfo?.id || '3' // 如果未登录或无用户信息，使用默认值3
-  }
 
+  const [previewImg, setPreviewImg] = useState(null)
+  const [commentUserMap, setCommentUserMap] = useState({})      // user_id → username
+  const [commentUserAvatarMap, setCommentUserAvatarMap] = useState({}) // user_id → avatar
+
+  // 当前登录用户 ID（memo 化，组件整个生命周期只算一次）
+  const currentUserId = useMemo(() => {
+    const ui = getUserInfo()
+    return ui?.id || 'null'          // 未登录就给个默认值 3
+  }, [])
+
+  // ──────────────── 拉取帖子详情 ────────────────
   const fetchPostDetail = useCallback(async () => {
     setLoading(true)
     setError(null)
@@ -39,121 +55,151 @@
       const data = await searchAPI.getPostDetail(id)
       setPost(data)
       setLikeCount(data.heat || 0)
-    } catch (error) {
-      console.error('获取帖子详情失败:', error)
+    } catch (err) {
+      console.error('获取帖子详情失败:', err)
       setError('帖子不存在或已被删除')
     } finally {
       setLoading(false)
     }
   }, [id])
 
+  // ──────────────── 拉取评论 ────────────────
   const fetchComments = useCallback(async () => {
     try {
       const data = await searchAPI.getComments(id)
       setComments(data.comments || [])
-    } catch (error) {
-      console.error('获取评论失败:', error)
+    } catch (err) {
+      console.error('获取评论失败:', err)
     }
   }, [id])
 
-  // 检查当前用户是否已关注发帖人
+  // ──────────────── 组件挂载：帖子详情 + 评论 + 点赞状态 ────────────────
+  useEffect(() => {
+    fetchPostDetail()
+    fetchComments()
+
+    // 检查我是否点过赞
+    if (currentUserId) {
+      ;(async () => {
+        try {
+          const res = await postsAPI.hasLikedPost(id, currentUserId)
+          setLiked(!!res.liked)
+        } catch (err) {
+          console.error('检查点赞状态失败:', err)
+        }
+      })()
+    }
+  }, [fetchPostDetail, fetchComments, id, currentUserId])
+
+  // ──────────────── 检查是否关注作者 ────────────────
   useEffect(() => {
     if (post && post.user_id) {
-      // 这里假设有API postsAPI.getUserFollowing
       const checkFollow = async () => {
         try {
-          const userInfo = getUserInfo()
-          if (!userInfo?.id) return
-          const res = await postsAPI.getUserFollowing(userInfo.id)
+          if (!currentUserId) return
+          const res = await postsAPI.getUserFollowing(currentUserId)
           if (Array.isArray(res)) {
-            setIsFollowing(res.some(u => u.id === post.user_id))
+            setIsFollowing(res.some((u) => u.id === post.user_id))
           } else if (Array.isArray(res.following)) {
-            setIsFollowing(res.following.some(u => u.id === post.user_id))
+            setIsFollowing(res.following.some((u) => u.id === post.user_id))
           }
         } catch {}
       }
       checkFollow()
     }
-  }, [post])
+  }, [post, currentUserId])
 
-  // 拉取发帖人信息
+  // ──────────────── 作者信息 ────────────────
   useEffect(() => {
     if (post && post.user_id) {
-      postsAPI.getUser(post.user_id).then(res => setAuthorInfo(res || {})).catch(() => setAuthorInfo({}))
+      postsAPI
+        .getUser(post.user_id)
+        .then((res) => setAuthorInfo(res || {}))
+        .catch(() => setAuthorInfo({}))
     }
   }, [post])
 
-  // 拉取所有评论用户昵称
+  // ──────────────── 拉取评论用户昵称 / 头像 ────────────────
   const fetchCommentUserNames = async (userIds) => {
     const map = {}
-    await Promise.all(userIds.map(async uid => {
-      try {
-        const user = await postsAPI.getUser(uid)
-        map[uid] = user.username || user.nickname || `用户${uid}`
-      } catch {
-        map[uid] = `用户${uid}`
-      }
-    }))
+    await Promise.all(
+      userIds.map(async (uid) => {
+        try {
+          const user = await postsAPI.getUser(uid)
+          map[uid] = user.username || user.nickname || `用户${uid}`
+        } catch {
+          map[uid] = `用户${uid}`
+        }
+      })
+    )
     setCommentUserMap(map)
   }
 
-  // 拉取所有评论用户头像
   const fetchCommentUserAvatars = async (userIds) => {
     const map = {}
-    await Promise.all(userIds.map(async uid => {
-      try {
-        const user = await postsAPI.getUser(uid)
-        map[uid] = user.avatar && user.avatar.startsWith('http') ? user.avatar : (user.avatar ? `http://10.126.59.25:5715/static/${user.avatar}` : `https://i.pravatar.cc/40?img=${uid}`)
-      } catch {
-        map[uid] = `https://i.pravatar.cc/40?img=${uid}`
-      }
-    }))
+    await Promise.all(
+      userIds.map(async (uid) => {
+        try {
+          const user = await postsAPI.getUser(uid)
+          map[uid] =
+            user.avatar && user.avatar.startsWith('http')
+              ? user.avatar
+              : user.avatar
+              ? `http://10.126.59.25:5715/static/${user.avatar}`
+              : `https://i.pravatar.cc/40?img=${uid}`
+        } catch {
+          map[uid] = `https://i.pravatar.cc/40?img=${uid}`
+        }
+      })
+    )
     setCommentUserAvatarMap(map)
   }
 
   useEffect(() => {
-    fetchPostDetail()
-    fetchComments()
-  }, [fetchPostDetail, fetchComments])
-
-  // 评论区用户昵称和头像拉取
-  useEffect(() => {
     if (comments.length > 0) {
-      const userIds = [...new Set(comments.map(c => c.user_id).filter(Boolean))]
-      fetchCommentUserNames(userIds)
-      fetchCommentUserAvatars(userIds)
+      const uidSet = new Set(comments.map((c) => c.user_id).filter(Boolean))
+      const ids = [...uidSet]
+      fetchCommentUserNames(ids)
+      fetchCommentUserAvatars(ids)
     }
   }, [comments])
 
-  const handleBack = () => {
-    navigate(-1)
-  }
+  // ──────────────── 交互 handlers ────────────────
+  const handleBack = () => navigate(-1)
+
   const handleLike = async () => {
+    if (!currentUserId) {
+      alert('请先登录～')
+      return
+    }
+
     try {
-      const currentUserId = getCurrentUserId()
-      const newLiked = !liked
-      if (newLiked) {
-        await searchAPI.likePost(id, currentUserId)
+      if (liked) {
+        // 取消点赞
+        await postsAPI.unlikePost(id, currentUserId)
       } else {
-        await searchAPI.unlikePost(id, currentUserId)
+        // 点赞
+        await postsAPI.likePost(id, currentUserId)
       }
-      setLiked(newLiked)
-      setLikeCount(prev => newLiked ? prev + 1 : prev - 1)
-    } catch (error) {
-      console.error('点赞失败:', error)
-      // 回滚状态
-      setLiked(!liked)
-      setLikeCount(prev => liked ? prev + 1 : prev - 1)
+
+      // —— 关键：操作成功后重新拉一次帖子详情（里面会 setLikeCount） —— 
+      await fetchPostDetail()
+
+      // —— 同步一下 liked 状态（可选，因为你直接用 fetchPostDetail 重置 likeCount，也可以重新查一下状态） —— 
+      const { liked: has } = await postsAPI.hasLikedPost(id, currentUserId)
+      setLiked(!!has)
+
+    } catch (err) {
+      console.error('点赞操作失败:', err)
     }
   }
 
   const handleBookmark = () => {
     setBookmarked(!bookmarked)
-    // 实际项目中这里应该调用后端API保存收藏状态
+    // TODO: 调后端保存收藏状态
   }
 
   const handleShare = () => {
-    // 分享功能
     if (navigator.share) {
       navigator.share({
         title: post?.title,
@@ -161,44 +207,27 @@
         url: window.location.href,
       })
     } else {
-      // 复制链接到剪贴板
       navigator.clipboard.writeText(window.location.href)
       alert('链接已复制到剪贴板')
     }
   }
+
   const handleAddComment = async (e) => {
     e.preventDefault()
     if (!newComment.trim()) return
-
     try {
-      const currentUserId = getCurrentUserId()
       await searchAPI.addComment(id, currentUserId, newComment)
       setNewComment('')
-      fetchComments() // 刷新评论列表
-    } catch (error) {
-      console.error('添加评论失败:', error)
+      fetchComments()
+    } catch (err) {
+      console.error('添加评论失败:', err)
       alert('评论失败，请重试')
     }
   }
 
-  // 关注后刷新关注状态
-  const handleFollowChange = async (followed) => {
-    setIsFollowing(followed)
-    // 关注/取关后重新拉取一次关注状态，保证和数据库同步
-    if (post && post.user_id) {
-      try {
-        const userInfo = getUserInfo()
-        if (!userInfo?.id) return
-        const res = await postsAPI.getUserFollowing(userInfo.id)
-        if (Array.isArray(res)) {
-          setIsFollowing(res.some(u => u.id === post.user_id))
-        } else if (Array.isArray(res.following)) {
-          setIsFollowing(res.following.some(u => u.id === post.user_id))
-        }
-      } catch {}
-    }
-  }
+  const handleFollowChange = (followed) => setIsFollowing(followed)
 
+  // ──────────────── 渲染逻辑 ────────────────
   if (loading) {
     return (
       <div className="post-detail">
@@ -210,7 +239,6 @@
     )
   }
 
-  // 优化错误和不存在的判断逻辑
   if (error) {
     return (
       <div className="post-detail">
@@ -226,7 +254,6 @@
     )
   }
 
-  // 只有明确为 null 或 undefined 时才显示不存在
   if (post === null || post === undefined) {
     return (
       <div className="post-detail">
@@ -254,8 +281,8 @@
           <button onClick={handleShare} className="action-btn">
             <Share2 size={20} />
           </button>
-          <button 
-            onClick={handleBookmark} 
+          <button
+            onClick={handleBookmark}
             className={`action-btn ${bookmarked ? 'active' : ''}`}
           >
             <BookmarkPlus size={20} />
@@ -265,31 +292,56 @@
 
       {/* 主要内容区 */}
       <main className="post-content">
-        {/* 帖子标题 */}
+        {/* 标题 */}
         <h1 className="post-title">{post.title}</h1>
 
-        {/* 作者信息和元数据 */}
+        {/* 作者 & 元数据 */}
         <div className="post-meta">
           <div className="author-info">
             <div className="avatar">
-              {authorInfo && authorInfo.avatar && authorInfo.avatar.startsWith('http') ? (
-                <img className="avatar" src={authorInfo.avatar} alt={authorInfo.username || authorInfo.nickname || post.author || '用户'} />
+              {authorInfo?.avatar && authorInfo.avatar.startsWith('http') ? (
+                <img
+                  className="avatar"
+                  src={authorInfo.avatar}
+                  alt={
+                    authorInfo.username ||
+                    authorInfo.nickname ||
+                    post.author ||
+                    '用户'
+                  }
+                />
               ) : (
-                <img className="avatar" src={`https://i.pravatar.cc/40?img=${post.user_id}`} alt={authorInfo?.username || authorInfo?.nickname || post.author || '用户'} />
+                <img
+                  className="avatar"
+                  src={`https://i.pravatar.cc/40?img=${post.user_id}`}
+                  alt={
+                    authorInfo?.username ||
+                    authorInfo?.nickname ||
+                    post.author ||
+                    '用户'
+                  }
+                />
               )}
             </div>
             <div className="author-details">
-              <span className="author-name">{authorInfo?.username || authorInfo?.nickname || post.author || '匿名用户'}</span>
-              <span className="post-date">
-                {post.created_at ? dayjs(post.created_at).format('YYYY-MM-DD HH:mm:ss') : '未知时间'}
+              <span className="author-name">
+                {authorInfo?.username ||
+                  authorInfo?.nickname ||
+                  post.author ||
+                  '匿名用户'}
               </span>
-              {/* 关注按钮 */}
+              <span className="post-date">
+                {post.created_at
+                  ? dayjs(post.created_at).format('YYYY-MM-DD HH:mm:ss')
+                  : '未知时间'}
+              </span>
+
               {post.user_id && (
                 <FollowButton
                   userId={post.user_id}
                   isFollowing={isFollowing}
                   onFollowChange={handleFollowChange}
-                  style={{marginLeft: 12}}
+                  style={{ marginLeft: 12 }}
                 />
               )}
             </div>
@@ -307,25 +359,40 @@
         </div>
 
         {/* 标签 */}
-        {post.tags && post.tags.length > 0 && (
+        {post.tags?.length > 0 && (
           <div className="post-tags">
-            {post.tags.map((tag, index) => (
-              <span key={index} className="tag">{tag}</span>
+            {post.tags.map((tag, idx) => (
+              <span key={idx} className="tag">
+                {tag}
+              </span>
             ))}
           </div>
         )}
 
-        {/* 帖子媒体（支持多图/多视频） */}
+        {/* 媒体 */}
         {Array.isArray(post.media_urls) && post.media_urls.length > 0 && (
-          <div className="post-media" style={{display:'flex',gap:8,marginBottom:16,flexWrap:'wrap'}}>
+          <div
+            className="post-media"
+            style={{
+              display: 'flex',
+              gap: 8,
+              marginBottom: 16,
+              flexWrap: 'wrap',
+            }}
+          >
             {post.media_urls.map((url, idx) => (
               <MediaPreview
                 key={idx}
                 url={url}
-                alt={`媒体${idx+1}`}
+                alt={`媒体${idx + 1}`}
                 onClick={(mediaUrl) => {
-                  // 对于图片，显示预览
-                  if (!mediaUrl.toLowerCase().includes('video') && !mediaUrl.includes('.mp4') && !mediaUrl.includes('.webm')) {
+                  // 图片点击预览
+                  const lower = mediaUrl.toLowerCase()
+                  if (
+                    !lower.includes('video') &&
+                    !lower.endsWith('.mp4') &&
+                    !lower.endsWith('.webm')
+                  ) {
                     setPreviewImg(mediaUrl)
                   }
                 }}
@@ -336,19 +403,42 @@
             ))}
           </div>
         )}
-        {/* 大图预览弹窗 */}
         {previewImg && (
-          <div className="img-preview-mask" style={{position:'fixed',zIndex:9999,top:0,left:0,right:0,bottom:0,background:'rgba(0,0,0,0.7)',display:'flex',alignItems:'center',justifyContent:'center'}} onClick={()=>setPreviewImg(null)}>
-            <img src={previewImg} alt="大图预览" style={{maxWidth:'90vw',maxHeight:'90vh',borderRadius:12,boxShadow:'0 4px 24px #0008'}} />
+          <div
+            className="img-preview-mask"
+            style={{
+              position: 'fixed',
+              zIndex: 9999,
+              top: 0,
+              left: 0,
+              right: 0,
+              bottom: 0,
+              background: 'rgba(0,0,0,0.7)',
+              display: 'flex',
+              alignItems: 'center',
+              justifyContent: 'center',
+            }}
+            onClick={() => setPreviewImg(null)}
+          >
+            <img
+              src={previewImg}
+              alt="大图预览"
+              style={{
+                maxWidth: '90vw',
+                maxHeight: '90vh',
+                borderRadius: 12,
+                boxShadow: '0 4px 24px #0008',
+              }}
+            />
           </div>
         )}
 
-        {/* 帖子正文 */}
+        {/* 正文 */}
         <div className="post-body">
           <p>{post.content}</p>
         </div>
 
-        {/* 类别信息 */}
+        {/* 分类 / 类型 */}
         {(post.category || post.type) && (
           <div className="post-category">
             {post.category && (
@@ -359,7 +449,9 @@
             )}
             {post.type && (
               <>
-                <span className="category-label" style={{marginLeft: '1em'}}>类型：</span>
+                <span className="category-label" style={{ marginLeft: '1em' }}>
+                  类型：
+                </span>
                 <span className="category-name">{post.type}</span>
               </>
             )}
@@ -369,7 +461,7 @@
         {/* 评论区 */}
         <div className="comments-section">
           <div className="comments-header">
-            <button 
+            <button
               onClick={() => setShowComments(!showComments)}
               className="comments-toggle"
             >
@@ -380,7 +472,7 @@
 
           {showComments && (
             <div className="comments-content">
-              {/* 添加评论 */}
+              {/* 新评论 */}
               <form onSubmit={handleAddComment} className="comment-form">
                 <textarea
                   value={newComment}
@@ -399,20 +491,37 @@
                 {comments.length === 0 ? (
                   <p className="no-comments">暂无评论</p>
                 ) : (
-                  comments.map((comment, index) => (
-                    <div key={index} className="comment-item">
+                  comments.map((comment, idx) => (
+                    <div key={idx} className="comment-item">
                       <div className="comment-author">
                         <div className="comment-avatar">
-                          <img className="avatar" src={commentUserAvatarMap[comment.user_id] || `https://i.pravatar.cc/40?img=${comment.user_id}`} alt={commentUserMap[comment.user_id] || comment.user_name || '用户'} />
+                          <img
+                            className="avatar"
+                            src={
+                              commentUserAvatarMap[comment.user_id] ||
+                              `https://i.pravatar.cc/40?img=${comment.user_id}`
+                            }
+                            alt={
+                              commentUserMap[comment.user_id] ||
+                              comment.user_name ||
+                              '用户'
+                            }
+                          />
                         </div>
-                        <span className="comment-name">{commentUserMap[comment.user_id] || comment.user_name || '匿名用户'}</span>
+                        <span className="comment-name">
+                          {commentUserMap[comment.user_id] ||
+                            comment.user_name ||
+                            '匿名用户'}
+                        </span>
                         <span className="comment-time">
-                          {comment.create_time ? new Date(comment.create_time).toLocaleString('zh-CN') : ''}
+                          {comment.create_time
+                            ? new Date(comment.create_time).toLocaleString(
+                                'zh-CN'
+                              )
+                            : ''}
                         </span>
                       </div>
-                      <div className="comment-content">
-                        {comment.content}
-                      </div>
+                      <div className="comment-content">{comment.content}</div>
                     </div>
                   ))
                 )}
@@ -425,29 +534,29 @@
       {/* 底部操作栏 */}
       <footer className="post-footer">
         <div className="action-bar">
-          <button 
-            onClick={handleLike} 
+          <button
+            onClick={handleLike}
             className={`action-button ${liked ? 'liked' : ''}`}
           >
             <ThumbsUp size={20} />
             <span>{likeCount}</span>
           </button>
-          
-          <button 
+
+          <button
             onClick={() => setShowComments(!showComments)}
             className="action-button"
           >
             <MessageCircle size={20} />
             <span>评论</span>
           </button>
-          
+
           <button onClick={handleShare} className="action-button">
             <Share2 size={20} />
             <span>分享</span>
           </button>
-          
-          <button 
-            onClick={handleBookmark} 
+
+          <button
+            onClick={handleBookmark}
             className={`action-button ${bookmarked ? 'bookmarked' : ''}`}
           >
             <BookmarkPlus size={20} />
