diff --git a/src/api/announcement.js b/src/api/announcement.js
new file mode 100644
index 0000000..6213d10
--- /dev/null
+++ b/src/api/announcement.js
@@ -0,0 +1,28 @@
+import { api } from './auth';
+
+// 获取所有公告
+export const getAnnouncements = () => {
+  return api.get('/announcement/list');
+};
+
+
+export const postAnnouncement = (data) => {
+  // 创建 FormData 对象
+  const formData = new FormData();
+  formData.append('title', data.title);
+  formData.append('content', data.content);
+
+  return api.post('/announcement/create', formData);
+}
+
+
+// 获取最新公告
+export const getLatestAnnouncements = () => {
+  return api.get('/announcement/latest');
+};
+
+// 获取公告详情
+export const getAnnouncementDetail = (id) => {
+  return api.get(`/announcement/${id}`);
+};
+
diff --git a/src/api/announcement.test.js b/src/api/announcement.test.js
new file mode 100644
index 0000000..bae9482
--- /dev/null
+++ b/src/api/announcement.test.js
@@ -0,0 +1,139 @@
+import MockAdapter from 'axios-mock-adapter';
+import { api } from './auth';
+import { getAnnouncements, getLatestAnnouncements, getAnnouncementDetail,postAnnouncement } from './announcement';
+
+describe('公告API', () => {
+  let mockAxios;
+
+  beforeEach(() => {
+    mockAxios = new MockAdapter(api);
+  });
+
+  afterEach(() => {
+    mockAxios.restore();
+  });
+
+describe('postAnnouncement - 发布公告', () => {
+  it('应该成功发布公告', async () => {
+    const mockData = {
+      title: '测试公告',
+      content: '测试内容'
+    };
+    
+    const mockResponse = {
+      code: 200,
+      message: '公告发布成功',
+      data: {
+        id: 123,
+        title: mockData.title,
+        content: mockData.content,
+        createTime: new Date().toISOString()
+      }
+    };
+  
+
+    mockAxios.onPost('/announcement/create').reply(200, mockResponse);
+
+    const response = await postAnnouncement(mockData);
+    expect(response.data).toEqual(mockResponse);
+    expect(response.data.code).toBe(200);
+    expect(response.data.data.title).toBe(mockData.title);
+    expect(response.data.data.content).toBe(mockData.content);
+  });
+});
+
+  describe('getAnnouncements - 获取所有公告', () => {
+    it('应该成功获取公告列表', async () => {
+      const mockResponse = {
+        code: 200,
+        data: {
+          announcements: [
+            { id: 1, title: '公告1', content: '内容1', createTime: '2023-01-01T00:00:00Z' },
+            { id: 2, title: '公告2', content: '内容2', createTime: '2023-01-01T00:00:00Z' }
+          ]
+        }
+      };
+      
+      mockAxios.onGet('/announcement/list').reply(200, mockResponse);
+
+      const response = await getAnnouncements();
+      expect(response.data).toEqual(mockResponse);
+      expect(response.data.data.announcements).toHaveLength(2);
+    });
+
+    
+  });
+
+  describe('getLatestAnnouncements - 获取最新公告', () => {
+    it('应该成功获取最新公告', async () => {
+      const mockResponse = {
+        code: 200,
+        data: {
+          announcements: [
+            { id: 1, title: '最新公告', content: '最新内容' }
+          ]
+        }
+      };
+      
+      mockAxios.onGet('/announcement/latest').reply(200, mockResponse);
+
+      const response = await getLatestAnnouncements();
+      expect(response.data).toEqual(mockResponse);
+      expect(response.data.data.announcements).toHaveLength(1);
+    });
+
+    it('应该正确处理服务器错误', async () => {
+      mockAxios.onGet('/announcement/latest').reply(500);
+      
+      await expect(getLatestAnnouncements()).rejects.toThrow();
+    });
+  });
+
+  describe('getAnnouncementDetail - 获取公告详情', () => {
+    it('应该成功获取公告详情', async () => {
+      const announcementId = 123;
+      const mockResponse = {
+        code: 200,
+        data: {
+          announcement: {
+            id: announcementId,
+            title: '详细公告',
+            content: '详细内容',
+            createTime: '2023-01-01T00:00:00Z'
+          }
+        }
+      };
+      
+      mockAxios.onGet(`/announcement/${announcementId}`).reply(200, mockResponse);
+
+      const response = await getAnnouncementDetail(announcementId);
+      expect(response.data).toEqual(mockResponse);
+      expect(response.data.data.announcement.id).toBe(announcementId);
+    });
+
+    it('应该处理公告不存在的情况', async () => {
+      const announcementId = 999;
+      const mockResponse = {
+        code: 404,
+        message: '公告不存在'
+      };
+      
+      mockAxios.onGet(`/announcement/${announcementId}`).reply(404, mockResponse);
+
+      try {
+        await getAnnouncementDetail(announcementId);
+    } catch (error) {
+        expect(error.response.status).toBe(404);
+        expect(error.response.data.code).toBe(404);
+        expect(error.response.data.message).toBe('公告不存在');
+    }
+    });
+
+    it('应该正确处理网络错误', async () => {
+      const announcementId = 456;
+      mockAxios.onGet(`/announcement/${announcementId}`).networkError();
+      
+      await expect(getAnnouncementDetail(announcementId)).rejects.toThrow();
+    });
+  });
+});
\ No newline at end of file
diff --git a/src/api/helpComment.js b/src/api/helpComment.js
index c1d00c0..2ff9ade 100644
--- a/src/api/helpComment.js
+++ b/src/api/helpComment.js
@@ -1,14 +1,14 @@
 import { api } from './auth';
 
