diff --git a/Merge/front/src/components/Admin.js b/Merge/front/src/components/Admin.js
index 2d97495..f73e239 100644
--- a/Merge/front/src/components/Admin.js
+++ b/Merge/front/src/components/Admin.js
@@ -1,21 +1,32 @@
-import 'antd/dist/antd.css';
-import React, { useState, useEffect, useMemo, useCallback } from 'react';
-import { Layout, Tabs, Input, List, Card, Button, Tag, Spin, Typography, Divider } from 'antd';
-import '../style/Admin.css';
-import { fetchPosts, approvePost, rejectPost } from '../api/posts_trm';
+// src/components/Admin.jsx
+import React, { useState, useEffect, useCallback } from 'react'
+import { useParams } from 'react-router-dom'
+import 'antd/dist/antd.css'
+import {
+  Layout,
+  Tabs,
+  Input,
+  List,
+  Card,
+  Button,
+  Tag,
+  Spin,
+  Typography,
+  Divider
+} from 'antd'
+import '../style/Admin.css'
+import { fetchPosts, approvePost, rejectPost } from '../api/posts_trm'
 
-export default function Admin() {
-  const ADMIN_USER_ID = 2;
-  const [posts, setPosts] = useState([]);
-  const [loading, setLoading] = useState(true);
-  const [hasPermission, setHasPermission] = useState(true);
-  const [activeTab, setActiveTab] = useState('all');
-  const [selectedPost, setSelectedPost] = useState(null);
-  const [searchTerm, setSearchTerm] = useState('');
-  
-  // 新增：拖拽相关状态
-  const [leftPanelWidth, setLeftPanelWidth] = useState(300);
-  const [isResizing, setIsResizing] = useState(false);
+export default function AdminPage() {
+  const { userId } = useParams()            // ← 从路由拿到
+  const [posts, setPosts] = useState([])
+  const [loading, setLoading] = useState(true)
+  const [hasPermission, setHasPermission] = useState(true)
+  const [activeTab, setActiveTab] = useState('all')
+  const [selectedPost, setSelectedPost] = useState(null)
+  const [searchTerm, setSearchTerm] = useState('')
+  const [leftPanelWidth, setLeftPanelWidth] = useState(300)
+  const [isResizing, setIsResizing] = useState(false)
 
   const statusColors = {
     draft: 'orange',
@@ -23,12 +34,12 @@
     published: 'green',
     deleted: 'gray',
     rejected: 'red'
-  };
+  }
 
   useEffect(() => {
     async function load() {
       try {
-        const list = await fetchPosts(ADMIN_USER_ID)
+        const list = await fetchPosts(userId)   // ← 传入 userId
         setPosts(list)
       } catch (e) {
         if (e.message === 'Unauthorized') {
@@ -41,10 +52,9 @@
       }
     }
     load()
-  }, [])
+  }, [userId])
 
