diff --git a/Merge/front/src/components/HomeFeed.jsx b/Merge/front/src/components/HomeFeed.jsx
index e30eb73..b959fd9 100644
--- a/Merge/front/src/components/HomeFeed.jsx
+++ b/Merge/front/src/components/HomeFeed.jsx
@@ -26,60 +26,77 @@
   // 获取当前用户ID，如果未登录则使用默认值
   const getCurrentUserId = () => {
     const userInfo = getUserInfo()
-    return userInfo?.id ? String(userInfo.id) : DEFAULT_USER_ID  }
+    return userInfo?.id ? String(userInfo.id) : DEFAULT_USER_ID
+  }
   
-  const [items, setItems]         = useState([])
-  const [loading, setLoading]     = useState(true)
-  const [error, setError]         = useState(null)
-    // JWLLL 搜索推荐相关状态
+  const [items, setItems] = useState([])
+  const [loading, setLoading] = useState(true)
+  const [error, setError] = useState(null)
+  // JWLLL 搜索推荐相关状态
   const [search, setSearch] = useState('')
   const [recMode, setRecMode] = useState('tag')
   const [recCFNum, setRecCFNum] = useState(20)
-  const [useSearchRecommend, setUseSearchRecommend] = useState(false) // 是否使用搜索推荐模式  // JWLLL 搜索推荐功能函数
-  const [userMap, setUserMap] = useState({}) // user_id: {username, nickname}
-    // JWLLL搜索推荐内容
+  const [useSearchRecommend, setUseSearchRecommend] = useState(false)
+  const [userMap, setUserMap] = useState({})
+  
+  // 异步加载单个帖子的详细信息
+  const loadPostDetails = async (postId, index) => {
+    try {
+      const d = await fetchPost(postId)
+      setItems(prevItems => {
+        const newItems = [...prevItems]
+        if (newItems[index]) {
+          newItems[index] = {
+            ...newItems[index],
+            media: d.media_urls?.[0] || '',
+            content: d.content || '',
+            mediaUrls: d.media_urls || [],
+            author: `作者 ${d.user_id}`,
+            authorId: d.user_id,
+            avatar: `http://192.168.5.200:8080/static/profile.webp`,
+            detailsLoaded: true
+          }
+        }
+        return newItems
+      })
+    } catch (error) {
+      console.error(`加载帖子 ${postId} 详情失败:`, error)
+    }
+  }
+
+  // JWLLL搜索推荐内容
   const fetchSearchContent = useCallback(async (keyword = '') => {
     setLoading(true)
     setError(null)
     try {
       const data = await searchAPI.search(keyword, undefined)
-      // 新增：拉取详情，保证和推荐一致
-      const detailed = await Promise.all(
-        (data.results || []).map(async item => {
-          try {
-            const d = await fetchPost(item.id)
-            return {
-              id:     d.id,
-              title:  d.title,
-              author: `作者 ${d.user_id}`,
-              avatar: `https://i.pravatar.cc/40?img=${d.user_id}`,
-              media:  d.media_urls?.[0] || '', // 改为 media，支持图片和视频
-              likes:  d.heat,
-              content: d.content || '',
-              mediaUrls: d.media_urls || [] // 保存所有媒体URL
-            }
-          } catch {
-            return {
-              id: item.id,
-              title: item.title,
-              author: item.author || '佚名',
-              avatar: `https://i.pravatar.cc/40?img=${item.id}`,
-              media: item.img || '',
-              likes: item.heat || 0,
-              content: item.content || '',
-              mediaUrls: []
-            }
-          }
-        })
-      )
-      setItems(detailed)
+      // 先设置基础数据，快速显示
+      const basicItems = (data.results || []).map(item => ({
+        id: item.id,
+        title: item.title,
+        author: item.author || '佚名',
+        avatar: `https://i.pravatar.cc/40?img=${item.id}`,
+        media: item.img || '',
+        likes: item.heat || 0,
+        content: item.content || '',
+        mediaUrls: [],
+        detailsLoaded: false
+      }))
+      setItems(basicItems)
+      setLoading(false)
+      
+      // 异步加载详细信息
+      basicItems.forEach((item, index) => {
+        loadPostDetails(item.id, index)
+      })
     } catch (e) {
       console.error('搜索失败:', e)
       setError('搜索失败')
       setItems([])
+      setLoading(false)
     }
-    setLoading(false)
   }, [])