-export const likePostComment = (commentId) => {
+export const likeHelpPostComment = (commentId) => {
   return api.post(`/help/comments/${commentId}/like`);
 };
 
-export const getCommentReplies = (commentId) => {
+export const getHelpCommentReplies = (commentId) => {
   return api.get(`/help/comments/${commentId}/replies`);
 };
 
-export const addCommentReply = (commentId, replyData) => {
+export const addHelpCommentReply = (commentId, replyData) => {
   const formData = new FormData();
   formData.append('authorId', replyData.authorId);
   formData.append('content', replyData.content);
@@ -21,7 +21,7 @@
   return api.post(`/help/comments/${commentId}/replies`, formData);
 };
 
-export const deleteComment = (commentId, authorId) => {
+export const deleteHelpComment = (commentId, authorId) => {
   return api.delete(`/help/comments/${commentId}`, {
     params: { authorId }
   });
diff --git a/src/api/helpComment.test.js b/src/api/helpComment.test.js
index a4a7d99..99efd8c 100644
--- a/src/api/helpComment.test.js
+++ b/src/api/helpComment.test.js
@@ -1,6 +1,6 @@
 import MockAdapter from 'axios-mock-adapter';
 import { api } from './auth'; // 添加api导入
-import { likePostComment, getCommentReplies, addCommentReply, deleteComment } from './helpComment';
+import { likeHelpPostComment, getHelpCommentReplies, addHelpCommentReply, deleteHelpComment } from './helpComment';
 
 describe('求助帖评论API', () => {
   let mockAxios;
@@ -13,27 +13,27 @@
     mockAxios.restore();
   });
 
-  describe('likePostComment - 点赞求助帖评论', () => {
+  describe('likeHelpPostComment - 点赞求助帖评论', () => {
     it('应该成功发送点赞请求', async () => {
       const mockResponse = { code: 200, message: '点赞成功' };
       mockAxios.onPost('/help/comments/123/like').reply(200, mockResponse);
 
-      const response = await likePostComment('123');
+      const response = await likeHelpPostComment('123');
       expect(response.data).toEqual(mockResponse);
     });
   });
 
-  describe('getCommentReplies - 获取评论回复', () => {
+  describe('getHelpCommentReplies - 获取评论回复', () => {
     it('应该返回正确的回复数据结构', async () => {
       const mockData = [{ id: '1', content: '回复内容' }];
       mockAxios.onGet('/help/comments/456/replies').reply(200, { code: 200, data: mockData });
 
-      const response = await getCommentReplies('456');
+      const response = await getHelpCommentReplies('456');
       expect(response.data.data).toEqual(mockData);
     });
   });
 
-  describe('addCommentReply - 添加评论回复', () => {
+  describe('addHelpCommentReply - 添加评论回复', () => {
     it('应该正确发送回复内容（无图片）', async () => {
       const commentId = '789';
       const replyData = {
@@ -49,7 +49,7 @@
         return [200, { code: 200 }];
       });
 
-      const response = await addCommentReply(commentId, replyData);
+      const response = await addHelpCommentReply(commentId, replyData);
       expect(response.status).toBe(200);
     });
     it('应该正确处理带图片的回复', async () => {
@@ -66,11 +66,11 @@
         return [200, { code: 200 }];
       });
 
-      const response = await addCommentReply(commentId, replyData);
+      const response = await addHelpCommentReply(commentId, replyData);
       expect(response.status).toBe(200);
     });
   });
-  describe('deleteComment - 删除评论', () => {
+  describe('deleteHelpComment - 删除评论', () => {
     it('应该正确发送删除请求', async () => {
       const commentId = '101112';
       const authorId = 'user1';
@@ -80,7 +80,7 @@
         return [200, { code: 200 }];
       });
 
-      const response = await deleteComment(commentId, authorId);
+      const response = await deleteHelpComment(commentId, authorId);
       expect(response.status).toBe(200);
     });
   });
diff --git a/src/api/helpPost.js b/src/api/helpPost.js
index 92d6402..68b37d9 100644
--- a/src/api/helpPost.js
+++ b/src/api/helpPost.js
@@ -1,7 +1,7 @@
 // src/api/helpPost.js
 import { api } from './auth'; // 复用已有的axios实例
 
-export const createPost = (title, content, authorId, selectedImage) => {
+export const createHelpPost = (title, content, authorId, selectedImage) => {
   // 创建 FormData 对象
   const formData = new FormData();
   formData.append('title', title);
@@ -16,44 +16,36 @@
   return api.post('/help/posts', formData);
 };
 
-export const getPosts = (page = 1, size = 5) => {
+export const getHelpPosts = (page = 1, size = 5) => {
   return api.get('/help/posts', {
     params: { page, size }
   });
 };
 
-export const getPostDetail = (postId) => {
+export const getHelpPostDetail = (postId) => {
   return api.get(`/help/posts/${postId}`);
 };
 
-export const likePost = (postId, data) => {
+export const likeHelpPost = (postId, data) => {
   return api.post(`/help/posts/${postId}/like`, null, {
     params: data
   });
 };
 
-export const addPostComment = (postId, commentData) => {
-  // 创建FormData对象来处理文件上传
-  const formData = new FormData();
-  formData.append('authorId', commentData.authorId);
-  formData.append('content', commentData.content);
+export const addHelpPostComment = (postId, commentData) => {
   
-  // 如果有图片，添加到formData
-  if (commentData.commentImage) {
-    formData.append('image', commentData.commentImage);
-  }
 
-  return api.post(`/help/posts/${postId}/comments`, formData);
+  return api.post(`/help/posts/${postId}/comments`, commentData);
 };
 
-export const deletePost = (postId, authorId) => {
+export const deleteHelpPost = (postId, authorId) => {
   return api.delete(`/help/posts/${postId}`, {
     params: { authorId }
   });
 };
 
 
-export const searchPosts = (keyword, page = 1, size = 5) => {
+export const searchHelpPosts = (keyword, page = 1, size = 5) => {
   return api.get('/help/posts/search', {
     params: { keyword, page, size }
   });
diff --git a/src/api/helpPost.test.js b/src/api/helpPost.test.js
index b445b4d..53e9e01 100644
--- a/src/api/helpPost.test.js
+++ b/src/api/helpPost.test.js
@@ -1,6 +1,6 @@
 import MockAdapter from 'axios-mock-adapter';
 import { api } from './auth'; // 添加api导入
-import { createPost, getPosts, getPostDetail, likePost, addPostComment,deletePost } from './helpPost';
+import { createHelpPost, getHelpPosts, getHelpPostDetail, likeHelpPost, addHelpPostComment,deleteHelpPost,searchHelpPosts } from './helpPost';
 
 describe('求助帖API', () => {
   let mockAxios;
@@ -13,7 +13,7 @@
     mockAxios.restore();
   });
 
-  describe('createPost - 创建求助帖', () => {
+  describe('createHelpPost - 创建求助帖', () => {
     it('应该正确发送无图片帖子数据', async () => {
       const postData = {
         title: '测试标题',
@@ -30,7 +30,7 @@
         return [201, { code: 201 }];
       });
 
-      const response = await createPost(postData.title, postData.content, postData.authorId);
+      const response = await createHelpPost(postData.title, postData.content, postData.authorId);
       expect(response.status).toBe(201);
     });
   });
@@ -48,7 +48,7 @@
       return [201, { code: 201 }];
     });
 
-    const response = await createPost(
+    const response = await createHelpPost(
       postData.title, 
       postData.content, 
       postData.authorId, 
@@ -58,7 +58,7 @@
   });
 
 
-  describe('getPosts - 获取求助帖列表', () => {
+  describe('getHelpPosts - 获取求助帖列表', () => {
     it('应该支持分页参数', async () => {
       const page = 2, size = 10;
       mockAxios.onGet('/help/posts', { params: { page, size } }).reply(200, {
@@ -66,57 +66,21 @@
         data: []
       });
 
-      const response = await getPosts(page, size);
+      const response = await getHelpPosts(page, size);
       expect(response.status).toBe(200);
     });
   });
 
-  describe('likePost - 点赞求助帖', () => {
+  describe('likeHelpPost - 点赞求助帖', () => {
     it('应该正确发送点赞请求', async () => {
       mockAxios.onPost('/help/posts/post123/like').reply(200, { code: 200 });
-      const response = await likePost('post123');
+      const response = await likeHelpPost('post123');
       expect(response.status).toBe(200);
     });
   });
 
-  describe('addPostComment - 添加帖子评论', () => {
-    it('应该正确发送评论数据（无图片）', async () => {
-      const postId = 'post456';
-      const commentData = {
-        authorId: 'user1',
-        content: '测试评论'
-      };
-      
-      mockAxios.onPost(`/help/posts/${postId}/comments`).reply(config => {
-        const data = config.data;
-        expect(data.get('authorId')).toBe(commentData.authorId);
-        expect(data.get('content')).toBe(commentData.content);
-        expect(data.has('image')).toBe(false);
-        return [200, { code: 200 }];
-      });
-      
-      const response = await addPostComment('post456', commentData);
-      expect(response.status).toBe(200);
-    });
-    it('应该正确处理带图片的评论', async () => {
-      const postId = 'post456';
-      const commentData = {
-        authorId: 'user1',
-        content: '测试评论',
-        commentImage: new File(['content'], 'comment.jpg')
-      };
-      
-      mockAxios.onPost(`/help/posts/${postId}/comments`).reply(config => {
-        const data = config.data;
-        expect(data.get('image')).toBeInstanceOf(File);
-        return [200, { code: 200 }];
-      });
-
-      const response = await addPostComment(postId, commentData);
-      expect(response.status).toBe(200);
-    });
-  });
-  describe('deletePost - 删除帖子', () => {
+  
+  describe('deleteHelpPost - 删除帖子', () => {
     it('应该正确发送删除请求', async () => {
       const postId = 'post789';
       const authorId = 'user1';
@@ -126,8 +90,28 @@
         return [200, { code: 200 }];
       });
 
-      const response = await deletePost(postId, authorId);
+      const response = await deleteHelpPost(postId, authorId);
       expect(response.status).toBe(200);
     });
   });
+  describe('searchHelpPosts - 搜索求助帖', () => {
+      it('应该正确发送搜索请求', async () => {
+        const keyword = '测试';
+        const page = 1, size = 5;
+        
+        mockAxios.onGet('/help/posts/search', {
+          params: { keyword, page, size }
+        }).reply(200, {
+          code: 200,
+          data: {
+            records: [],
+            total: 0
+          }
+        });
+  
+        const response = await searchHelpPosts(keyword, page, size);
+        expect(response.status).toBe(200);
+        expect(response.data.data).toBeDefined();
+      });
+    });
 });
\ No newline at end of file
diff --git a/src/api/personal.test.js b/src/api/personal.test.js
new file mode 100644
index 0000000..3a929e8
--- /dev/null
+++ b/src/api/personal.test.js
@@ -0,0 +1,354 @@
+// src/api/__tests__/personal.test.js
+import { 
+  getUserInfo, 
+  formatFileSize, 
+  getDownloadQuota, 
+  getDownloadProgress, 
+  getUserTorrents, 
+  deleteTorrent, 
+  generateInviteCode, 
+  getUserInviteCodes, 
+  exchangeUpload, 
+  updatePassword 
+} from './personal';
+import { api } from './auth';
+
+// 模拟整个 auth 模块
+jest.mock('./auth');
+
+describe('Personal API', () => {
+  beforeEach(() => {
+    // 在每个测试前重置模拟
+    jest.clearAllMocks();
+  });
+
+  describe('getUserInfo', () => {
+    it('should return formatted user info when API call succeeds', async () => {
+      const mockUserData = {
+        username: 'testuser',
+        level: 3,
+        registTime: '2023-01-01T00:00:00Z',
+        magicPoints: 100,
+        upload: 1024,
+        download: 512,
+        shareRate: 2.0
+      };
+
+      api.get.mockResolvedValue({
+        data: {
+          code: 200,
+          data: mockUserData,
+          message: 'success'
+        }
+      });
+
+      const result = await getUserInfo();
+      
+      expect(api.get).toHaveBeenCalledWith('/user/userInfo');
+      expect(result).toEqual({
+        username: 'testuser',
+        level: 3,
+        registTime: '2023-01-01',
+        magicPoints: 100,
+        upload: 1024,
+        download: 512,
+        shareRate: '2.00'
+      });
+    });
+
+    it('should throw error when API call fails', async () => {
+      api.get.mockResolvedValue({
+        data: {
+          code: 500,
+          message: 'Internal server error'
+        }
+      });
+
+      await expect(getUserInfo()).rejects.toThrow('Internal server error');
+    });
+  });
+
+  describe('formatFileSize', () => {
+    it('should format bytes correctly', () => {
+      expect(formatFileSize(500)).toBe('500 B');
+      expect(formatFileSize(1024)).toBe('1.00 KB');
+      expect(formatFileSize(2048)).toBe('2.00 KB');
+      expect(formatFileSize(1024 * 1024)).toBe('1.00 MB');
+      expect(formatFileSize(1024 * 1024 * 2.5)).toBe('2.50 MB');
+      expect(formatFileSize(1024 * 1024 * 1024)).toBe('1.00 GB');
+      expect(formatFileSize(1024 * 1024 * 1024 * 3.7)).toBe('3.70 GB');
+    });
+  });
+
+  describe('getDownloadQuota', () => {
+    it('should return download quota data when API call succeeds', async () => {
+      const mockData = {
+        total: 1073741824, // 1GB in bytes
+        used: 536870912,   // 512MB
+        remaining: 536870912
+      };
+
+      api.get.mockResolvedValue({
+        data: {
+          code: 200,
+          data: mockData,
+          message: 'success'
+        }
+      });
+
+      const result = await getDownloadQuota();
+      
+      expect(api.get).toHaveBeenCalledWith('/user/allowDownload');
+      expect(result).toEqual(mockData);
+    });
+
+    it('should throw error when API call fails', async () => {
+      api.get.mockResolvedValue({
+        data: {
+          code: 403,
+          message: 'Forbidden'
+        }
+      });
+
+      await expect(getDownloadQuota()).rejects.toThrow('Forbidden');
+    });
+  });
+
+  describe('getDownloadProgress', () => {
+    it('should return download progress when API call succeeds', async () => {
+      const mockProgresses = [
+        { id: 1, name: 'file1', progress: 50 },
+        { id: 2, name: 'file2', progress: 75 }
+      ];
+
+      api.get.mockResolvedValue({
+        data: {
+          code: 200,
+          data: { progresses: mockProgresses },
+          message: 'success'
+        }
+      });
+
+      const result = await getDownloadProgress();
+      
+      expect(api.get).toHaveBeenCalledWith('/torrent/getProgress');
+      expect(result).toEqual(mockProgresses);
+    });
+
+    it('should throw error when API call fails', async () => {
+      api.get.mockResolvedValue({
+        data: {
+          code: 404,
+          message: 'Not found'
+        }
+      });
+
+      await expect(getDownloadProgress()).rejects.toThrow('Not found');
+    });
+  });
+
+  describe('getUserTorrents', () => {
+    it('should return user torrents with pagination when API call succeeds', async () => {
+      const mockResponse = {
+        records: [
+          { 
+            torrent: { id: 1, name: 'torrent1', size: 1024 },
+            downloadCount: 10,
+            formattedSize: '1 KB'
+          }
+        ],
+        total: 1
+      };
+
+      api.get.mockResolvedValue({
+        data: {
+          code: 200,
+          data: mockResponse,
+          message: 'success'
+        }
+      });
+
+      const result = await getUserTorrents(1, 5);
+      
+      expect(api.get).toHaveBeenCalledWith('/torrent/get/torrentMyself', {
+        params: { page: 1, size: 5 }
+      });
+      expect(result).toEqual({
+        records: [
+          {
+            id: 1,
+            name: 'torrent1',
+            size: 1024,
+            downloadCount: 10,
+            formattedSize: '1 KB'
+          }
+        ],
+        total: 1
+      });
+    });
+
+    it('should throw error when API call fails', async () => {
+      api.get.mockResolvedValue({
+        data: {
+          code: 500,
+          message: 'Server error'
+        }
+      });
+
+      await expect(getUserTorrents()).rejects.toThrow('Server error');
+    });
+  });
+
+  describe('deleteTorrent', () => {
+    it('should successfully delete torrent when API call succeeds', async () => {
+      const mockResponse = {
+        code: 200,
+        message: 'Deleted successfully'
+      };
+
+      api.delete.mockResolvedValue({
+        data: mockResponse
+      });
+
+      const result = await deleteTorrent(123);
+      
+      expect(api.delete).toHaveBeenCalledWith('/torrent/deleteTorrent/123');
+      expect(result).toEqual(mockResponse);
+    });
+
+    it('should throw error when API call fails', async () => {
+      api.delete.mockResolvedValue({
+        data: {
+          code: 404,
+          message: 'Torrent not found'
+        }
+      });
+
+      await expect(deleteTorrent(123)).rejects.toThrow('Torrent not found');
+    });
+  });
+
+  describe('generateInviteCode', () => {
+    it('should return generated invite code when API call succeeds', async () => {
+      const mockCode = 'ABCD-EFGH-IJKL';
+
+      api.post.mockResolvedValue({
+        data: {
+          code: 200,
+          data: { inviteCode: mockCode },
+          message: 'success'
+        }
+      });
+
+      const result = await generateInviteCode();
+      
+      expect(api.post).toHaveBeenCalledWith('/invitecode/generate');
+      expect(result).toBe(mockCode);
+    });
+
+    it('should throw error when API call fails', async () => {
+      api.post.mockResolvedValue({
+        data: {
+          code: 403,
+          message: 'Permission denied'
+        }
+      });
+
+      await expect(generateInviteCode()).rejects.toThrow('Permission denied');
+    });
+  });
+
+  describe('getUserInviteCodes', () => {
+    it('should return user invite codes when API call succeeds', async () => {
+      const mockCodes = ['CODE1', 'CODE2'];
+
+      api.get.mockResolvedValue({
+        data: {
+          code: 200,
+          data: { inviteCode: mockCodes },
+          message: 'success'
+        }
+      });
+
+      const result = await getUserInviteCodes();
+      
+      expect(api.get).toHaveBeenCalledWith('/invitecode/userInviteCode');
+      expect(result).toEqual(mockCodes);
+    });
+
+    it('should throw error when API call fails', async () => {
+      api.get.mockResolvedValue({
+        data: {
+          code: 500,
+          message: 'Server error'
+        }
+      });
+
+      await expect(getUserInviteCodes()).rejects.toThrow('Server error');
+    });
+  });
+
+  describe('exchangeUpload', () => {
+    it('should successfully exchange magic points for upload when API call succeeds', async () => {
+      const mockResponse = {
+        code: 200,
+        message: 'Exchange successful'
+      };
+
+      api.post.mockResolvedValue({
+        data: mockResponse
+      });
+
+      const result = await exchangeUpload(100);
+      
+      expect(api.post).toHaveBeenCalledWith('/user/exchangeUpload', {
+        magicPoint: 100
+      });
+      expect(result).toEqual(mockResponse);
+    });
+
+    it('should throw error when API call fails', async () => {
+      api.post.mockResolvedValue({
+        data: {
+          code: 400,
+          message: 'Not enough points'
+        }
+      });
+
+      await expect(exchangeUpload(100)).rejects.toThrow('Not enough points');
+    });
+  });
+
+  describe('updatePassword', () => {
+    it('should successfully update password when API call succeeds', async () => {
+      const mockResponse = {
+        code: 200,
+        message: 'Password updated'
+      };
+
+      api.put.mockResolvedValue({
+        data: mockResponse
+      });
+
+      const result = await updatePassword('oldPass', 'newPass');
+      
+      expect(api.put).toHaveBeenCalledWith('/user/password', {
+        oldPassword: 'oldPass',
+        newPassword: 'newPass'
+      });
+      expect(result).toEqual(mockResponse);
+    });
+
+    it('should throw error when API call fails', async () => {
+      api.put.mockResolvedValue({
+        data: {
+          code: 401,
+          message: 'Invalid old password'
+        }
+      });
+
+      await expect(updatePassword('wrongPass', 'newPass'))
+        .rejects.toThrow('Invalid old password');
+    });
+  });
+});
\ No newline at end of file
diff --git a/src/api/requestComment.js b/src/api/requestComment.js
new file mode 100644
index 0000000..f7e9b43
--- /dev/null
+++ b/src/api/requestComment.js
@@ -0,0 +1,28 @@
+import { api } from './auth';
+
+export const likeRequestPostComment = (commentId) => {
+  return api.post(`/request/comments/${commentId}/like`);
+};
+
+export const getRequestCommentReplies = (commentId) => {
+  return api.get(`/request/comments/${commentId}/replies`);
+};
+
+export const addRequestCommentReply = (commentId, replyData) => {
+  const formData = new FormData();
+  formData.append('authorId', replyData.authorId);
+  formData.append('content', replyData.content);
+
+  // 如果有图片，添加到formData
+  if (replyData.image) {
+    formData.append('image', replyData.image);
+  }
+
+  return api.post(`/request/comments/${commentId}/replies`, formData);
+};
+
+export const deleteRequestComment = (commentId, authorId) => {
+  return api.delete(`/request/comments/${commentId}`, {
+    params: { authorId }
+  });
+};
\ No newline at end of file
diff --git a/src/api/requestComment.test.js b/src/api/requestComment.test.js
new file mode 100644
index 0000000..2f50a3c
--- /dev/null
+++ b/src/api/requestComment.test.js
@@ -0,0 +1,97 @@
+import MockAdapter from 'axios-mock-adapter';
+import { api } from './auth';
+import {
+  likeRequestPostComment,
+  getRequestCommentReplies,
+  addRequestCommentReply,
+  deleteRequestComment
+} from './requestComment';
+
+describe('求种帖评论API', () => {
+  let mockAxios;
+
+  beforeEach(() => {
+    mockAxios = new MockAdapter(api);
+  });
+
+  afterEach(() => {
+    mockAxios.restore();
+  });
+
+  describe('likeRequestPostComment - 点赞求种帖评论', () => {
+    it('应该成功发送点赞请求', async () => {
+      const commentId = 'reqc123';
+      const mockResponse = { code: 200, message: '点赞成功' };
+      mockAxios.onPost(`/request/comments/${commentId}/like`).reply(200, mockResponse);
+
+      const response = await likeRequestPostComment(commentId);
+      expect(response.data).toEqual(mockResponse);
+    });
+  });
+
+  describe('getRequestCommentReplies - 获取评论回复', () => {
+    it('应该返回正确的回复数据结构', async () => {
+      const commentId = 'reqc456';
+      const mockData = [{ id: '1', content: '求种回复内容' }];
+      mockAxios.onGet(`/request/comments/${commentId}/replies`)
+        .reply(200, { code: 200, data: mockData });
+
+      const response = await getRequestCommentReplies(commentId);
+      expect(response.data.data).toEqual(mockData);
+    });
+  });
+
+  describe('addRequestCommentReply - 添加评论回复', () => {
+    it('应该正确发送回复内容（无图片）', async () => {
+      const commentId = 'reqc789';
+      const replyData = {
+        authorId: 'user1',
+        content: '测试求种回复'
+      };
+      
+      mockAxios.onPost(`/request/comments/${commentId}/replies`).reply(config => {
+        const data = config.data;
+        expect(data.get('authorId')).toBe(replyData.authorId);
+        expect(data.get('content')).toBe(replyData.content);
+        expect(data.has('image')).toBe(false);
+        return [200, { code: 200 }];
+      });
+
+      const response = await addRequestCommentReply(commentId, replyData);
+      expect(response.status).toBe(200);
+    });
+
+    it('应该正确处理带图片的回复', async () => {
+      const commentId = 'reqc789';
+      const replyData = {
+        authorId: 'user1',
+        content: '测试求种回复',
+        image: new File(['content'], 'reply.jpg')
+      };
+      
+      mockAxios.onPost(`/request/comments/${commentId}/replies`).reply(config => {
+        const data = config.data;
+        expect(data.get('image')).toBeInstanceOf(File);
+        return [200, { code: 200 }];
+      });
+
+      const response = await addRequestCommentReply(commentId, replyData);
+      expect(response.status).toBe(200);
+    });
+  });
+
+  describe('deleteRequestComment - 删除评论', () => {
+    it('应该正确发送删除请求', async () => {
+      const commentId = 'reqc101';
+      const authorId = 'user1';
+      
+      mockAxios.onDelete(`/request/comments/${commentId}`).reply(config => {
+        expect(config.params).toEqual({ authorId });
+        return [200, { code: 200 }];
+      });
+
+      const response = await deleteRequestComment(commentId, authorId);
+      expect(response.status).toBe(200);
+    });
+  });
+});
\ No newline at end of file
diff --git a/src/api/requestPost.js b/src/api/requestPost.js
new file mode 100644
index 0000000..224e3e9
--- /dev/null
+++ b/src/api/requestPost.js
@@ -0,0 +1,52 @@
+// src/api/requestPost.js
+import { api } from './auth'; // 复用已有的axios实例
+
+export const createRequestPost = (title, content, authorId, selectedImage) => {
+  // 创建 FormData 对象
+  const formData = new FormData();
+  formData.append('title', title);
+  formData.append('content', content);
+  formData.append('authorId', authorId);
+  
+  // 如果有图片，添加到 FormData
+  if (selectedImage) {
+    formData.append('image', selectedImage);
+  }
+
+  return api.post('/request/posts', formData);
+};
+
+export const getRequestPosts = (page = 1, size = 5) => {
+  return api.get('/request/posts', {
+    params: { page, size }
+  });
+};
+
+export const getRequestPostDetail = (postId) => {
+  return api.get(`/request/posts/${postId}`);
+};
+
+export const likeRequestPost = (postId, data) => {
+  return api.post(`/request/posts/${postId}/like`, null, {
+    params: data
+  });
+};
+
+export const addRequestPostComment = (postId, commentData) => {
+  
+
+  return api.post(`/request/posts/${postId}/comments`, commentData);
+};
+
+export const deleteRequestPost = (postId, authorId) => {
+  return api.delete(`/request/posts/${postId}`, {
+    params: { authorId }
+  });
+};
+
+
+export const searchRequestPosts = (keyword, page = 1, size = 5) => {
+  return api.get('/request/posts/search', {
+    params: { keyword, page, size }
+  });
+};
\ No newline at end of file
diff --git a/src/api/requestPost.test.js b/src/api/requestPost.test.js
new file mode 100644
index 0000000..a3bccc6
--- /dev/null
+++ b/src/api/requestPost.test.js
@@ -0,0 +1,147 @@
+import MockAdapter from 'axios-mock-adapter';
+import { api } from './auth';
+import {
+  createRequestPost,
+  getRequestPosts,
+  getRequestPostDetail,
+  likeRequestPost,
+  addRequestPostComment,
+  deleteRequestPost,
+  searchRequestPosts
+} from './requestPost';
+
+describe('求种帖API', () => {
+  let mockAxios;
+
+  beforeEach(() => {
+    mockAxios = new MockAdapter(api);
+  });
+
+  afterEach(() => {
+    mockAxios.restore();
+  });
+
+  describe('createRequestPost - 创建求种帖', () => {
+    it('应该正确发送无图片帖子数据', async () => {
+      const postData = {
+        title: '求种测试标题',
+        content: '求种测试内容',
+        authorId: 'user123'
+      };
+      
+      mockAxios.onPost('/request/posts').reply(config => {
+        const data = config.data;
+        expect(data.get('title')).toBe(postData.title);
+        expect(data.get('content')).toBe(postData.content);
+        expect(data.get('authorId')).toBe(postData.authorId);
+        expect(data.has('image')).toBe(false);
+        return [201, { code: 201 }];
+      });
+
+      const response = await createRequestPost(
+        postData.title,
+        postData.content,
+        postData.authorId
+      );
+      expect(response.status).toBe(201);
+    });
+
+    it('应该正确处理带图片的帖子', async () => {
+      const postData = {
+        title: '求种测试标题',
+        content: '求种测试内容',
+        authorId: 'user123',
+        selectedImage: new File(['content'], 'request.jpg')
+      };
+      
+      mockAxios.onPost('/request/posts').reply(config => {
+        const data = config.data;
+        expect(data.get('image')).toBeInstanceOf(File);
+        return [201, { code: 201 }];
+      });
+
+      const response = await createRequestPost(
+        postData.title,
+        postData.content,
+        postData.authorId,
+        postData.selectedImage
+      );
+      expect(response.status).toBe(201);
+    });
+  });
+
+  describe('getRequestPosts - 获取求种帖列表', () => {
+    it('应该支持分页参数', async () => {
+      const page = 2, size = 10;
+      mockAxios.onGet('/request/posts', { params: { page, size } })
+        .reply(200, {
+          code: 200,
+          data: {
+            records: [],
+            total: 0
+          }
+        });
+
+      const response = await getRequestPosts(page, size);
+      expect(response.status).toBe(200);
+      expect(response.data.data).toBeDefined();
+    });
+  });
+
+  describe('getRequestPostDetail - 获取求种帖详情', () => {
+    it('应该正确获取帖子详情', async () => {
+      const postId = 'req123';
+      mockAxios.onGet(`/request/posts/${postId}`)
+        .reply(200, {
+          code: 200,
+          data: {
+            post: {
+              id: postId,
+              title: '测试求种帖'
+            }
+          }
+        });
+
+      const response = await getRequestPostDetail(postId);
+      expect(response.status).toBe(200);
+      expect(response.data.data.post.id).toBe(postId);
+    });
+  });
+
+
+
+  describe('deleteRequestPost - 删除求种帖', () => {
+    it('应该正确发送删除请求', async () => {
+      const postId = 'req101';
+      const authorId = 'user1';
+      
+      mockAxios.onDelete(`/request/posts/${postId}`, {
+        params: { authorId }
+      }).reply(200, { code: 200 });
+
+      const response = await deleteRequestPost(postId, authorId);
+      expect(response.status).toBe(200);
+    });
+  });
+
+  describe('searchRequestPosts - 搜索求种帖', () => {
+    it('应该正确发送搜索请求', async () => {
+      const keyword = '测试';
+      const page = 1, size = 5;
+      
+      mockAxios.onGet('/request/posts/search', {
+        params: { keyword, page, size }
+      }).reply(200, {
+        code: 200,
+        data: {
+          records: [],
+          total: 0
+        }
+      });
+
+      const response = await searchRequestPosts(keyword, page, size);
+      expect(response.status).toBe(200);
+      expect(response.data.data).toBeDefined();
+    });
+  });
+});
\ No newline at end of file
diff --git a/src/api/torrent.js b/src/api/torrent.js
index 8a00e54..4a623d7 100644
--- a/src/api/torrent.js
+++ b/src/api/torrent.js
@@ -1,26 +1,74 @@
 // src/api/torrent.js
 import { api } from './auth'; // 复用已有的axios实例
 
-export const createTorrent = (torrentData, file) => {
+/**
+ * 创建并上传一个种子
+ * @param {File} file 种子文件 (.torrent)
+ * @param {Object} bodyObj 包含种子信息的对象，格式如下：
+ * {
+ *   torrentName: "测试下载",
+ *   description: "A high-quality 1080p version of Example Movie.",
+ *   category: "电影",
+ *   region: "USA",
+ *   resolution: "1080p",
+ *   subtitle: "English",
+ *   filePath: "D:/大学/大三_下/torrentFrom/[电影天堂www.dytt89.com]两杆大烟枪BD中英双字.mp4.torrent"
+ * }
+ */
+export async function createTorrent(file, bodyObj) {
   const formData = new FormData();
-  const token = localStorage.getItem('token');
+  formData.append('file', file);
 
-  // 添加文件
-  if (file) {
-    formData.append('file', file);
+  // 关键修改：将JSON字符串转换为Blob对象，并设置正确的Content-Type
+  formData.append('body', new Blob([JSON.stringify(bodyObj)], {
+    type: 'application/json'
+  }));
+
+  try {
+    const response = await api.post('/torrent', formData, {
+      headers: {
+      }
+    });
+    return response.data;
+  } catch (error) {
+    console.error('上传种子失败:', error);
+    throw error;
   }
-  // 通过这个方式就可以指定 ContentType 了
-  formData.append('body', JSON.stringify(torrentData))
-
-  console.log(formData);
-  return api.post('/torrent', formData, {
-    headers: {
-      'Content-Type': 'multipart/form-data',
-      'Authorization': `${token}`
-    },
-  });
 };
 
+/**
+ * 下载种子文件
+ * @param {number} torrentId 种子ID
+ * @param {string} downloadPath 下载路径
+ */
+export async function downloadTorrent(torrentId, downloadPath) {
+  try {
+    const response = await api.get(`/torrent/downloadTorrent`, {
+      params: {
+        id: torrentId,
+        downloadPath: downloadPath
+      }
+    });
+    return response.data;
+  } catch (error) {
+    console.error('下载种子失败:', error);
+    throw error;
+  }
+}
+
+/**
+ * 获取下载进度
+ */
+export async function getDownloadProgress() {
+  try {
+    const response = await api.get('/torrent/getProgress');
+    return response.data;
+  } catch (error) {
+    console.error('获取下载进度失败:', error);
+    throw error;
+  }
+}
+
 export const getTorrents = (page = 1, size = 5) => {
   return api.get('/torrent', {
     params: { page, size }
@@ -54,6 +102,61 @@
   return api.post(`/torrent/${torrentId}/comments`, commentData);
 };
 
+export const deleteTorrent = (torrentId) => {
+  return api.delete(`/torrent/deleteTorrent/${torrentId}`);
+};
+
+// // 上传种子接口
+// export const uploadTorrent = async (torrentFile, torrentData, onProgress) => {
+//   // 1. 基础验证
+//   if (!torrentFile || !torrentFile.name.endsWith('.torrent')) {
+//     throw new Error('请选择有效的.torrent文件');
+//   }
+
+//   // 2. 构建FormData
+//   const formData = new FormData();
+//   formData.append('file', torrentFile);
+  
+//   // 确保JSON内容使用正确的Content-Type
+//   const metadataBlob = new Blob(
+//     [JSON.stringify(torrentData)], 
+//     { type: 'application/json' }
+//   );
+//   formData.append('body', metadataBlob);
+
+//   // 3. 获取认证token（根据你的实际存储方式调整）
+//   const token = localStorage.getItem('token') || '';
+
+//   try {
+//     const response = await api.post('/api/torrents', formData, {
+//       headers: {
+//         'Authorization': `Bearer ${token}`,
+//       },
+//       onUploadProgress: (progressEvent) => {
+//         if (onProgress && progressEvent.total) {
+//           const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);
+//           onProgress(percent);
+//         }
+//       }
+//     });
+
+//     return response.data;
+//   } catch (error) {
+//     console.error('上传失败:', error);
+    
+//     // 增强错误处理
+//     let errorMessage = '上传失败';
+//     if (error.response) {
+//       errorMessage = error.response.data?.message || 
+//                      `服务器错误: ${error.response.status}`;
+//     } else if (error.request) {
+//       errorMessage = '网络错误，请检查连接';
+//     }
+
+//     throw new Error(errorMessage);
+//   }
+// };
+
 export const searchTorrents = (keyword, page = 1, size = 5) => {
   return api.get('/torrent/search', {
     params: { keyword, page, size }
diff --git a/src/api/torrent.test.js b/src/api/torrent.test.js
index 6515bdc..6cd481e 100644
--- a/src/api/torrent.test.js
+++ b/src/api/torrent.test.js
@@ -22,22 +22,6 @@
     localStorage.clear();
   });
 
-  describe('createTorrent - 创建种子', () => {
-    it('应该正确发送包含文件和数据的表单请求', async () => {
-      const mockFile = new File(['test'], 'test.torrent');
-      const torrentData = { name: '测试种子', description: '测试描述' };
-      const mockResponse = { code: 200, message: '创建成功' };
-  
-      mockAxios.onPost('/torrent').reply((config) => {
-        expect(config.headers['Content-Type']).toBe('multipart/form-data');
-        expect(config.headers['Authorization']).toBe('Bearer test-token'); // 修改为包含Bearer
-        return [200, mockResponse];
-      });
-  
-      const response = await createTorrent(torrentData, mockFile);
-      expect(response.data).toEqual(mockResponse);
-    });
-  });
 
   describe('getTorrents - 获取种子列表', () => {
     it('应该发送带分页参数的请求', async () => {
diff --git a/src/components/Administer.css b/src/components/Administer.css
index 1599a3e..786e3dc 100644
--- a/src/components/Administer.css
+++ b/src/components/Administer.css
@@ -167,4 +167,60 @@
   padding: 10px;
   background: #f5f5f5;
   border-radius: 4px;
+}
+
+/* 公告表单样式 */
+.announcement-form {
+  padding: 20px;
+  background: #f5f5f5;
+  border-radius: 8px;
+  margin-bottom: 20px;
+}
+
+.announcement-form .form-group {
+  margin-bottom: 15px;
+}
+
+.announcement-form label {
+  display: block;
+  margin-bottom: 5px;
+  font-weight: bold;
+}
+
+.announcement-form input[type="text"],
+.announcement-form textarea {
+  width: 100%;
+  padding: 8px;
+  border: 1px solid #ddd;
+  border-radius: 4px;
+}
+
+.announcement-form textarea {
+  min-height: 100px;
+}
+
+/* 公告列表样式 */
+.announcement-list-container {
+  margin-top: 20px;
+}
+
+.announcement-table {
+  width: 100%;
+  border-collapse: collapse;
+}
+
+.announcement-table th,
+.announcement-table td {
+  padding: 12px;
+  text-align: left;
+  border-bottom: 1px solid #ddd;
+}
+
+.announcement-table th {
+  background-color: #f2f2f2;
+  font-weight: bold;
+}
+
+.announcement-table tr:hover {
+  background-color: #f9f9f9;
 }
\ No newline at end of file
diff --git a/src/components/Administer.jsx b/src/components/Administer.jsx
index 35ae428..0f915e3 100644
--- a/src/components/Administer.jsx
+++ b/src/components/Administer.jsx
@@ -10,6 +10,7 @@
   addDiscount,
   deleteDiscount
 } from '../api/administer';
+import {postAnnouncement, getAnnouncements} from '../api/announcement'; 
 import DatePicker from 'react-datepicker';
 import 'react-datepicker/dist/react-datepicker.css';
 
@@ -22,13 +23,18 @@
   const [searchKey, setSearchKey] = useState('');
   const [loading, setLoading] = useState(false);
   const [error, setError] = useState(null);
+  const [announcements, setAnnouncements] = useState([]); // 存储公告列表
+  const [newAnnouncement, setNewAnnouncement] = useState({
+    title: '',
+    content: ''
+  });
   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 [activeTab, setActiveTab] = useState('users'); // 'users' 或 'discounts','announcements'
 
 const fetchAllUsers = async () => {
   setLoading(true);
@@ -208,15 +214,7 @@
     }
   };
 
-  // 初始化加载数据
-  useEffect(() => {
-    if (activeTab === 'users') {
-      fetchAllUsers();
-    } else {
-      fetchAllDiscounts();
-      fetchCurrentDiscount();
-    }
-  }, [activeTab]);
+  
 
   // 格式化分享率为百分比
   const formatShareRate = (rate) => {
@@ -244,6 +242,54 @@
     }
   };
 
+  // 获取所有公告
+  const fetchAllAnnouncements = async () => {
+  setLoading(true);
+  setError(null);
+  try {
+    const announcements = await getAnnouncements();
+    // 确保总是设置为数组
+    setAnnouncements(Array.isArray(announcements) ? announcements : []);
+  } catch (err) {
+    setError('获取公告列表失败: ' + err.message);
+    console.error(err);
+  } finally {
+    setLoading(false);
+  }
+};
+
+  // 发布新公告
+  const handlePostAnnouncement = async () => {
+    if (!newAnnouncement.title || !newAnnouncement.content) {
+      setError('请填写公告标题和内容');
+      return;
+    }
+
+    try {
+      await postAnnouncement(newAnnouncement);
+      setNewAnnouncement({ title: '', content: '' });
+      fetchAllAnnouncements();
+      setError(null);
+    } catch (err) {
+      setError('发布公告失败: ' + err.message);
+      console.error(err);
+    }
+  };
+
+  // 初始化加载数据
+  useEffect(() => {
+    if (activeTab === 'users') {
+      fetchAllUsers();
+    } else if (activeTab === 'discounts') {
+      fetchAllDiscounts();
+      fetchCurrentDiscount();
+    } else if (activeTab === 'announcements') {
+      fetchAllAnnouncements();
+    }
+  }, [activeTab]);
+
+  
+
 
   return (
     <div className="administer-container">
@@ -263,6 +309,12 @@
         >
           折扣管理
         </button>
+        <button 
+          className={`tab-button ${activeTab === 'announcements' ? 'active' : ''}`}
+          onClick={() => setActiveTab('announcements')}
+        >
+          公告管理
+        </button>
       </div>
 
       {activeTab === 'users' ? (
@@ -335,116 +387,174 @@
                 </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>
+      ) : activeTab === 'discounts' ? (
+          /* 新增的折扣管理部分 */
+          <>
+            {/* 当前活动折扣 */}
+            <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 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>
+              </div>
+              <div className="form-group">
+                  <label>开始时间:</label>
                   <DatePicker
-                    selected={endDate}
-                    onChange={(date) => setEndDate(date)}
+                    selected={startDate}
+                    onChange={(date) => setStartDate(date)}
                     showTimeSelect
                     timeFormat="HH:mm"
                     timeIntervals={1} // 1分钟间隔
                     dateFormat="yyyy-MM-dd HH:mm"
-                    minDate={startDate}
-                    placeholderText="选择结束日期和时间"
+                    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 className="announcement-form">
+            <h3>发布新公告</h3>
+            <div className="form-group">
+              <label>公告标题:</label>
+              <input
+                type="text"
+                value={newAnnouncement.title}
+                onChange={(e) => setNewAnnouncement({
+                  ...newAnnouncement,
+                  title: e.target.value
+                })}
+                placeholder="输入公告标题"
+              />
             </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>
+              <label>公告内容:</label>
+              <textarea
+                value={newAnnouncement.content}
+                onChange={(e) => setNewAnnouncement({
+                  ...newAnnouncement,
+                  content: e.target.value
+                })}
+                rows="5"
+                placeholder="输入公告内容"
+              />
             </div>
-            <button 
-                onClick={(e) => {
-                    e.preventDefault(); // 确保没有阻止默认行为
-                    handleAddDiscount();
-                }}
-                >
-                添加折扣
+            <button onClick={handlePostAnnouncement}>
+              发布公告
             </button>
           </div>
 
-          {/* 所有折扣列表 */}
-          <div className="discount-list-container">
-            <h3>所有折扣计划</h3>
-            <table className="discount-table">
+          {/* 所有公告列表 */}
+          <div className="announcement-list-container">
+            <h3>所有公告</h3>
+            <table className="announcement-table">
               <thead>
                 <tr>
-                  <th>ID</th>
-                  <th>名称</th>
-                  <th>开始时间</th>
-                  <th>结束时间</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>
+                {announcements.map(announcement => (
+                  <tr key={announcement.id}>
+                    <td>{announcement.title}</td>
+                    <td>{announcement.content}</td>
+                    <td>{formatDateTime(announcement.createTime)}</td>
                   </tr>
                 ))}
               </tbody>
diff --git a/src/components/Administer.test.jsx b/src/components/Administer.test.jsx
index 5a452fa..7f446ed 100644
--- a/src/components/Administer.test.jsx
+++ b/src/components/Administer.test.jsx
@@ -3,193 +3,122 @@
 import { MemoryRouter } from 'react-router-dom';
 import '@testing-library/jest-dom';
 import axios from 'axios';
+import MockAdapter from 'axios-mock-adapter';
 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();
+  let mock;
+
+  beforeAll(() => {
+    mock = new MockAdapter(axios);
+    localStorage.setItem('token', 'test-token');
   });
 
-  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
-    }
-  ];
+  afterEach(() => {
+    mock.reset();
+  });
 
-  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: '已过期'
-    }
-  ];
+  afterAll(() => {
+    mock.restore();
+  });
 
-  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: '进行中'
-  };
+  test('renders user management tab by default', async () => {
+    mock.onGet('http://localhost:8088/user/allUser').reply(200, {
+      code: 200,
+      data: { data: [] }
+    });
 
-  const renderAdminister = () => {
-    return render(
+    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();
+    expect(screen.getByText('公告管理')).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 }
-        }
-      });
+  test('fetches and displays users', async () => {
+    const mockUsers = [
+      {
+        username: 'testuser',
+        authority: 'USER',
+        registTime: '2023-01-01',
+        lastLogin: '2023-05-01',
+        upload: 1000,
+        download: 500,
+        shareRate: 2.0,
+        magicPoints: 100
+      }
+    ];
 
-    renderAdminister();
+    mock.onGet('http://localhost:8088/user/allUser').reply(200, {
+      code: 200,
+      data: { data: mockUsers }
+    });
+
+    render(
+      <MemoryRouter>
+        <Administer />
+      </MemoryRouter>
+    );
 
     await waitFor(() => {
-      expect(screen.getByText('user1')).toBeInTheDocument();
+      expect(screen.getByText('testuser')).toBeInTheDocument();
     });
+  });
+
+  test('handles user search', async () => {
+    const mockUsers = [
+      {
+        username: 'searchuser',
+        authority: 'USER'
+      }
+    ];
+
+    mock.onGet('http://localhost:8088/user/searchUser').reply(200, {
+      code: 200,
+      data: { data: mockUsers }
+    });
+
+    render(
+      <MemoryRouter>
+        <Administer />
+      </MemoryRouter>
+    );
+
+    fireEvent.change(screen.getByPlaceholderText('输入用户名搜索'), {
+      target: { value: 'search' }
+    });
+    fireEvent.click(screen.getByText('搜索'));
+
+    await waitFor(() => {
+      expect(screen.getByText('searchuser')).toBeInTheDocument();
+    });
+  });
+
+  test('switches between tabs', async () => {
+    mock.onGet('http://localhost:8088/user/allUser').reply(200, {
+      code: 200,
+      data: { data: [] }
+    });
+
+    mock.onGet('http://localhost:8088/discount/all').reply(200, {
+      code: 200,
+      data: { data: [] }
+    });
+
+    render(
+      <MemoryRouter>
+        <Administer />
+      </MemoryRouter>
+    );
 
     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();
+      expect(screen.getByText('添加新折扣')).toBeInTheDocument();
     });
   });
 });
\ No newline at end of file
diff --git a/src/components/AnnouncementDetail.jsx b/src/components/AnnouncementDetail.jsx
index 8e90672..ac3b92c 100644
--- a/src/components/AnnouncementDetail.jsx
+++ b/src/components/AnnouncementDetail.jsx
@@ -1,12 +1,19 @@
-import React from 'react';
-import { useNavigate, useLocation } from 'react-router-dom';
+import React, { useEffect, useState } from 'react';
+import { useNavigate, useLocation, useParams } from 'react-router-dom';
+import { getAnnouncementDetail } from '../api/announcement';
+import { message } from 'antd';
 import './AnnouncementDetail.css';
 
 const AnnouncementDetail = () => {
   const navigate = useNavigate();
-const location = useLocation();
+  const { id } = useParams();
+  const [announcement, setAnnouncement] = useState(null);
+  const [loading, setLoading] = useState(true);
+  const [error, setError] = useState('');
+  const location = useLocation();
   const { state } = useLocation();
-  const announcement = state?.announcement;
+  
+  
   const handleBack = () => {
     const fromTab = location.state?.fromTab; // 从跳转时传递的 state 中获取
     if (fromTab) {
@@ -15,16 +22,36 @@
         navigate(-1); // 保底策略
     }
 }
+  useEffect(() => {
+    const fetchAnnouncement = async () => {
+      try {
+        setLoading(true);
+        const response = await getAnnouncementDetail(id);
+        if (response.data.code === 200) {
+          setAnnouncement(response.data.data.announcement);
+        } else {
+          setError(response.data.message || '获取公告详情失败');
+        }
+      } catch (err) {
+        setError('获取公告详情失败');
+        message.error('获取公告详情失败');
+      } finally {
+        setLoading(false);
+      }
+    };
+
+    fetchAnnouncement();
+  }, [id]);
   
     
 
-  if (!announcement) {
+  if (error || !announcement) {
     return (
       <div className="announcement-container">
-        <button className="back-button" onClick={() => navigate(-1)}>
-          &larr; 返回公告区
+        <button className="back-button" onClick={handleBack}>
+          &larr; 返回
         </button>
-        <div className="error-message">公告加载失败，请返回重试</div>
+        <div className="error-message">{error || '公告不存在'}</div>
       </div>
     );
   }
@@ -39,9 +66,7 @@
         <div className="announcement-header">
           <h1>{announcement.title}</h1>
           <div className="announcement-meta">
-            <span className="category-badge">{announcement.category}</span>
-            <span>发布人：{announcement.author}</span>
-            <span>发布日期：{announcement.date}</span>
+            <span>发布日期：{announcement.createTime}</span>
           </div>
         </div>
 
diff --git a/src/components/AnnouncementDetail.test.jsx b/src/components/AnnouncementDetail.test.jsx
new file mode 100644
index 0000000..7f44ecd
--- /dev/null
+++ b/src/components/AnnouncementDetail.test.jsx
@@ -0,0 +1,116 @@
+import React from 'react';
+import { render, screen, fireEvent, waitFor } from '@testing-library/react';
+import { MemoryRouter, Route, Routes, useNavigate, useParams, useLocation } from 'react-router-dom';
+import AnnouncementDetail from './AnnouncementDetail';
+import * as announcementApi from '../api/announcement';
+
+// Mock API 模块
+jest.mock('../api/announcement');
+
+// Mock 路由钩子
+const mockNavigate = jest.fn();
+jest.mock('react-router-dom', () => ({
+  ...jest.requireActual('react-router-dom'),
+  useNavigate: () => mockNavigate,
+  useParams: jest.fn(),
+  useLocation: jest.fn(),
+}));
+
+describe('AnnouncementDetail 组件', () => {
+  const mockAnnouncement = {
+    id: 1,
+    title: '测试公告标题',
+    content: '这是测试公告内容\n这是第二行内容',
+    
+    createTime: '2023-01-01T00:00:00Z',
+    
+  };
+
+  beforeEach(() => {
+    // 重置 mock 函数
+    mockNavigate.mockClear();
+    
+    // 设置模拟的 API 响应
+    announcementApi.getAnnouncementDetail.mockResolvedValue({
+      data: {
+        code: 200,
+        data: {
+          announcement: mockAnnouncement
+        }
+      }
+    });
+
+    // 模拟 useParams
+    useParams.mockReturnValue({ id: '1' });
+
+    // 模拟 useLocation
+    useLocation.mockReturnValue({
+      state: { fromTab: 'announcement' }
+    });
+  });
+
+  const renderComponent = () => {
+    return render(
+      <MemoryRouter initialEntries={['/announcement/1']}>
+        <Routes>
+          <Route path="/announcement/:id" element={<AnnouncementDetail />} />
+          {/* 添加一个模拟的公告列表路由用于导航测试 */}
+          <Route path="/dashboard/announcement" element={<div>公告列表</div>} />
+        </Routes>
+      </MemoryRouter>
+    );
+  };
+
+  it('应该正确加载和显示公告详情', async () => {
+    renderComponent();
+
+    
+
+    // 等待数据加载完成
+    await waitFor(() => {
+      expect(screen.getByText('测试公告标题')).toBeInTheDocument();
+      expect(screen.getByText('这是测试公告内容')).toBeInTheDocument();
+      expect(screen.getByText('这是第二行内容')).toBeInTheDocument();
+    });
+  });
+
+  it('应该处理公告加载失败的情况', async () => {
+    // 模拟 API 返回错误
+    announcementApi.getAnnouncementDetail.mockResolvedValue({
+      data: {
+        code: 404,
+        message: '公告不存在'
+      }
+    });
+
+    renderComponent();
+
+    await waitFor(() => {
+      expect(screen.getByText('公告不存在')).toBeInTheDocument();
+    });
+  });
+
+  it('应该能够返回公告区', async () => {
+    renderComponent();
+  
+    await waitFor(() => {
+      expect(screen.getByText('测试公告标题')).toBeInTheDocument();
+    });
+  
+    fireEvent.click(screen.getByRole('button', { name: /返回/i }));
+  
+    // 检查是否导航回公告区
+    expect(mockNavigate).toHaveBeenCalledWith('/dashboard/announcement');
+  });
+
+  it('应该显示加载错误时的UI', async () => {
+    // 模拟 API 抛出错误
+    announcementApi.getAnnouncementDetail.mockRejectedValue(new Error('网络错误'));
+
+    renderComponent();
+
+    await waitFor(() => {
+      expect(screen.getByText('获取公告详情失败')).toBeInTheDocument();
+    });
+  });
+});
\ No newline at end of file
diff --git a/src/components/Dashboard.css b/src/components/Dashboard.css
index a6b3a5a..d3a5471 100644
--- a/src/components/Dashboard.css
+++ b/src/components/Dashboard.css
@@ -717,6 +717,154 @@
   background-color: #218838;
 }
 
+/* 下载模态框样式 */
+.modal-overlay {
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background: rgba(0, 0, 0, 0.5);
+    z-index: 1000;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+
+.download-modal {
+    background: white;
+    padding: 20px;
+    border-radius: 8px;
+    width: 500px;
+    max-width: 90%;
+    position: relative;
+}
+
+.download-modal .close-btn {
+    position: absolute;
+    top: 10px;
+    right: 10px;
+    background: none;
+    border: none;
+    font-size: 20px;
+    cursor: pointer;
+}
+
+.download-modal .form-group {
+    margin-bottom: 15px;
+}
+
+.download-modal .form-group label {
+    display: block;
+    margin-bottom: 5px;
+}
+
+.download-modal .form-group input {
+    width: 100%;
+    padding: 8px;
+    border: 1px solid #ddd;
+    border-radius: 4px;
+}
+
+.progress-container {
+    margin: 15px 0;
+    background: #f0f0f0;
+    border-radius: 4px;
+    height: 20px;
+    overflow: hidden;
+}
+
+.progress-bar {
+    height: 100%;
+    background: #1890ff;
+    transition: width 0.3s;
+    color: white;
+    text-align: center;
+    font-size: 12px;
+    line-height: 20px;
+}
+
+.modal-actions {
+    display: flex;
+    justify-content: flex-end;
+    gap: 10px;
+    margin-top: 20px;
+}
+
+.modal-actions button {
+    padding: 8px 16px;
+    border-radius: 4px;
+    cursor: pointer;
+}
+
+.modal-actions button:first-child {
+    background: #f5f5f5;
+    border: 1px solid #d9d9d9;
+}
+
+.modal-actions button:last-child {
+    background: #1890ff;
+    color: white;
+    border: none;
+}
+
+.modal-actions button:disabled {
+    background: #d9d9d9;
+    cursor: not-allowed;
+    opacity: 0.7;
+}
+
+/* 在Dashboard.css中添加以下样式 */
+
+.resource-actions {
+  display: flex;
+  gap: 10px;
+  margin-left: auto;
+}
+
+.delete-btn {
+  padding: 8px 15px;
+  background-color: #ff4d4f;
+  color: white;
+  border: none;
+  border-radius: 4px;
+  cursor: pointer;
+  transition: background-color 0.3s;
+}
+
+.delete-btn:hover {
+  background-color: #ff7875;
+}
+
+.delete-btn:disabled {
+  background-color: #d9d9d9;
+  cursor: not-allowed;
+}
+
+.carousel-image {
+  padding: 1rem;
+  background: linear-gradient(to right, #f7b733, #fc4a1a);
+  color: white;
+  border-radius: 10px;
+  height: 180px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  font-size: 18px;
+  transition: all 0.5s ease-in-out;
+}
+
+.carousel-image h3 {
+  font-size: 22px;
+  margin: 0;
+}
+
+.carousel-image p {
+  margin: 4px 0;
+}
+
+
 /* 平台名称样式 */
 .platform-name {
   flex: 1;
diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx
index f8f5dd3..40bd19d 100644
--- a/src/components/Dashboard.jsx
+++ b/src/components/Dashboard.jsx
@@ -1,9 +1,13 @@
 import React, {useEffect, useState} from 'react';
 import {useNavigate, useLocation, useParams} from 'react-router-dom';  
-import {createTorrent, getTorrents, searchTorrents} from '../api/torrent';
+import {createTorrent, getTorrents, downloadTorrent, getDownloadProgress, deleteTorrent, searchTorrents} from '../api/torrent';
 import './Dashboard.css';
-import {createPost, getPosts, getPostDetail, searchPosts} from '../api/helpPost';
-import { getUserInfo, isAdmin } from '../api/auth';
+import {createHelpPost, getHelpPosts, getHelpPostDetail, searchHelpPosts} from '../api/helpPost';
+import {createRequestPost, getRequestPosts, getRequestPostDetail, searchRequestPosts} from '../api/requestPost';
+import { message } from 'antd'; // 用于显示提示消息
+import { getAnnouncements,getLatestAnnouncements,getAnnouncementDetail } from '../api/announcement'; 
+import { getAllDiscounts } from '../api/administer'; 
+   import { getUserInfo, isAdmin } from '../api/auth';
 import { api } from '../api/auth'; 
 
 
@@ -36,6 +40,11 @@
     const [currentPage, setCurrentPage] = useState(1);
     const [totalPages, setTotalPages] = useState(1);
     const [likedPosts,setLikedPosts] = useState({});
+    const [announcements, setAnnouncements] = useState([]);
+    const [carouselDiscounts, setCarouselDiscounts] = useState([]);
+    const [requestLoading, setRequestLoading] = useState(false);
+    const [requestError, setRequestError] = useState(null);
+    const [requestPosts, setRequestPosts] = useState([]);
 
 
     // 添加状态
@@ -46,6 +55,13 @@
     const [filteredResources, setFilteredResources] = useState(torrentPosts);
     const [isAdmin, setIsAdmin] = useState(false);
 
+    // 在组件状态中添加
+    const [showDownloadModal, setShowDownloadModal] = useState(false);
+    const [selectedTorrent, setSelectedTorrent] = useState(null);
+    const [downloadProgress, setDownloadProgress] = useState(0);
+    const [isDownloading, setIsDownloading] = useState(false);
+    const [downloadPath, setDownloadPath] = useState('D:/studies/ptPlatform/torrent');
+
     // 新增搜索状态
     const [announcementSearch, setAnnouncementSearch] = useState('');
     const [shareSearch, setShareSearch] = useState('');
@@ -66,150 +82,54 @@
         });
     };
 
-    //公告区
-    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 handleSearchAnnouncement = (e) => {
-        setAnnouncementSearch(e.target.value);
-    };
-
-    // 修改后的搜索函数
-    const handleSearchShare = async () => {
-        try {
-            setTorrentLoading(true);
-            const response = await searchTorrents(shareSearch, 1);
-            if (response.data.code === 200) {
-                setTorrentPosts(response.data.data.records);
-                const total = response.data.data.total;
-                setTotalPages(Math.ceil(total / 5));
-                setCurrentPage(1);
-            } else {
-                setTorrentError(response.data.message || '搜索失败');
-            }
-        } catch (err) {
-            setTorrentError(err.message || '搜索失败');
-        } finally {
-            setTorrentLoading(false);
-        }
-    };
-
-    const handleResetShareSearch = async () => {
-        setShareSearch('');
-        setSelectedFilters(
-            Object.keys(filterCategories).reduce((acc, category) => {
-                acc[category] = 'all';
-                return acc;
-            }, {})
-        );
-        await fetchTorrentPosts(1, true);
-    };
-
-    // 求种区搜索处理
-    const handleSearchRequest = (e) => {
-        setRequestSearch(e.target.value);
-    };
-
-    // 添加搜索函数
-    const handleSearchHelp = async () => {
-        try {
-        setHelpLoading(true);
-        const response = await searchPosts(helpSearch, currentPage);
-        if (response.data.code === 200) {
-            const postsWithCounts = await Promise.all(
-            response.data.data.records.map(async (post) => {
-                try {
-                const detailResponse = await getPostDetail(post.id);
-                if (detailResponse.data.code === 200) {
-                    return {
-                    ...post,
-                    replyCount: detailResponse.data.data.post.replyCount || 0,
-                    isLiked: false
-                    };
-                }
-                return post;
-                } catch (err) {
-                console.error(`获取帖子${post.id}详情失败:`, err);
-                return post;
-                }
-            })
-            );
-            setHelpPosts(postsWithCounts);
-            setTotalPages(Math.ceil(response.data.data.total / 5));
-        } else {
-            setHelpError(response.data.message || '搜索失败');
-        }
-        } catch (err) {
-        setHelpError(err.message || '搜索失败');
-        } finally {
-        setHelpLoading(false);
-        }
-    };
     
-    // 添加重置搜索函数
-    const handleResetHelpSearch = async () => {
-        setHelpSearch('');
-        await fetchHelpPosts(1); // 重置到第一页
+
+    //公告区
+    // 添加获取公告的方法
+    const fetchAnnouncements = async () => {
+    try {
+        const response = await getLatestAnnouncements();
+        setAnnouncements(response.data.data.announcements || []);
+    } catch (error) {
+        console.error('获取公告失败:', error);
+    }
     };
 
+    useEffect(() => {
+        if (activeTab === 'announcement') {
+            fetchAnnouncements();
+            fetchDiscountsForCarousel();
+        }
+    }, [activeTab]);
 
+    const fetchDiscountsForCarousel = async () => {
+        try {
+            const all = await getAllDiscounts();
+            console.log("返回的折扣数据：", all);
+            const now = new Date();
 
+            // ⚠️ 使用 Date.parse 确保兼容 ISO 格式
+            const ongoing = all.filter(d =>
+            Date.parse(d.startTime) <= now.getTime() && Date.parse(d.endTime) >= now.getTime()
+            );
+
+            const upcoming = all
+            .filter(d => Date.parse(d.startTime) > now.getTime())
+            .sort((a, b) => Date.parse(a.startTime) - Date.parse(b.startTime));
+
+            const selected = [...ongoing.slice(0, 3)];
+
+            while (selected.length < 3 && upcoming.length > 0) {
+            selected.push(upcoming.shift());
+            }
+
+            setCarouselDiscounts(selected);
+        } catch (e) {
+            console.error("获取折扣失败:", e);
+        }
+    };
+
+    // 修改handleAnnouncementClick函数中的state传递，移除不必要的字段
     const handleAnnouncementClick = (announcement, e) => {
         if (!e.target.closest('.exclude-click')) {
             navigate(`/announcement/${announcement.id}`, {
@@ -223,6 +143,129 @@
         }
     };
 
+    
+   // 公告区搜索处理
+    const handleSearchAnnouncement = (e) => {
+        setAnnouncementSearch(e.target.value);
+    };
+
+    // 修改后的搜索函数
+    const handleSearchShare = async () => {
+        try {
+            setTorrentLoading(true);
+            const response = await searchTorrents(shareSearch, 1);
+            if (response.data.code === 200) {
+                setTorrentPosts(response.data.data.records);
+                const total = response.data.data.total;
+                setTotalPages(Math.ceil(total / 5));
+                setCurrentPage(1);
+            } else {
+                setTorrentError(response.data.message || '搜索失败');
+            }
+        } catch (err) {
+            setTorrentError(err.message || '搜索失败');
+        } finally {
+            setTorrentLoading(false);
+        }
+    };
+
+    const handleResetShareSearch = async () => {
+        setShareSearch('');
+        setSelectedFilters(
+            Object.keys(filterCategories).reduce((acc, category) => {
+                acc[category] = 'all';
+                return acc;
+            }, {})
+        );
+        await fetchTorrentPosts(1, true);
+    };
+
+    // 添加搜索函数
+    const handleSearchRequest = async () => {
+        try {
+        setRequestLoading(true);
+        const response = await searchRequestPosts(requestSearch, currentPage);
+        if (response.data.code === 200) {
+            const postsWithCounts = await Promise.all(
+            response.data.data.records.map(async (post) => {
+                try {
+                const detailResponse = await getRequestPostDetail(post.id);
+                if (detailResponse.data.code === 200) {
+                    return {
+                    ...post,
+                    replyCount: detailResponse.data.data.post.replyCount || 0,
+                    isLiked: false
+                    };
+                }
+                return post;
+                } catch (err) {
+                console.error(`获取帖子${post.id}详情失败:`, err);
+                return post;
+                }
+            })
+            );
+            setRequestPosts(postsWithCounts);
+            setTotalPages(Math.ceil(response.data.data.total / 5));
+        } else {
+            setRequestError(response.data.message || '搜索失败');
+        }
+        } catch (err) {
+        setRequestError(err.message || '搜索失败');
+        } finally {
+        setRequestLoading(false);
+        }
+    };
+    
+    // 添加重置搜索函数
+    const handleResetRequestSearch = async () => {
+        setRequestSearch('');
+        await fetchRequestPosts(1); // 重置到第一页
+ };
+
+   // 添加搜索函数
+    const handleSearchHelp = async () => {
+        try {
+        setHelpLoading(true);
+        const response = await searchHelpPosts(helpSearch, currentPage);
+        if (response.data.code === 200) {
+            const postsWithCounts = await Promise.all(
+            response.data.data.records.map(async (post) => {
+                try {
+                const detailResponse = await getHelpPostDetail(post.id);
+                if (detailResponse.data.code === 200) {
+                    return {
+                    ...post,
+                    replyCount: detailResponse.data.data.post.replyCount || 0,
+                    isLiked: false
+                    };
+                }
+                return post;
+                } catch (err) {
+                console.error(`获取帖子${post.id}详情失败:`, err);
+                return post;
+                }
+            })
+            );
+            setHelpPosts(postsWithCounts);
+            setTotalPages(Math.ceil(response.data.data.total / 5));
+        } else {
+            setHelpError(response.data.message || '搜索失败');
+        }
+        } catch (err) {
+        setHelpError(err.message || '搜索失败');
+        } finally {
+        setHelpLoading(false);
+        }
+    };
+    
+    // 添加重置搜索函数
+    const handleResetHelpSearch = async () => {
+        setHelpSearch('');
+        await fetchHelpPosts(1); // 重置到第一页
+ };
+
+
+
 
     //资源区
     const handleFileChange = (e) => {
@@ -243,7 +286,10 @@
                 subtitle: uploadData.subtitle
             };
 
-            await createTorrent(torrentData, uploadData.file);
+            await createTorrent(uploadData.file, torrentData, (progress) => {
+                console.log(`上传进度: ${progress}%`);
+                // 这里可以添加进度条更新逻辑
+                });
 
             // 上传成功处理
             setShowUploadModal(false);
@@ -269,11 +315,164 @@
         }
     };
 
-    const handlePostSubmit = async (e) => {
+    // 处理下载按钮点击
+    const handleDownloadClick = (torrent, e) => {
+        e.stopPropagation();
+        setSelectedTorrent(torrent);
+        setShowDownloadModal(true);
+    };
+
+    // 执行下载
+    const handleDownload = async () => {
+    if (!selectedTorrent || !downloadPath) return;
+
+    setIsDownloading(true);
+    setDownloadProgress(0);
+
+    try {
+        // 标准化路径
+        const cleanPath = downloadPath
+        .replace(/\\/g, '/')  // 统一使用正斜杠
+        .replace(/\/+/g, '/') // 去除多余斜杠
+        .trim();
+
+        // 确保路径以斜杠结尾
+        const finalPath = cleanPath.endsWith('/') ? cleanPath : cleanPath + '/';
+
+        // 发起下载请求
+        await downloadTorrent(selectedTorrent.id, finalPath);
+        
+        // 开始轮询进度
+        const interval = setInterval(async () => {
+            try {
+                const res = await getDownloadProgress();
+                const progresses = res.data.progresses;
+                
+                if (progresses) {
+                    // 使用完整的 torrent 文件路径作为键
+                    const torrentPath = selectedTorrent.filePath.replace(/\\/g, '/');
+                    const torrentHash = selectedTorrent.hash;
+                    // 查找匹配的进度
+                    let foundProgress = null;
+                    for (const [key, value] of Object.entries(progresses)) {
+                        const normalizedKey = key.replace(/\\/g, '/');
+                        if (normalizedKey.includes(selectedTorrent.hash) || 
+                            normalizedKey.includes(selectedTorrent.torrentName)) {
+                            foundProgress = value;
+                            break;
+                        }
+                    }
+                    if (foundProgress !== null) {
+                        const newProgress = Math.round(foundProgress * 100);
+                        setDownloadProgress(newProgress);
+                        
+                        // 检查是否下载完成
+                        if (newProgress >= 100) {
+                        clearInterval(interval);
+                        setIsDownloading(false);
+                        message.success('下载完成！');
+                        setTimeout(() => setShowDownloadModal(false), 2000);
+                        }
+                    } else {
+                        console.log('当前下载进度:', progresses); // 添加日志
+                    }
+                    }
+                } catch (error) {
+                    console.error('获取进度失败:', error);
+                    // 如果获取进度失败但文件已存在，也视为完成
+                    const filePath = `${finalPath}${selectedTorrent.torrentName || 'downloaded_file'}`;
+                    try {
+                    const exists = await checkFileExists(filePath);
+                    if (exists) {
+                        clearInterval(interval);
+                        setDownloadProgress(100);
+                        setIsDownloading(false);
+                        message.success('下载完成！');
+                        setTimeout(() => setShowDownloadModal(false), 2000);
+                    }
+                    } catch (e) {
+                    console.error('文件检查失败:', e);
+                    }
+                }
+                }, 2000);
+
+        return () => clearInterval(interval);
+    } catch (error) {
+        setIsDownloading(false);
+        if (error.response && error.response.status === 409) {
+        message.error('分享率不足，无法下载此资源');
+        } else {
+        message.error('下载失败: ' + (error.message || '未知错误'));
+        }
+    }
+    };
+
+    const checkFileExists = async (filePath) => {
+        try {
+            // 这里需要根据您的实际环境实现文件存在性检查
+            // 如果是Electron应用，可以使用Node.js的fs模块
+            // 如果是纯前端，可能需要通过API请求后端检查
+            return true; // 暂时返回true，实际实现需要修改
+        } catch (e) {
+            console.error('检查文件存在性失败:', e);
+            return false;
+        }
+    };
+
+    const handleDeleteTorrent = async (torrentId, e) => {
+        e.stopPropagation(); // 阻止事件冒泡，避免触发资源项的点击事件
+        
+        try {
+            // 确认删除
+            if (!window.confirm('确定要删除这个种子吗？此操作不可撤销！')) {
+            return;
+            }
+            
+            // 调用删除API
+            await deleteTorrent(torrentId);
+            
+            // 删除成功后刷新列表
+            message.success('种子删除成功');
+            await fetchTorrentPosts(currentPage);
+        } catch (error) {
+            console.error('删除种子失败:', error);
+            message.error('删除种子失败: ' + (error.response?.data?.message || error.message));
+        }
+        };
+
+        const handleRequestPostSubmit = async (e) => {
         e.preventDefault();
         try {
           const username = localStorage.getItem('username');
-          const response = await createPost(
+          const response = await createRequestPost(
+            postTitle,
+            postContent,
+            username,
+            selectedImage
+          );
+          
+          if (response.data.code === 200) {
+            // 刷新帖子列表
+           
+            await fetchRequestPosts(currentPage);
+            // 重置表单
+            setShowPostModal(false);
+            setPostTitle('');
+            setPostContent('');
+            setSelectedImage(null);
+          } else {
+            setHelpError(response.data.message || '发帖失败');
+          }
+        } catch (err) {
+          setHelpError(err.message || '发帖失败');
+        }
+      };
+
+    const handleHelpPostSubmit = async (e) => {
+        e.preventDefault();
+        try {
+          const username = localStorage.getItem('username');
+          const response = await createHelpPost(
             postTitle,
             postContent,
             username,
@@ -283,6 +482,7 @@
           if (response.data.code === 200) {
             // 刷新帖子列表
             await fetchHelpPosts(currentPage);
+            
             // 重置表单
             setShowPostModal(false);
             setPostTitle('');
@@ -339,6 +539,42 @@
         }
     }, [activeTab]);
 
+const fetchRequestPosts = async (page = 1) => {
+        setRequestLoading(true);
+        try {
+          const response = await getRequestPosts(page);
+          if (response.data.code === 200) {
+            const postsWithCounts = await Promise.all(
+              response.data.data.records.map(async (post) => {
+                try {
+                  const detailResponse = await getRequestPostDetail(post.id);
+                  if (detailResponse.data.code === 200) {
+                    return {
+                      ...post,
+                      replyCount: detailResponse.data.data.post.replyCount || 0,
+                      isLiked: false // 根据需要添加其他字段
+                    };
+                  }
+                  return post; // 如果获取详情失败，返回原始帖子数据
+                } catch (err) {
+                  console.error(`获取帖子${post.id}详情失败:`, err);
+                  return post;
+                }
+              })
+            );
+            setRequestPosts(postsWithCounts);
+            setTotalPages(Math.ceil(response.data.data.total / 5)); // 假设每页5条
+            setCurrentPage(page);
+          } else {
+            setRequestError(response.data.message || '获取求助帖失败');
+          }
+        } catch (err) {
+          setRequestError(err.message || '获取求助帖失败');
+        } finally {
+          setRequestLoading(false);
+        }
+      };
+
     const handleImageUpload = (e) => {
         setSelectedImage(e.target.files[0]);
     };
@@ -347,12 +583,12 @@
     const fetchHelpPosts = async (page = 1) => {
         setHelpLoading(true);
         try {
-          const response = await getPosts(page);
+          const response = await getHelpPosts(page);
           if (response.data.code === 200) {
             const postsWithCounts = await Promise.all(
               response.data.data.records.map(async (post) => {
                 try {
-                  const detailResponse = await getPostDetail(post.id);
+                  const detailResponse = await getHelpPostDetail(post.id);
                   if (detailResponse.data.code === 200) {
                     return {
                       ...post,
@@ -382,8 +618,8 @@
 
 
     useEffect(() => {
-        if (activeTab === 'help') {
-            fetchHelpPosts(currentPage);
+        if (activeTab === 'request') {
+            fetchRequestPosts(currentPage);
         }
     }, [activeTab, currentPage]); // 添加 currentPage 作为依赖
 
@@ -541,7 +777,10 @@
     useEffect(() => {
         if (activeTab === 'announcement') {
             const timer = setInterval(() => {
-                setCurrentSlide(prev => (prev + 1) % 3); // 3张轮播图循环
+                setCurrentSlide(prev => {
+                    const count = carouselDiscounts.length || 1;
+                    return (prev + 1) % count;
+                });
             }, 3000);
             return () => clearInterval(timer);
         }
@@ -551,7 +790,9 @@
         if (activeTab === 'help') {
             fetchHelpPosts();
         }
-    }, [activeTab]);
+    }, [activeTab, currentPage]); // 添加 currentPage 作为依赖
+
+    
 
     const renderContent = () => {
         switch (activeTab) {
@@ -575,22 +816,30 @@
                             </button>
                         </div>
                         {/* 轮播图区域 */}
-                        <div className="carousel-container">
-                            <div className={`carousel-slide ${currentSlide === 0 ? 'active' : ''}`}>
-                                <div className="carousel-image gray-bg">促销活动1</div>
+                       <div className="carousel-container">
+                        {carouselDiscounts.length === 0 ? (
+                            <div className="carousel-slide active">
+                            <div className="carousel-image gray-bg">暂无折扣活动</div>
                             </div>
-                            <div className={`carousel-slide ${currentSlide === 1 ? 'active' : ''}`}>
-                                <div className="carousel-image gray-bg">促销活动2</div>
+                        ) : (
+                            carouselDiscounts.map((discount, index) => (
+                            <div key={index} className={`carousel-slide ${currentSlide === index ? 'active' : ''}`}>
+                                <div className="carousel-image gray-bg">
+                                <h3>{discount.type}</h3>
+                                <p>{discount.name}</p>
+                                <p>{new Date(discount.startTime).toLocaleDateString()} ~ {new Date(discount.endTime).toLocaleDateString()}</p>
+                                </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 className="carousel-dots">
+                            {carouselDiscounts.map((_, index) => (
+                            <span key={index} className={`dot ${currentSlide === index ? 'active' : ''}`}></span>
+                            ))}
                         </div>
+                        </div>
+
+
 
                         {/* 公告区块区域 */}
                         <div className="announcement-grid">
@@ -601,9 +850,8 @@
                                     onClick={(e) => handleAnnouncementClick(announcement, e)}
                                 >
                                     <h3>{announcement.title}</h3>
-                                    <p>{announcement.excerpt}</p>
+                                    <p>{announcement.content.substring(0, 100)}...</p>
                                     <div className="announcement-footer exclude-click">
-                                        <span>{announcement.author}</span>
                                         <span>{announcement.date}</span>
                                     </div>
                                 </div>
@@ -845,13 +1093,19 @@
                                     </div>
                                     <button
                                         className="download-btn"
-                                        onClick={(e) => {
-                                            e.stopPropagation();
-                                            // 下载逻辑
-                                        }}
+                                        onClick={(e) => handleDownloadClick(torrent, e)}
                                     >
                                         立即下载
                                     </button>
+                                    {/* 添加删除按钮 - 只有管理员或发布者可见 */}
+                                    {(userInfo?.isAdmin || userInfo?.name === torrent.username) && (
+                                        <button
+                                        className="delete-btn"
+                                        onClick={(e) => handleDeleteTorrent(torrent.id, e)}
+                                        >
+                                        删除
+                                        </button>
+                                    )}
                                 </div>
                             ))}
                         </div>
@@ -889,11 +1143,11 @@
             case 'request':
                 return (
                     <div className="content-area" data-testid="request-section">
-                        {/* 求种区搜索框 */}
+                        {/* 求助区搜索框 */}
                         <div className="section-search-container">
                             <input
                                 type="text"
-                                placeholder="搜索求种..."
+                                placeholder="搜索求助..."
                                 value={requestSearch}
                                 onChange={(e) => setRequestSearch(e.target.value)}
                                 className="section-search-input"
@@ -905,51 +1159,160 @@
                             >
                                 搜索
                             </button>
+                            <button 
+                                className="reset-button"
+                                onClick={handleResetRequestSearch}
+                                style={{marginLeft: '10px'}}
+                            >
+                                重置
+                            </button>
                         </div>
+
+                         {/* 新增发帖按钮 */}
+                        <div className="post-header">
+                            <button
+                                className="create-post-btn"
+                                onClick={() => setShowPostModal(true)}
+                            >
+                                ＋ 发帖求助
+                            </button>
+                        </div>
+
+                        {/* 加载状态和错误提示 */}
+                        {requestLoading && <div className="loading">加载中...</div>}
+                        {requestError && <div className="error">{helpError}</div>}
                         {/* 求种区帖子列表 */}
                         <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 => (
+                            {requestPosts.map(post => (
                                 <div
                                     key={post.id}
-                                    className="request-post"
+                                    className={`request-post ${post.isSolved ? 'solved' : ''}`}
                                     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>
+                                        <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}</span>
-                                        <span className="post-comments">💬 {post.commentCount}</span>
+                                        <span className="post-likes">👍 {post.likeCount || 0}</span>
+                                        <span className="post-comments">💬 {post.replyCount || 0}</span>
                                     </div>
                                 </div>
                             ))}
                         </div>
+                        {/* 在帖子列表后添加分页控件 */}
+                        <div className="pagination">
+                            <button
+                                onClick={() => fetchRequestPosts(currentPage - 1)}
+                                disabled={currentPage === 1}
+                            >
+                                上一页
+                            </button>
+
+                            {Array.from({length: totalPages}, (_, i) => i + 1).map(page => (
+                                <button
+                                    key={page}
+                                    onClick={() => fetchRequestPosts(page)}
+                                    className={currentPage === page ? 'active' : ''}
+                                >
+                                    {page}
+                                </button>
+                            ))}
+
+                            <button
+                                onClick={() => fetchRequestPosts(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={handleRequestPostSubmit}>
+                                        <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>
+                    
+                
+
+                    
                 );
             // 在Dashboard.jsx的renderContent函数中修改case 'help'部分
             case 'help':
@@ -1063,7 +1426,7 @@
                                         ×
                                     </button>
 
-                                    <form onSubmit={handlePostSubmit}>
+                                    <form onSubmit={handleHelpPostSubmit}>
                                         <div className="form-group">
                                             <label>帖子标题</label>
                                             <input
@@ -1128,6 +1491,7 @@
             default:
                 return <div className="content-area" data-testid="default-section">公告区内容</div>;
         }
+        
     };
 
     if (loading) return <div className="loading">加载中...</div>;
@@ -1198,6 +1562,62 @@
 
             {/* 内容区 */}
             {renderContent()}
+            {/* 下载模态框 - 添加在这里 */}
+            {showDownloadModal && selectedTorrent && (
+                <div className="modal-overlay">
+                    <div className="download-modal">
+                        <h3>下载 {selectedTorrent.torrentName}</h3>
+                        <button 
+                            className="close-btn"
+                            onClick={() => !isDownloading && setShowDownloadModal(false)}
+                            disabled={isDownloading}
+                        >
+                            ×
+                        </button>
+                        
+                        <div className="form-group">
+                            <label>下载路径:</label>
+                            <input
+                                type="text"
+                                value={downloadPath}
+                                onChange={(e) => {
+                                    // 实时格式化显示
+                                    let path = e.target.value
+                                        .replace(/\t/g, '')
+                                        .replace(/\\/g, '/')
+                                        .replace(/\s+/g, ' ');
+                                    setDownloadPath(path);
+                                }}
+                                disabled={isDownloading}
+                                placeholder="例如: D:/downloads/"
+                            />
+                        </div>
+                        
+                        {isDownloading && (
+                            <div className="progress-container">
+                                <div className="progress-bar" style={{ width: `${downloadProgress}%` }}>
+                                    {downloadProgress}%
+                                </div>
+                            </div>
+                        )}
+                        
+                        <div className="modal-actions">
+                            <button
+                                onClick={() => !isDownloading && setShowDownloadModal(false)}
+                                disabled={isDownloading}
+                            >
+                                取消
+                            </button>
+                            <button
+                                onClick={handleDownload}
+                                disabled={isDownloading || !downloadPath}
+                            >
+                                {isDownloading ? '下载中...' : '开始下载'}
+                            </button>
+                        </div>
+                    </div>
+                </div>
+            )}
         </div>
     );
 };
diff --git a/src/components/HelpDetail.css b/src/components/HelpDetail.css
index 94d791b..34e1363 100644
--- a/src/components/HelpDetail.css
+++ b/src/components/HelpDetail.css
@@ -554,4 +554,33 @@
   border-radius: 4px;
   padding: 8px 16px;
   cursor: pointer;
-}
\ No newline at end of file
+}
+
+.post-image-container {
+  width: 100%;
+  max-width: 500px; /* 最大宽度 */
+  margin: 10px 0;
+}
+
+.post-image {
+  width: 100%;
+  height: auto;
+  max-height: 400px; /* 最大高度 */
+  object-fit: contain; /* 保持比例完整显示图片 */
+  border-radius: 4px;
+}
+
+.comment-image-container {
+  width: 100%;
+  max-width: 500px; /* 最大宽度 */
+  margin: 10px 0;
+}
+
+.comment-image {
+  width: 100%;
+  height: auto;
+  max-height: 400px; /* 最大高度 */
+  object-fit: contain; /* 保持比例完整显示图片 */
+  border-radius: 4px;
+}
+
diff --git a/src/components/HelpDetail.jsx b/src/components/HelpDetail.jsx
index 7e7b7c8..1e35aec 100644
--- a/src/components/HelpDetail.jsx
+++ b/src/components/HelpDetail.jsx
@@ -1,16 +1,16 @@
 import React, { useState, useEffect, useRef } from 'react';
 import { useParams, useNavigate, useLocation } from 'react-router-dom';
 import { 
-  getPostDetail,
-  addPostComment,
-  likePost,
-  deletePost
+  getHelpPostDetail,
+  addHelpPostComment,
+  likeHelpPost,
+  deleteHelpPost
 } from '../api/helpPost';
 import {
-  likePostComment,
+  likeHelpPostComment,
   getCommentReplies,
-  addCommentReply,
-  deleteComment
+  addHelpCommentReply,
+  deleteHelpComment
 } from '../api/helpComment';
 import './HelpDetail.css';
 
@@ -136,7 +136,7 @@
    const fetchPostDetail = async () => {
       try {
         setLoading(true);
-        const response = await getPostDetail(id);
+        const response = await getHelpPostDetail(id);
         console.log('API Response:', JSON.parse(JSON.stringify(response.data.data.comments))); // 深度拷贝避免Proxy影响
         setPost(response.data.data.post);
         setComments(response.data.data.comments);
@@ -154,7 +154,7 @@
     // 点赞帖子
     const handleLikePost = async () => {
       try {
-        await likePost(id);
+        await likeHelpPost(id);
         setPost(prev => ({
           ...prev,
           likeCount: prev.likeCount + 1
@@ -169,7 +169,7 @@
       if (window.confirm('确定要删除这个帖子吗？所有评论也将被删除！')) {
         try {
           const username = localStorage.getItem('username');
-          await deletePost(postId, username);
+          await deleteHelpPost(postId, username);
           navigate('/dashboard/help'); // 删除成功后返回求助区
         } catch (err) {
           setError('删除失败: ' + (err.response?.data?.message || err.message));
@@ -183,16 +183,21 @@
       
       try {
         const username = localStorage.getItem('username');
-        const response = await addPostComment(id, {
-          content: newComment,
-          authorId: username
-        });
+        const formData = new FormData();
+        formData.append('content', newComment);
+        formData.append('authorId', username);
+        if (commentImage) {
+          formData.append('image', commentImage);
+        }
+
+        const response = await addHelpPostComment(id, formData);
     
         // 修改这里的响应处理逻辑
         if (response.data && response.data.code === 200) {
           await fetchPostDetail();
           
           setNewComment('');
+          setCommentImage(null); // 清空评论图片
         } else {
           setError(response.data.message || '评论失败');
         }
@@ -204,7 +209,7 @@
     
     const handleLikeComment = async (commentId) => {
       try {
-        await likePostComment(commentId);
+        await likeHelpPostComment(commentId);
         
         // 递归更新评论点赞数
         const updateComments = (comments) => {
@@ -236,7 +241,7 @@
       if (window.confirm('确定要删除这条评论吗？')) {
         try {
           const username = localStorage.getItem('username');
-          await deleteComment(commentId, username);
+          await deleteHelpComment(commentId, username);
           await fetchPostDetail(); // 刷新评论列表
         } catch (err) {
           setError('删除失败: ' + (err.response?.data?.message || err.message));
@@ -264,7 +269,7 @@
     
       try {
         const username = localStorage.getItem('username');
-        const response = await addCommentReply(replyModal.replyingTo, {
+        const response = await addHelpCommentReply(replyModal.replyingTo, {
           authorId: username,
           content: replyContent,
           image: replyImage
diff --git a/src/components/HelpDetail.test.jsx b/src/components/HelpDetail.test.jsx
index 6364be2..2e917e7 100644
--- a/src/components/HelpDetail.test.jsx
+++ b/src/components/HelpDetail.test.jsx
@@ -53,7 +53,7 @@
     mockNavigate.mockClear();
     
     // 设置模拟的 API 响应
-    helpPostApi.getPostDetail.mockResolvedValue({
+    helpPostApi.getHelpPostDetail.mockResolvedValue({
       data: {
         code: 200,
         data: {
@@ -111,29 +111,33 @@
     fireEvent.click(screen.getByText(/点赞 \(5\)/));
 
     await waitFor(() => {
-      expect(helpPostApi.likePost).toHaveBeenCalledWith('1');
+      expect(helpPostApi.likeHelpPost).toHaveBeenCalledWith('1');
     });
   });
 
   it('应该能够提交评论', async () => {
-    renderComponent();
+  renderComponent();
 
-    await waitFor(() => {
-      expect(screen.getByText('测试求助帖')).toBeInTheDocument();
-    });
-
-    const commentInput = screen.getByPlaceholderText('写下你的评论...');
-    fireEvent.change(commentInput, { target: { value: '新评论' } });
-    fireEvent.click(screen.getByText('发表评论'));
-
-    await waitFor(() => {
-      expect(helpPostApi.addPostComment).toHaveBeenCalledWith('1', {
-        content: '新评论',
-        authorId: 'testuser'
-      });
-    });
+  await waitFor(() => {
+    expect(screen.getByText('测试求助帖')).toBeInTheDocument();
   });
 
+  const commentInput = screen.getByPlaceholderText('写下你的评论...');
+  fireEvent.change(commentInput, { target: { value: '新评论' } });
+  fireEvent.click(screen.getByText('发表评论'));
+
+  await waitFor(() => {
+    expect(helpPostApi.addHelpPostComment).toHaveBeenCalled();
+    
+    const calledArgs = helpPostApi.addHelpPostComment.mock.calls[0];
+    expect(calledArgs[0]).toBe('1'); // postId
+    const formData = calledArgs[1];
+    
+    expect(formData instanceof FormData).toBe(true);
+    expect(formData.get('authorId')).toBe('testuser');
+    expect(formData.get('content')).toBe('新评论');
+  });
+});
   it('应该能够点赞评论', async () => {
     renderComponent();
 
@@ -144,7 +148,7 @@
     fireEvent.click(screen.getAllByText(/👍 \(2\)/)[0]);
 
     await waitFor(() => {
-      expect(helpCommentApi.likePostComment).toHaveBeenCalledWith('c1');
+      expect(helpCommentApi.likeHelpPostComment).toHaveBeenCalledWith('c1');
     });
   });
 
diff --git a/src/components/RequestDetail.jsx b/src/components/RequestDetail.jsx
index 022b0cb..c138419 100644
--- a/src/components/RequestDetail.jsx
+++ b/src/components/RequestDetail.jsx
@@ -1,111 +1,355 @@
-import React, { useState } from 'react';
-import { useParams, useNavigate,useLocation } from 'react-router-dom';
+import React, { useState, useEffect, useRef } from 'react';
+import { useParams, useNavigate, useLocation } from 'react-router-dom';
+import { 
+  getRequestPostDetail,
+  addRequestPostComment,
+  likeRequestPost,
+  deleteRequestPost
+} from '../api/requestPost';
+import {
+  likeRequestPostComment,
+  getCommentReplies,
+  addRequestCommentReply,
+  deleteRequestComment
+} from '../api/requestComment';
 import './RequestDetail.css';
 
 const RequestDetail = () => {
   const { id } = useParams();
   const navigate = useNavigate();
   const location = useLocation();
-  
-  // 模拟数据
-  const [post, setPost] = useState({
-    id: 1,
-    title: '求《药屋少女的呢喃》第二季全集',
-    content: '求1080P带中文字幕版本，最好是内嵌字幕不是外挂的。\n\n希望有热心大佬能分享，可以给积分奖励！',
-    author: '动漫爱好者',
-    authorAvatar: 'https://via.placeholder.com/40',
-    date: '2023-10-15',
-    likeCount: 24,
-    isLiked: false,
-    isFavorited: false
-  });
-
-  const [comments, setComments] = useState([
-    {
-      id: 1,
-      type: 'text',
-      author: '资源达人',
-      authorAvatar: 'https://via.placeholder.com/40',
-      content: '我有第1-5集，需要的话可以私聊',
-      date: '2023-10-15 14:30',
-      likeCount: 5
-    },
-    {
-      id: 2,
-      type: 'torrent',
-      title: '药屋少女的呢喃第二季第8集',
-      size: '1.2GB',
-      author: '种子分享者',
-      authorAvatar: 'https://via.placeholder.com/40',
-      date: '2023-10-16 09:15',
-      likeCount: 8
-    }
-  ]);
-
+  const fileInputRef = useRef(null);
+  const [post, setPost] = useState(null);
+  const [comments, setComments] = useState([]);
+  const [loading, setLoading] = useState(true);
+  const [error, setError] = useState(null);
   const [newComment, setNewComment] = useState('');
+  const [replyContent, setReplyContent] = useState('');
+  const [replyImage, setReplyImage] = useState([]);
+  const [commentImage, setCommentImage] = useState([]);
+  const [expandedReplies, setExpandedReplies] = useState({}); // 记录哪些评论的回复是展开的
+  const [loadingReplies, setLoadingReplies] = useState({});
+  const [setReplyingTo] = useState(null);
+  
 
-  const handleLikePost = () => {
-    setPost(prev => ({
-      ...prev,
-      likeCount: prev.isLiked ? prev.likeCount - 1 : prev.likeCount + 1,
-      isLiked: !prev.isLiked
-    }));
+  const [activeReplyId, setActiveReplyId] = useState(null);
+    const [replyModal, setReplyModal] = useState({
+      visible: false,
+      replyingTo: null,
+      replyingToUsername: '',
+      isReply: false
+    });
+  
+    // 确保openReplyModal接收username参数
+  const openReplyModal = (commentId, username) => {
+    setReplyModal({
+      visible: true,
+      replyingTo: commentId,
+      replyingToUsername: username,  // 确保这里接收username
+      isReply: false
+    });
+  };
+  
+    // 关闭回复弹窗
+    const closeReplyModal = () => {
+      setReplyModal({
+        visible: false,
+        replyingTo: null,
+        replyingToUsername: '',
+        isReply: false
+      });
+      setReplyContent('');
+    };
+
+    const Comment = ({ comment, onLike, onReply, onDelete, isReply = false }) => {
+      return (
+        <div className={`comment-container ${isReply ? "is-reply" : ""}`}>
+          <div className="comment-item">
+            <div className="comment-avatar">
+              {(comment.authorId || "?").charAt(0)} {/* 修复点 */}
+            </div>
+            <div className="comment-content">
+              <div className="comment-header">
+                <span className="comment-user">{comment.authorId || "匿名用户"}</span>
+                {comment.replyTo && (
+                  <span className="reply-to">回复 @{comment.replyTo}</span>
+                )}
+                <span className="comment-time">
+                  {new Date(comment.createTime).toLocaleString()}
+                </span>
+              </div>
+              <p className="comment-text">{comment.content}</p>
+              {/* 添加评论图片展示 */}
+              {comment.imageUrl && (
+                <div className="comment-image-container">
+                  <img 
+                    src={`http://localhost:8088${comment.imageUrl}`} 
+                    alt="评论图片" 
+                    className="comment-image"
+                    onClick={() => window.open(comment.imageUrl, '_blank')}
+                  />
+                </div>
+              )}
+              <div className="comment-actions">
+                <button onClick={() => onLike(comment.id)}>
+                  👍 ({comment.likeCount || 0})
+                </button>
+                <button onClick={() => onReply(comment.id, comment.authorId)}>
+                  回复
+                </button>
+                {comment.authorId === localStorage.getItem('username') && (
+                  <button 
+                    className="delete-comment-btn"
+                    onClick={() => onDelete(comment.id)}
+                  >
+                    删除
+                  </button>
+                )}
+              </div>
+            </div>
+          </div>
+        </div>
+      );
+    };
+
+      // 递归渲染评论组件
+  const renderComment = (comment, depth = 0) => {
+    return (
+      <div key={comment.id} style={{ marginLeft: `${depth * 30}px` }}>
+        <Comment
+          comment={comment}
+          onLike={handleLikeComment}
+          onReply={openReplyModal}
+          isReply={depth > 0}
+          onDelete={handleDeleteComment}
+        />
+        
+        {/* 递归渲染所有回复 */}
+        {comment.replies && comment.replies.map(reply => 
+          renderComment(reply, depth + 1)
+        )}
+      </div>
+    );
   };
 
-  const handleFavoritePost = () => {
-    setPost(prev => ({
-      ...prev,
-      isFavorited: !prev.isFavorited
-    }));
-  };
 
-  const handleCommentSubmit = (e) => {
-    e.preventDefault();
-    if (!newComment.trim()) return;
+   const fetchPostDetail = async () => {
+      try {
+        setLoading(true);
+        const response = await getRequestPostDetail(id);
+        console.log('API Response:', JSON.parse(JSON.stringify(response.data.data.comments))); // 深度拷贝避免Proxy影响
+        setPost(response.data.data.post);
+        setComments(response.data.data.comments);
+      } catch (err) {
+        setError(err.response?.data?.message || '获取帖子详情失败');
+      } finally {
+        setLoading(false);
+      }
+    };
+  
+    useEffect(() => {
+      fetchPostDetail();
+    }, [id]);
+  
+    // 点赞帖子
+    const handleLikePost = async () => {
+      try {
+        await likeRequestPost(id);
+        setPost(prev => ({
+          ...prev,
+          likeCount: prev.likeCount + 1
+        }));
+      } catch (err) {
+        setError('点赞失败: ' + (err.response?.data?.message || err.message));
+      }
+    };
+
+     // 添加删除处理函数
+     const handleDeletePost = async (postId) => {
+      if (window.confirm('确定要删除这个帖子吗？所有评论也将被删除！')) {
+        try {
+          const username = localStorage.getItem('username');
+          await deleteRequestPost(postId, username);
+          navigate('/dashboard/request'); // 删除成功后返回求助区
+        } catch (err) {
+          setError('删除失败: ' + (err.response?.data?.message || err.message));
+        }
+      }
+    };
+  
+    const handleCommentSubmit = async (e) => {
+      e.preventDefault();
+      if (!newComment.trim()) return;
+      
+      try {
+        const username = localStorage.getItem('username');
+        const formData = new FormData();
+        formData.append('content', newComment);
+        formData.append('authorId', username);
+        if (commentImage) {
+          formData.append('image', commentImage);
+        }
+
+        const response = await addRequestPostComment(id, formData);
     
-    const newCommentObj = {
-      id: comments.length + 1,
-      type: 'text',
-      author: '当前用户',
-      authorAvatar: 'https://via.placeholder.com/40',
-      content: newComment,
-      date: new Date().toLocaleString(),
-      likeCount: 0
+        // 修改这里的响应处理逻辑
+        if (response.data && response.data.code === 200) {
+          await fetchPostDetail();
+          
+          setNewComment('');
+          setCommentImage(null); // 清空评论图片
+        } else {
+          setError(response.data.message || '评论失败');
+        }
+      } catch (err) {
+        setError('评论失败: ' + (err.response?.data?.message || err.message));
+      }
     };
     
-    setComments([...comments, newCommentObj]);
-    setNewComment('');
-  };
-
-  const handleDownloadTorrent = (commentId) => {
-
-
     
-    console.log('下载种子', commentId);
-    // 实际下载逻辑
+    const handleLikeComment = async (commentId) => {
+      try {
+        await likeRequestPostComment(commentId);
+        
+        // 递归更新评论点赞数
+        const updateComments = (comments) => {
+          return comments.map(comment => {
+            // 当前评论匹配
+            if (comment.id === commentId) {
+              return { ...comment, likeCount: comment.likeCount + 1 };
+            }
+            
+            // 递归处理回复
+            if (comment.replies && comment.replies.length > 0) {
+              return {
+                ...comment,
+                replies: updateComments(comment.replies)
+              };
+            }
+            
+            return comment;
+          });
+        };
+    
+        setComments(prev => updateComments(prev));
+      } catch (err) {
+        setError('点赞失败: ' + (err.response?.data?.message || err.message));
+      }
+    };
+
+    const handleDeleteComment = async (commentId) => {
+      if (window.confirm('确定要删除这条评论吗？')) {
+        try {
+          const username = localStorage.getItem('username');
+          await deleteRequestComment(commentId, username);
+          await fetchPostDetail(); // 刷新评论列表
+        } catch (err) {
+          setError('删除失败: ' + (err.response?.data?.message || err.message));
+        }
+      }
+    };
+
+
+    // 修改startReply函数
+    const startReply = (commentId) => {
+      if (activeReplyId === commentId) {
+        // 如果点击的是已经激活的回复按钮，则关闭
+        setActiveReplyId(null);
+        setReplyingTo(null);
+      } else {
+        // 否则打开新的回复框
+        setActiveReplyId(commentId);
+        setReplyingTo(commentId);
+      }
+    };
+  
+    const handleReplySubmit = async (e) => {
+      e.preventDefault();
+      if (!replyContent.trim()) return;
+    
+      try {
+        const username = localStorage.getItem('username');
+        const response = await addRequestCommentReply(replyModal.replyingTo, {
+          authorId: username,
+          content: replyContent,
+          image: replyImage
+        });
+    
+        console.log('回复响应:', response.data); // 调试
+        
+        if (response.data && response.data.code === 200) {
+          await fetchPostDetail();
+          setReplyContent('');
+          closeReplyModal();
+        }
+      } catch (err) {
+        console.error('回复错误:', err);
+        setError('回复失败: ' + (err.response?.data?.message || err.message));
+      }
+    };
+  
+  
+    // 返回按钮
+    const handleBack = () => {
+      const fromTab = location.state?.fromTab || 'share';
+      navigate(`/dashboard/request`);
+    };
+  
+    
+
+  const handleMarkSolved = () => {
+    // TODO: 实现标记为已解决的功能
+    setPost(prev => ({
+      ...prev,
+      isSolved: !prev.isSolved
+    }));
   };
 
-  const handleBack = () => {
-    const fromTab = location.state?.fromTab; // 从跳转时传递的 state 中获取
-    if (fromTab) {
-      navigate(`/dashboard/${fromTab}`); // 明确返回对应标签页
-    } else {
-      navigate(-1); // 保底策略
-    }
-  }
+  // const handleImageUpload = (e) => {
+  //   const files = Array.from(e.target.files);
+  //   const newImages = files.map(file => URL.createObjectURL(file));
+  //   setImages(prev => [...prev, ...newImages]);
+  // };
+
+  // const handleRemoveImage = (index) => {
+  //   setImages(prev => prev.filter((_, i) => i !== index));
+  // };
+
+  
+
+  if (loading) return <div className="loading">加载中...</div>;
+  if (error) return <div className="error">{error}</div>;
+  if (!post) return <div className="error">帖子不存在</div>;
 
   return (
     <div className="request-detail-container">
       <button className="back-button" onClick={handleBack}>
-        &larr; 返回求种区
+        &larr; 返回求助区
       </button>
       
-      <div className="request-post">
+      <div className={`request-post ${post.isSolved ? 'solved' : ''}`}>
         <div className="post-header">
-          <img src={post.authorAvatar} alt={post.author} className="post-avatar" />
+          <img 
+            src={post.authorAvatar || 'https://via.placeholder.com/40'} 
+            alt={post.authorId} 
+            className="post-avatar" 
+          />
           <div className="post-meta">
-            <div className="post-author">{post.author}</div>
-            <div className="post-date">{post.date}</div>
+            <div className="post-author">{post.authorId}</div>
+            <div className="post-date">
+              {new Date(post.createTime).toLocaleString()}
+              </div>
+          </div>
+          {post.isSolved && <span ClassName="solved-badge">已解决</span>}
+          <div classname="delete-post">
+            {post.authorId === localStorage.getItem('username') && (
+              <button 
+                className="delete-button"
+                onClick={() => handleDeletePost(post.id)}
+              >
+                删除帖子
+              </button>
+            )}
           </div>
         </div>
         
@@ -115,6 +359,21 @@
           {post.content.split('\n').map((para, i) => (
             <p key={i}>{para}</p>
           ))}
+          {/* 添加帖子图片展示 */}
+          {post.imageUrl && (
+            <div className="post-image-container">
+              <img 
+                src={`http://localhost:8088${post.imageUrl}`} 
+                alt="帖子图片" 
+                className="post-image"
+                // onError={(e) => {
+                //   e.target.onerror = null; 
+                //   e.target.src = 'https://via.placeholder.com/400x300?text=图片加载失败';
+                //   console.error('图片加载失败:', post.imageUrl);
+                // }}
+              />
+            </div>
+          )}
         </div>
         
         <div className="post-actions">
@@ -125,74 +384,86 @@
             👍 点赞 ({post.likeCount})
           </button>
           <button 
-            className={`favorite-button ${post.isFavorited ? 'favorited' : ''}`}
-            onClick={handleFavoritePost}
+            className={`solve-button ${post.isSolved ? 'solved' : ''}`}
+            onClick={handleMarkSolved}
           >
-            {post.isFavorited ? '★ 已收藏' : '☆ 收藏'}
+            {post.isSolved ? '✓ 已解决' : '标记为已解决'}
           </button>
         </div>
       </div>
       
-      <div className="comments-section">
-        <h2>回应 ({comments.length})</h2>
+       <div className="comments-section">
+        <h2>评论 ({post.replyCount})</h2>
         
         <form onSubmit={handleCommentSubmit} className="comment-form">
           <textarea
             value={newComment}
             onChange={(e) => setNewComment(e.target.value)}
-            placeholder="写下你的回应..."
+            placeholder="写下你的评论..."
             rows="3"
             required
           />
-          <div className="form-actions">
-            <button type="submit" className="submit-comment">发表文字回应</button>
-            <button 
-              type="button" 
-              className="submit-torrent"
-              onClick={() => console.log('打开种子上传对话框')}
-            >
-              上传种子回应
-            </button>
+          <button type="submit">发表评论</button>
+
+          {/* 图片上传部分 */}
+          <div className="form-group">
+            <div className="upload-image-btn">
+              <input 
+                type="file" 
+                accept="image/*" 
+                onChange={(e) => setCommentImage(e.target.files[0])} 
+                data-testid="comment-image-input"  
+              />
+            </div>
           </div>
         </form>
         
+        
         <div className="comment-list">
-          {comments.map(comment => (
-            <div key={comment.id} className={`comment-item ${comment.type}`}>
-              <img 
-                src={comment.authorAvatar} 
-                alt={comment.author} 
-                className="comment-avatar"
-              />
-              
-              <div className="comment-content">
-                <div className="comment-header">
-                  <span className="comment-author">{comment.author}</span>
-                  <span className="comment-date">{comment.date}</span>
-                </div>
-                
-                {comment.type === 'text' ? (
-                  <p className="comment-text">{comment.content}</p>
-                ) : (
-                  <div className="torrent-comment">
-                    <span className="torrent-title">{comment.title}</span>
-                    <span className="torrent-size">{comment.size}</span>
-                    <button 
-                      className="download-torrent"
-                      onClick={() => handleDownloadTorrent(comment.id)}
-                    >
-                      立即下载
-                    </button>
-                  </div>
-                )}
-                
-                <button className="comment-like">
-                  👍 ({comment.likeCount})
-                </button>
-              </div>
-            </div>
-          ))}
+          {comments.map(comment => renderComment(comment))}
         </div>
+
+        {replyModal.visible && (
+          <div className="reply-modal-overlay">
+            <div className="reply-modal">
+              <div className="modal-header">
+                <h3>回复 @{replyModal.replyingToUsername}</h3>
+                <button onClick={closeReplyModal} className="close-modal">&times;</button>
+              </div>
+              <form onSubmit={handleReplySubmit}>
+                <textarea
+                  value={replyContent}
+                  onChange={(e) => setReplyContent(e.target.value)}
+                  placeholder={`回复 @${replyModal.replyingToUsername}...`}
+                  rows="5"
+                  autoFocus
+                  required
+                />
+
+                {/* 图片上传部分 */}
+                <div className="form-group">
+                  <div className="upload-image-btn">
+                    <input 
+                      type="file" 
+                      accept="image/*" 
+                      onChange={(e) => setReplyImage(e.target.files[0])} 
+                    />
+                  </div>
+                </div>
+
+                <div className="modal-actions">
+                  <button type="button" onClick={closeReplyModal} className="cancel-btn">
+                    取消
+                  </button>
+                  <button type="submit" className="submit-btn">
+                    发送回复
+                  </button>
+                </div>
+              </form>
+            </div>
+          </div>
+        )}
+
       </div>
     </div>
   );
diff --git a/src/components/RequestDetail.test.jsx b/src/components/RequestDetail.test.jsx
new file mode 100644
index 0000000..8ec34c2
--- /dev/null
+++ b/src/components/RequestDetail.test.jsx
@@ -0,0 +1,209 @@
+import React from 'react';
+import { render, screen, fireEvent, waitFor } from '@testing-library/react';
+import { MemoryRouter, Route, Routes } from 'react-router-dom';
+import RequestDetail from './RequestDetail';
+import { isFormData } from 'axios';
+
+const mockNavigate = jest.fn();
+
+
+// 明确 mock API 模块
+jest.mock('../api/requestPost', () => ({
+  getRequestPostDetail: jest.fn(),
+  addRequestPostComment: jest.fn(),
+  likeRequestPost: jest.fn(),
+  deleteRequestPost: jest.fn()
+}));
+
+jest.mock('../api/requestComment', () => ({
+  likeRequestPostComment: jest.fn(),
+  getRequestCommentReplies: jest.fn(),
+  addRequestCommentReply: jest.fn(),
+  deleteRequestComment: jest.fn()
+}));
+
+jest.mock('react-router-dom', () => ({
+  ...jest.requireActual('react-router-dom'),
+  useNavigate: () => mockNavigate,
+  useLocation: jest.fn()
+}));
+
+// 导入 mock 后的 API
+import * as requestPostApi from '../api/requestPost';
+import * as requestCommentApi from '../api/requestComment';
+
+describe('RequestDetail 组件', () => {
+  const mockPost = {
+    id: '1',
+    title: '测试求种帖',
+    content: '这是一个测试求种内容',
+    authorId: 'user1',
+    createTime: '2023-01-01T00:00:00Z',
+    likeCount: 5,
+    replyCount: 3,
+    isSolved: false,
+  };
+
+  const mockComments = [
+    {
+      id: 'c1',
+      content: '测试评论1',
+      authorId: 'user2',
+      createTime: '2023-01-01T01:00:00Z',
+      likeCount: 2,
+      replies: [
+        {
+          id: 'c1r1',
+          content: '测试回复1',
+          authorId: 'user3',
+          createTime: '2023-01-01T02:00:00Z',
+          likeCount: 1,
+        }
+      ]
+    }
+  ];
+
+  beforeEach(() => {
+    jest.clearAllMocks();
+    
+    requestPostApi.getRequestPostDetail.mockResolvedValue({
+      data: {
+        code: 200,
+        data: {
+          post: mockPost,
+          comments: mockComments,
+        }
+      }
+    });
+
+    // 模拟 useLocation
+    require('react-router-dom').useLocation.mockReturnValue({
+      state: { fromTab: 'request' }
+    });
+
+    // 模拟 localStorage
+    Storage.prototype.getItem = jest.fn((key) => {
+      if (key === 'username') return 'testuser';
+      return null;
+    });
+  });
+
+  const renderComponent = () => {
+    return render(
+      <MemoryRouter initialEntries={['/request/1']}>
+        <Routes>
+          <Route path="/request/:id" element={<RequestDetail />} />
+          {/* 添加一个模拟的求助列表路由用于导航测试 */}
+          <Route path="/dashboard/request" element={<div>求助列表</div>} />
+        </Routes>
+      </MemoryRouter>
+    );
+  };
+
+  it('应该正确加载和显示求助帖详情', async () => {
+    renderComponent();
+
+    // 检查加载状态
+    expect(screen.getByText('加载中...')).toBeInTheDocument();
+
+    // 增加超时时间
+    await waitFor(() => {
+        expect(screen.getByText(mockPost.title)).toBeInTheDocument();
+    }, { timeout: 3000 });
+
+    // 等待数据加载完成
+     await waitFor(() => {
+      expect(screen.getByText(mockPost.title)).toBeInTheDocument();
+      expect(screen.getByText(mockPost.content)).toBeInTheDocument();
+      expect(screen.getByText(mockPost.authorId)).toBeInTheDocument();
+    });
+  });
+  
+  it('应该能够点赞帖子', async () => {
+    renderComponent();
+
+    await waitFor(() => {
+      expect(screen.getByText(mockPost.title)).toBeInTheDocument();
+    });
+
+    const likeButton = screen.getByRole('button', { name: /点赞 \(\d+\)/ });
+    fireEvent.click(likeButton);
+
+    await waitFor(() => {
+      expect(requestPostApi.likeRequestPost).toHaveBeenCalledWith('1');
+    });
+  });
+
+  it('应该能够提交评论', async () => {
+    renderComponent();
+
+    await waitFor(() => {
+      expect(screen.getByText(mockPost.title)).toBeInTheDocument();
+    });
+
+    const commentInput = screen.getByPlaceholderText('写下你的评论...');
+    fireEvent.change(commentInput, { target: { value: '新评论' } });
+    
+    const submitButton = screen.getByRole('button', { name: '发表评论' });
+    fireEvent.click(submitButton);
+
+    await waitFor(() => {
+      expect(requestPostApi.addRequestPostComment).toHaveBeenCalled();
+    });
+  });
+
+  it('应该能够点赞评论', async () => {
+    renderComponent();
+
+    await waitFor(() => {
+      expect(screen.getByText(mockComments[0].content)).toBeInTheDocument();
+    });
+
+    const likeButtons = screen.getAllByRole('button', { name: /👍 \(\d+\)/ });
+    fireEvent.click(likeButtons[0]);
+
+    await waitFor(() => {
+      expect(requestCommentApi.likeRequestPostComment).toHaveBeenCalledWith('c1');
+    });
+  });
+
+  it('应该能够打开和关闭回复模态框', async () => {
+    renderComponent();
+
+    await waitFor(() => {
+      expect(screen.getByText(mockComments[0].content)).toBeInTheDocument();
+    });
+
+    // 点击回复按钮
+    const replyButtons = screen.getAllByRole('button', { name: '回复' });
+    fireEvent.click(replyButtons[0]);
+
+    // 检查模态框是否打开
+    await waitFor(() => {
+      expect(screen.getByText(`回复 @${mockComments[0].authorId}`)).toBeInTheDocument();
+    });
+
+    // 点击关闭按钮
+    const closeButton = screen.getByRole('button', { name: '×' });
+    fireEvent.click(closeButton);
+
+    // 检查模态框是否关闭
+    await waitFor(() => {
+      expect(screen.queryByText(`回复 @${mockComments[0].authorId}`)).not.toBeInTheDocument();
+    });
+  });
+
+  it('应该能够返回求助区', async () => {
+    renderComponent();
+  
+    await waitFor(() => {
+      expect(screen.getByText(mockPost.title)).toBeInTheDocument();
+    });
+  
+    const backButton = screen.getByRole('button', { name: /返回/i });
+    fireEvent.click(backButton);
+  
+    expect(mockNavigate).toHaveBeenCalledWith('/dashboard/request');
+
+  });
+});
\ No newline at end of file