-  // 过滤并排序
-  const sortedPosts = useMemo(() => {
+  const sortedPosts = React.useMemo(() => {
     return [...posts].sort((a, b) => {
       if (a.status === 'pending' && b.status !== 'pending') return -1
       if (b.status === 'pending' && a.status !== 'pending') return 1
@@ -52,18 +62,10 @@
     })
   }, [posts])
 
-  // 调整：根据 activeTab 及搜索关键词过滤
-  const filteredPosts = useMemo(() => {
-    let list
-    switch (activeTab) {
-      case 'pending':
-        list = sortedPosts.filter(p => p.status === 'pending'); break
-      case 'published':
-        list = sortedPosts.filter(p => p.status === 'published'); break
-      case 'rejected':
-        list = sortedPosts.filter(p => p.status === 'rejected'); break
-      default:
-        list = sortedPosts
+  const filteredPosts = React.useMemo(() => {
+    let list = sortedPosts
+    if (activeTab !== 'all') {
+      list = sortedPosts.filter(p => p.status === activeTab)
     }
     return list.filter(p =>
       p.title.toLowerCase().includes(searchTerm.toLowerCase())
@@ -71,84 +73,101 @@
   }, [sortedPosts, activeTab, searchTerm])
 
   const handleApprove = async id => {
-    await approvePost(id, ADMIN_USER_ID)
-    setPosts(ps => ps.map(x => x.id === id ? { ...x, status: 'published' } : x))
-    // 同步更新选中的帖子状态
+    await approvePost(id, userId)            // ← 传入 userId
+    setPosts(ps =>
+      ps.map(x => (x.id === id ? { ...x, status: 'published' } : x))
+    )
     if (selectedPost?.id === id) {
-      setSelectedPost(prev => ({ ...prev, status: 'published' }));
+      setSelectedPost(prev => ({ ...prev, status: 'published' }))
     }
   }
-  const handleReject  = async id => {
-    await rejectPost(id, ADMIN_USER_ID)
-    setPosts(ps => ps.map(x => x.id === id ? { ...x, status: 'rejected' } : x))
-    // 同步更新选中的帖子状态
-    if (selectedPost?.id === id) {
-      setSelectedPost(prev => ({ ...prev, status: 'rejected' }));
-    }
-  }
-  const handleSelect  = post => setSelectedPost(post)
 
-  // 修复：拖拽处理函数
-  const handleMouseMove = useCallback((e) => {
-    if (!isResizing) return;
-    
-    const newWidth = e.clientX;
-    const minWidth = 200;
-    const maxWidth = window.innerWidth - 300;
-    
-    if (newWidth >= minWidth && newWidth <= maxWidth) {
-      setLeftPanelWidth(newWidth);
+  const handleReject = async id => {
+    await rejectPost(id, userId)             // ← 传入 userId
+    setPosts(ps =>
+      ps.map(x => (x.id === id ? { ...x, status: 'rejected' } : x))
+    )
+    if (selectedPost?.id === id) {
+      setSelectedPost(prev => ({ ...prev, status: 'rejected' }))
     }
-  }, [isResizing]);
+  }
+
+  const handleSelect = post => setSelectedPost(post)
+
+  const handleMouseMove = useCallback(
+    e => {
+      if (!isResizing) return
+      const newWidth = e.clientX
+      const minWidth = 200
+      const maxWidth = window.innerWidth - 300
+      if (newWidth >= minWidth && newWidth <= maxWidth) {
+        setLeftPanelWidth(newWidth)
+      }
+    },
+    [isResizing]
+  )
 
   const handleMouseUp = useCallback(() => {
-    setIsResizing(false);
-    document.removeEventListener('mousemove', handleMouseMove);
-    document.removeEventListener('mouseup', handleMouseUp);
-    document.body.style.cursor = '';
-    document.body.style.userSelect = '';
-  }, [handleMouseMove]);
+    setIsResizing(false)
+    document.removeEventListener('mousemove', handleMouseMove)
+    document.removeEventListener('mouseup', handleMouseUp)
+    document.body.style.cursor = ''
+    document.body.style.userSelect = ''
+  }, [handleMouseMove])
 
-  const handleMouseDown = useCallback((e) => {
-    e.preventDefault();
-    setIsResizing(true);
-    document.addEventListener('mousemove', handleMouseMove);
-    document.addEventListener('mouseup', handleMouseUp);
-    document.body.style.cursor = 'col-resize';
-    document.body.style.userSelect = 'none';
-  }, [handleMouseMove, handleMouseUp]);
+  const handleMouseDown = useCallback(
+    e => {
+      e.preventDefault()
+      setIsResizing(true)
+      document.addEventListener('mousemove', handleMouseMove)
+      document.addEventListener('mouseup', handleMouseUp)
+      document.body.style.cursor = 'col-resize'
+      document.body.style.userSelect = 'none'
+    },
+    [handleMouseMove, handleMouseUp]
+  )
 
-  // 新增：组件卸载时清理事件监听器
   useEffect(() => {
     return () => {
-      document.removeEventListener('mousemove', handleMouseMove);
-      document.removeEventListener('mouseup', handleMouseUp);
-      document.body.style.cursor = '';
-      document.body.style.userSelect = '';
-    };
-  }, [handleMouseMove, handleMouseUp]);
+      document.removeEventListener('mousemove', handleMouseMove)
+      document.removeEventListener('mouseup', handleMouseUp)
+      document.body.style.cursor = ''
+      document.body.style.userSelect = ''
+    }
+  }, [handleMouseMove, handleMouseUp])
 
-  if (loading) return <Spin spinning tip="加载中…" style={{ width: '100%', marginTop: 100 }} />;
-  if (!hasPermission) return <div style={{ textAlign: 'center', marginTop: 100 }}>权限不足</div>;
+  if (loading)
+    return (
+      <Spin
+        spinning
+        tip="加载中…"
+        style={{ width: '100%', marginTop: 100 }}
+      />
+    )
+  if (!hasPermission)
+    return (
+      <div style={{ textAlign: 'center', marginTop: 100 }}>
+        权限不足
+      </div>
+    )
 
-  const { Content } = Layout;
-  const { TabPane } = Tabs;
-  const { Title, Text } = Typography;
+  const { Content } = Layout
+  const { TabPane } = Tabs
+  const { Title, Text } = Typography
 
   return (
     <div style={{ height: '100vh', display: 'flex' }}>
-      {/* 左侧面板 */}
-      <div 
-        style={{ 
+      <div
+        style={{
           width: leftPanelWidth,
-          background: '#fff', 
+          background: '#fff',
           padding: 16,
           borderRight: '1px solid #f0f0f0',
           overflow: 'hidden'
         }}
       >
         <div style={{ marginBottom: 24 }}>
-          <Title level={3}>小红书</Title>
+          <Title level={3}>小红书 管理</Title>
           <Input.Search
             placeholder="搜索帖子标题..."
             value={searchTerm}
@@ -156,26 +175,38 @@
             enterButton
           />
         </div>
-        <Tabs activeKey={activeTab} onChange={key => { setActiveTab(key); setSelectedPost(null); }}>
+        <Tabs
+          activeKey={activeTab}
+          onChange={key => {
+            setActiveTab(key)
+            setSelectedPost(null)
+          }}
+        >
           <TabPane tab="全部" key="all" />
           <TabPane tab="待审核" key="pending" />
           <TabPane tab="已通过" key="published" />
           <TabPane tab="已驳回" key="rejected" />
         </Tabs>
-        <div style={{ height: 'calc(100vh - 200px)', overflow: 'auto' }}>
+        <div
+          style={{
+            height: 'calc(100vh - 200px)',
+            overflow: 'auto'
+          }}
+        >
           <List
             dataSource={filteredPosts}
             pagination={{
               pageSize: 5,
               showSizeChanger: true,
-              pageSizeOptions: ['5','10','20'],
+              pageSizeOptions: ['5', '10', '20'],
               onChange: () => setSelectedPost(null)
             }}
             renderItem={p => (
               <List.Item
                 key={p.id}
                 style={{
-                  background: selectedPost?.id === p.id ? '#e6f7ff' : '',
+                  background:
+                    selectedPost?.id === p.id ? '#e6f7ff' : '',
                   cursor: 'pointer',
                   marginBottom: 8
                 }}
@@ -187,32 +218,38 @@
                       <img
                         src={p.thumbnail}
                         alt=""
-                        style={{ width: 64, height: 64, objectFit: 'cover' }}
+                        style={{
+                          width: 64,
+                          height: 64,
+                          objectFit: 'cover'
+                        }}
                       />
                     )
                   }
                   title={p.title}
-                  description={`${p.createdAt} · ${p.author} · ${p.likes || 0}赞`}
+                  description={`${p.createdAt} · ${p.author} · ${
+                    p.likes || 0
+                  }赞`}
                 />
-                <Tag color={statusColors[p.status]}>{p.status}</Tag>
+                <Tag color={statusColors[p.status]}>
+                  {p.status}
+                </Tag>
               </List.Item>
             )}
           />
         </div>
       </div>
 
-      {/* 拖拽分割条 */}
       <div
         style={{
           width: 5,
           cursor: 'col-resize',
           background: isResizing ? '#1890ff' : '#f0f0f0',
-          transition: isResizing ? 'none' : 'background-color 0.2s',
           position: 'relative',
           flexShrink: 0
         }}
         onMouseDown={handleMouseDown}
-        onSelectStart={(e) => e.preventDefault()}
+        onSelectStart={e => e.preventDefault()}
       >
         <div
           style={{
@@ -228,41 +265,111 @@
         />
       </div>
 
-      {/* 右侧内容区域 */}
-      <div style={{ flex: 1, display: 'flex', flexDirection: 'column' }}>
-        <Content style={{ padding: 24, background: '#fff', overflow: 'auto' }}>
+      <div
+        style={{
+          flex: 1,
+          display: 'flex',
+          flexDirection: 'column'
+        }}
+      >
+        <Content
+          style={{
+            padding: 24,
+            background: '#fff',
+            overflow: 'auto'
+          }}
+        >
           {selectedPost ? (
             <Card
-              cover={selectedPost.image && <img alt="cover" src={selectedPost.image} />}
+              cover={
+                selectedPost.image && (
+                  <img
+                    alt="cover"
+                    src={selectedPost.image}
+                  />
+                )
+              }
               title={selectedPost.title}
               extra={
                 <div>
                   {selectedPost.status === 'pending' && (
                     <>
-                      <Button type="primary" onClick={() => handleApprove(selectedPost.id)}>通过</Button>
-                      <Button danger onClick={() => handleReject(selectedPost.id)}>驳回</Button>
+                      <Button
+                        type="primary"
+                        onClick={() =>
+                          handleApprove(selectedPost.id)
+                        }
+                      >
+                        通过
+                      </Button>
+                      <Button
+                        danger
+                        onClick={() =>
+                          handleReject(selectedPost.id)
+                        }
+                      >
+                        驳回
+                      </Button>
                     </>
                   )}
                   {selectedPost.status === 'published' && (
-                    <Button danger onClick={() => handleReject(selectedPost.id)}>驳回</Button>
+                    <Button
+                      danger
+                      onClick={() =>
+                        handleReject(selectedPost.id)
+                      }
+                    >
+                      驳回
+                    </Button>
                   )}
                   {selectedPost.status === 'rejected' && (
                     <>
-                      <Button onClick={() => {
-                        setPosts(ps => ps.map(x => x.id === selectedPost.id ? { ...x, status: 'pending' } : x));
-                        setSelectedPost(prev => ({ ...prev, status: 'pending' }));
-                      }}>恢复待审</Button>
-                      <Button onClick={() => {
-                        setPosts(ps => ps.map(x => x.id === selectedPost.id ? { ...x, status: 'published' } : x));
-                        setSelectedPost(prev => ({ ...prev, status: 'published' }));
-                      }}>恢复已发</Button>
+                      <Button
+                        onClick={() => {
+                          setPosts(ps =>
+                            ps.map(x =>
+                              x.id === selectedPost.id
+                                ? { ...x, status: 'pending' }
+                                : x
+                            )
+                          )
+                          setSelectedPost(prev => ({
+                            ...prev,
+                            status: 'pending'
+                          }))
+                        }}
+                      >
+                        恢复待审
+                      </Button>
+                      <Button
+                        onClick={() => {
+                          setPosts(ps =>
+                            ps.map(x =>
+                              x.id === selectedPost.id
+                                ? {
+                                    ...x,
+                                    status: 'published'
+                                  }
+                                : x
+                            )
+                          )
+                          setSelectedPost(prev => ({
+                            ...prev,
+                            status: 'published'
+                          }))
+                        }}
+                      >
+                        恢复已发
+                      </Button>
                     </>
                   )}
                 </div>
               }
             >
               <Text type="secondary">
-                {`${selectedPost.createdAt} · ${selectedPost.author} · ${selectedPost.likes || 0}赞`}
+                {`${selectedPost.createdAt} · ${selectedPost.author} · ${
+                  selectedPost.likes || 0
+                }赞`}
               </Text>
               <Divider />
               <p>{selectedPost.content}</p>
@@ -274,10 +381,12 @@
               </ul>
             </Card>
           ) : (
-            <Text type="secondary">请选择左侧列表中的帖子查看详情</Text>
+            <Text type="secondary">
+              请选择左侧列表中的帖子查看详情
+            </Text>
           )}
         </Content>
       </div>
     </div>
-  );
+)
 }
diff --git a/Merge/front/src/components/Sidebar.jsx b/Merge/front/src/components/Sidebar.jsx
index 26118b2..92bc8f1 100644
--- a/Merge/front/src/components/Sidebar.jsx
+++ b/Merge/front/src/components/Sidebar.jsx
@@ -24,10 +24,10 @@
       { id: 'fans',     label: '粉丝数据', path: '/dashboard/fans'     },
     ]
   },
