diff --git a/src/main/java/com/g9/g9backend/controller/ResourceController.java b/src/main/java/com/g9/g9backend/controller/ResourceController.java
index 5398d0a..b01898d 100644
--- a/src/main/java/com/g9/g9backend/controller/ResourceController.java
+++ b/src/main/java/com/g9/g9backend/controller/ResourceController.java
@@ -2,8 +2,8 @@
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
 
 /**
  * ResourceController 资源控制器类，处理与资源相关的请求
diff --git a/src/main/java/com/g9/g9backend/controller/UserController.java b/src/main/java/com/g9/g9backend/controller/UserController.java
index ca6de5c..1be4222 100644
--- a/src/main/java/com/g9/g9backend/controller/UserController.java
+++ b/src/main/java/com/g9/g9backend/controller/UserController.java
@@ -1,9 +1,14 @@
 package com.g9.g9backend.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.g9.g9backend.pojo.*;
+import com.g9.g9backend.pojo.DTO.*;
+import com.g9.g9backend.service.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * UserController 用户控制器类，处理与用户相关的请求
@@ -14,7 +19,128 @@
 @RequestMapping("/user")
 public class UserController {
 
+    private final UserService userService;
+
+    private final InvitationService invitationService;
+
+    private final SubscriptionService subscriptionService;
+
+    public UserController(UserService userService, InvitationService invitationService, SubscriptionService subscriptionService) {
+        this.userService = userService;
+        this.invitationService = invitationService;
+        this.subscriptionService = subscriptionService;
+    }
+
     private final Logger logger = LoggerFactory.getLogger(UserController.class);
-}
 
+    /**
+     * 用户注册
+     *
+     * @param registerDTO 用户注册
+     * @return 注册结果
+     */
+    @PostMapping("/register")
+    public ResponseEntity<String> register(@RequestBody RegisterDTO registerDTO) {
+        String username = registerDTO.getUsername();
+        String password = registerDTO.getPassword();
+        String invitationCode = registerDTO.getInvitationCode();
+        logger.info("Register request received for account: {}", username);
 
+        // 根据用户名查询该用户名是否已存在
+        QueryWrapper<User> userQuery = new QueryWrapper<>();
+        userQuery.eq("username", username);
+        User userCheck = userService.getOne(userQuery);
+
+        if (userCheck != null) {
+            // 用户名重复
+            logger.warn("Registration attempt failed. Account already exists: {}", username);
+            return ResponseEntity.status(407).body("");
+        }
+
+        // 查询邀请码是否存在
+        QueryWrapper<Invitation> invitationQuery = new QueryWrapper<>();
+        invitationQuery.eq("invitation_code", invitationCode);
+        Invitation invitation = invitationService.getOne(invitationQuery);
+
+        if (invitation == null) {
+            // 邀请码不存在
+            logger.info("The invitation code does not exist: {}", invitationCode);
+            return ResponseEntity.status(409).body("");
+        } else if (invitation.getInviteeId() != 0) {
+            // 邀请码已被使用
+            logger.info("The invitation code has been used: {}", invitationCode);
+            return ResponseEntity.status(410).body("");
+        }
+        // 注册
+        // 添加新用户
+        User user = new User();
+        user.setUsername(username);
+        user.setPassword(password);
+        userService.save(user);
+
+        // 设置该邀请码已被使用
+        User userGetId = userService.getOne(userQuery);
+        int newUserId = userGetId.getUserId();
+
+        UpdateWrapper<Invitation> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.eq("invitation_code", invitationCode).set("invitee_id", newUserId);
+        invitationService.update(updateWrapper);
+
+        // 生成五个邀请码并分配给新用户
+        String[] invitationCodes = invitationService.generateInvitationCode();
+
+        for (String code : invitationCodes) {
+            Invitation newInvitation = new Invitation();
+            newInvitation.setInvitationCode(code);
+            newInvitation.setUserId(newUserId);
+            invitationService.save(newInvitation);
+        }
+
+        logger.info("User registered successfully: {}", username);
+        return ResponseEntity.ok("");
+    }
+
+    /**
+     * 用户登录
+     *
+     * @param user 登录信息
+     * @return 登录结果
+     */
+    @PostMapping("/login")
+    public ResponseEntity<String> login(@RequestBody User user) {
+        String username = user.getUsername();
+        String password = user.getPassword();
+        logger.info("Login attempt for account: {}", username);
+
+        // 根据用户名查询该用户名是否已存在
+        QueryWrapper<User> userQuery = new QueryWrapper<>();
+        userQuery.eq("username", username);
+        User userCheck = userService.getOne(userQuery);
+
+        if (userCheck == null) {
+            // 用户名不存在
+            logger.warn("Login failed. User not found: {}", username);
+            return ResponseEntity.status(406).body("");
+        } else {
+            if (userCheck.getPassword().equals(password)) {
+                return ResponseEntity.ok("");
+            } else {
+                // 密码错误
+                logger.warn("Login failed. Incorrect password for account: {}", username);
+                return ResponseEntity.status(408).body("");
+            }
+        }
+    }
+
+    /**
+     * 关注
+     *
+     * @param subscription 关注信息
+     * @return 关注结果
+     */
+    @PostMapping("/subscription")
+    public ResponseEntity<String> subscription(@RequestBody Subscription subscription) {
+        subscriptionService.save(subscription);
+        return ResponseEntity.ok("");
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/g9/g9backend/pojo/Comment.java b/src/main/java/com/g9/g9backend/pojo/Comment.java
index 08ebed6..eddc42b 100644
--- a/src/main/java/com/g9/g9backend/pojo/Comment.java
+++ b/src/main/java/com/g9/g9backend/pojo/Comment.java
@@ -1,5 +1,6 @@
 package com.g9.g9backend.pojo;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import lombok.*;
 
@@ -15,7 +16,7 @@
 @NoArgsConstructor
 public class Comment {
 
-    @TableId
+    @TableId(type = IdType.AUTO)
     private int commentId;
 
     private int userId;
diff --git a/src/main/java/com/g9/g9backend/pojo/Community.java b/src/main/java/com/g9/g9backend/pojo/Community.java
index 35f63de..6e1f370 100644
--- a/src/main/java/com/g9/g9backend/pojo/Community.java
+++ b/src/main/java/com/g9/g9backend/pojo/Community.java
@@ -1,5 +1,6 @@
 package com.g9.g9backend.pojo;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import lombok.*;
 
@@ -13,7 +14,7 @@
 @NoArgsConstructor
 public class Community {
 
-    @TableId
+    @TableId(type = IdType.AUTO)
     private int communityId;
 
     private String communityName;
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceInfoDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceInfoDTO.java
new file mode 100644
index 0000000..770ceb8
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceInfoDTO.java
@@ -0,0 +1,14 @@
+package com.g9.g9backend.pojo.DTO;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class GetResourceInfoDTO {
+
+    // todo:待完善
+    private int id;
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceSearchDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceSearchDTO.java
new file mode 100644
index 0000000..2348a8f
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/GetResourceSearchDTO.java
@@ -0,0 +1,26 @@
+package com.g9.g9backend.pojo.DTO;
+
+import com.g9.g9backend.pojo.Resource;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class GetResourceSearchDTO {
+
+    // Todo: 待完善
+    private List<Resource> records;
+
+    private long total;
+
+    private long pages;
+
+    private long current;
+
+    private long size;
+
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/GetUserDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/GetUserDTO.java
new file mode 100644
index 0000000..3f2ab83
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/GetUserDTO.java
@@ -0,0 +1,29 @@
+package com.g9.g9backend.pojo.DTO;
+
+import com.g9.g9backend.pojo.User;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class GetUserDTO {
+
+    private List<Subscriber> userList = new ArrayList<>();
+
+    public GetUserDTO(List<User> users) {
+        for (User user : users) {
+            Subscriber subscriber = new Subscriber(user.getUserId(), user.getUsername());
+            userList.add(subscriber);
+        }
+    }
+
+    @Data
+    @AllArgsConstructor
+    public static class Subscriber {
+        private int userId;
+
+        private String username;
+    }
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/GetUserDataDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/GetUserDataDTO.java
new file mode 100644
index 0000000..609cccf
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/GetUserDataDTO.java
@@ -0,0 +1,18 @@
+package com.g9.g9backend.pojo.DTO;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+
+@Data
+@AllArgsConstructor
+public class GetUserDataDTO {
+
+    private int subscriberCount;
+
+    private int uploadAmount;
+
+    private int beDownloadedAmount;
+
+    private float[] seedPercentageList;
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/GetUserResourceListDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/GetUserResourceListDTO.java
new file mode 100644
index 0000000..fc398d6
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/GetUserResourceListDTO.java
@@ -0,0 +1,28 @@
+package com.g9.g9backend.pojo.DTO;
+
+import com.g9.g9backend.pojo.Resource;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * GetResourceListDTO DTO类，用户返回用户收藏列表信息
+ *
+ * @author hcy
+ */
+@Data
+@AllArgsConstructor
+public class GetUserResourceListDTO {
+
+    private List<Resource> records;
+
+    private long total;
+
+    private long pages;
+
+    private long current;
+
+    private long size;
+
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/GetUserSearchHistoryDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/GetUserSearchHistoryDTO.java
new file mode 100644
index 0000000..b74fc6e
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/GetUserSearchHistoryDTO.java
@@ -0,0 +1,14 @@
+package com.g9.g9backend.pojo.DTO;
+
+import com.g9.g9backend.pojo.SearchHistory;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+public class GetUserSearchHistoryDTO {
+
+    private List<SearchHistory> historyList;
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/ModifyPasswordDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/ModifyPasswordDTO.java
new file mode 100644
index 0000000..6af4d14
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/ModifyPasswordDTO.java
@@ -0,0 +1,17 @@
+package com.g9.g9backend.pojo.DTO;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ModifyPasswordDTO {
+
+    private int userId;
+
+    private String password;
+
+    private String newPassword;
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/PostResourceDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/PostResourceDTO.java
new file mode 100644
index 0000000..632ff3c
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/PostResourceDTO.java
@@ -0,0 +1,21 @@
+package com.g9.g9backend.pojo.DTO;
+
+import com.g9.g9backend.pojo.Resource;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PostResourceDTO {
+
+    private Resource resource;
+
+    private String[] gameplayList;
+
+    private int completeRewardId;
+
+    private int userId;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/g9/g9backend/pojo/DTO/UserResourceDTO.java b/src/main/java/com/g9/g9backend/pojo/DTO/UserResourceDTO.java
new file mode 100644
index 0000000..fe61dec
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/pojo/DTO/UserResourceDTO.java
@@ -0,0 +1,15 @@
+package com.g9.g9backend.pojo.DTO;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserResourceDTO {
+
+    private int userId;
+
+    private int resourceId;
+}
diff --git a/src/main/java/com/g9/g9backend/pojo/Notification.java b/src/main/java/com/g9/g9backend/pojo/Notification.java
index 18f8e37..7ebf7c1 100644
--- a/src/main/java/com/g9/g9backend/pojo/Notification.java
+++ b/src/main/java/com/g9/g9backend/pojo/Notification.java
@@ -1,5 +1,6 @@
 package com.g9.g9backend.pojo;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import lombok.*;
 
@@ -15,7 +16,7 @@
 @NoArgsConstructor
 public class Notification {
 
-    @TableId
+    @TableId(type = IdType.AUTO)
     private int notificationId;
 
     private int userId;
diff --git a/src/main/java/com/g9/g9backend/pojo/Resource.java b/src/main/java/com/g9/g9backend/pojo/Resource.java
index f4346b2..a3b17f3 100644
--- a/src/main/java/com/g9/g9backend/pojo/Resource.java
+++ b/src/main/java/com/g9/g9backend/pojo/Resource.java
@@ -1,5 +1,6 @@
 package com.g9.g9backend.pojo;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import lombok.*;
 
@@ -15,7 +16,7 @@
 @NoArgsConstructor
 public class Resource {
 
-    @TableId
+    @TableId(type = IdType.AUTO)
     private int resourceId;
 
     private String resourceName;
diff --git a/src/main/java/com/g9/g9backend/pojo/ResourceVersion.java b/src/main/java/com/g9/g9backend/pojo/ResourceVersion.java
index 1e4acf9..4395a5a 100644
--- a/src/main/java/com/g9/g9backend/pojo/ResourceVersion.java
+++ b/src/main/java/com/g9/g9backend/pojo/ResourceVersion.java
@@ -1,5 +1,6 @@
 package com.g9.g9backend.pojo;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import lombok.*;
 
@@ -13,7 +14,7 @@
 @NoArgsConstructor
 public class ResourceVersion {
 
-    @TableId
+    @TableId(type = IdType.AUTO)
     private int resourceVersionId;
 
     private String resourceVersionName;
diff --git a/src/main/java/com/g9/g9backend/pojo/Reward.java b/src/main/java/com/g9/g9backend/pojo/Reward.java
index 91e376d..5812284 100644
--- a/src/main/java/com/g9/g9backend/pojo/Reward.java
+++ b/src/main/java/com/g9/g9backend/pojo/Reward.java
@@ -1,5 +1,6 @@
 package com.g9.g9backend.pojo;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import lombok.*;
 
@@ -15,7 +16,7 @@
 @NoArgsConstructor
 public class Reward {
 
-    @TableId
+    @TableId(type = IdType.AUTO)
     private int rewardId;
 
     private String rewardName;
diff --git a/src/main/java/com/g9/g9backend/pojo/SearchHistory.java b/src/main/java/com/g9/g9backend/pojo/SearchHistory.java
index ba8894c..a400cef 100644
--- a/src/main/java/com/g9/g9backend/pojo/SearchHistory.java
+++ b/src/main/java/com/g9/g9backend/pojo/SearchHistory.java
@@ -1,5 +1,6 @@
 package com.g9.g9backend.pojo;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import lombok.*;
 
@@ -13,7 +14,7 @@
 @NoArgsConstructor
 public class SearchHistory {
 
-    @TableId
+    @TableId(type = IdType.AUTO)
     private int searchHistoryId;
 
     private String searchContent;
diff --git a/src/main/java/com/g9/g9backend/pojo/Thread.java b/src/main/java/com/g9/g9backend/pojo/Thread.java
index f14929c..ddcea67 100644
--- a/src/main/java/com/g9/g9backend/pojo/Thread.java
+++ b/src/main/java/com/g9/g9backend/pojo/Thread.java
@@ -1,5 +1,6 @@
 package com.g9.g9backend.pojo;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import lombok.*;
 
@@ -15,7 +16,7 @@
 @NoArgsConstructor
 public class Thread {
 
-    @TableId
+    @TableId(type = IdType.AUTO)
     private int threadId;
 
     private int userId;
diff --git a/src/main/java/com/g9/g9backend/pojo/TorrentRecord.java b/src/main/java/com/g9/g9backend/pojo/TorrentRecord.java
index 89ed56b..6e26727 100644
--- a/src/main/java/com/g9/g9backend/pojo/TorrentRecord.java
+++ b/src/main/java/com/g9/g9backend/pojo/TorrentRecord.java
@@ -1,5 +1,6 @@
 package com.g9.g9backend.pojo;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import lombok.*;
 
@@ -15,7 +16,7 @@
 @NoArgsConstructor
 public class TorrentRecord {
 
-    @TableId
+    @TableId(type = IdType.AUTO)
     private int torrentRecordId;
 
     private String torrentUrl;
diff --git a/src/main/java/com/g9/g9backend/pojo/User.java b/src/main/java/com/g9/g9backend/pojo/User.java
index 2915460..370631b 100644
--- a/src/main/java/com/g9/g9backend/pojo/User.java
+++ b/src/main/java/com/g9/g9backend/pojo/User.java
@@ -1,5 +1,6 @@
 package com.g9.g9backend.pojo;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import lombok.*;
 
@@ -13,7 +14,7 @@
 @NoArgsConstructor
 public class User {
 
-    @TableId
+    @TableId(type = IdType.AUTO)
     private int userId;
 
     private String username;
diff --git a/src/main/java/com/g9/g9backend/pojo/UserCollection.java b/src/main/java/com/g9/g9backend/pojo/UserCollection.java
index 7ffb746..df5e542 100644
--- a/src/main/java/com/g9/g9backend/pojo/UserCollection.java
+++ b/src/main/java/com/g9/g9backend/pojo/UserCollection.java
@@ -1,6 +1,5 @@
 package com.g9.g9backend.pojo;
 
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
 import lombok.*;
 
diff --git a/src/main/java/com/g9/g9backend/pojo/UserLike.java b/src/main/java/com/g9/g9backend/pojo/UserLike.java
index 585661b..7aa0783 100644
--- a/src/main/java/com/g9/g9backend/pojo/UserLike.java
+++ b/src/main/java/com/g9/g9backend/pojo/UserLike.java
@@ -1,6 +1,5 @@
 package com.g9.g9backend.pojo;
 
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
 import lombok.*;
 
diff --git a/src/main/java/com/g9/g9backend/pojo/UserPurchase.java b/src/main/java/com/g9/g9backend/pojo/UserPurchase.java
index 80ac247..e170978 100644
--- a/src/main/java/com/g9/g9backend/pojo/UserPurchase.java
+++ b/src/main/java/com/g9/g9backend/pojo/UserPurchase.java
@@ -1,6 +1,5 @@
 package com.g9.g9backend.pojo;
 
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
 import lombok.*;
 
diff --git a/src/main/java/com/g9/g9backend/pojo/UserUpload.java b/src/main/java/com/g9/g9backend/pojo/UserUpload.java
index 8f9fc42..cb7b039 100644
--- a/src/main/java/com/g9/g9backend/pojo/UserUpload.java
+++ b/src/main/java/com/g9/g9backend/pojo/UserUpload.java
@@ -1,6 +1,5 @@
 package com.g9.g9backend.pojo;
 
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
 import lombok.*;
 
diff --git a/src/main/java/com/g9/g9backend/pojo/Version.java b/src/main/java/com/g9/g9backend/pojo/Version.java
index 1f4fe9f..180d332 100644
--- a/src/main/java/com/g9/g9backend/pojo/Version.java
+++ b/src/main/java/com/g9/g9backend/pojo/Version.java
@@ -1,6 +1,5 @@
 package com.g9.g9backend.pojo;
 
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
 import lombok.*;
 
diff --git a/src/main/java/com/g9/g9backend/service/InvitationService.java b/src/main/java/com/g9/g9backend/service/InvitationService.java
index 3708d53..bc17e9a 100644
--- a/src/main/java/com/g9/g9backend/service/InvitationService.java
+++ b/src/main/java/com/g9/g9backend/service/InvitationService.java
@@ -4,4 +4,7 @@
 import com.g9.g9backend.pojo.Invitation;
 
 public interface InvitationService extends IService<Invitation> {
+
+    // 定义生成邀请码的方法
+    String[] generateInvitationCode();
 }
diff --git a/src/main/java/com/g9/g9backend/service/impl/InvitationServiceImpl.java b/src/main/java/com/g9/g9backend/service/impl/InvitationServiceImpl.java
index 9530312..0a04c00 100644
--- a/src/main/java/com/g9/g9backend/service/impl/InvitationServiceImpl.java
+++ b/src/main/java/com/g9/g9backend/service/impl/InvitationServiceImpl.java
@@ -1,11 +1,54 @@
 package com.g9.g9backend.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.g9.g9backend.mapper.InvitationMapper;
 import com.g9.g9backend.pojo.Invitation;
 import com.g9.g9backend.service.InvitationService;
 import org.springframework.stereotype.Service;
 
+import java.util.HashSet;
+import java.util.Random;
+import java.util.Set;
+
 @Service
 public class InvitationServiceImpl extends ServiceImpl<InvitationMapper, Invitation> implements InvitationService {
+
+    private static final String CHAR_POOL = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; // 字符池
+    private static final int CODE_LENGTH = 8; // 邀请码长度
+    private static final int CODE_COUNT = 5; // 邀请码数量
+    private final Random random = new Random();
+
+    @Override
+    public String[] generateInvitationCode() {
+        // 使用不允许存储重复的元素的数据结构：Set
+        Set<String> uniqueCodes = new HashSet<>();
+
+        // 生成 5 个互不重复的邀请码
+        while (uniqueCodes.size() < CODE_COUNT) {
+            String code = generateRandomCode();
+
+            // 检查数据库中是否已存在该邀请码
+            QueryWrapper<Invitation> invitationQuery = new QueryWrapper<>();
+            invitationQuery.eq("invitation_code", code);
+            boolean exists = this.count(invitationQuery) > 0;
+
+            // 如果数据库中不存在，加入集合
+            if (!exists) {
+                uniqueCodes.add(code);
+            }
+        }
+
+        // 返回字符串数组
+        return uniqueCodes.toArray(new String[0]);
+    }
+
+    // 生成随机邀请码的方法
+    private String generateRandomCode() {
+        StringBuilder code = new StringBuilder(CODE_LENGTH);
+        for (int i = 0; i < CODE_LENGTH; i++) {
+            code.append(CHAR_POOL.charAt(random.nextInt(CHAR_POOL.length())));
+        }
+        return code.toString();
+    }
 }
diff --git a/src/test/java/com/g9/g9backend/controller/ResourceControllerTest.java b/src/test/java/com/g9/g9backend/controller/ResourceControllerTest.java
new file mode 100644
index 0000000..c02be49
--- /dev/null
+++ b/src/test/java/com/g9/g9backend/controller/ResourceControllerTest.java
@@ -0,0 +1,5 @@
+package com.g9.g9backend.controller;
+
+public class ResourceControllerTest {
+
+}
\ 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
new file mode 100644
index 0000000..208645c
--- /dev/null
+++ b/src/test/java/com/g9/g9backend/controller/UserControllerTest.java
@@ -0,0 +1,172 @@
+package com.g9.g9backend.controller;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.g9.g9backend.pojo.*;
+import com.g9.g9backend.pojo.DTO.*;
+import com.g9.g9backend.service.*;
+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.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+public class UserControllerTest {
+
+    private MockMvc mockMvc;
+
+    @InjectMocks
+    private UserController userController;
+
+    @Mock
+    private UserService userService;
+
+    @Mock
+    private InvitationService invitationService;
+
+    @Mock
+    private SubscriptionService subscriptionService;
+
+    private final ObjectMapper objectMapper = new ObjectMapper();
+
+    @BeforeEach
+    public void setup() {
+        MockitoAnnotations.openMocks(this);
+        mockMvc = MockMvcBuilders.standaloneSetup(userController).build();
+    }
+
+    // 注册
+    @Test
+    public void testRegister_success() throws Exception {
+        /*
+        注意单元测试中（使用Mockito ），当多次为同一个方法设置不同的返回值时，后面的设置会覆盖前面的设置
+        可见单元测试在执行时，本质上在跑实际接口实现，当遇到被mock模拟的方法时，会来测试代码里找对应的when...thenReturn，直接看最后一个设置，所以当测试方法时，测试代码里写的和实际接口的顺序上不是一一对应
+        而是测试代码里写B C A，实际接口代码里写A B C，当实际代码跑到A时去测试代码里从后往前找到A，而不是看测试代码里第一个是不是A若是再用的逻辑
+        所以如果写成如下形式：
+        when(userService.getOne(any())).thenReturn(null);
+        ....其他代码
+        when(userService.getOne(any())).thenReturn(new User(2, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+        则下面的设置会覆盖上面的设置，导致无论什么时候调用该方法，返回的都是非空对象
+        所以应该写成如下形式：
+        when(userService.getOne(any()))
+            .thenReturn(null)          // 第一次调用返回null
+            .thenReturn(new User(2, "hcy", "123", null, 0, 0, null, 0, 0, 0)); // 第二次调用返回非空对象
+        */
+
+        when(userService.getOne(any()))
+                .thenReturn(null)          // 第一次调用返回null，表示用户名不是已存在的
+                .thenReturn(new User(2, "hcy", "123", null, 0, 0, null, 0, 0, 0)); // 第二次调用返回非空对象，表示获取添加后的用户信息
+        // 邀请码存在且未被使用
+        when(invitationService.getOne(any())).thenReturn(new Invitation("6RCA7Y8J", 1, 0));
+        // 添加新用户
+        when(userService.save(any())).thenReturn(true);
+        // 设置该邀请码被新添加的新用户使用
+        when(invitationService.update(any())).thenReturn(true);
+        // 获取五个新邀请码
+        when(invitationService.generateInvitationCode()).thenReturn(new String[5]);
+        // 分配给新用户邀请码
+        when(invitationService.save(any())).thenReturn(true);
+        mockMvc.perform(post("/user/register")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(new RegisterDTO("hcy", "123", "6RCA7Y8J"))))
+                .andExpect(status().isOk());
+    }
+
+    @Test
+    public void testRegister_userExists() throws Exception {
+        // 用户名不是已存在的
+        when(userService.getOne(any())).thenReturn(new User(2, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+        mockMvc.perform(post("/user/register")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(new RegisterDTO("hcy", "123", "6RCA7Y8J"))))
+                .andExpect(status().is(407));
+    }
+
+    @Test
+    public void testRegister_invitationNotExist() throws Exception {
+        // 用户名不是已存在的
+        when(userService.getOne(any())).thenReturn(null);
+        // 邀请码不存在
+        when(invitationService.getOne(any())).thenReturn(null);
+        mockMvc.perform(post("/user/register")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(new RegisterDTO("hcy", "123", "6RCA7Y8J"))))
+                .andExpect(status().is(409));
+    }
+
+    @Test
+    public void testRegister_invitationUsed() throws Exception {
+        // 用户名不是已存在的
+        when(userService.getOne(any())).thenReturn(null);
+        // 邀请码存在但已被使用
+        when(invitationService.getOne(any())).thenReturn(new Invitation("6RCA7Y8J", 1, 2));
+        mockMvc.perform(post("/user/register")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(new RegisterDTO("hcy", "123", "6RCA7Y8J"))))
+                .andExpect(status().is(410));
+    }
+
+    // 登录
+    @Test
+    public void testLogin_success() throws Exception {
+        // 设置请求参数
+        User user = new User();
+        user.setUsername("hcy");
+        user.setPassword("123");
+
+        when(userService.getOne(any())).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+        mockMvc.perform(post("/user/login")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(user)))
+                .andExpect(status().isOk());
+    }
+
+    @Test
+    public void testLogin_userNotFound() throws Exception {
+        //设置请求参数
+        User user = new User();
+        user.setUsername("hcy");
+        user.setPassword("123");
+
+        when(userService.getOne(any())).thenReturn(null);
+
+        mockMvc.perform(post("/user/login")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(user)))
+                .andExpect(status().is(406));
+    }
+
+    @Test
+    public void testLogin_wrongPassword() throws Exception {
+        // 设置请求参数
+        User user = new User();
+        user.setUsername("hcy");
+        user.setPassword("wrongPassword");
+
+        when(userService.getOne(any())).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+        mockMvc.perform(post("/user/login")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(user)))
+                .andExpect(status().is(408));
+    }
+
+    // 关注
+    @Test
+    public void testSubscription() throws Exception {
+        when(subscriptionService.save(any())).thenReturn(true);
+
+        mockMvc.perform(post("/user/subscription")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(objectMapper.writeValueAsString(new Subscription(1, 2))))
+                .andExpect(status().isOk());
+    }
+}
\ No newline at end of file
