diff --git a/src/main/java/com/g9/g9backend/controller/UserController.java b/src/main/java/com/g9/g9backend/controller/UserController.java
index 48ec0cd..38b4586 100644
--- a/src/main/java/com/g9/g9backend/controller/UserController.java
+++ b/src/main/java/com/g9/g9backend/controller/UserController.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.g9.g9backend.pojo.*;
 import com.g9.g9backend.pojo.DTO.*;
 import com.g9.g9backend.service.*;
@@ -11,6 +13,9 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * UserController 用户控制器类，处理与用户相关的请求
  *
@@ -28,13 +33,29 @@
 
     private final SearchHistoryService searchHistoryService;
 
-    public UserController(UserService userService, InvitationService invitationService, SubscriptionService subscriptionService, SearchHistoryService searchHistoryService) {
+    private final RewardService rewardService;
+
+    private final UserCollectionService userCollectionService;
+
+    private final UserUploadService userUploadService;
+
+    private final UserPurchaseService userPurchaseService;
+
+    private final ResourceService resourceService;
+
+    public UserController(UserService userService, InvitationService invitationService, SubscriptionService subscriptionService, SearchHistoryService searchHistoryService, RewardService rewardService, UserCollectionService userCollectionService, UserUploadService userUploadService, UserPurchaseService userPurchaseService, ResourceService resourceService) {
         this.userService = userService;
         this.invitationService = invitationService;
         this.subscriptionService = subscriptionService;
         this.searchHistoryService = searchHistoryService;
+        this.rewardService = rewardService;
+        this.userCollectionService = userCollectionService;
+        this.userUploadService = userUploadService;
+        this.userPurchaseService = userPurchaseService;
+        this.resourceService = resourceService;
     }
 
+
     private final Logger logger = LoggerFactory.getLogger(UserController.class);
 
     /**
@@ -203,4 +224,268 @@
         subscriptionService.remove(subscriptionQuery);
         return ResponseEntity.noContent().build();
     }
+
+
+    /**
+     * 获取用户ID
+     *
+     * @param username 用户名
+     * @param password 密码
+     * @return 获取邀请码结果
+     */
+    @GetMapping("/getId")
+    public ResponseEntity<Integer> getUserId(@RequestParam String username, @RequestParam String password) {
+        QueryWrapper<User> userQuery = new QueryWrapper<>();
+        userQuery.eq("username", username).eq("password", password);
+        User user = userService.getOne(userQuery);
+        return ResponseEntity.ok(user.getUserId());
+    }
+
+    /**
+     * 获取邀请码
+     *
+     * @param userId 用户id
+     * @return 获取邀请码结果
+     */
+    @GetMapping("/invitation-code")
+    public ResponseEntity<GetInvitationCodeDTO> getInvitationCode(@RequestParam int userId) {
+        QueryWrapper<Invitation> invitationQuery = new QueryWrapper<>();
+        invitationQuery.eq("user_id", userId).eq("invitee_id", 0); // 获取未被使用过的分配给该用户的邀请码
+        invitationQuery.select("invitation_code");
+        List<Invitation> invitationList = invitationService.list(invitationQuery);
+        GetInvitationCodeDTO getInvitationCodeDTO = new GetInvitationCodeDTO(invitationList);
+        return ResponseEntity.ok(getInvitationCodeDTO);
+    }
+
+    /**
+     * 获取用户信息
+     *
+     * @param userId 用户id
+     * @return 获取用户信息结果
+     */
+    @GetMapping("/info")
+    public ResponseEntity<User> getUserInfo(@RequestParam int userId) {
+        User user = userService.getById(userId);
+        return ResponseEntity.ok(user);
+    }
+
+    /**
+     * 获取用户悬赏
+     *
+     * @param userId     用户id
+     * @param pageNumber 页数
+     * @param rows       行数
+     * @return 获取用户悬赏结果
+     */
+    @GetMapping("/reward")
+    public ResponseEntity<GetUserRewardDTO> getUserReward(@RequestParam int userId, @RequestParam int pageNumber, @RequestParam int rows) {
+        IPage<Reward> page = new Page<>(pageNumber, rows);
+        QueryWrapper<Reward> rewardQuery = new QueryWrapper<>();
+        rewardQuery.eq("user_id", userId);
+        IPage<Reward> rewardPage = rewardService.page(page, rewardQuery);
+        List<Reward> rewardList = rewardPage.getRecords();
+        long total = rewardPage.getTotal();
+        long pages = rewardPage.getPages();
+        long current = rewardPage.getCurrent();
+        long size = rewardPage.getSize();
+
+        GetUserRewardDTO getUserRewardDTO = new GetUserRewardDTO(rewardList, total, pages, current, size);
+        return ResponseEntity.ok(getUserRewardDTO);
+    }
+
+    /**
+     * 获取用户收藏资源
+     *
+     * @param userId     用户id
+     * @param pageNumber 页数
+     * @param rows       行数
+     * @return 获取用户收藏结果
+     */
+    @GetMapping("/collection")
+    public ResponseEntity<GetUserResourceListDTO> getUserCollection(@RequestParam int userId, @RequestParam int pageNumber, @RequestParam int rows) {
+        IPage<UserCollection> page = new Page<>(pageNumber, rows);
+        QueryWrapper<UserCollection> userCollectionQuery = new QueryWrapper<>();
+        userCollectionQuery.eq("user_id", userId);
+        IPage<UserCollection> userCollectionPage = userCollectionService.page(page, userCollectionQuery);
+        List<UserCollection> resourceList = userCollectionPage.getRecords();
+        List<Resource> collectionList = new ArrayList<>();
+        for (UserCollection userCollection : resourceList) {
+            Resource resource = resourceService.getById(userCollection.getResourceId());
+            collectionList.add(resource);
+        }
+        long total = userCollectionPage.getTotal();
+        long pages = userCollectionPage.getPages();
+        long current = userCollectionPage.getCurrent();
+        long size = userCollectionPage.getSize();
+
+        GetUserResourceListDTO getUserResourceListDTO = new GetUserResourceListDTO(collectionList, total, pages, current, size);
+        return ResponseEntity.ok(getUserResourceListDTO);
+    }
+
+    /**
+     * 获取用户上传资源
+     *
+     * @param userId     用户id
+     * @param pageNumber 页数
+     * @param rows       行数
+     * @return 获取用户上传资源结果
+     */
+    @GetMapping("/upload")
+    public ResponseEntity<GetUserResourceListDTO> getUserUpload(@RequestParam int userId, @RequestParam int pageNumber, @RequestParam int rows) {
+        IPage<UserUpload> page = new Page<>(pageNumber, rows);
+        QueryWrapper<UserUpload> userUploadQuery = new QueryWrapper<>();
+        userUploadQuery.eq("user_id", userId);
+        IPage<UserUpload> userUploadPage = userUploadService.page(page, userUploadQuery);
+        List<UserUpload> resourceList = userUploadPage.getRecords();
+        List<Resource> uploadList = new ArrayList<>();
+        for (UserUpload userUpload : resourceList) {
+            Resource resource = resourceService.getById(userUpload.getResourceId());
+            uploadList.add(resource);
+        }
+        long total = userUploadPage.getTotal();
+        long pages = userUploadPage.getPages();
+        long current = userUploadPage.getCurrent();
+        long size = userUploadPage.getSize();
+
+        GetUserResourceListDTO getUserResourceListDTO = new GetUserResourceListDTO(uploadList, total, pages, current, size);
+        return ResponseEntity.ok(getUserResourceListDTO);
+    }
+
+    /**
+     * 获取用户购买资源
+     *
+     * @param userId     用户id
+     * @param pageNumber 页数
+     * @param rows       行数
+     * @return 获取用户购买资源结果
+     */
+    @GetMapping("/purchase")
+    public ResponseEntity<GetUserResourceListDTO> getUserPurchase(@RequestParam int userId, @RequestParam int pageNumber, @RequestParam int rows) {
+        IPage<UserPurchase> page = new Page<>(pageNumber, rows);
+        QueryWrapper<UserPurchase> userPurchaseQuery = new QueryWrapper<>();
+        userPurchaseQuery.eq("user_id", userId);
+        IPage<UserPurchase> userPurchasePage = userPurchaseService.page(page, userPurchaseQuery);
+        List<UserPurchase> resourceList = userPurchasePage.getRecords();
+        List<Resource> purchaseList = new ArrayList<>();
+        for (UserPurchase userPurchase : resourceList) {
+            Resource resource = resourceService.getById(userPurchase.getResourceId());
+            purchaseList.add(resource);
+        }
+        long total = userPurchasePage.getTotal();
+        long pages = userPurchasePage.getPages();
+        long current = userPurchasePage.getCurrent();
+        long size = userPurchasePage.getSize();
+
+        GetUserResourceListDTO getUserResourceListDTO = new GetUserResourceListDTO(purchaseList, total, pages, current, size);
+        return ResponseEntity.ok(getUserResourceListDTO);
+    }
+
+    /**
+     * 获取用户搜索历史
+     *
+     * @param userId 用户id
+     * @return 获取用户搜索历史结果
+     */
+    @GetMapping("/search")
+    public ResponseEntity<GetUserSearchHistoryDTO> getUserSearchHistory(@RequestParam int userId) {
+        QueryWrapper<SearchHistory> SearchHistoryQuery = new QueryWrapper<>();
+        SearchHistoryQuery.eq("user_id", userId).orderByDesc("search_history_id").last("LIMIT 10");
+        List<SearchHistory> searchHistoryList = searchHistoryService.list(SearchHistoryQuery);
+
+        GetUserSearchHistoryDTO getUserSearchHistoryDTO = new GetUserSearchHistoryDTO(searchHistoryList);
+        return ResponseEntity.ok(getUserSearchHistoryDTO);
+    }
+
+    /**
+     * 获取用户数据
+     *
+     * @param userId 用户id
+     * @return 获取用户数据结果
+     */
+    @GetMapping("/data")
+    public ResponseEntity<GetUserDataDTO> getUserData(@RequestParam int userId) {
+        User user = userService.getById(userId);
+        int subscriberCount = user.getSubscriberCount();
+        int uploadAmount = user.getUploadAmount();
+
+        QueryWrapper<UserUpload> UserUploadQuery = new QueryWrapper<>();
+        UserUploadQuery.eq("user_id", userId);
+        List<UserUpload> UserUpload = userUploadService.list(UserUploadQuery);
+        int beDownloadedAmount = 0; // 上传资源被下载量
+        float[] seedPercentageList = new float[4]; // 上传资源类型百分比，0-1区间的小数
+        int resourcePackAmount = 0;
+        int modAmount = 0;
+        int modPackAmount = 0;
+        int mapAmount = 0;
+        for (UserUpload userUpload : UserUpload) {
+            Resource resource = resourceService.getById(userUpload.getResourceId());
+            beDownloadedAmount += resource.getDownloads();
+            switch (resource.getClassify()) {
+                case "resourcePack":
+                    resourcePackAmount++;
+                    break;
+                case "mod":
+                    modAmount++;
+                    break;
+                case "modPack":
+                    modPackAmount++;
+                    break;
+                case "map":
+                    mapAmount++;
+                    break;
+            }
+        }
+        int totalAmount = resourcePackAmount + modAmount + modPackAmount + mapAmount;
+        seedPercentageList[0] = (float) resourcePackAmount / totalAmount;
+        seedPercentageList[1] = (float) modAmount / totalAmount;
+        seedPercentageList[2] = (float) modPackAmount / totalAmount;
+        seedPercentageList[3] = (float) mapAmount / totalAmount;
+
+        GetUserDataDTO getUserDataDTO = new GetUserDataDTO(subscriberCount, uploadAmount, beDownloadedAmount, seedPercentageList);
+        return ResponseEntity.ok(getUserDataDTO);
+    }
+
+    /**
+     * 获取关注列表
+     *
+     * @param userId 用户id
+     * @return 获取关注列表结果
+     */
+    @GetMapping("/subscriber")
+    public ResponseEntity<GetUserDTO> getUserSubscriber(@RequestParam int userId) {
+        QueryWrapper<Subscription> subscriptionQuery = new QueryWrapper<>();
+        subscriptionQuery.eq("follower_id", userId);
+        List<Subscription> subscriptionList = subscriptionService.list(subscriptionQuery);
+
+        List<User> subscriberList = new ArrayList<>();
+        for (Subscription subscription : subscriptionList) {
+            User user = userService.getById(subscription.getUserId());
+            subscriberList.add(user);
+        }
+
+        GetUserDTO getUserDTO = new GetUserDTO(subscriberList);
+        return ResponseEntity.ok(getUserDTO);
+    }
+
+    /**
+     * 获取粉丝列表
+     *
+     * @param userId 用户id
+     * @return 获取粉丝列表结果
+     */
+    @GetMapping("/follower")
+    public ResponseEntity<GetUserDTO> getUserFollower(@RequestParam int userId) {
+        QueryWrapper<Subscription> subscriptionQuery = new QueryWrapper<>();
+        subscriptionQuery.eq("user_id", userId);
+        List<Subscription> subscriptionList = subscriptionService.list(subscriptionQuery);
+
+        List<User> subscriberList = new ArrayList<>();
+        for (Subscription subscription : subscriptionList) {
+            User user = userService.getById(subscription.getUserId());
+            subscriberList.add(user);
+        }
+
+        GetUserDTO getUserDTO = new GetUserDTO(subscriberList);
+        return ResponseEntity.ok(getUserDTO);
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/com/g9/g9backend/controller/UserControllerTest.java b/src/test/java/com/g9/g9backend/controller/UserControllerTest.java
index 3f06b32..bec8b11 100644
--- a/src/test/java/com/g9/g9backend/controller/UserControllerTest.java
+++ b/src/test/java/com/g9/g9backend/controller/UserControllerTest.java
@@ -1,5 +1,7 @@
 package com.g9.g9backend.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.g9.g9backend.pojo.*;
 import com.g9.g9backend.pojo.DTO.*;
@@ -13,6 +15,10 @@
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.when;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
@@ -37,6 +43,21 @@
     @Mock
     private SearchHistoryService searchHistoryService;
 
+    @Mock
+    private RewardService rewardService;
+
+    @Mock
+    private UserCollectionService userCollectionService;
+
+    @Mock
+    private UserUploadService userUploadService;
+
+    @Mock
+    private UserPurchaseService userPurchaseService;
+
+    @Mock
+    private ResourceService resourceService;
+
     private final ObjectMapper objectMapper = new ObjectMapper();
 
     @BeforeEach
@@ -218,4 +239,170 @@
                         .param("followerId", "2"))
                 .andExpect(status().isNoContent());
     }