-  { id: 'activity', label: '活动中心', icon: Activity, path: '/activity' },
-  { id: 'notes',    label: '笔记灵感', icon: BookOpen, path: '/notes'    },
-  { id: 'creator',  label: '创作学院', icon: Users,    path: '/creator'  },
-  { id: 'journal',  label: '创作日刊', icon: BookOpen, path: '/journal'  },
+  // { id: 'activity', label: '活动中心', icon: Activity, path: '/activity' },
+  // { id: 'notes',    label: '笔记灵感', icon: BookOpen, path: '/notes'    },
+  // { id: 'creator',  label: '创作学院', icon: Users,    path: '/creator'  },
+  // { id: 'journal',  label: '创作日刊', icon: BookOpen, path: '/journal'  },
 ]
 
 export default function Sidebar() {
diff --git a/Merge/front/src/components/SuperAdmin.js b/Merge/front/src/components/SuperAdmin.js
index f24e5d4..0fa6722 100644
--- a/Merge/front/src/components/SuperAdmin.js
+++ b/Merge/front/src/components/SuperAdmin.js
@@ -1,33 +1,48 @@
-import React, { useState, useEffect } from 'react';
-import { NavLink, Outlet } from 'react-router-dom';
-import { Spin } from 'antd';
-import { fetchUserList } from '../api/posts_trm';
-import '../style/SuperAdmin.css';
+// src/components/SuperAdmin.jsx
+import React, { useState, useEffect } from 'react'
+import { NavLink, Outlet, useParams } from 'react-router-dom'
+import { Spin } from 'antd'
+import { fetchUserList } from '../api/posts_trm'
+import '../style/SuperAdmin.css'
 
 export default function SuperAdmin() {
-  const SUPERADMIN_USER_ID = 3;
-  const [loading, setLoading] = useState(true);
-  const [hasPermission, setHasPermission] = useState(true);
+  const { userId } = useParams()             // ← 从路由拿到
+  const [loading, setLoading] = useState(true)
+  const [hasPermission, setHasPermission] = useState(true)
 
   useEffect(() => {
     async function check() {
       try {
-        await fetchUserList(SUPERADMIN_USER_ID);
+        await fetchUserList(userId)          // ← 传入 userId
       } catch (e) {
         if (e.message === 'Unauthorized') {
-          setHasPermission(false);
+          setHasPermission(false)
         } else {
-          console.error(e);
+          console.error(e)
         }
       } finally {
-        setLoading(false);
+        setLoading(false)
       }
     }
-    check();
-  }, []);
+    check()
+  }, [userId])
 