+
   // 标签推荐
   const fetchTagRecommend = useCallback(async (tags) => {
     setLoading(true)
@@ -87,44 +104,33 @@
     try {
       const currentUserId = getCurrentUserId()
       const data = await searchAPI.recommendByTags(currentUserId, tags)
-      // 新增：拉取详情，保证和原始数据一致
-      const detailed = await Promise.all(
-        (data.recommendations || []).map(async item => {
-          try {
-            const d = await fetchPost(item.id)
-            return {
-              id:     d.id,
-              title:  d.title,
-              author: `作者 ${d.user_id}`,
-              avatar: `https://i.pravatar.cc/40?img=${d.user_id}`,
-              media:  d.media_urls?.[0] || '', // 改为 media，支持图片和视频
-              likes:  d.heat,
-              content: d.content || '',
-              mediaUrls: d.media_urls || [] // 保存所有媒体URL
-            }
-          } catch {
-            // 拉详情失败时兜底
-            return {
-              id: item.id,
-              title: item.title,
-              author: item.author || '佚名',
-              avatar: `https://i.pravatar.cc/40?img=${item.id}`,
-              media: item.img || '',
-              likes: item.heat || 0,
-              content: item.content || '',
-              mediaUrls: []
-            }
-          }
-        })
-      )
-      setItems(detailed)
+      // 先设置基础数据，快速显示
+      const basicItems = (data.recommendations || []).map(item => ({
+        id: item.id,
+        title: item.title,
+        author: item.author || '佚名',
+        avatar: `https://i.pravatar.cc/40?img=${item.id}`,
+        media: item.img || '',
+        likes: item.heat || 0,
+        content: item.content || '',
+        mediaUrls: [],
+        detailsLoaded: false
+      }))
+      setItems(basicItems)
+      setLoading(false)
+      
+      // 异步加载详细信息
+      basicItems.forEach((item, index) => {
+        loadPostDetails(item.id, index)
+      })
     } catch (e) {
       console.error('标签推荐失败:', e)
       setError('标签推荐失败')
       setItems([])
+      setLoading(false)
     }
-    setLoading(false)
   }, [])
+
   // 协同过滤推荐
   const fetchCFRecommend = useCallback(async (topN = recCFNum) => {
     setLoading(true)
@@ -132,44 +138,33 @@
     try {
       const currentUserId = getCurrentUserId()
       const data = await searchAPI.userBasedRecommend(currentUserId, topN)
-      // 新增：拉取详情，保证和原始数据一致
-      const detailed = await Promise.all(
-        (data.recommendations || []).map(async item => {
-          try {
-            const d = await fetchPost(item.id)
-            return {
-              id:     d.id,
-              title:  d.title,
-              author: `作者 ${d.user_id}`,
-              avatar: `https://i.pravatar.cc/40?img=${d.user_id}`,
-              media:  d.media_urls?.[0] || '', // 改为 media，支持图片和视频
-              likes:  d.heat,
-              content: d.content || '',
-              mediaUrls: d.media_urls || [] // 保存所有媒体URL
-            }
-          } catch {
-            // 拉详情失败时兜底
-            return {
-              id: item.id,
-              title: item.title,
-              author: item.author || '佚名',
-              avatar: `https://i.pravatar.cc/40?img=${item.id}`,
-              media: item.img || '',
-              likes: item.heat || 0,
-              content: item.content || '',
-              mediaUrls: []
-            }
-          }
-        })
-      )
-      setItems(detailed)
+      // 先设置基础数据，快速显示
+      const basicItems = (data.recommendations || []).map(item => ({
+        id: item.id,
+        title: item.title,
+        author: item.author || '佚名',
+        avatar: `https://i.pravatar.cc/40?img=${item.id}`,
+        media: item.img || '',
+        likes: item.heat || 0,
+        content: item.content || '',
+        mediaUrls: [],
+        detailsLoaded: false
+      }))
+      setItems(basicItems)
+      setLoading(false)
+      
+      // 异步加载详细信息
+      basicItems.forEach((item, index) => {
+        loadPostDetails(item.id, index)
+      })
     } catch (e) {
       console.error('协同过滤推荐失败:', e)
       setError('协同过滤推荐失败')
       setItems([])
+      setLoading(false)
     }
-    setLoading(false)
   }, [recCFNum])
+
   // 深度推荐
   const fetchDeepRecommend = useCallback(async (topN = 20) => {
     setLoading(true)
@@ -177,42 +172,32 @@
     try {
       const currentUserId = getCurrentUserId()
       const recs = await deepRecommend(currentUserId, topN)
-      // 拉取详情，保证和原始数据一致
-      const detailed = await Promise.all(
-        (recs || []).map(async item => {
-          try {
-            const d = await fetchPost(item.id)
-            return {
-              id:     d.id,
-              title:  d.title,
-              author: `作者 ${d.user_id}`,
-              avatar: `https://i.pravatar.cc/40?img=${d.user_id}`,
-              media:  d.media_urls?.[0] || '', // 改为 media，支持图片和视频
-              likes:  d.heat,
-              content: d.content || '',
-              mediaUrls: d.media_urls || [] // 保存所有媒体URL
-            }
-          } catch {
-            return {
-              id: item.id,
-              title: item.title,
-              author: item.author || '佚名',
-              avatar: `https://i.pravatar.cc/40?img=${item.id}`,
-              media: item.img || '',
-              likes: item.heat || 0,
-              content: item.content || '',
-              mediaUrls: []
-            }
-          }
-        })
-      )
-      setItems(detailed)
+      // 先设置基础数据，快速显示
+      const basicItems = (recs || []).map(item => ({
+        id: item.id,
+        title: item.title,
+        author: item.author || '佚名',
+        avatar: `https://i.pravatar.cc/40?img=${item.id}`,
+        media: item.img || '',
+        likes: item.heat || 0,
+        content: item.content || '',
+        mediaUrls: [],
+        detailsLoaded: false
+      }))
+      setItems(basicItems)
+      setLoading(false)
+      
+      // 异步加载详细信息
+      basicItems.forEach((item, index) => {
+        loadPostDetails(item.id, index)
+      })
     } catch (e) {
       setError('深度推荐失败')
       setItems([])
+      setLoading(false)
     }
-    setLoading(false)
   }, [])
