diff --git a/src/components/Administer.css b/src/components/Administer.css
new file mode 100644
index 0000000..1599a3e
--- /dev/null
+++ b/src/components/Administer.css
@@ -0,0 +1,170 @@
+.administer-container {
+  padding: 20px;
+  max-width: 1200px;
+  margin: 0 auto;
+}
+
+.search-container {
+  margin-bottom: 20px;
+  display: flex;
+  gap: 10px;
+}
+
+.search-input {
+  padding: 8px;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+  flex-grow: 1;
+  max-width: 300px;
+}
+
+.search-button, .reset-button {
+  padding: 8px 16px;
+  background-color: #4CAF50;
+  color: white;
+  border: none;
+  border-radius: 4px;
+  cursor: pointer;
+}
+
+.reset-button {
+  background-color: #f44336;
+}
+
+.error-message {
+  color: #f44336;
+  margin-bottom: 15px;
+}
+
+.loading-message {
+  color: #2196F3;
+  margin-bottom: 15px;
+}
+
+.user-list-container {
+  overflow-x: auto;
+}
+
+.user-table {
+  width: 100%;
+  border-collapse: collapse;
+}
+
+.user-table th, .user-table td {
+  border: 1px solid #ddd;
+  padding: 8px;
+  text-align: left;
+}
+
+.user-table th {
+  background-color: #f2f2f2;
+}
+
+.user-table tr:nth-child(even) {
+  background-color: #f9f9f9;
+}
+
+.user-table tr:hover {
+  background-color: #f1f1f1;
+}
+
+.authority-select {
+  padding: 5px;
+  border-radius: 4px;
+  border: 1px solid #ccc;
+}
+
+/* 选项卡样式 */
+.tab-container {
+  display: flex;
+  margin-bottom: 20px;
+  border-bottom: 1px solid #ddd;
+}
+
+.tab-button {
+  padding: 10px 20px;
+  background: none;
+  border: none;
+  cursor: pointer;
+  font-size: 16px;
+  border-bottom: 3px solid transparent;
+}
+
+.tab-button.active {
+  border-bottom: 3px solid #1890ff;
+  color: #1890ff;
+}
+
+/* 折扣卡片样式 */
+.current-discount-card {
+  background-color: #f5f5f5;
+  padding: 15px;
+  border-radius: 5px;
+  margin-bottom: 20px;
+}
+
+/* 折扣表单样式 */
+.add-discount-form {
+  background-color: #f9f9f9;
+  padding: 20px;
+  border-radius: 5px;
+  margin-bottom: 20px;
+}
+
+.form-group {
+  margin-bottom: 15px;
+}
+
+.form-group label {
+  display: inline-block;
+  width: 100px;
+  margin-right: 10px;
+}
+
+/* 折扣表格样式 */
+.discount-table {
+  width: 100%;
+  border-collapse: collapse;
+}
+
+.discount-table th, .discount-table td {
+  padding: 10px;
+  border: 1px solid #ddd;
+  text-align: left;
+}
+
+.discount-table th {
+  background-color: #f2f2f2;
+}
+
+.delete-button {
+  background-color: #ff4d4f;
+  color: white;
+  border: none;
+  padding: 5px 10px;
+  border-radius: 3px;
+  cursor: pointer;
+}
+
+.delete-button:hover {
+  background-color: #ff7875;
+}
+
+.react-datepicker {
+  font-size: 14px;
+}
+
+.react-datepicker__time-container {
+  width: 120px;
+}
+
+.react-datepicker-time__header {
+  font-size: 13px;
+}
+
+.time-preview {
+  margin: 10px 0;
+  padding: 10px;
+  background: #f5f5f5;
+  border-radius: 4px;
+}
\ No newline at end of file
diff --git a/src/components/Administer.jsx b/src/components/Administer.jsx
new file mode 100644
index 0000000..35ae428
--- /dev/null
+++ b/src/components/Administer.jsx
@@ -0,0 +1,459 @@
+import React, { useState, useEffect } from 'react';
+import { useNavigate } from 'react-router-dom';
+import './Administer.css';
+import { 
+  getAllUsers, 
+  searchUsers, 
+  updateUserAuthority,
+  getAllDiscounts,
+  getCurrentDiscount,
+  addDiscount,
+  deleteDiscount
+} from '../api/administer';
+import DatePicker from 'react-datepicker';
+import 'react-datepicker/dist/react-datepicker.css';
+
+
+const Administer = () => {
+  const navigate = useNavigate();
+  const [users, setUsers] = useState([]);
+  const [discounts, setDiscounts] = useState([]);
+  const [currentDiscount, setCurrentDiscount] = useState(null);
+  const [searchKey, setSearchKey] = useState('');
+  const [loading, setLoading] = useState(false);
+  const [error, setError] = useState(null);
+  const [newDiscount, setNewDiscount] = useState({
+    name: '',
+    discountType: 'FREE'
+  });
+  const [startDate, setStartDate] = useState(new Date());
+  const [endDate, setEndDate] = useState(new Date());
+  const [activeTab, setActiveTab] = useState('users'); // 'users' 或 'discounts'
+
+const fetchAllUsers = async () => {
+  setLoading(true);
+  setError(null);
+  try {
+    const users = await getAllUsers();
+    console.log("API Data:", users); // 现在应该直接是用户数组
+    
+    const formattedUsers = users.map(user => ({
+      username: user.username || '未知用户',
+      authority: user.authority || 'USER',
+      registTime: user.registTime || null,
+      lastLogin: user.lastLogin || null,
+      upload: Number(user.upload) || 0,
+      download: Number(user.download) || 0,
+      magicPoints: Number(user.magicPoints) || 0,
+      shareRate: Number(user.shareRate) || 0
+    }));
+    
+    console.log("Formatted Users:", formattedUsers);
+    setUsers(formattedUsers);
+  } catch (err) {
+    console.error("Error details:", err);
+    setError(`获取用户列表失败: ${err.message}`);
+  } finally {
+    setLoading(false);
+  }
+};
+
+
+ const handleSearch = async () => {
+  if (!searchKey.trim()) {
+    fetchAllUsers();
+    return;
+  }
+
+  setLoading(true);
+  setError(null);
+  try {
+    const users = await searchUsers(searchKey);
+    console.log("Search Results:", users); // 打印搜索结果
+
+    // 格式化数据（确保数值字段正确解析）
+    const formattedUsers = users.map(user => ({
+      username: user.username || '未知用户',
+      authority: user.authority || 'USER',
+      registTime: user.registTime || null,
+      lastLogin: user.lastLogin || null,
+      upload: Number(user.upload) || 0,    // 确保解析为数字
+      download: Number(user.download) || 0,
+      magicPoints: Number(user.magicPoints) || 0,
+      shareRate: Number(user.shareRate) || 0
+    }));
+
+    setUsers(formattedUsers);
+  } catch (err) {
+    setError('搜索用户失败，请重试');
+    console.error(err);
+  } finally {
+    setLoading(false);
+  }
+};
+
+  // 重置搜索
+  const handleReset = () => {
+    setSearchKey('');
+    fetchAllUsers();
+  };
+
+  // 修改用户权限
+  const handleChangeAuthority = async (username, newAuthority) => {
+    try {
+      await updateUserAuthority(username, newAuthority);
+      // 更新本地状态
+      setUsers(users.map(user => 
+        user.username === username ? { ...user, authority: newAuthority } : user
+      ));
+    } catch (err) {
+      setError('修改权限失败，请重试');
+      console.error(err);
+    }
+  };
+
+   // 获取所有折扣
+  const fetchAllDiscounts = async () => {
+    setLoading(true);
+    setError(null);
+    try {
+      const data = await getAllDiscounts();
+      setDiscounts(data);
+    } catch (err) {
+      setError('获取折扣列表失败: ' + err.message);
+      console.error(err);
+    } finally {
+      setLoading(false);
+    }
+  };
+
+  // 获取当前折扣
+  const fetchCurrentDiscount = async () => {
+    try {
+      const data = await getCurrentDiscount();
+      setCurrentDiscount(data);
+    } catch (err) {
+      console.error('获取当前折扣失败:', err);
+    }
+  };
+
+    const handleAddDiscount = async () => {
+  if (!newDiscount.name || !startDate || !endDate) {
+    setError('请填写所有必填字段');
+    return;
+  }
+
+  try {
+    // 验证时间
+    if (startDate >= endDate) {
+      setError('结束时间必须晚于开始时间');
+      return;
+    }
+
+    const payload = {
+      name: newDiscount.name,
+      startTime: formatDateToISO(startDate), // 例如: "2025-06-01T14:30:00"
+      endTime: formatDateToISO(endDate, true), // 例如: "2025-06-01T18:45:59"
+      discountType: newDiscount.discountType
+    };
+
+    console.log('提交数据:', payload); // 调试用
+
+    await addDiscount(payload);
+    
+    // 重置表单
+    setNewDiscount({
+      name: '',
+      discountType: 'FREE'
+    });
+    setStartDate(new Date());
+    setEndDate(new Date());
+    
+    fetchAllDiscounts();
+    setError(null);
+  } catch (err) {
+    setError('添加折扣失败: ' + err.message);
+    console.error(err);
+  }
+};
+
+const formatDateToISO = (date, isEndTime = false) => {
+  if (!date) return '';
+  
+  const pad = (num) => num.toString().padStart(2, '0');
+  
+  const year = date.getFullYear();
+  const month = pad(date.getMonth() + 1);
+  const day = pad(date.getDate());
+  const hours = pad(date.getHours());
+  const minutes = pad(date.getMinutes());
+  
+  if (isEndTime) {
+    // 结束时间精确到用户选择的时间+59秒
+    return `${year}-${month}-${day}T${hours}:${minutes}:59`;
+  } else {
+    // 开始时间精确到用户选择的时间+00秒
+    return `${year}-${month}-${day}T${hours}:${minutes}:00`;
+  }
+};
+
+  // 删除折扣
+  const handleDeleteDiscount = async (id) => {
+    try {
+      await deleteDiscount(id);
+      fetchAllDiscounts();
+    } catch (err) {
+      setError('删除折扣失败: ' + err.message);
+      console.error(err);
+    }
+  };
+
+  // 初始化加载数据
+  useEffect(() => {
+    if (activeTab === 'users') {
+      fetchAllUsers();
+    } else {
+      fetchAllDiscounts();
+      fetchCurrentDiscount();
+    }
+  }, [activeTab]);
+
+  // 格式化分享率为百分比
+  const formatShareRate = (rate) => {
+    return (rate * 100).toFixed(2) + '%';
+  };
+
+  // 格式化日期
+  const formatDate = (date) => {
+    if (!date) return '-';
+    return new Date(date).toLocaleDateString();
+  };
+    // 格式化日期
+  const formatDateTime = (dateTime) => {
+    if (!dateTime) return '-';
+    return new Date(dateTime).toLocaleString();
+  };
+
+    // 折扣类型翻译
+  const translateDiscountType = (type) => {
+    switch (type) {
+      case 'FREE': return '全部免费';
+      case 'HALF': return '半价下载';
+      case 'DOUBLE': return '双倍上传';
+      default: return type;
+    }
+  };
+
+
+  return (
+    <div className="administer-container">
+      <h1>系统管理</h1>
+
+      {/* 选项卡切换 */}
+      <div className="tab-container">
+        <button 
+          className={`tab-button ${activeTab === 'users' ? 'active' : ''}`}
+          onClick={() => setActiveTab('users')}
+        >
+          用户管理
+        </button>
+        <button 
+          className={`tab-button ${activeTab === 'discounts' ? 'active' : ''}`}
+          onClick={() => setActiveTab('discounts')}
+        >
+          折扣管理
+        </button>
+      </div>
+
+      {activeTab === 'users' ? (
+        <>
+            {/* 搜索框 */}
+            <div className="search-container">
+                <input
+                type="text"
+                value={searchKey}
+                onChange={(e) => setSearchKey(e.target.value)}
+                placeholder="输入用户名搜索"
+                className="search-input"
+                />
+                <button onClick={handleSearch} className="search-button">
+                搜索
+                </button>
+                <button onClick={handleReset} className="reset-button">
+                重置
+                </button>
+            </div>
+
+            {/* 错误提示 */}
+            {error && <div className="error-message">{error}</div>}
+
+            {/* 加载状态 */}
+            {loading && <div className="loading-message">加载中...</div>}
+
+            {/* 用户列表 */}
+            <div className="user-list-container">
+                <table className="user-table">
+                <thead>
+                    <tr>
+                    <th>用户名</th>
+                    <th>注册时间</th>
+                    <th>最后登录</th>
+                    <th>上传量</th>
+                    <th>下载量</th>
+                    <th>分享率</th>
+                    <th>魔力值</th>
+                    <th>权限</th>
+                    <th>操作</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    {Array.isArray(users) && users.map((user) => (
+                    <tr key={user.username}>
+                        <td>{user.username}</td>
+                        <td>{formatDate(user.registTime)}</td>
+                        <td>{formatDate(user.lastLogin)}</td>
+                        <td>{user.upload}</td>
+                        <td>{user.download}</td>
+                        <td>{formatShareRate(user.shareRate)}</td>
+                        <td>{user.magicPoints}</td>
+                        <td>{user.authority}</td>
+                        <td>
+                        <select
+                            value={user.authority}
+                            onChange={(e) => handleChangeAuthority(user.username, e.target.value)}
+                            className="authority-select"
+                        >
+                            <option value="USER">普通用户</option>
+                            <option value="ADMIN">管理员</option>
+                            <option value="LIMIT">受限用户</option>
+                            <option value="BAN">封禁用户</option>
+                        </select>
+                        </td>
+                    </tr>
+                    ))}
+                </tbody>
+                </table>
+            </div>
+        </>
+    ) : (
+        /* 新增的折扣管理部分 */
+        <>
+          {/* 当前活动折扣 */}
+          <div className="current-discount-section">
+            <h3>当前活动折扣</h3>
+            {currentDiscount ? (
+              <div className="current-discount-card">
+                <p><strong>名称:</strong> {currentDiscount.name}</p>
+                <p><strong>类型:</strong> {translateDiscountType(currentDiscount.discountType)}</p>
+                <p><strong>时间:</strong> {formatDateTime(currentDiscount.startTime)} 至 {formatDateTime(currentDiscount.endTime)}</p>
+                <p><strong>状态:</strong> {currentDiscount.status}</p>
+              </div>
+            ) : (
+              <p>当前没有进行中的折扣</p>
+            )}
+          </div>
+
+          {/* 添加新折扣表单 */}
+          <div className="add-discount-form">
+            <h3>添加新折扣</h3>
+            <div className="form-group">
+              <label>折扣名称:</label>
+              <input
+                type="text"
+                value={newDiscount.name}
+                onChange={(e) => setNewDiscount({...newDiscount, name: e.target.value})}
+              />
+            </div>
+            <div className="form-group">
+                <label>开始时间:</label>
+                <DatePicker
+                  selected={startDate}
+                  onChange={(date) => setStartDate(date)}
+                  showTimeSelect
+                  timeFormat="HH:mm"
+                  timeIntervals={1} // 1分钟间隔
+                  dateFormat="yyyy-MM-dd HH:mm"
+                  minDate={new Date()}
+                  placeholderText="选择开始日期和时间"
+                />
+            </div>
+            <div className="form-group">
+                  <label>结束时间:</label>
+                  <DatePicker
+                    selected={endDate}
+                    onChange={(date) => setEndDate(date)}
+                    showTimeSelect
+                    timeFormat="HH:mm"
+                    timeIntervals={1} // 1分钟间隔
+                    dateFormat="yyyy-MM-dd HH:mm"
+                    minDate={startDate}
+                    placeholderText="选择结束日期和时间"
+                  />
+            </div>
+            <div className="form-group">
+              <label>折扣类型:</label>
+              <select
+                value={newDiscount.discountType}
+                onChange={(e) => setNewDiscount({...newDiscount, discountType: e.target.value})}
+              >
+                <option value="FREE">全部免费</option>
+                <option value="HALF">半价下载</option>
+                <option value="DOUBLE">双倍上传</option>
+              </select>
+            </div>
+            <button 
+                onClick={(e) => {
+                    e.preventDefault(); // 确保没有阻止默认行为
+                    handleAddDiscount();
+                }}
+                >
+                添加折扣
+            </button>
+          </div>
+
+          {/* 所有折扣列表 */}
+          <div className="discount-list-container">
+            <h3>所有折扣计划</h3>
+            <table className="discount-table">
+              <thead>
+                <tr>
+                  <th>ID</th>
+                  <th>名称</th>
+                  <th>开始时间</th>
+                  <th>结束时间</th>
+                  <th>类型</th>
+                  <th>创建时间</th>
+                  <th>状态</th>
+                  <th>操作</th>
+                </tr>
+              </thead>
+              <tbody>
+                {discounts.map(discount => (
+                  <tr key={discount.id}>
+                    <td>{discount.id}</td>
+                    <td>{discount.name}</td>
+                    <td>{formatDateTime(discount.startTime)}</td>
+                    <td>{formatDateTime(discount.endTime)}</td>
+                    <td>{translateDiscountType(discount.discountType)}</td>
+                    <td>{formatDateTime(discount.createTime)}</td>
+                    <td>{discount.status || '未知'}</td>
+                    <td>
+                      <button 
+                        onClick={() => handleDeleteDiscount(discount.id)}
+                        className="delete-button"
+                      >
+                        删除
+                      </button>
+                    </td>
+                  </tr>
+                ))}
+              </tbody>
+            </table>
+          </div>
+        </>
+      )}
+    </div>
+  );
+};
+
+export default Administer;
\ No newline at end of file
diff --git a/src/components/Administer.test.jsx b/src/components/Administer.test.jsx
new file mode 100644
index 0000000..5a452fa
--- /dev/null
+++ b/src/components/Administer.test.jsx
@@ -0,0 +1,195 @@
+import React from 'react';
+import { render, screen, waitFor, fireEvent, act } from '@testing-library/react';
+import { MemoryRouter } from 'react-router-dom';
+import '@testing-library/jest-dom';
+import axios from 'axios';
+import Administer from './Administer';
+
+// Mock axios
+jest.mock('axios');
+
+// Mock localStorage
+const localStorageMock = {
+  getItem: jest.fn(),
+  setItem: jest.fn(),
+  removeItem: jest.fn(),
+  clear: jest.fn(),
+};
+global.localStorage = localStorageMock;
+
+describe('Administer Component', () => {
+  beforeEach(() => {
+    localStorageMock.getItem.mockReturnValue('test-token');
+    jest.clearAllMocks();
+  });
+
+  const mockUsers = [
+    {
+      username: 'user1',
+      authority: 'USER',
+      registTime: '2023-01-01T00:00:00',
+      lastLogin: '2023-05-01T00:00:00',
+      upload: 1000,
+      download: 500,
+      shareRate: 2.0,
+      magicPoints: 100
+    },
+    {
+      username: 'admin1',
+      authority: 'ADMIN',
+      registTime: '2023-01-15T00:00:00',
+      lastLogin: '2023-05-10T00:00:00',
+      upload: 5000,
+      download: 1000,
+      shareRate: 5.0,
+      magicPoints: 500
+    }
+  ];
+
+  const mockDiscounts = [
+    {
+      id: 1,
+      name: '五一活动',
+      discountType: 'FREE',
+      startTime: '2023-05-01T00:00:00',
+      endTime: '2023-05-07T23:59:59',
+      createTime: '2023-04-25T10:00:00',
+      status: '已过期'
+    },
+    {
+      id: 2,
+      name: '端午节活动',
+      discountType: 'HALF',
+      startTime: '2023-06-10T00:00:00',
+      endTime: '2023-06-15T23:59:59',
+      createTime: '2023-05-30T10:00:00',
+      status: '已过期'
+    }
+  ];
+
+  const mockCurrentDiscount = {
+    id: 3,
+    name: '国庆活动',
+    discountType: 'DOUBLE',
+    startTime: '2023-10-01T00:00:00',
+    endTime: '2023-10-07T23:59:59',
+    createTime: '2023-09-25T10:00:00',
+    status: '进行中'
+  };
+
+  const renderAdminister = () => {
+    return render(
+      <MemoryRouter>
+        <Administer />
+      </MemoryRouter>
+    );
+  };
+
+  test('renders Administer component with user tab by default', async () => {
+    axios.get.mockResolvedValueOnce({
+      data: {
+        code: 200,
+        data: { data: mockUsers }
+      }
+    });
+
+    renderAdminister();
+
+    expect(screen.getByText('系统管理')).toBeInTheDocument();
+    expect(screen.getByText('用户管理')).toBeInTheDocument();
+    expect(screen.getByText('折扣管理')).toBeInTheDocument();
+
+    await waitFor(() => {
+      expect(screen.getByText('user1')).toBeInTheDocument();
+    });
+    
+    expect(screen.getByText('admin1')).toBeInTheDocument();
+  });
+
+  test('switches between user and discount tabs', async () => {
+    axios.get
+      .mockResolvedValueOnce({
+        data: {
+          code: 200,
+          data: { data: mockUsers }
+        }
+      })
+      .mockResolvedValueOnce({
+        data: {
+          code: 200,
+          data: { data: mockDiscounts }
+        }
+      })
+      .mockResolvedValueOnce({
+        data: {
+          code: 200,
+          data: { data: mockCurrentDiscount }
+        }
+      });
+
+    renderAdminister();
+
+    await waitFor(() => {
+      expect(screen.getByText('user1')).toBeInTheDocument();
+    });
+
+    fireEvent.click(screen.getByText('折扣管理'));
+
+    await waitFor(() => {
+      expect(screen.getByText('五一活动')).toBeInTheDocument();
+    });
+    
+    expect(screen.getByText('国庆活动')).toBeInTheDocument();
+  });
+
+ 
+
+  test('changes user authority', async () => {
+    axios.get.mockResolvedValueOnce({
+      data: {
+        code: 200,
+        data: { data: mockUsers }
+      }
+    });
+    axios.put.mockResolvedValueOnce({
+      data: {
+        code: 200,
+        message: '修改用户权限成功'
+      }
+    });
+
+    renderAdminister();
+
+    await waitFor(() => {
+      expect(screen.getByText('user1')).toBeInTheDocument();
+    });
+
+    const selectElement = screen.getAllByRole('combobox')[0];
+    fireEvent.change(selectElement, { target: { value: 'ADMIN' } });
+
+    await waitFor(() => {
+      expect(axios.put).toHaveBeenCalled();
+    });
+    
+    expect(axios.put).toHaveBeenCalledWith(
+      expect.stringContaining('/user/changeAuthority'),
+      {
+        changeUsername: 'user1',
+        authority: 'ADMIN'
+      },
+      expect.any(Object)
+    );
+  });
+
+
+
+  test('shows error messages', async () => {
+    axios.get.mockRejectedValueOnce(new Error('Network Error'));
+
+    renderAdminister();
+
+    await waitFor(() => {
+      expect(screen.getByText(/获取用户列表失败/)).toBeInTheDocument();
+    });
+  });
+});
\ No newline at end of file
diff --git a/src/components/AuthForm.css b/src/components/AuthForm.css
index 8eb1d0a..0348f50 100644
--- a/src/components/AuthForm.css
+++ b/src/components/AuthForm.css
@@ -7,55 +7,58 @@
     min-height: 100vh;
     background-color: #f5f5f5;
     padding: 20px;