-  if (loading) return <Spin spinning tip="加载中…" style={{ width: '100%', marginTop: 100 }} />;
-  if (!hasPermission) return <div style={{ textAlign: 'center', marginTop: 100 }}>权限不足</div>;
+  if (loading) {
+    return (
+      <Spin
+        spinning
+        tip="加载中…"
+        style={{ width: '100%', marginTop: 100 }}
+      />
+    )
+  }
+  if (!hasPermission) {
+    return (
+      <div style={{ textAlign: 'center', marginTop: 100 }}>
+        权限不足
+      </div>
+    )
+  }
 
   return (
     <div className="super-admin-container">
@@ -36,18 +51,22 @@
         <nav>
           <ul>
             <li>
-              <NavLink 
-                to="users" 
-                end 
-                className={({ isActive }) => isActive ? 'active' : ''}
+              <NavLink
+                to="users"
+                end
+                className={({ isActive }) =>
+                  isActive ? 'active' : ''
+                }
               >
                 用户管理
               </NavLink>
             </li>
             <li>
-              <NavLink 
-                to="dashboard" 
-                className={({ isActive }) => isActive ? 'active' : ''}
+              <NavLink
+                to="dashboard"
+                className={({ isActive }) =>
+                  isActive ? 'active' : ''
+                }
               >
                 平台运行监控
               </NavLink>
@@ -60,5 +79,5 @@
         <Outlet />
       </main>
     </div>
-  );
-}
\ No newline at end of file
+  )
+}
diff --git a/Merge/front/src/components/UserManagement.js b/Merge/front/src/components/UserManagement.js
index a48f8cf..bed6b8f 100644
--- a/Merge/front/src/components/UserManagement.js
+++ b/Merge/front/src/components/UserManagement.js
@@ -1,51 +1,77 @@
-import React, { useState, useEffect } from 'react';
-import '../style/Admin.css';
-import { Select, message, Table } from 'antd';
-import { fetchUserList, giveUser, giveAdmin, giveSuperAdmin } from '../api/posts_trm';
+// src/components/UserManagement.jsx
 
