diff --git a/src/main/java/com/pt5/pthouduan/controller/TorrentController.java b/src/main/java/com/pt5/pthouduan/controller/TorrentController.java
index e864f20..4cffef8 100644
--- a/src/main/java/com/pt5/pthouduan/controller/TorrentController.java
+++ b/src/main/java/com/pt5/pthouduan/controller/TorrentController.java
@@ -57,6 +57,58 @@
 
 
 
+    // 获取单个种子详情
+    @GetMapping("/{id}")
+    public ResponseEntity<?> getTorrentById(@PathVariable Long id) {
+        try {
+            Torrent torrent = torrentService.getTorrentById(id);
+            if (torrent == null) {
+                return ResponseEntity.notFound().build(); // 如果种子不存在，返回 404
+            }
+            System.out.println(torrent);
+            return ResponseEntity.ok(torrent); // 返回种子详情
+        } catch (Exception e) {
+            return ResponseEntity.badRequest().body("获取种子详情失败: " + e.getMessage());
+        }
+    }
+//未更新前端前
+//    @PostMapping("/upload")
+//    public ResponseEntity<?> uploadTorrent(
+//            @RequestParam("file") MultipartFile torrentFile,
+//            @RequestParam("title") String title,
+//            @RequestParam("description") String description
+//            //@AuthenticationPrincipal User user
+//            //User user
+//    ){
+//        // 创建临时用户对象
+//        User user = new User(1L,"testuser");
+//        //user.setUserid(1L); // 设置测试用户ID
+//        try{
+//            //torrentService.Upload(torrentFile,title,description,user);
+//            return torrentService.Upload(torrentFile, title, description, user);
+//        }catch(Exception e){
+//            return ResponseEntity.badRequest().body("Upload failed:" + e.getMessage());
+//        }
+//    }
+//@PostMapping("/upload")
+//public ResponseEntity<?> uploadTorrent(
+//        @RequestParam("file") MultipartFile torrentFile,
+//        @RequestParam("title") String title,
+//        @RequestParam("description") String description,
+//        @RequestParam("categoryId") Integer categoryId,
+//        @RequestParam(value = "dpi",required = false) String dpi,
+//        @RequestParam(value = "caption", required = false) String caption){
+//    // 创建临时用户对象
+//    User user = new User(1L,"testuser");
+//    //user.setUserid(1L); // 设置测试用户ID
+//    try{
+//        //torrentService.Upload(torrentFile,title,description,user);
+//        return torrentService.Upload(torrentFile, title, description, categoryId, dpi,caption,user);
+//    }catch(Exception e){
+//        return ResponseEntity.badRequest().body("Upload failed:" + e.getMessage());
+//    }
+//}
+    
 @PostMapping("/upload")
 public ResponseEntity<?> uploadTorrent(
         @RequestParam("userid") Long userid,
diff --git a/src/test/java/com/pt5/pthouduan/ControllerTest/TorrentDetailControllerTest.java b/src/test/java/com/pt5/pthouduan/ControllerTest/TorrentDetailControllerTest.java
new file mode 100644
index 0000000..6c0c33e
--- /dev/null
+++ b/src/test/java/com/pt5/pthouduan/ControllerTest/TorrentDetailControllerTest.java
@@ -0,0 +1,83 @@
+package com.pt5.pthouduan.ControllerTest;
+
+import com.pt5.pthouduan.controller.TorrentController;
+import com.pt5.pthouduan.entity.Torrent;
+import com.pt5.pthouduan.service.TorrentService;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.*;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+class TorrentDetailControllerTest {
+
+    @Mock
+    private TorrentService torrentService;
+
+    @InjectMocks
+    private TorrentController torrentController;
+
+    private MockMvc mockMvc;
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+        mockMvc = MockMvcBuilders.standaloneSetup(torrentController).build();
+    }
+
+    @Test
+    void getTorrentById_ExistingId_ShouldReturnTorrent() throws Exception {
+        // Arrange
+        Long id = 1L;
+        Torrent torrent = new Torrent();
+        torrent.setTorrentid(id);
+
+        when(torrentService.getTorrentById(id)).thenReturn(torrent);
+
+        // Act & Assert
+        mockMvc.perform(get("/torrent/{id}", id))
+                .andExpect(status().isOk());
+                //.andExpect(jsonPath("$.id").value(id));
+
+        // 验证服务层方法被调用
+        verify(torrentService, times(1)).getTorrentById(id);
+    }
+
+    @Test
+    void getTorrentById_NonExistingId_ShouldReturnNotFound() throws Exception {
+        // Arrange
+        Long id = 999L;
+
+        when(torrentService.getTorrentById(id)).thenReturn(null);
+
+        // Act & Assert
+        mockMvc.perform(get("/torrent/{id}", id))
+                .andExpect(status().isNotFound());
+
+        // 验证服务层方法被调用
+        verify(torrentService, times(1)).getTorrentById(id);
+    }
+
+    @Test
+    void getTorrentById_WhenServiceThrowsException_ShouldReturnBadRequest() throws Exception {
+        // Arrange
+        Long id = 1L;
+
+        when(torrentService.getTorrentById(id)).thenThrow(new RuntimeException("Database error"));
+
+        // Act & Assert
+        mockMvc.perform(get("/torrent/{id}", id))
+                .andExpect(status().isBadRequest());
+                //.andExpect(jsonPath("$.message").value("获取种子详情失败: Database error"));
+
+        // 验证服务层方法被调用
+        verify(torrentService, times(1)).getTorrentById(id);
+    }
+}
\ No newline at end of file