+
+    // 获取用户ID
+    @Test
+    public void testGetUserId() throws Exception {
+
+        when(userService.getOne(any())).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+        mockMvc.perform(get("/user/getId")
+                        .param("username", "hcy")
+                        .param("password", "123"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取邀请码
+    @Test
+    public void testGetInvitationCode() throws Exception {
+
+        List<Invitation> invitationList = new ArrayList<>();
+        invitationList.add(new Invitation("1RCA7Y8J", 0, 0));
+        invitationList.add(new Invitation("2RCA7Y8J", 0, 0));
+        invitationList.add(new Invitation("3RCA7Y8J", 0, 0));
+        invitationList.add(new Invitation("4RCA7Y8J", 0, 0));
+        invitationList.add(new Invitation("5RCA7Y8J", 0, 0));
+
+        QueryWrapper<Invitation> invitationQuery = new QueryWrapper<>();
+        invitationQuery.eq("user_id", 1).eq("invitee_id", 0);
+        invitationQuery.select("invitation_code");
+
+        when(invitationService.list(invitationQuery)).thenReturn(invitationList); //这里用any()无法识别，因为list有多种参数可能
+
+        mockMvc.perform(get("/user/invitation-code")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取用户信息
+    @Test
+    public void testGetUserInfo() throws Exception {
+
+        when(userService.getById(anyInt())).thenReturn(new User(1, "user", "pass", null, 0, 0, null, 0, 0, 0));
+
+        mockMvc.perform(get("/user/info")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取悬赏
+    @Test
+    public void testGetUserReward() throws Exception {
+
+        when(rewardService.page(any(), any())).thenReturn(new Page<>(1, 2));
+
+        mockMvc.perform(get("/user/reward")
+                        .param("userId", "1")
+                        .param("pageNumber", "2")
+                        .param("rows", "2"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取收藏
+    @Test
+    public void testGetUserCollection() throws Exception {
+
+        when(userCollectionService.page(any(), any())).thenReturn(new Page<>(1, 2));
+        when(resourceService.getById(anyInt())).thenReturn(new Resource(1, "a", null, null, null, new Date(), new Date(), 100, 0, 0, 0, 0, 0, "mod"));
+
+        mockMvc.perform(get("/user/collection")
+                        .param("userId", "1")
+                        .param("pageNumber", "1")
+                        .param("rows", "2"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取上传
+    @Test
+    public void testGetUserUpload() throws Exception {
+
+        when(userUploadService.page(any(), any())).thenReturn(new Page<>(1, 2));
+        when(resourceService.getById(anyInt())).thenReturn(new Resource(1, "a", null, null, null, new Date(), new Date(), 100, 0, 0, 0, 0, 0, "mod"));
+
+        mockMvc.perform(get("/user/upload")
+                        .param("userId", "1")
+                        .param("pageNumber", "1")
+                        .param("rows", "2"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取购买
+    @Test
+    public void testGetUserPurchase() throws Exception {
+
+        when(userPurchaseService.page(any(), any())).thenReturn(new Page<>(1, 2));
+        when(resourceService.getById(anyInt())).thenReturn(new Resource(1, "a", null, null, null, new Date(), new Date(), 100, 0, 0, 0, 0, 0, "mod"));
+
+        mockMvc.perform(get("/user/purchase")
+                        .param("userId", "1")
+                        .param("pageNumber", "1")
+                        .param("rows", "2"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取搜索历史
+    @Test
+    public void testGetUserSearchHistory() throws Exception {
+
+        List<SearchHistory> searchHistoryList = new ArrayList<>();
+
+        QueryWrapper<SearchHistory> searchHistoryQuery = new QueryWrapper<>();
+        searchHistoryQuery.eq("user_id", 1).orderByDesc("search_history_id").last("LIMIT 10");
+
+        when(searchHistoryService.list(searchHistoryQuery)).thenReturn(searchHistoryList);
+
+        mockMvc.perform(get("/user/search")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取用户数据
+    @Test
+    public void testGetUserData() throws Exception {
+
+        when(userService.getById(1)).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+        List<UserUpload> UserUpload = new ArrayList<>();
+        QueryWrapper<UserUpload> userUploadQuery = new QueryWrapper<>();
+        userUploadQuery.eq("user_id", 1);
+        when(userUploadService.list(userUploadQuery)).thenReturn(UserUpload);
+
+        when(resourceService.getById(anyInt())).thenReturn(new Resource());
+
+        mockMvc.perform(get("/user/data")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取关注列表
+    @Test
+    public void testGetUserSubscriber() throws Exception {
+
+        QueryWrapper<Subscription> subscriptionQuery = new QueryWrapper<>();
+        subscriptionQuery.eq("follower_id", 1);
+        List<Subscription> subscriptionList = new ArrayList<>();
+
+        when(subscriptionService.list(subscriptionQuery)).thenReturn(subscriptionList);
+        when(userService.getById(1)).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+        mockMvc.perform(get("/user/subscriber")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取粉丝列表
+    @Test
+    public void testGetUserFollower() throws Exception {
+
+        QueryWrapper<Subscription> subscriptionQuery = new QueryWrapper<>();
+        subscriptionQuery.eq("user_id", 1);
+        List<Subscription> subscriptionList = new ArrayList<>();
+
+        when(subscriptionService.list(subscriptionQuery)).thenReturn(subscriptionList);
+        when(userService.getById(1)).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+        mockMvc.perform(get("/user/follower")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
 }
\ No newline at end of file