-const { Option } = Select;
-const ROLE_LIST = ['用户', '管理员', '超级管理员'];
+import React, { useState, useEffect } from 'react'
+import { useParams } from 'react-router-dom'
+import { Table, Select, message } from 'antd'
+import {
+  fetchUserList,
+  giveUser,
+  giveAdmin,
+  giveSuperAdmin
+} from '../api/posts_trm'
+import '../style/Admin.css'
 
-function UserManagement({ superAdminId }) {
-  const [users, setUsers] = useState([]);
+const { Option } = Select
+const ROLE_LIST = ['用户', '管理员', '超级管理员']
+
+export default function UserManagement() {
+  // 直接从 URL 参数里拿到 superAdminId
+  const { userId: superAdminId } = useParams()
+
+  const [users, setUsers] = useState([])
 
   useEffect(() => {
     async function load() {
       try {
-        const data = superAdminId
-          ? await fetchUserList(superAdminId)
-          : await fetch('/api/users').then(res => res.json());
-        setUsers(data);
+        // 调用接口获取用户列表
+        const data = await fetchUserList(superAdminId)
+        setUsers(data)
       } catch (e) {
-        console.error(e);
+        console.error(e)
+        message.error('获取用户列表失败：' + e.message)
       }
     }
-    load();
-  }, [superAdminId]);
 
-  // handle role changes
+    // 只有当 superAdminId 有值时才发请求
+    if (superAdminId) {
+      load()
+    }
+  }, [superAdminId])
+
+  // 处理角色变更
   const handleRoleChange = async (userId, newRole) => {
     try {
-      if (newRole === '用户') await giveUser(superAdminId, userId);
-      else if (newRole === '管理员') await giveAdmin(superAdminId, userId);
-      else if (newRole === '超级管理员') await giveSuperAdmin(superAdminId, userId);
-      setUsers(us => us.map(u => u.id === userId ? { ...u, role: newRole } : u));
-      message.success('修改成功');
+      if (newRole === '用户') {
+        await giveUser(superAdminId, userId)
+      } else if (newRole === '管理员') {
+        await giveAdmin(superAdminId, userId)
+      } else if (newRole === '超级管理员') {
+        await giveSuperAdmin(superAdminId, userId)
+      }
+      // 本地更新状态
+      setUsers(us =>
+        us.map(u => (u.id === userId ? { ...u, role: newRole } : u))
+      )
+      message.success('修改成功')
     } catch (e) {
-      console.error(e);
-      message.error('修改失败');
+      console.error(e)
+      message.error('修改失败：' + e.message)
     }
-  };
+  }
 
