diff --git a/src/main/java/com/pt5/pthouduan/controller/TorrentController.java b/src/main/java/com/pt5/pthouduan/controller/TorrentController.java
index 7994287..3150258 100644
--- a/src/main/java/com/pt5/pthouduan/controller/TorrentController.java
+++ b/src/main/java/com/pt5/pthouduan/controller/TorrentController.java
@@ -108,6 +108,27 @@
 //        return ResponseEntity.badRequest().body("Upload failed:" + e.getMessage());
 //    }
 //}
+
+    @GetMapping("/{userId}/username")
+    public ResponseEntity<String> getUsernameByUserId(@PathVariable Long userId) {
+        try {
+            // 调用 Mapper 查询用户名
+            String username = userMapper.selectUsernameByUserid(userId);
+            //System.out.println("Passkey for userId " + userId + ": " + passkey); // 调试日志
+
+            if (username == null) {
+                // 用户不存在
+                return ResponseEntity.notFound().build();
+            }
+
+            // 返回用户名
+            return ResponseEntity.ok(username);
+        } catch (Exception e) {
+            e.printStackTrace();
+            // 其他异常（如数据库错误）
+            return ResponseEntity.internalServerError().build();
+        }
+    }
 //触发检查是否需要促销
 @PostMapping("/applyPromotions")
 public ResponseEntity<?> applyPromotions(@RequestParam("userid") Long userid)
diff --git a/src/test/java/com/pt5/pthouduan/ControllerTest/TorrentUsernameControllerTest.java b/src/test/java/com/pt5/pthouduan/ControllerTest/TorrentUsernameControllerTest.java
new file mode 100644
index 0000000..631ba29
--- /dev/null
+++ b/src/test/java/com/pt5/pthouduan/ControllerTest/TorrentUsernameControllerTest.java
@@ -0,0 +1,88 @@
+package com.pt5.pthouduan.ControllerTest;
+
+
+import com.pt5.pthouduan.controller.TorrentController;
+import com.pt5.pthouduan.mapper.UserMapper;
+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 TorrentUsernameControllerTest {
+
+    @Mock
+    private UserMapper userMapper;
+
+    @InjectMocks
+    private TorrentController torrentController;
+
+    private MockMvc mockMvc;
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+        mockMvc = MockMvcBuilders.standaloneSetup(torrentController).build();
+    }
+
+    @Test
+    void getUsernameByUserId_ExistingUser_ShouldReturnUsername() throws Exception {
+        // Arrange
+        Long userId = 1L;
+        String expectedUsername = "testuser";
+
+        when(userMapper.selectUsernameByUserid(userId)).thenReturn(expectedUsername);
+
+        // Act & Assert
+        mockMvc.perform(get("/torrent/{userId}/username", userId))
+                .andExpect(status().isOk())
+                .andExpect(content().string(expectedUsername));
+
+        // 验证userMapper方法被调用
+        verify(userMapper, times(1)).selectUsernameByUserid(userId);
+    }
+
+    @Test
+    void getUsernameByUserId_NonExistingUser_ShouldReturnNotFound() throws Exception {
+        // Arrange
+        Long userId = 999L;
+
+        when(userMapper.selectUsernameByUserid(userId)).thenReturn(null);
+
+        // Act & Assert
+        mockMvc.perform(get("/torrent/{userId}/username", userId))
+                .andExpect(status().isNotFound());
+
+        // 验证userMapper方法被调用
+        verify(userMapper, times(1)).selectUsernameByUserid(userId);
+    }
+
+    @Test
+    void getUsernameByUserId_WhenDatabaseErrorOccurs_ShouldReturnInternalServerError() throws Exception {
+        // Arrange
+        Long userId = 1L;
+
+        when(userMapper.selectUsernameByUserid(userId)).thenThrow(new RuntimeException("Database connection failed"));
+
+        // Act & Assert
+        mockMvc.perform(get("/torrent/{userId}/username", userId))
+                .andExpect(status().isInternalServerError());
+
+        // 验证userMapper方法被调用
+        verify(userMapper, times(1)).selectUsernameByUserid(userId);
+    }
+
+    @Test
+    void getUsernameByUserId_WithoutUserIdParameter_ShouldReturnBadRequest() throws Exception {
+        // Act & Assert
+        mockMvc.perform(get("/torrent//username")) // 故意不提供userId
+                .andExpect(status().isBadRequest());
+    }
+}
\ No newline at end of file