-  }
-  
-  .auth-title {
+}
+
+.auth-title {
     color: #333;
     font-size: 2.5rem;
     margin-bottom: 2rem;
     text-align: center;
-  }
-  
-  .auth-form-wrapper {
+}
+
+.auth-form-wrapper {
     width: 100%;
     max-width: 400px;
     background: white;
     padding: 2rem;
     border-radius: 8px;
     box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
-  }
-  
-  .auth-form {
+}
+
+.auth-form {
     display: flex;
     flex-direction: column;
     gap: 1rem;
-  }
-  
-  .auth-form h2 {
+}
+
+.auth-form h2 {
     color: #333;
     text-align: center;
     margin-bottom: 1.5rem;
-  }
-  
-  .form-group {
+}
+
+.form-group {
     display: flex;
     flex-direction: column;
     gap: 0.5rem;
-  }
-  
-  .form-group input {
+}
+
+.form-group input {
     padding: 0.8rem;
     border: 1px solid #ddd;
     border-radius: 4px;
     font-size: 1rem;
-  }
-  
-  .form-group input:focus {
+    width: 100%;
+    box-sizing: border-box; /* 确保padding不会影响宽度 */
+    height: 42px; /* 固定高度 */
+}
+
+.form-group input:focus {
     outline: none;
     border-color: #007bff;
-  }
-  
-  .auth-button {
+}
+
+.auth-button {
     padding: 0.8rem;
     background-color: #007bff;
     color: white;
@@ -64,18 +67,19 @@
     font-size: 1rem;
     cursor: pointer;
     transition: background-color 0.3s;
-  }
-  
-  .auth-button:hover {
+    height: 42px; /* 与输入框高度一致 */
+}
+
+.auth-button:hover {
     background-color: #0056b3;
-  }
-  
-  .auth-button:disabled {
+}
+
+.auth-button:disabled {
     background-color: #cccccc;
     cursor: not-allowed;
-  }
-  
-  .auth-switch {
+}
+
+.auth-switch {
     display: flex;
     justify-content: center;
     align-items: center;
@@ -83,9 +87,9 @@
     margin-top: 1rem;
     font-size: 0.9rem;
     color: #666;
-  }
-  
-  .switch-button {
+}
+
+.switch-button {
     background: none;
     border: none;
     color: #007bff;
@@ -93,17 +97,17 @@
     text-decoration: underline;
     font-size: 0.9rem;
     padding: 0;
-  }
-  
-  .switch-button:hover {
+}
+
+.switch-button:hover {
     color: #0056b3;
-  }
-  
-  .error-message {
+}
+
+.error-message {
     color: #dc3545;
     background-color: #f8d7da;
     padding: 0.5rem;
     border-radius: 4px;
     text-align: center;
     margin-bottom: 1rem;
-  }
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/src/components/Dashboard.css b/src/components/Dashboard.css
index af9e421..09ab88f 100644
--- a/src/components/Dashboard.css
+++ b/src/components/Dashboard.css
@@ -646,4 +646,73 @@
   z-index: 100;
   padding: 15px;
   box-shadow: 0 2px 5px rgba(0,0,0,0.1);