-  // define table columns
+  // 表格列定义
   const columns = [
     { title: '用户名', dataIndex: 'username', key: 'username' },
-    { title: '角色', dataIndex: 'role', key: 'role' },
+    { title: '角色',   dataIndex: 'role',     key: 'role' },
     {
       title: '操作',
       key: 'action',
       render: (_, record) => {
-        const orderedRoles = [record.role, ...ROLE_LIST.filter(r => r !== record.role)];
+        // 当前角色排第一
+        const orderedRoles = [
+          record.role,
+          ...ROLE_LIST.filter(r => r !== record.role)
+        ]
         return (
           <Select
             value={record.role}
@@ -53,13 +79,15 @@
             onChange={value => handleRoleChange(record.id, value)}
           >
             {orderedRoles.map(r => (
-              <Option key={r} value={r}>{r}</Option>
+              <Option key={r} value={r}>
+                {r}
+              </Option>
             ))}
           </Select>
-        );
-      },
-    },
-  ];
+        )
+      }
+    }
+  ]
 
   return (
     <div className="admin-container">
@@ -70,7 +98,5 @@
         pagination={false}
       />
     </div>
-  );
+  )
 }
-
-export default UserManagement;
diff --git a/Merge/front/src/pages/LoginPage/LoginPage.js b/Merge/front/src/pages/LoginPage/LoginPage.js
index 31453a4..bdd75d0 100644
--- a/Merge/front/src/pages/LoginPage/LoginPage.js
+++ b/Merge/front/src/pages/LoginPage/LoginPage.js
@@ -1,4 +1,5 @@
 // src/pages/LoginPage/LoginPage.jsx
+
 import React, { useState, useEffect } from 'react'
 import { useNavigate, Link } from 'react-router-dom'
 import { Input, Checkbox, Modal, Alert } from 'antd'
@@ -12,7 +13,8 @@
   getRememberedLoginInfo,
   saveRememberedLoginInfo,
   saveAuthInfo,
-  isLoggedIn
+  isLoggedIn,
+  clearAuthInfo           // ← 新增
 } from '../../utils/auth'
 import { hashPassword } from '../../utils/crypto'
 import './LoginPage.css'
