diff --git a/src/pages/UserCenter/UserDynamics.jsx b/src/pages/UserCenter/UserDynamics.jsx
index e69de29..05d9046 100644
--- a/src/pages/UserCenter/UserDynamics.jsx
+++ b/src/pages/UserCenter/UserDynamics.jsx
@@ -0,0 +1,88 @@
+import React, { useEffect, useState } from 'react';
+import { useUser } from '../../context/UserContext';
+import './UserDynamics.css';
+
+const UserDynamics = () => {
+  const { user } = useUser();
+  const [dynamics, setDynamics] = useState([]);
+  const [loading, setLoading] = useState(true);
+
+  useEffect(() => {
+    if (!user?.userId) return;
+
+    const fetchDynamics = async () => {
+      try {
+        const res = await fetch(`/echo/dynamic/${user.userId}/getAdynamic`);
+        const data = await res.json();
+        setDynamics(data.dynamic || []);
+      } catch (err) {
+        console.error('获取动态失败:', err);
+      } finally {
+        setLoading(false);
+      }
+    };
+
+    fetchDynamics();
+  }, [user]);
+
+  if (loading) return <div className="user-dynamics-loading">加载中...</div>;
+
+  return (
+    <div className="user-dynamics-container">
+      <h2 className="user-dynamics-title">我的动态</h2>
+      {dynamics.length === 0 ? (
+        <div className="user-dynamics-empty">暂无动态</div>
+      ) : (
+        dynamics.map((item) => (
+          <div key={item.dynamic_id} className="dynamic-card">
+            <div className="dynamic-header">
+              <img
+                className="dynamic-avatar"
+                src={item.avatar_url}
+                alt={item.username}
+              />
+              <div className="dynamic-userinfo">
+                <span className="dynamic-username">{item.username}</span>
+                <span className="dynamic-time">{new Date(item.time).toLocaleString()}</span>
+              </div>
+            </div>
+            <div className="dynamic-content">
+              {item.title && <h4 className="dynamic-title">{item.title}</h4>}
+              <p>{item.content}</p>
+              {/* {item.images && (
+                <div className="dynamic-images">
+                  {JSON.parse(item.images).map((img, index) => (
+                    <img key={index} src={img} alt={`图${index + 1}`} />
+                  ))}
+                </div>
+              )} */}
+              {item.images && (
+                <div className="dynamic-images">
+                    {(() => {
+                    let imageList = [];
+                    try {
+                        if (item.images.startsWith('[')) {
+                        imageList = JSON.parse(item.images);
+                        } else {
+                        imageList = [item.images];
+                        }
+                    } catch (e) {
+                        console.error('解析 images 出错：', e);
+                    }
+
+                    return imageList.map((img, index) => (
+                        <img key={index} src={img} alt={`图${index + 1}`} />
+                    ));
+                    })()}
+                </div>
+                )}
+
+            </div>
+          </div>
+        ))
+      )}
+    </div>
+  );
+};
+
+export default UserDynamics;
