Merge remote-tracking branch 'refs/remotes/origin/master'

Change-Id: I599f5959d217e7cb51cf76233b2409b34d49abca
diff --git a/WZY/xhs_front/src/components/HomeFeed.jsx b/WZY/xhs_front/src/components/HomeFeed.jsx
index d906e33..382c942 100644
--- a/WZY/xhs_front/src/components/HomeFeed.jsx
+++ b/WZY/xhs_front/src/components/HomeFeed.jsx
@@ -20,24 +20,50 @@
     async function loadPosts() {
       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}`,
-              avatar: `https://i.pravatar.cc/40?img=${d.user_id}`,
-              img:    d.media_urls?.[0] || '', // 用第一张媒体作为封面
-              likes:  d.heat
-            }
-          })
-        )
-        setItems(detailed)
+        
+        // 第一轮:立即展示基础信息
+        const basicItems = list.map(p => ({
+          id:     p.id,
+          title:  p.title,
+          author: `作者 ${p.user_id || 'unknown'}`,
+          avatar: `https://i.pravatar.cc/40?img=${p.user_id || 1}`,
+          img:    '', // 暂时为空
+          likes:  p.heat || 0,
+          loading: true // 标记图片正在加载
+        }))
+        
+        setItems(basicItems)
+        setLoading(false) // 基础内容已加载完成
+        
+        // 第二轮:异步加载详情和图片
+        basicItems.forEach(async (item, index) => {
+          try {
+            const detail = await fetchPost(item.id)
+            setItems(prevItems => 
+              prevItems.map(prevItem => 
+                prevItem.id === item.id 
+                  ? {
+                      ...prevItem,
+                      img: detail.media_urls?.[0] || '',
+                      loading: false
+                    }
+                  : prevItem
+              )
+            )
+          } catch (e) {
+            // 单个图片加载失败不影响其他
+            setItems(prevItems => 
+              prevItems.map(prevItem => 
+                prevItem.id === item.id 
+                  ? { ...prevItem, loading: false }
+                  : prevItem
+              )
+            )
+          }
+        })
+        
       } catch (e) {
         setError(e.message)
-      } finally {
         setLoading(false)
       }
     }
@@ -69,7 +95,11 @@
         <div className="feed-grid">
           {items.map(item => (
             <div key={item.id} className="feed-card">
-              <img className="card-img" src={item.img} alt={item.title} />
+              {item.loading ? (
+                <div className="card-img-placeholder">图片加载中...</div>
+              ) : (
+                <img className="card-img" src={item.img} alt={item.title} />
+              )}
               <h3 className="card-title">{item.title}</h3>
               <div className="card-footer">
                 <div className="card-author">