@@ -22,6 +24,11 @@
 export default function LoginPage() {
   const navigate = useNavigate()
 
+  // —— 登录页加载时先清除旧的认证信息 —— 
+  useEffect(() => {
+    clearAuthInfo(/* clearRemembered= */ false)
+  }, [])
+
   const [formData, setFormData] = useState({
     email: '',
     password: ''
@@ -59,15 +66,14 @@
   useEffect(() => {
     if (isLoggedIn()) {
       console.log('用户已登录')
-      // 如果要自动跳转可以在这里：
-      // navigate('/home', { replace: true })
+      // 如果想自动跳转： navigate('/home', { replace: true })
     }
     const { email, password, rememberMe } = getRememberedLoginInfo()
     if (rememberMe && email) {
       setFormData({ email, password })
       setRememberMe(true)
     }
-  }, [navigate])
+  }, [])
 
   const handleEmailChange = (e) => {
     setFormData(f => ({ ...f, email: e.target.value }))
@@ -120,13 +126,13 @@
         saveAuthInfo(result.token, result.user, rememberMe)
         saveRememberedLoginInfo(formData.email, formData.password, rememberMe)
         setTimeout(() => {
-        // 根据不同角色跳转
+          const uid = result.user.id
           switch (result.user.role) {
             case 'admin':
-              navigate('/admin', { replace: true })
+              navigate(`/admin/${uid}`, { replace: true })
               break
             case 'superadmin':
-              navigate('/superadmin', { replace: true })
+              navigate(`/superadmin/${uid}/users`, { replace: true })
               break
             default:
               navigate('/home', { replace: true })
diff --git a/Merge/front/src/router/App.js b/Merge/front/src/router/App.js
index 4da6f49..d7f5f09 100644
--- a/Merge/front/src/router/App.js
+++ b/Merge/front/src/router/App.js
@@ -1,74 +1,85 @@
 // src/router/index.jsx
 import React from 'react'
-import { Routes, Route, Navigate, Outlet } from 'react-router-dom'
+import { Routes, Route, Navigate } from 'react-router-dom'
 
-import LoginPage           from '../pages/LoginPage/LoginPage'
-import RegisterPage        from '../pages/RegisterPage/RegisterPage'
-import ForgotPasswordPage  from '../pages/ForgotPasswordPage/ForgotPasswordPage'
-import TestDashboard       from '../pages/TestDashboard/TestDashboard'
-import HomeFeed            from '../components/HomeFeed'
-import CreatePost          from '../components/CreatePost'
-import NotebookPage        from '../components/NotebookPage'
-import PlaceholderPage     from '../components/PlaceholderPage'
-import UserProfile         from '../components/UserProfile'
+import LoginPage          from '../pages/LoginPage/LoginPage'
+import RegisterPage       from '../pages/RegisterPage/RegisterPage'
+import ForgotPasswordPage from '../pages/ForgotPasswordPage/ForgotPasswordPage'
+import TestDashboard      from '../pages/TestDashboard/TestDashboard'
 
-import AdminPage           from '../components/Admin'
-import SuperAdmin          from '../components/SuperAdmin'
-import UserManagement      from '../components/UserManagement'
-import LogsDashboard       from '../components/LogsDashboard'
-import TransactionLogs     from '../components/TransactionLogs'
-import PerformanceLogs     from '../components/PerformanceLogs'
+import HomeFeed           from '../components/HomeFeed'
+import CreatePost         from '../components/CreatePost'
+import NotebookPage       from '../components/NotebookPage'
+import PlaceholderPage    from '../components/PlaceholderPage'
+import UserProfile        from '../components/UserProfile'
 
-import { RequireAuth, RequireRole } from './Guards'
+import AdminPage          from '../components/Admin'
+import SuperAdmin         from '../components/SuperAdmin'
+import UserManagement     from '../components/UserManagement'
+import LogsDashboard      from '../components/LogsDashboard'
+import TransactionLogs    from '../components/TransactionLogs'
+import PerformanceLogs    from '../components/PerformanceLogs'
+
+import {
+  RequireAuth,
+  RequireRole,
+  RequireOwnProfile,
+  RequireAdminOwn,
+  RequireSuperAdminOwn
+} from './Guards'
 
 export default function AppRoutes() {
   return (
     <Routes>
-      {/* ### 公开路由（不用登录就能看） */}
-      <Route path="/login"            element={<LoginPage />} />
-      <Route path="/register"         element={<RegisterPage />} />
-      <Route path="/forgot-password"  element={<ForgotPasswordPage />} />
+      {/* 1. 公开路由 */}
+      <Route path="/login"           element={<LoginPage />} />
+      <Route path="/register"        element={<RegisterPage />} />
+      <Route path="/forgot-password" element={<ForgotPasswordPage />} />
 
-      {/* ### 需要登录才能访问的区域 */}
+      {/* 2. 受保护路由 */}
       <Route element={<RequireAuth />}>
-        {/* ---- 普通用户区块 ---- */}
-        <Route element={<RequireRole allowedRoles={['user']} />}>
-          <Route path="/home"      element={<HomeFeed />} />
-          <Route path="/posts/new" element={<CreatePost />} />
-          <Route path="/notebooks" element={<NotebookPage />} />
+        {/* 2.1 任何登录用户都能看自己的主页 */}
+        <Route element={<RequireOwnProfile />}>
           <Route path="/user/:userId" element={<UserProfile />} />
-          <Route path="/activity"  element={<PlaceholderPage pageId="activity" />} />
-          <Route path="/notes"     element={<PlaceholderPage pageId="notes" />} />
-          <Route path="/creator"   element={<PlaceholderPage pageId="creator" />} />
-          <Route path="/journal"   element={<PlaceholderPage pageId="journal" />} />
-
-          <Route path="/dashboard/*" element={<PlaceholderPage />} />
-          <Route path="/posts/new"           element={<CreatePost />} />
-          <Route path="/posts/edit/:postId"  element={<CreatePost />} />
-          <Route path="/" element={<Navigate to="/dashboard/overview" replace />} />
         </Route>
 
-        {/* ---- 管理员区块 ---- */}
+        {/* 2.2 普通用户 */}
+        <Route element={<RequireRole allowedRoles={['user']} />}>
+          <Route path="/home"               element={<HomeFeed />} />
+          <Route path="/posts/new"          element={<CreatePost />} />
+          <Route path="/posts/edit/:postId" element={<CreatePost />} />
+          <Route path="/notebooks"          element={<NotebookPage />} />
+          <Route path="/dashboard/*"        element={<PlaceholderPage />} />
+          <Route path="/activity"           element={<PlaceholderPage pageId="activity" />} />
+          <Route path="/notes"              element={<PlaceholderPage pageId="notes" />} />
+          <Route path="/creator"            element={<PlaceholderPage pageId="creator" />} />
+          <Route path="/journal"            element={<PlaceholderPage pageId="journal" />} />
+          <Route path="/"                   element={<Navigate to="/home" replace />} />
+        </Route>
+
+        {/* 2.3 Admin 自己的页面 */}
+        <Route element={<RequireAdminOwn />}>
+          <Route path="/admin/:userId" element={<AdminPage />} />
+        </Route>
         <Route element={<RequireRole allowedRoles={['admin']} />}>
-          <Route path="/admin" element={<AdminPage />} />
-          <Route path="/test-dashboard" element={<TestDashboard  />} />
+          <Route path="/test-dashboard" element={<TestDashboard />} />
         </Route>
 
-        {/* ---- 超级管理员区块 ---- */}
-        <Route element={<RequireRole allowedRoles={['superadmin']} />}>
-          <Route path="/superadmin" element={<SuperAdmin />}>
+        {/* 2.4 SuperAdmin 自己的区域 */}
+        <Route element={<RequireSuperAdminOwn />}>
+          <Route path="/superadmin/:userId/*" element={<SuperAdmin />}>
             <Route index element={<Navigate to="users" replace />} />
-            <Route path="users"         element={<UserManagement superAdminId={3} />} />
-            <Route path="dashboard"     element={<LogsDashboard />}>
+            <Route path="users"     element={<UserManagement />} />
+            <Route path="dashboard" element={<LogsDashboard />}>
               <Route index element={<Navigate to="transactions" replace />} />
-              <Route path="transactions" element={<TransactionLogs userId={1} />} />
-              <Route path="performance"  element={<PerformanceLogs userId={1} />} />
+              <Route path="transactions" element={<TransactionLogs />} />
+              <Route path="performance"  element={<PerformanceLogs />} />
             </Route>
           </Route>
         </Route>
       </Route>
 
-      {/* ### 兜底：不认识的地址都重定向到 /login */}
+      {/* 3. 兜底：未匹配一律回登录 */}
       <Route path="*" element={<Navigate to="/login" replace />} />
     </Routes>
   )
diff --git a/Merge/front/src/router/Guards.jsx b/Merge/front/src/router/Guards.jsx
index 3fa7408..fe45e30 100644
--- a/Merge/front/src/router/Guards.jsx
+++ b/Merge/front/src/router/Guards.jsx
@@ -1,24 +1,53 @@
 // src/router/Guards.jsx
 import React from 'react'
-import { Navigate, Outlet, useLocation } from 'react-router-dom'
-import { getAuthToken, getUserInfo } from '../utils/auth'
+import { Navigate, Outlet, useLocation, useParams } from 'react-router-dom'
+import { getUserInfo } from '../utils/auth'
 
-/** 登录检查：有 token 才放行，否则跳到 /login */
-export function RequireAuth({ children }) {
-  const token = getAuthToken()
-  const loc   = useLocation()
-  if (!token) {
-    return <Navigate to="/login" state={{ from: loc }} replace />
+/** 需登录 */
+export function RequireAuth() {
+  const user = getUserInfo()
+  const location = useLocation()
+  if (!user) {
+    return <Navigate to="/login" state={{ from: location }} replace />
   }
-  return children ?? <Outlet />
+  return <Outlet />
 }
 
-/** 角色检查：只有 allowedRoles 内的角色才能访问 */
-export function RequireRole({ allowedRoles, children }) {
+/** 需特定角色 */
+export function RequireRole({ allowedRoles }) {
   const user = getUserInfo()
-  // user 里应该有 .role
   if (!user || !allowedRoles.includes(user.role)) {
     return <Navigate to="/login" replace />
   }
-  return children ?? <Outlet />
+  return <Outlet />
+}
+
+/** 只能访问自己的用户详情 */
+export function RequireOwnProfile() {
+  const user = getUserInfo()
+  const { userId } = useParams()
+  if (!user || user.id.toString() !== userId) {
+    return <Navigate to="/home" replace />
+  }
+  return <Outlet />
+}
+
+/** 只能访问自己的 Admin 页面 */
+export function RequireAdminOwn() {
+  const user = getUserInfo()
+  const { userId } = useParams()
+  if (!user || user.role !== 'admin' || user.id.toString() !== userId) {
+    return <Navigate to="/login" replace />
+  }
+  return <Outlet />
+}
+
+/** 只能访问自己的 SuperAdmin 区 */
+export function RequireSuperAdminOwn() {
+  const user = getUserInfo()
+  const { userId } = useParams()
+  if (!user || user.role !== 'superadmin' || user.id.toString() !== userId) {
+    return <Navigate to="/login" replace />
+  }
+  return <Outlet />
 }