+}
+
+.admin-center-btn {
+  padding: 5px 10px;
+  margin-right: 10px;
+  background-color: #ff5722;
+  color: white;
+  border: none;
+  border-radius: 4px;
+  cursor: pointer;
+  font-size: 14px;
+}
+
+.admin-center-btn:hover {
+  background-color: #e64a19;
+}
+
+/* 区域搜索容器样式 */
+.section-search-container {
+  display: flex;
+  margin-bottom: 20px;
+  gap: 10px;
+}
+
+.section-search-input {
+  flex: 1;
+  padding: 10px 15px;
+  border: 1px solid #ddd;
+  border-radius: 4px;
+  font-size: 1rem;
+}
+
+.section-search-button {
+  padding: 10px 20px;
+  background-color: #007bff;
+  color: white;
+  border: none;
+  border-radius: 4px;
+  cursor: pointer;
+  transition: background-color 0.3s;
+}
+
+.section-search-button:hover {
+  background-color: #0056b3;
+}
+
+/* 分享区顶部操作栏 */
+.share-top-actions {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20px;
+  gap: 20px;
+}
+
+/* 上传按钮样式 */
+.upload-btn {
+  padding: 10px 20px;
+  background-color: #28a745;
+  color: white;
+  border: none;
+  border-radius: 4px;
+  cursor: pointer;
+  transition: background-color 0.3s;
+  white-space: nowrap;
+}
+
+.upload-btn:hover {
+  background-color: #218838;
 }
\ No newline at end of file
diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx
index 941210c..97a01cc 100644
--- a/src/components/Dashboard.jsx
+++ b/src/components/Dashboard.jsx
@@ -1,940 +1,941 @@
-import React, { useEffect, useState } from 'react';
-import { useNavigate, useLocation,useParams } from 'react-router-dom';
-// import { getUserInfo } from '../api';  // 保留import但注释掉
-import { createTorrent, getTorrents} from '../api/torrent'; 
+import React, {useEffect, useState} from 'react';
+import {useNavigate, useLocation, useParams} from 'react-router-dom';
+// import { getUserInfo } from '../api/auth';  
+import {createTorrent, getTorrents} from '../api/torrent';
 import './Dashboard.css';