+
   // 获取用户兴趣标签后再推荐
   const fetchUserTagsAndRecommend = useCallback(async () => {
     setLoading(true)
@@ -253,29 +238,43 @@
     const loadPosts = async () => {
       try {
         const list = await fetchPosts()  // [{id, title, heat, created_at}, …]
-        // 为了拿到 media_urls 和 user_id，这里再拉详情
-        const detailed = await Promise.all(
-          list.map(async p => {
-            const d = await fetchPost(p.id)
-            return {
-              id:     d.id,
-              title:  d.title,
-              author: `作者 ${d.user_id}`,
-              authorId: d.user_id,
-              avatar: `http://192.168.5.200:8080/static/profile.webp`,
-              media:  d.media_urls?.[0] || '', // 改为 media，支持图片和视频
-              likes:  d.heat,
-              mediaUrls: d.media_urls || [] // 保存所有媒体URL
-            }
-          })
-        )
-        setItems(detailed)
-        // 拉取所有涉及用户的昵称
-        const userIds = [...new Set(detailed.map(i => i.authorId))]
-        fetchUserNames(userIds)
+        // 先设置基础数据，快速显示
+        const basicItems = list.map(p => ({
+          id: p.id,
+          title: p.title,
+          author: '加载中...',
+          authorId: null,
+          avatar: `http://192.168.5.200:8080/static/profile.webp`,
+          media: '',
+          likes: p.heat,
+          mediaUrls: [],
+          detailsLoaded: false
+        }))
+        setItems(basicItems)
+        setLoading(false)
+        
+        // 异步加载详细信息
+        basicItems.forEach((item, index) => {
+          loadPostDetails(item.id, index)
+        })
+        
+        // 异步加载用户信息
+        setTimeout(async () => {
+          const allItems = await Promise.all(
+            list.map(async p => {
+              try {
+                const d = await fetchPost(p.id)
+                return { ...p, user_id: d.user_id }
+              } catch {
+                return p
+              }
+            })
+          )
+          const userIds = [...new Set(allItems.map(i => i.user_id).filter(Boolean))]
+          fetchUserNames(userIds)
+        }, 100)
       } catch (e) {
         setError(e.message)
-      } finally {
         setLoading(false)
       }
     }
@@ -286,7 +285,7 @@
     } else {
       loadPosts()
     }
-  }, [useSearchRecommend, fetchUserTagsAndRecommend])  // 切换推荐模式时的额外处理
+  }, [useSearchRecommend, fetchUserTagsAndRecommend])
   useEffect(() => {
     if (useSearchRecommend) {
       fetchUserTagsAndRecommend()
@@ -408,7 +407,7 @@
           ) : (
             items.map(item => (
               <div key={item.id} className="feed-card" onClick={() => handlePostClick(item.id)}>
-                {item.media && (
+                {item.media ? (
                   <MediaPreview
                     url={item.media}
                     alt={item.title}
@@ -421,13 +420,25 @@
                     }}
                     style={{ cursor: 'pointer' }}
                   />
-                )}
+                ) : !item.detailsLoaded ? (
+                  <div className="card-img-placeholder" style={{
+                    height: '200px',
+                    background: '#f5f5f5',
+                    display: 'flex',
+                    alignItems: 'center',
+                    justifyContent: 'center',
+                    color: '#999',
+                    fontSize: '14px'
+                  }}>
+                    加载中...
+                  </div>
+                ) : null}
                 <h3 className="card-title">{item.title}</h3>
                 {item.content && <div className="card-content">{item.content.slice(0, 60) || ''}</div>}
                 <div className="card-footer">
                   <div className="card-author">
-                    <img className="avatar" src={item.avatar} alt={userMap[item.authorId] || item.authorId} />
-                    <span className="username">{userMap[item.authorId] || item.authorId}</span>
+                    <img className="avatar" src={item.avatar} alt={userMap[item.authorId] || item.authorId || item.author} />
+                    <span className="username">{userMap[item.authorId] || item.author}</span>
                   </div>
                   <div className="card-likes">
                     <ThumbsUp size={16} />