-import { createPost, getPosts } from '../api/helpPost';
+import {createPost, getPosts} from '../api/helpPost';
 
 
-const Dashboard = ({ onLogout }) => {
-  const location = useLocation();
-  const [userInfo, setUserInfo] = useState(null);
-  const [loading, setLoading] = useState(false);
-  const [error, setError] = useState('');
-  const [currentSlide, setCurrentSlide] = useState(0);
-  const navigate = useNavigate();
-  const {tab} = useParams();
-  const [showUploadModal, setShowUploadModal] = useState(false);
-  const [isUploading, setIsUploading] = useState(false);
-  const [uploadData, setUploadData] = useState({
-    name: '',
-    type: '',
-    region: '',
-    subtitle: '',
-    resolution: '', // 新增分辨率字段
-    file: null,
-    description: ''
-  });
-  const [showPostModal, setShowPostModal] = useState(false);
-  const [postTitle, setPostTitle] = useState('');
-  const [postContent, setPostContent] = useState('');
-  const [selectedImage, setSelectedImage] = useState(null);
-  const [helpPosts, setHelpPosts] = useState([]);
-  const [helpLoading, setHelpLoading] = useState(false);
-  const [helpError, setHelpError] = useState(null);
-  const [currentPage, setCurrentPage] = useState(1);
-  const [totalPages, setTotalPages] = useState(1);
+const Dashboard = ({onLogout}) => {
+    const location = useLocation();
+    const [userInfo, setUserInfo] = useState(null);
+    const [loading, setLoading] = useState(false);
+    const [error, setError] = useState('');
+    const [currentSlide, setCurrentSlide] = useState(0);
+    const navigate = useNavigate();
+    const {tab} = useParams();
+    const [showUploadModal, setShowUploadModal] = useState(false);
+    const [isUploading, setIsUploading] = useState(false);
+    const [uploadData, setUploadData] = useState({
+        name: '',
+        type: '',
+        region: '',
+        subtitle: '',
+        resolution: '', // 新增分辨率字段
+        file: null,
+        description: ''
+    });
+    const [showPostModal, setShowPostModal] = useState(false);
+    const [postTitle, setPostTitle] = useState('');
+    const [postContent, setPostContent] = useState('');
+    const [selectedImage, setSelectedImage] = useState(null);
+    const [helpPosts, setHelpPosts] = useState([]);
+    const [helpLoading, setHelpLoading] = useState(false);
+    const [helpError, setHelpError] = useState(null);
+    const [currentPage, setCurrentPage] = useState(1);
+    const [totalPages, setTotalPages] = useState(1);
 
     // 添加状态
-  const [torrentPosts, setTorrentPosts] = useState([]);
-  const [torrentLoading, setTorrentLoading] = useState(false);
-  const [torrentError, setTorrentError] = useState(null);
-  
-  const [filteredResources, setFilteredResources] = useState(torrentPosts);
-  
-  const activeTab = tab || 'announcement'; // 如果没有tab参数，则默认为announcement
-  // 从location.state中初始化状态
-  
-  
-  const handleTabChange = (tabName) => {
-    navigate(`/dashboard/${tabName}`, { 
-      state: { 
-        savedFilters: selectedFilters, // 使用新的筛选状态 // 保留现有状态
-        activeTab: tabName // 可选，如果其他组件依赖这个 state
-      } 
-    });
-  };
-  
-  //公告区
-  const [announcements] = useState([
-    {
-      id: 1,
-      title: '系统维护与更新',
-      content: '2023-10-15 02:00-06:00将进行系统维护升级，期间网站将无法访问。本次更新包含：\n1. 数据库服务器迁移\n2. 安全补丁更新\n3. CDN节点优化\n\n请提前做好下载安排。',
-      author: '系统管理员',
-      date: '2023-10-10',
-      excerpt: '2023-10-15 02:00-06:00将进行系统维护，期间无法访问',
-      category: '系统'
-    },
-    {
-      id: 2,
-      title: '资源上新',
-      content: '最新热门电影《奥本海默》4K REMUX资源已上线，包含：\n- 4K HDR版本 (56.8GB)\n- 1080P标准版 (12.3GB)\n- 中英双语字幕\n\n欢迎下载保种！',
-      author: '资源组',
-      date: '2023-10-08',
-      excerpt: '最新热门电影《奥本海默》4K资源已上线',
-      category: '资源'
-    },
-    {
-      id: 3,
-      title: '积分规则调整',
-      content: '自11月1日起，上传资源积分奖励提升20%，具体规则如下：\n- 上传电影资源：每GB 10积分\n- 上传电视剧资源：每GB 8积分\n- 上传动漫资源：每GB 6积分\n\n感谢大家的支持与贡献！',
-      author: '管理员',
-      date: '2023-10-05',
-      excerpt: '自11月1日起，上传资源积分奖励提升20%',
-      category: '公告'
-    },
-    {
-      id: 4,
-      title: '违规处理公告',
-      content: '用户user123因发布虚假资源已被封禁，相关资源已删除。请大家遵守社区规则，维护良好的分享环境。',
-      author: '管理员',
-      date: '2023-10-03',
-      excerpt: '用户user123因发布虚假资源已被封禁',
-      category: '违规'
-    },
-    {
-      id: 5,
-      title: '节日活动',
-      content: '国庆期间所有资源下载积分减半，活动时间：2023年10月1日至2023年10月7日。',
-      author: '活动组',
-      date: '2023-09-30',
-      excerpt: '国庆期间所有资源下载积分减半',
-      category: '活动'
-    },
-    {
-      id: 6,
-      title: '客户端更新',
-      content: 'PT客户端v2.5.0已发布，修复多个BUG，新增资源搜索功能。请尽快更新到最新版本以获得更好的使用体验。',
-      author: '开发组',
-      date: '2023-09-28',
-      excerpt: 'PT客户端v2.5.0已发布，修复多个BUG',
-      category: '更新'
-    },
-    // 其他公告...
-  ]);
+    const [torrentPosts, setTorrentPosts] = useState([]);
+    const [torrentLoading, setTorrentLoading] = useState(false);
+    const [torrentError, setTorrentError] = useState(null);
 
-  
-  const handleAnnouncementClick = (announcement,e) => {
-    if (!e.target.closest('.exclude-click')) {
-      navigate(`/announcement/${announcement.id}`, {
-        state: {
-          announcement,
-          returnPath: `/dashboard/${activeTab}`,
-          scrollPosition: window.scrollY,
-          activeTab
+    const [filteredResources, setFilteredResources] = useState(torrentPosts);
+    const [isAdmin, setIsAdmin] = useState(false);
+
+
+    const activeTab = tab || 'announcement'; // 如果没有tab参数，则默认为announcement
+    // 从location.state中初始化状态
+
+
+    const handleTabChange = (tabName) => {
+        navigate(`/dashboard/${tabName}`, {
+            state: {
+                savedFilters: selectedFilters, // 使用新的筛选状态 // 保留现有状态
+                activeTab: tabName // 可选，如果其他组件依赖这个 state
+            }
+        });
+    };
+
+    //公告区
+    const [announcements] = useState([
+        {
+            id: 1,
+            title: '系统维护与更新',
+            content: '2023-10-15 02:00-06:00将进行系统维护升级，期间网站将无法访问。本次更新包含：\n1. 数据库服务器迁移\n2. 安全补丁更新\n3. CDN节点优化\n\n请提前做好下载安排。',
+            author: '系统管理员',
+            date: '2023-10-10',
+            excerpt: '2023-10-15 02:00-06:00将进行系统维护，期间无法访问',
+            category: '系统'
+        },
+        {
+            id: 2,
+            title: '资源上新',
+            content: '最新热门电影《奥本海默》4K REMUX资源已上线，包含：\n- 4K HDR版本 (56.8GB)\n- 1080P标准版 (12.3GB)\n- 中英双语字幕\n\n欢迎下载保种！',
+            author: '资源组',
+            date: '2023-10-08',
+            excerpt: '最新热门电影《奥本海默》4K资源已上线',
+            category: '资源'
+        },
+        {
+            id: 3,
+            title: '积分规则调整',
+            content: '自11月1日起，上传资源积分奖励提升20%，具体规则如下：\n- 上传电影资源：每GB 10积分\n- 上传电视剧资源：每GB 8积分\n- 上传动漫资源：每GB 6积分\n\n感谢大家的支持与贡献！',
+            author: '管理员',
+            date: '2023-10-05',
+            excerpt: '自11月1日起，上传资源积分奖励提升20%',
+            category: '公告'
+        },
+        {
+            id: 4,
+            title: '违规处理公告',
+            content: '用户user123因发布虚假资源已被封禁，相关资源已删除。请大家遵守社区规则，维护良好的分享环境。',
+            author: '管理员',
+            date: '2023-10-03',
+            excerpt: '用户user123因发布虚假资源已被封禁',
+            category: '违规'
+        },
+        {
+            id: 5,
+            title: '节日活动',
+            content: '国庆期间所有资源下载积分减半，活动时间：2023年10月1日至2023年10月7日。',
+            author: '活动组',
+            date: '2023-09-30',
+            excerpt: '国庆期间所有资源下载积分减半',
+            category: '活动'
+        },
+        {
+            id: 6,
+            title: '客户端更新',
+            content: 'PT客户端v2.5.0已发布，修复多个BUG，新增资源搜索功能。请尽快更新到最新版本以获得更好的使用体验。',
+            author: '开发组',
+            date: '2023-09-28',
+            excerpt: 'PT客户端v2.5.0已发布，修复多个BUG',
+            category: '更新'
+        },
+        // 其他公告...
+    ]);
+
+
+    const handleAnnouncementClick = (announcement, e) => {
+        if (!e.target.closest('.exclude-click')) {
+            navigate(`/announcement/${announcement.id}`, {
+                state: {
+                    announcement,
+                    returnPath: `/dashboard/${activeTab}`,
+                    scrollPosition: window.scrollY,
+                    activeTab
+                }
+            });
         }
-      });
-    }
-  };
+    };
 
 
-  //资源区
- 
+    //资源区
+    const handleFileChange = (e) => {
+        setUploadData({...uploadData, file: e.target.files[0]});
+    };
 
-  const handleFileChange = (e) => {
-    setUploadData({...uploadData, file: e.target.files[0]});
-  };
+    const handleUploadSubmit = async (e) => {
+        e.preventDefault();
+        try {
+            setIsUploading(true);
 
-  const handleUploadSubmit = async (e) => {
-    e.preventDefault();
-    
-    try {
-      setIsUploading(true);
-      const username = localStorage.getItem('username');
-      
-      // 创建种子数据
-      const torrentData = {
-        torrentName: uploadData.name,
-        category: uploadData.type,
-        regin: uploadData.region,
-        resolution: uploadData.resolution,
-        subtitle: uploadData.subtitle,
-        description: uploadData.description,
-        username: username,
-        filePath: "D:\\大学\\大三_下\\实训BT服务器下载\\G2-ptPlatform-backend\\torrents\\[电影天堂www.dytt89.com]两杆大烟枪BD中英双字.mp4.torrent" // 默认路径
-      };
-  
-      // 调用API创建种子
-      await createTorrent(
-        torrentData.torrentName,
-        torrentData.description,
-        torrentData.username,
-        torrentData.category,
-        torrentData.regin,
-        torrentData.resolution,
-        torrentData.subtitle,
-        torrentData.filePath
-      );
-      
-      // 上传成功处理
-      setShowUploadModal(false);
-      setUploadData({ 
-        name: '', 
-        type: '', 
-        region: '', 
-        subtitle: '', 
-        resolution: '', 
-        file: null, 
-        description: '' 
-      });
-      alert('种子创建成功！');
-      
-      // 刷新列表
-      fetchTorrentPosts(currentPage);
-      
-    } catch (error) {
-      console.error('创建失败:', error);
-      alert('创建失败: ' + (error.response?.data?.message || error.message));
-    } finally {
-      setIsUploading(false);
-    }
-  };
+            const torrentData = {
+                torrentName: uploadData.name,
+                description: uploadData.description,
+                category: uploadData.type,
+                region: uploadData.region,
+                resolution: uploadData.resolution,
+                subtitle: uploadData.subtitle
+            };
 
-  const handlePostSubmit = async (e) => {
-    e.preventDefault();
-    try {
-      const username = localStorage.getItem('username');
-      const response = await createPost(
-        postTitle,
-        postContent,
-        username
-      );
-      
-      if (response.data.code === 200) {
-        // 刷新帖子列表
-        await fetchHelpPosts();
-        // 重置表单
-        setShowPostModal(false);
-        setPostTitle('');
-        setPostContent('');
-        setSelectedImage(null);
-      } else {
-        setHelpError(response.data.message || '发帖失败');
-      }
-    } catch (err) {
-      setHelpError(err.message || '发帖失败');
-    }
-  };
+            await createTorrent(torrentData, uploadData.file);
+
+            // 上传成功处理
+            setShowUploadModal(false);
+            setUploadData({
+                name: '',
+                type: '',
+                region: '',
+                subtitle: '',
+                resolution: '',
+                file: null,
+                description: ''
+            });
+            alert('种子创建成功！');
+
+            // 刷新列表
+            await fetchTorrentPosts(currentPage);
+
+        } catch (error) {
+            console.error('创建失败:', error);
+            alert('创建失败: ' + (error.response?.data?.message || error.message));
+        } finally {
+            setIsUploading(false);
+        }
+    };
+
+    const handlePostSubmit = async (e) => {
+        e.preventDefault();
+        try {
+            const username = localStorage.getItem('username');
+            const response = await createPost(
+                postTitle,
+                postContent,
+                username
+            );
+
+            if (response.data.code === 200) {
+                // 刷新帖子列表
+                await fetchHelpPosts();
+                // 重置表单
+                setShowPostModal(false);
+                setPostTitle('');
+                setPostContent('');
+                setSelectedImage(null);
+            } else {
+                setHelpError(response.data.message || '发帖失败');
+            }
+        } catch (err) {
+            setHelpError(err.message || '发帖失败');
+        }
+    };
 
     // 获取Torrent帖子列表
-  const fetchTorrentPosts = async (page = 1) => {
-  setTorrentLoading(true);
-  try {
-    const response = await getTorrents(page);
-    setTorrentPosts(response.data.data.records);
-    setTotalPages(Math.ceil(response.data.data.total / 5)); // 假设每页5条
-    setCurrentPage(page);
-  } catch (err) {
-    setTorrentError(err.message);
-  } finally {
-    setTorrentLoading(false);
-  }
-};
+    const fetchTorrentPosts = async (page = 1) => {
+        setTorrentLoading(true);
+        try {
+            const response = await getTorrents(page);
+            setTorrentPosts(response.data.data.records);
+            setTotalPages(Math.ceil(response.data.data.total / 5)); // 假设每页5条
+            setCurrentPage(page);
+        } catch (err) {
+            setTorrentError(err.message);
+        } finally {
+            setTorrentLoading(false);
+        }
+    };
 
-  // 在useEffect中调用
-  useEffect(() => {
-    if (activeTab === 'share') {
-      fetchTorrentPosts();
-    }
-  }, [activeTab]);
+    // 在useEffect中调用
+    useEffect(() => {
+        if (activeTab === 'share') {
+            fetchTorrentPosts();
+        }
+    }, [activeTab]);
 
-  const handleImageUpload = (e) => {
-    setSelectedImage(e.target.files[0]);
-  };
+    const handleImageUpload = (e) => {
+        setSelectedImage(e.target.files[0]);
+    };
 
 
+    const fetchHelpPosts = async (page = 1) => {
+        setHelpLoading(true);
+        try {
+            const response = await getPosts(page);
+            if (response.data.code === 200) {
+                setHelpPosts(response.data.data.records);
+                setTotalPages(Math.ceil(response.data.data.total / 5)); // 假设每页5条
+                setCurrentPage(page);
+            } else {
+                setHelpError(response.data.message || '获取求助帖失败');
+            }
+        } catch (err) {
+            setHelpError(err.message || '获取求助帖失败');
+        } finally {
+            setHelpLoading(false);
+        }
+    };
+    useEffect(() => {
+        if (activeTab === 'help') {
+            fetchHelpPosts(currentPage);
+        }
+    }, [activeTab, currentPage]); // 添加 currentPage 作为依赖
 
 
-  const fetchHelpPosts = async (page = 1) => {
-    setHelpLoading(true);
-    try {
-      const response = await getPosts(page);
-      if (response.data.code === 200) {
-        setHelpPosts(response.data.data.records);
-        setTotalPages(Math.ceil(response.data.data.total / 5)); // 假设每页5条
-        setCurrentPage(page);
-      } else {
-        setHelpError(response.data.message || '获取求助帖失败');
-      }
-    } catch (err) {
-      setHelpError(err.message || '获取求助帖失败');
-    } finally {
-      setHelpLoading(false);
-    }
-  };
-  useEffect(() => {
-    if (activeTab === 'help') {
-      fetchHelpPosts(currentPage);
-    }
-  }, [activeTab, currentPage]); // 添加 currentPage 作为依赖
+    // 分类维度配置
+    const filterCategories = {
+        type: {
+            label: '类型',
+            options: {
+                'all': '全部',
+                '电影': '电影',
+                '电视剧': '电视剧',
+                '动漫': '动漫',
+                '综艺': '综艺'
+            }
+        },
+        subtitle: {
+            label: '字幕',
+            options: {
+                'all': '全部',
+                'yes': '有字幕',
+                'no': '无字幕'
+            }
+        },
+        region: {
+            label: '地区',
+            options: {
+                'all': '全部',
+                'cn': '大陆',
+                'us': '欧美',
+                'jp': '日本'
+            }
+        }
+    };
 
-
-  
-
-  // 分类维度配置
-  const filterCategories = {
-    type: {
-      label: '类型',
-      options: {
-        'all': '全部',
-        '电影': '电影',
-        '电视剧': '电视剧',
-        '动漫': '动漫',
-        '综艺': '综艺'
-      }
-    },
-    subtitle: {
-      label: '字幕',
-      options: {
-        'all': '全部',
-        'yes': '有字幕',
-        'no': '无字幕'
-      }
-    },
-    region: {
-      label: '地区',
-      options: {
-        'all': '全部',
-        'cn': '大陆',
-        'us': '欧美',
-        'jp': '日本'
-      }
-    }
-  };
-  
-  const [selectedFilters, setSelectedFilters] = useState(
-    location.state?.savedFilters || 
-    Object.keys(filterCategories).reduce((acc, category) => {
-      acc[category] = 'all';
-      return acc;
-    }, {})
-  );
-
+    const [selectedFilters, setSelectedFilters] = useState(
+        location.state?.savedFilters ||
+        Object.keys(filterCategories).reduce((acc, category) => {
+            acc[category] = 'all';
+            return acc;
+        }, {})
+    );
 
 
 // 处理筛选条件变更
-const handleFilterSelect = (category, value) => {
-  setSelectedFilters(prev => ({
-    ...prev,
-    [category]: prev[category] === value ? null : value // 点击已选中的则取消
-  }));
-};
-
-//应用筛选条件
-const applyFilters = () => {
-  const result = torrentPosts.filter(resource => {
-    return Object.entries(selectedFilters).every(([category, selectedValue]) => {
-      if (selectedValue === 'all') return true;
-      if (category === 'subtitle') {
-        return resource.subtitle === (selectedValue === 'yes');
-      }
-      return resource[category] === selectedValue;
-    });
-  });
-  setFilteredResources(result);
-};
-
-
-  // 恢复滚动位置
-  useEffect(() => {
-    if (location.state?.scrollPosition) {
-      window.scrollTo(0, location.state.scrollPosition);
-    }
-  }, [location.state]);
-
-
-  useEffect(() => {
-    const token = localStorage.getItem('token');
-    if (!token) {
-      navigate('/login');
-      return;
-    }
-
-    /* 保留但注释掉实际的用户信息获取
-    const fetchUserInfo = async () => {
-      try {
-        const response = await getUserInfo(token);
-        if (response.data.code === 200) {
-          setUserInfo(response.data.data);
-        } else {
-          setError('获取用户信息失败');
-        }
-      } catch (err) {
-        setError('获取用户信息失败');
-      } finally {
-        setLoading(false);
-      }
+    const handleFilterSelect = (category, value) => {
+        setSelectedFilters(prev => ({
+            ...prev,
+            [category]: prev[category] === value ? null : value // 点击已选中的则取消
+        }));
     };
 
-    fetchUserInfo();
-    */
-    
-    // 模拟用户信息
-    setUserInfo({ 
-      name: localStorage.getItem('username') || '演示用户', // 确保这里读取的是最新值
-    avatar: 'https://via.placeholder.com/40'
-    });
-    setLoading(false);
-  }, [navigate]);
-
-  // 轮播图自动切换效果
-  useEffect(() => {
-    if (activeTab === 'announcement') {
-      const timer = setInterval(() => {
-        setCurrentSlide(prev => (prev + 1) % 3); // 3张轮播图循环
-      }, 3000);
-      return () => clearInterval(timer);
-    }
-  }, [activeTab]);
-
-  useEffect(() => {
-    if (activeTab === 'help') {
-      fetchHelpPosts();
-    }
-  }, [activeTab]);
-
-  const renderContent = () => {
-    switch(activeTab) {
-      case 'announcement':
-        return (
-          <div className="content-area" data-testid="announcement-section"> 
-            {/* 轮播图区域 */}
-            <div className="carousel-container">
-              <div className={`carousel-slide ${currentSlide === 0 ? 'active' : ''}`}>
-                <div className="carousel-image gray-bg">促销活动1</div>
-              </div>
-              <div className={`carousel-slide ${currentSlide === 1 ? 'active' : ''}`}>
-                <div className="carousel-image gray-bg">促销活动2</div>
-              </div>
-              <div className={`carousel-slide ${currentSlide === 2 ? 'active' : ''}`}>
-                <div className="carousel-image gray-bg">促销活动3</div>
-              </div>
-              <div className="carousel-dots">
-                <span className={`dot ${currentSlide === 0 ? 'active' : ''}`}></span>
-                <span className={`dot ${currentSlide === 1 ? 'active' : ''}`}></span>
-                <span className={`dot ${currentSlide === 2 ? 'active' : ''}`}></span>
-              </div>
-            </div>
-
-            {/* 公告区块区域 */}
-            <div className="announcement-grid">
-              {announcements.map(announcement => (
-                <div 
-                  key={announcement.id}
-                  className="announcement-card"
-                  onClick={(e) => handleAnnouncementClick(announcement, e)}
-                >
-                  <h3>{announcement.title}</h3>
-                  <p>{announcement.excerpt}</p>
-                  <div className="announcement-footer exclude-click">
-                    <span>{announcement.author}</span>
-                    <span>{announcement.date}</span>
-                  </div>
-                </div>
-              ))}
-            </div>
-          </div>
-        );
-        case 'share':
-          return (
-            <div className="content-area" data-testid="share-section">
-              {/* 上传按钮 - 添加在筛选区上方 */}
-              <div className="upload-header">
-                <button 
-                  className="upload-btn"
-                  onClick={() => setShowUploadModal(true)}
-                >
-                  ＋ 上传种子
-                </button>
-              </div>
-              {/* 分类筛选区 */}
-              <div className="filter-section">
-                {Object.entries(filterCategories).map(([category, config]) => (
-                  <div key={category} className="filter-group">
-                    <h4>{config.label}：</h4>
-                    <div className="filter-options">
-                      {Object.entries(config.options).map(([value, label]) => (
-                        <button
-                          key={value}
-                          className={`filter-btn ${
-                            selectedFilters[category] === value ? 'active' : ''
-                          }`}
-                          onClick={() => handleFilterSelect(category, value)}
-                        >
-                          {label}
-                        </button>
-                      ))}
-                    </div>
-                  </div>
-                ))}
-        
-                <button 
-                  className="confirm-btn"
-                  onClick={applyFilters}
-                >
-                  确认筛选
-                </button>
-              </div>
-        
-              {/* 上传弹窗 */}
-              {showUploadModal && (
-                <div className="modal-overlay">
-                  <div className="upload-modal">
-                    <h3>上传新种子</h3>
-                    <button 
-                      className="close-btn"
-                      onClick={() => setShowUploadModal(false)}
-                    >
-                      ×
-                    </button>
-                    
-                    <form onSubmit={handleUploadSubmit}>
-                      <div className="form-group">
-                        <label>种子名称</label>
-                        <input
-                          type="text"
-                          value={uploadData.name}
-                          onChange={(e) => setUploadData({...uploadData, name: e.target.value})}
-                          required
-                        />
-                      </div>
-        
-                      <div className="form-group">
-                        <label>资源类型</label>
-                        <select
-                          value={uploadData.type}
-                          onChange={(e) => setUploadData({...uploadData, type: e.target.value})}
-                          required
-                        >
-                          <option value="">请选择</option>
-                          <option value="电影">电影</option>
-                          <option value="电视剧">电视剧</option>
-                          <option value="动漫">动漫</option>
-                          <option value="综艺">综艺</option>
-                          <option value="音乐">音乐</option>
-                        </select>
-                      </div>
-        
-                      {/* 新增地区输入框 */}
-                      <div className="form-group">
-                        <label>地区</label>
-                        <input
-                          type="text"
-                          value={uploadData.region || ''}
-                          onChange={(e) => setUploadData({...uploadData, region: e.target.value})}
-                          placeholder="例如: 美国, 中国, 日本等"
-                          required
-                        />
-                      </div>
-
-                      {/* 添加分辨率下拉框 */}
-                      <div className="form-group">
-                        <label>分辨率</label>
-                        <select
-                          value={uploadData.resolution || ''}
-                          onChange={(e) => setUploadData({...uploadData, resolution: e.target.value})}
-                          required
-                        >
-                          <option value="">请选择</option>
-                          <option value="4K">4K</option>
-                          <option value="2K">2K</option>
-                          <option value="1080P">1080P</option>
-                          <option value="720P">720P</option>
-                          <option value="SD">SD</option>
-                          <option value="无损音源">无损音源</option>
-                          <option value="杜比全景声">杜比全景声</option>
-                          <option value="其他">其他</option>
-                        </select>
-                      </div>
-
-                    
-        
-                      {/* 新增字幕语言下拉框 */}
-                      <div className="form-group">
-                        <label>字幕语言</label>
-                        <select
-                          value={uploadData.subtitle || ''}
-                          onChange={(e) => setUploadData({...uploadData, subtitle: e.target.value})}
-                          required
-                        >
-                          <option value="">请选择</option>
-                          <option value="无需字幕">无需字幕</option>
-                          <option value="暂无字幕">暂无字幕</option>
-                          <option value="自带中文字幕">自带中文字幕</option>
-                          <option value="自带双语字幕(含中文)">自带双语字幕(含中文)</option>
-                          <option value="附件中文字幕">附件中文字幕</option>
-                          <option value="附件双语字幕">附件双语字幕</option>
-                        </select>
-                      </div>
-        
-                      <div className="form-group">
-                        <label>种子文件</label>
-                        <input
-                          type="file"
-                          accept=".torrent"
-                          onChange={handleFileChange}
-
-                        />
-                      </div>
-        
-                      <div className="form-group">
-                        <label>简介</label>
-                        <textarea
-                          value={uploadData.description}
-                          onChange={(e) => setUploadData({...uploadData, description: e.target.value})}
-                        />
-                      </div>
-        
-                      <div className="form-actions">
-                        <button 
-                          type="button"
-                          className="cancel-btn"
-                          onClick={() => setShowUploadModal(false)}
-                        >
-                          取消
-                        </button>
-                        <button 
-                          type="submit" 
-                          className="confirm-btn"
-                          disabled={isUploading}
-                        >
-                          {isUploading ? '上传中...' : '确认上传'}
-                        </button>
-                      </div>
-                    </form>
-                  </div>
-                </div>
-              )}
-              
-              <div className="resource-list">
-                {torrentPosts.map(torrent => (
-                  <div 
-                    key={torrent.id}
-                    className="resource-item"
-                    onClick={() => navigate(`/torrent/${torrent.id}`)}
-                  >
-                    <div className="resource-poster">
-                      <div className="poster-image gray-bg">{torrent.torrentName.charAt(0)}</div>
-                    </div>
-                    <div className="resource-info">
-                      <h3 className="resource-title">{torrent.torrentName}</h3>
-                      <p className="resource-meta">
-                        {torrent.resolution} | {torrent.region} | {torrent.category}
-                      </p>
-                      <p className="resource-subtitle">字幕: {torrent.subtitle}</p>
-                    </div>
-                    <div className="resource-stats">
-                      <span className="stat">{torrent.size}</span>
-                      <span className="stat">发布者: {torrent.username}</span>
-                    </div>
-                    <button 
-                      className="download-btn"
-                      onClick={(e) => {
-                        e.stopPropagation();
-                        // 下载逻辑
-                      }}
-                    >
-                      立即下载
-                    </button>
-                  </div>
-                ))}
-              </div>
-
-              {/* 分页控件 */}
-              <div className="pagination">
-                <button 
-                  onClick={() => fetchTorrentPosts(currentPage - 1)} 
-                  disabled={currentPage === 1}
-                >
-                  上一页
-                </button>
-                
-                {Array.from({ length: totalPages }, (_, i) => i + 1).map(page => (
-                  <button
-                    key={page}
-                    onClick={() => fetchTorrentPosts(page)}
-                    className={currentPage === page ? 'active' : ''}
-                  >
-                    {page}
-                  </button>
-                ))}
-                
-                <button 
-                  onClick={() => fetchTorrentPosts(currentPage + 1)} 
-                  disabled={currentPage === totalPages}
-                >
-                  下一页
-                </button>
-              </div>
-            </div>
-          );
-      // 在Dashboard.jsx的renderContent函数中修改case 'request'部分
-      case 'request':
-        return (
-          <div className="content-area" data-testid="request-section">
-            {/* 求种区帖子列表 */}
-            <div className="request-list">
-              {[
-                {
-                  id: 1,
-                  title: '求《药屋少女的呢喃》第二季全集',
-                  content: '求1080P带中文字幕版本，最好是内嵌字幕不是外挂的',
-                  author: '动漫爱好者',
-                  authorAvatar: 'https://via.placeholder.com/40',
-                  date: '2023-10-15',
-                  likeCount: 24,
-                  commentCount: 8
-                },
-                {
-                  id: 2,
-                  title: '求《奥本海默》IMAX版',
-                  content: '最好是原盘或者高码率的版本，谢谢各位大佬',
-                  author: '电影收藏家',
-                  authorAvatar: 'https://via.placeholder.com/40',
-                  date: '2023-10-14',
-                  likeCount: 15,
-                  commentCount: 5
+//应用筛选条件
+    const applyFilters = () => {
+        const result = torrentPosts.filter(resource => {
+            return Object.entries(selectedFilters).every(([category, selectedValue]) => {
+                if (selectedValue === 'all') return true;
+                if (category === 'subtitle') {
+                    return resource.subtitle === (selectedValue === 'yes');
                 }
-              ].map(post => (
-                <div 
-                  key={post.id} 
-                  className="request-post"
-                  onClick={() => navigate(`/request/${post.id}`)}
-                >
-                  <div className="post-header">
-                    <img src={post.authorAvatar} alt={post.author} className="post-avatar" />
-                    <div className="post-author">{post.author}</div>
-                    <div className="post-date">{post.date}</div>
-                  </div>
-                  <h3 className="post-title">{post.title}</h3>
-                  <p className="post-content">{post.content}</p>
-                  <div className="post-stats">
-                    <span className="post-likes">👍 {post.likeCount}</span>
-                    <span className="post-comments">💬 {post.commentCount}</span>
-                  </div>
-                </div>
-              ))}
-            </div>
-          </div>
-        );
-      // 在Dashboard.jsx的renderContent函数中修改case 'help'部分
-      case 'help':
-        return (
-          <div className="content-area" data-testid="help-section">
-            {/* 新增发帖按钮 */}
-            <div className="post-header">
-              <button 
-                className="create-post-btn"
-                onClick={() => setShowPostModal(true)}
-              >
-                ＋ 发帖求助
-              </button>
-            </div>
+                return resource[category] === selectedValue;
+            });
+        });
+        setFilteredResources(result);
+    };
 
-            {/* 加载状态和错误提示 */}
-            {helpLoading && <div className="loading">加载中...</div>}
-            {helpError && <div className="error">{helpError}</div>}
 
-            {/* 求助区帖子列表 */}
-            <div className="help-list">
-              {helpPosts.map(post => (
-                <div 
-                  key={post.id} 
-                  className={`help-post ${post.isSolved ? 'solved' : ''}`}
-                  onClick={() => navigate(`/help/${post.id}`)}
-                >
-                  <div className="post-header">
-                    <img 
-                      src={post.authorAvatar || 'https://via.placeholder.com/40'} 
-                      alt={post.authorId} 
-                      className="post-avatar" 
-                    />
-                    <div className="post-author">{post.authorId}</div>
-                    <div className="post-date">
-                      {new Date(post.createTime).toLocaleDateString()}
-                    </div>
-                    {post.isSolved && <span className="solved-badge">已解决</span>}
-                  </div>
-                  <h3 className="post-title">{post.title}</h3>
-                  <p className="post-content">{post.content}</p>
-                  <div className="post-stats">
-                    <span className="post-likes">👍 {post.likeCount || 0}</span>
-                    <span className="post-comments">💬 {post.replyCount || 0}</span>
-                  </div>
-                </div>
-              ))}
-            </div>
+    // 恢复滚动位置
+    useEffect(() => {
+        if (location.state?.scrollPosition) {
+            window.scrollTo(0, location.state.scrollPosition);
+        }
+    }, [location.state]);
 
-            {/* 在帖子列表后添加分页控件 */}
-            <div className="pagination">
-              <button 
-                onClick={() => fetchHelpPosts(currentPage - 1)} 
-                disabled={currentPage === 1}
-              >
-                上一页
-              </button>
-              
-              {Array.from({ length: totalPages }, (_, i) => i + 1).map(page => (
-                <button
-                  key={page}
-                  onClick={() => fetchHelpPosts(page)}
-                  className={currentPage === page ? 'active' : ''}
-                >
-                  {page}
-                </button>
-              ))}
-              
-              <button 
-                onClick={() => fetchHelpPosts(currentPage + 1)} 
-                disabled={currentPage === totalPages}
-              >
-                下一页
-              </button>
-            </div>
-        
-            {/* 新增发帖弹窗 */}
-            {showPostModal && (
-              <div className="post-modal-overlay">
-                <div className="post-modal">
-                  <h3>发布求助帖</h3>
-                  <button 
-                    className="modal-close-btn"
-                    onClick={() => setShowPostModal(false)}
-                  >
-                    ×
-                  </button>
-                  
-                  <form onSubmit={handlePostSubmit}>
-                    <div className="form-group">
-                      <label>帖子标题</label>
-                      <input
-                        type="text"
-                        value={postTitle}
-                        onChange={(e) => setPostTitle(e.target.value)}
-                        placeholder="请输入标题"
-                        required
-                      />
+
+    useEffect(() => {
+        const token = localStorage.getItem('token');
+        if (!token) {
+            navigate('/login');
+            return;
+        }
+
+        /* 保留但注释掉实际的用户信息获取
+          const fetchUserInfo = async () => {
+            try {
+              const response = await getUserInfo(token);
+              if (response.data.code === 200) {
+                setUserInfo(response.data.data);
+              } else {
+                setError('获取用户信息失败');
+              }
+            } catch (err) {
+              setError('获取用户信息失败');
+            } finally {
+              setLoading(false);
+            }
+          };
+
+          fetchUserInfo();
+          */
+
+        // 模拟用户信息
+        setUserInfo({
+            name: localStorage.getItem('username') || '演示用户', // 确保这里读取的是最新值
+            avatar: 'https://via.placeholder.com/40',
+            isAdmin: true
+        });
+        setLoading(false);
+    }, [navigate]);
+
+    // 轮播图自动切换效果
+    useEffect(() => {
+        if (activeTab === 'announcement') {
+            const timer = setInterval(() => {
+                setCurrentSlide(prev => (prev + 1) % 3); // 3张轮播图循环
+            }, 3000);
+            return () => clearInterval(timer);
+        }
+    }, [activeTab]);
+
+    useEffect(() => {
+        if (activeTab === 'help') {
+            fetchHelpPosts();
+        }
+    }, [activeTab]);
+
+    const renderContent = () => {
+        switch (activeTab) {
+            case 'announcement':
+                return (
+                    <div className="content-area" data-testid="announcement-section">
+                        {/* 轮播图区域 */}
+                        <div className="carousel-container">
+                            <div className={`carousel-slide ${currentSlide === 0 ? 'active' : ''}`}>
+                                <div className="carousel-image gray-bg">促销活动1</div>
+                            </div>
+                            <div className={`carousel-slide ${currentSlide === 1 ? 'active' : ''}`}>
+                                <div className="carousel-image gray-bg">促销活动2</div>
+                            </div>
+                            <div className={`carousel-slide ${currentSlide === 2 ? 'active' : ''}`}>
+                                <div className="carousel-image gray-bg">促销活动3</div>
+                            </div>
+                            <div className="carousel-dots">
+                                <span className={`dot ${currentSlide === 0 ? 'active' : ''}`}></span>
+                                <span className={`dot ${currentSlide === 1 ? 'active' : ''}`}></span>
+                                <span className={`dot ${currentSlide === 2 ? 'active' : ''}`}></span>
+                            </div>
+                        </div>
+
+                        {/* 公告区块区域 */}
+                        <div className="announcement-grid">
+                            {announcements.map(announcement => (
+                                <div
+                                    key={announcement.id}
+                                    className="announcement-card"
+                                    onClick={(e) => handleAnnouncementClick(announcement, e)}
+                                >
+                                    <h3>{announcement.title}</h3>
+                                    <p>{announcement.excerpt}</p>
+                                    <div className="announcement-footer exclude-click">
+                                        <span>{announcement.author}</span>
+                                        <span>{announcement.date}</span>
+                                    </div>
+                                </div>
+                            ))}
+                        </div>
                     </div>
-        
-                    <div className="form-group">
-                      <label>帖子内容</label>
-                      <textarea
-                        value={postContent}
-                        onChange={(e) => setPostContent(e.target.value)}
-                        placeholder="详细描述你的问题"
-                        required
-                      />
-                    </div>
-        
-                    <div className="form-group">
-                      <label>上传图片</label>
-                      <div className="upload-image-btn">
-                        <input
-                          type="file"
-                          id="image-upload"
-                          accept="image/*"
-                          onChange={handleImageUpload}
-                          style={{ display: 'none' }}
-                        />
-                        <label htmlFor="image-upload">
-                          {selectedImage ? '已选择图片' : '选择图片'}
-                        </label>
-                        {selectedImage && (
-                          <span className="image-name">{selectedImage.name}</span>
+                );
+            case 'share':
+                return (
+                    <div className="content-area" data-testid="share-section">
+                        {/* 上传按钮 - 添加在筛选区上方 */}
+                        <div className="upload-header">
+                            <button
+                                className="upload-btn"
+                                onClick={() => setShowUploadModal(true)}
+                            >
+                                ＋ 上传种子
+                            </button>
+                        </div>
+                        {/* 分类筛选区 */}
+                        <div className="filter-section">
+                            {Object.entries(filterCategories).map(([category, config]) => (
+                                <div key={category} className="filter-group">
+                                    <h4>{config.label}：</h4>
+                                    <div className="filter-options">
+                                        {Object.entries(config.options).map(([value, label]) => (
+                                            <button
+                                                key={value}
+                                                className={`filter-btn ${
+                                                    selectedFilters[category] === value ? 'active' : ''
+                                                }`}
+                                                onClick={() => handleFilterSelect(category, value)}
+                                            >
+                                                {label}
+                                            </button>
+                                        ))}
+                                    </div>
+                                </div>
+                            ))}
+
+                            <button
+                                className="confirm-btn"
+                                onClick={applyFilters}
+                            >
+                                确认筛选
+                            </button>
+                        </div>
+
+                        {/* 上传弹窗 */}
+                        {showUploadModal && (
+                            <div className="modal-overlay">
+                                <div className="upload-modal">
+                                    <h3>上传新种子</h3>
+                                    <button
+                                        className="close-btn"
+                                        onClick={() => setShowUploadModal(false)}
+                                    >
+                                        ×
+                                    </button>
+
+                                    <form onSubmit={handleUploadSubmit}>
+                                        <div className="form-group">
+                                            <label>种子名称</label>
+                                            <input
+                                                type="text"
+                                                value={uploadData.name}
+                                                onChange={(e) => setUploadData({...uploadData, name: e.target.value})}
+                                                required
+                                            />
+                                        </div>
+
+                                        <div className="form-group">
+                                            <label>资源类型</label>
+                                            <select
+                                                value={uploadData.type}
+                                                onChange={(e) => setUploadData({...uploadData, type: e.target.value})}
+                                                required
+                                            >
+                                                <option value="">请选择</option>
+                                                <option value="电影">电影</option>
+                                                <option value="电视剧">电视剧</option>
+                                                <option value="动漫">动漫</option>
+                                                <option value="综艺">综艺</option>
+                                                <option value="音乐">音乐</option>
+                                            </select>
+                                        </div>
+
+                                        {/* 新增地区输入框 */}
+                                        <div className="form-group">
+                                            <label>地区</label>
+                                            <input
+                                                type="text"
+                                                value={uploadData.region || ''}
+                                                onChange={(e) => setUploadData({...uploadData, region: e.target.value})}
+                                                placeholder="例如: 美国, 中国, 日本等"
+                                                required
+                                            />
+                                        </div>
+
+                                        {/* 添加分辨率下拉框 */}
+                                        <div className="form-group">
+                                            <label>分辨率</label>
+                                            <select
+                                                value={uploadData.resolution || ''}
+                                                onChange={(e) => setUploadData({
+                                                    ...uploadData,
+                                                    resolution: e.target.value
+                                                })}
+                                                required
+                                            >
+                                                <option value="">请选择</option>
+                                                <option value="4K">4K</option>
+                                                <option value="2K">2K</option>
+                                                <option value="1080P">1080P</option>
+                                                <option value="720P">720P</option>
+                                                <option value="SD">SD</option>
+                                                <option value="无损音源">无损音源</option>
+                                                <option value="杜比全景声">杜比全景声</option>
+                                                <option value="其他">其他</option>
+                                            </select>
+                                        </div>
+
+
+                                        {/* 新增字幕语言下拉框 */}
+                                        <div className="form-group">
+                                            <label>字幕语言</label>
+                                            <select
+                                                value={uploadData.subtitle || ''}
+                                                onChange={(e) => setUploadData({
+                                                    ...uploadData,
+                                                    subtitle: e.target.value
+                                                })}
+                                                required
+                                            >
+                                                <option value="">请选择</option>
+                                                <option value="无需字幕">无需字幕</option>
+                                                <option value="暂无字幕">暂无字幕</option>
+                                                <option value="自带中文字幕">自带中文字幕</option>
+                                                <option value="自带双语字幕(含中文)">自带双语字幕(含中文)</option>
+                                                <option value="附件中文字幕">附件中文字幕</option>
+                                                <option value="附件双语字幕">附件双语字幕</option>
+                                            </select>
+                                        </div>
+
+                                        <div className="form-group">
+                                            <label>种子文件</label>
+                                            <input
+                                                type="file"
+                                                accept=".torrent"
+                                                onChange={handleFileChange}
+
+                                            />
+                                        </div>
+
+                                        <div className="form-group">
+                                            <label>简介</label>
+                                            <textarea
+                                                value={uploadData.description}
+                                                onChange={(e) => setUploadData({
+                                                    ...uploadData,
+                                                    description: e.target.value
+                                                })}
+                                            />
+                                        </div>
+
+                                        <div className="form-actions">
+                                            <button
+                                                type="button"
+                                                className="cancel-btn"
+                                                onClick={() => setShowUploadModal(false)}
+                                            >
+                                                取消
+                                            </button>
+                                            <button
+                                                type="submit"
+                                                className="confirm-btn"
+                                                disabled={isUploading}
+                                            >
+                                                {isUploading ? '上传中...' : '确认上传'}
+                                            </button>
+                                        </div>
+                                    </form>
+                                </div>
+                            </div>
                         )}
-                      </div>
+
+                        <div className="resource-list">
+                            {torrentPosts.map(torrent => (
+                                <div
+                                    key={torrent.id}
+                                    className="resource-item"
+                                    onClick={() => navigate(`/torrent/${torrent.id}`)}
+                                >
+                                    <div className="resource-poster">
+                                        <div className="poster-image gray-bg">{torrent.torrentName.charAt(0)}</div>
+                                    </div>
+                                    <div className="resource-info">
+                                        <h3 className="resource-title">{torrent.torrentName}</h3>
+                                        <p className="resource-meta">
+                                            {torrent.resolution} | {torrent.region} | {torrent.category}
+                                        </p>
+                                        <p className="resource-subtitle">字幕: {torrent.subtitle}</p>
+                                    </div>
+                                    <div className="resource-stats">
+                                        <span className="stat">{torrent.size}</span>
+                                        <span className="stat">发布者: {torrent.username}</span>
+                                    </div>
+                                    <button
+                                        className="download-btn"
+                                        onClick={(e) => {
+                                            e.stopPropagation();
+                                            // 下载逻辑
+                                        }}
+                                    >
+                                        立即下载
+                                    </button>
+                                </div>
+                            ))}
+                        </div>
+
+                        {/* 分页控件 */}
+                        <div className="pagination">
+                            <button
+                                onClick={() => fetchTorrentPosts(currentPage - 1)}
+                                disabled={currentPage === 1}
+                            >
+                                上一页
+                            </button>
+
+                            {Array.from({length: totalPages}, (_, i) => i + 1).map(page => (
+                                <button
+                                    key={page}
+                                    onClick={() => fetchTorrentPosts(page)}
+                                    className={currentPage === page ? 'active' : ''}
+                                >
+                                    {page}
+                                </button>
+                            ))}
+
+                            <button
+                                onClick={() => fetchTorrentPosts(currentPage + 1)}
+                                disabled={currentPage === totalPages}
+                            >
+                                下一页
+                            </button>
+                        </div>
                     </div>
-        
-                    <div className="form-actions">
-                      <button 
-                        type="button"
-                        className="cancel-btn"
-                        onClick={() => setShowPostModal(false)}
-                      >
-                        取消
-                      </button>
-                      <button 
-                        type="submit" 
-                        className="submit-btn"
-                      >
-                        确认发帖
-                      </button>
+                );
+            // 在Dashboard.jsx的renderContent函数中修改case 'request'部分
+            case 'request':
+                return (
+                    <div className="content-area" data-testid="request-section">
+                        {/* 求种区帖子列表 */}
+                        <div className="request-list">
+                            {[
+                                {
+                                    id: 1,
+                                    title: '求《药屋少女的呢喃》第二季全集',
+                                    content: '求1080P带中文字幕版本，最好是内嵌字幕不是外挂的',
+                                    author: '动漫爱好者',
+                                    authorAvatar: 'https://via.placeholder.com/40',
+                                    date: '2023-10-15',
+                                    likeCount: 24,
+                                    commentCount: 8
+                                },
+                                {
+                                    id: 2,
+                                    title: '求《奥本海默》IMAX版',
+                                    content: '最好是原盘或者高码率的版本，谢谢各位大佬',
+                                    author: '电影收藏家',
+                                    authorAvatar: 'https://via.placeholder.com/40',
+                                    date: '2023-10-14',
+                                    likeCount: 15,
+                                    commentCount: 5
+                                }
+                            ].map(post => (
+                                <div
+                                    key={post.id}
+                                    className="request-post"
+                                    onClick={() => navigate(`/request/${post.id}`)}
+                                >
+                                    <div className="post-header">
+                                        <img src={post.authorAvatar} alt={post.author} className="post-avatar"/>
+                                        <div className="post-author">{post.author}</div>
+                                        <div className="post-date">{post.date}</div>
+                                    </div>
+                                    <h3 className="post-title">{post.title}</h3>
+                                    <p className="post-content">{post.content}</p>
+                                    <div className="post-stats">
+                                        <span className="post-likes">👍 {post.likeCount}</span>
+                                        <span className="post-comments">💬 {post.commentCount}</span>
+                                    </div>
+                                </div>
+                            ))}
+                        </div>
                     </div>
-                  </form>
+                );
+            // 在Dashboard.jsx的renderContent函数中修改case 'help'部分
+            case 'help':
+                return (
+                    <div className="content-area" data-testid="help-section">
+                        {/* 新增发帖按钮 */}
+                        <div className="post-header">
+                            <button
+                                className="create-post-btn"
+                                onClick={() => setShowPostModal(true)}
+                            >
+                                ＋ 发帖求助
+                            </button>
+                        </div>
+
+                        {/* 加载状态和错误提示 */}
+                        {helpLoading && <div className="loading">加载中...</div>}
+                        {helpError && <div className="error">{helpError}</div>}
+
+                        {/* 求助区帖子列表 */}
+                        <div className="help-list">
+                            {helpPosts.map(post => (
+                                <div
+                                    key={post.id}
+                                    className={`help-post ${post.isSolved ? 'solved' : ''}`}
+                                    onClick={() => navigate(`/help/${post.id}`)}
+                                >
+                                    <div className="post-header">
+                                        <img
+                                            src={post.authorAvatar || 'https://via.placeholder.com/40'}
+                                            alt={post.authorId}
+                                            className="post-avatar"
+                                        />
+                                        <div className="post-author">{post.authorId}</div>
+                                        <div className="post-date">
+                                            {new Date(post.createTime).toLocaleDateString()}
+                                        </div>
+                                        {post.isSolved && <span className="solved-badge">已解决</span>}
+                                    </div>
+                                    <h3 className="post-title">{post.title}</h3>
+                                    <p className="post-content">{post.content}</p>
+                                    <div className="post-stats">
+                                        <span className="post-likes">👍 {post.likeCount || 0}</span>
+                                        <span className="post-comments">💬 {post.replyCount || 0}</span>
+                                    </div>
+                                </div>
+                            ))}
+                        </div>
+
+                        {/* 在帖子列表后添加分页控件 */}
+                        <div className="pagination">
+                            <button
+                                onClick={() => fetchHelpPosts(currentPage - 1)}
+                                disabled={currentPage === 1}
+                            >
+                                上一页
+                            </button>
+
+                            {Array.from({length: totalPages}, (_, i) => i + 1).map(page => (
+                                <button
+                                    key={page}
+                                    onClick={() => fetchHelpPosts(page)}
+                                    className={currentPage === page ? 'active' : ''}
+                                >
+                                    {page}
+                                </button>
+                            ))}
+
+                            <button
+                                onClick={() => fetchHelpPosts(currentPage + 1)}
+                                disabled={currentPage === totalPages}
+                            >
+                                下一页
+                            </button>
+                        </div>
+
+                        {/* 新增发帖弹窗 */}
+                        {showPostModal && (
+                            <div className="post-modal-overlay">
+                                <div className="post-modal">
+                                    <h3>发布求助帖</h3>
+                                    <button
+                                        className="modal-close-btn"
+                                        onClick={() => setShowPostModal(false)}
+                                    >
+                                        ×
+                                    </button>
+
+                                    <form onSubmit={handlePostSubmit}>
+                                        <div className="form-group">
+                                            <label>帖子标题</label>
+                                            <input
+                                                type="text"
+                                                value={postTitle}
+                                                onChange={(e) => setPostTitle(e.target.value)}
+                                                placeholder="请输入标题"
+                                                required
+                                            />
+                                        </div>
+
+                                        <div className="form-group">
+                                            <label>帖子内容</label>
+                                            <textarea
+                                                value={postContent}
+                                                onChange={(e) => setPostContent(e.target.value)}
+                                                placeholder="详细描述你的问题"
+                                                required
+                                            />
+                                        </div>
+
+                                        <div className="form-group">
+                                            <label>上传图片</label>
+                                            <div className="upload-image-btn">
+                                                <input
+                                                    type="file"
+                                                    id="image-upload"
+                                                    accept="image/*"
+                                                    onChange={handleImageUpload}
+                                                    style={{display: 'none'}}
+                                                />
+                                                <label htmlFor="image-upload">
+                                                    {selectedImage ? '已选择图片' : '选择图片'}
+                                                </label>
+                                                {selectedImage && (
+                                                    <span className="image-name">{selectedImage.name}</span>
+                                                )}
+                                            </div>
+                                        </div>
+
+                                        <div className="form-actions">
+                                            <button
+                                                type="button"
+                                                className="cancel-btn"
+                                                onClick={() => setShowPostModal(false)}
+                                            >
+                                                取消
+                                            </button>
+                                            <button
+                                                type="submit"
+                                                className="submit-btn"
+                                            >
+                                                确认发帖
+                                            </button>
+                                        </div>
+                                    </form>
+                                </div>
+                            </div>
+                        )}
+                    </div>
+                );
+            default:
+                return <div className="content-area" data-testid="default-section">公告区内容</div>;
+        }
+    };
+
+    if (loading) return <div className="loading">加载中...</div>;
+    if (error) return <div className="error">{error}</div>;
+
+    return (
+        <div className="dashboard-container" data-testid="dashboard-container">
+            {/* 顶部栏 */}
+            <div className="top-bar" data-testid="top-bar">
+                {/* 搜索框 */}
+                <div className="search-container">
+                    <input
+                        type="text"
+                        placeholder="搜索种子、用户..."
+                        className="search-input"
+                    />
+                    <button className="search-button">搜索</button>
                 </div>
-              </div>
-            )}
-          </div>
-        );
-      default:
-        return <div className="content-area" data-testid="default-section">公告区内容</div>;
-    }
-  };
 
-  if (loading) return <div className="loading">加载中...</div>;
-  if (error) return <div className="error">{error}</div>;
+                <div className="user-actions">
+                    {/* 新增管理员按钮 - 只有管理员可见 */}
+                    {userInfo?.isAdmin && (
+                        <button
+                            className="admin-center-button"
+                            onClick={() => navigate('/administer')}
+                        >
+                            管理员中心
+                        </button>
+                    )}
 
-  return (
-    <div className="dashboard-container" data-testid="dashboard-container">
-      {/* 顶部栏 */}
-      <div className="top-bar" data-testid="top-bar">
-        {/* 搜索框 */}
-        <div className="search-container">
-          <input 
-            type="text" 
-            placeholder="搜索种子、用户..." 
-            className="search-input"
-          />
-          <button className="search-button">搜索</button>
+                    <div className="user-info" data-testid="user-info">
+                        <img
+                            src={userInfo?.avatar || 'https://via.placeholder.com/40'}
+                            alt="用户头像"
+                            className="user-avatar"
+                            onClick={() => navigate('/personal')}
+                            style={{cursor: 'pointer'}}
+                        />
+                        <span className="username">{userInfo?.name || '用户'}</span>
+                        <button onClick={onLogout} className="logout-button">退出</button>
+                    </div>
+                </div>
+            </div>
+
+            {/* 导航栏 */}
+            {/* handleTabchange函数替换了原本的setactivetab函数 */}
+            <div className="nav-tabs">
+                <button
+                    className={`tab-button ${activeTab === 'announcement' ? 'active' : ''}`}
+                    onClick={() => handleTabChange('announcement')}
+                >
+                    公告区
+                </button>
+                <button
+                    className={`tab-button ${activeTab === 'share' ? 'active' : ''}`}
+                    onClick={() => handleTabChange('share')}
+                >
+                    分享区
+                </button>
+                <button
+                    className={`tab-button ${activeTab === 'request' ? 'active' : ''}`}
+                    onClick={() => handleTabChange('request')}
+                >
+                    求种区
+                </button>
+                <button
+                    className={`tab-button ${activeTab === 'help' ? 'active' : ''}`}
+                    onClick={() => handleTabChange('help')}
+                >
+                    求助区
+                </button>
+            </div>
+
+            {/* 内容区 */}
+            {renderContent()}
         </div>
-        
-        <div className="user-info" data-testid="user-info">
-          <img 
-            src={userInfo?.avatar || 'https://via.placeholder.com/40'} 
-            alt="用户头像" 
-            className="user-avatar"
-            onClick={() => navigate('/personal')}  // 添加点击跳转
-            style={{ cursor: 'pointer' }}  // 添加手型指针
-          />
-          <span className="username">{userInfo?.name || '用户'}</span>
-          <button onClick={onLogout} className="logout-button">退出</button>
-        </div>
-      </div>
-      
-      {/* 导航栏 */}
-      {/* handleTabchange函数替换了原本的setactivetab函数 */}
-      <div className="nav-tabs">
-        <button 
-          className={`tab-button ${activeTab === 'announcement' ? 'active' : ''}`}
-          onClick={() => handleTabChange('announcement')}
-        >
-          公告区
-        </button>
-        <button 
-          className={`tab-button ${activeTab === 'share' ? 'active' : ''}`}
-          onClick={() => handleTabChange('share')}
-        >
-          分享区
-        </button>
-        <button 
-          className={`tab-button ${activeTab === 'request' ? 'active' : ''}`}
-          onClick={() => handleTabChange('request')}
-        >
-          求种区
-        </button>
-        <button 
-          className={`tab-button ${activeTab === 'help' ? 'active' : ''}`}
-          onClick={() => handleTabChange('help')}
-        >
-          求助区
-        </button>
-      </div>
-      
-      {/* 内容区 */}
-      {renderContent()}
-    </div>
-  );
+    );
 };
 
 export default Dashboard;
\ No newline at end of file
diff --git a/src/components/RequestDetail.jsx b/src/components/RequestDetail.jsx
index 993fe8e..022b0cb 100644
--- a/src/components/RequestDetail.jsx
+++ b/src/components/RequestDetail.jsx
@@ -78,6 +78,9 @@
   };
 
   const handleDownloadTorrent = (commentId) => {
+
+
+    
     console.log('下载种子', commentId);
     // 实际下载逻辑
   };
