diff --git a/src/main/java/api/ApiController.java b/src/main/java/api/ApiController.java
index 41d9052..b8ee0c1 100644
--- a/src/main/java/api/ApiController.java
+++ b/src/main/java/api/ApiController.java
@@ -25,6 +25,7 @@
 
 import entity.Seed;
 import entity.User;
+import entity.Post;
 
 import java.util.UUID;
 
@@ -308,4 +309,189 @@
             return new ResponseEntity<>("{}", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
         }
     }
+
+    @Override
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<String> loginUser(
+        @RequestBody String requestBody
+    ) {
+        try {
+            // 解析前端发送的JSON数据 {email: xxx, password: xxx}
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            
+            // 获取email和password字段
+            com.fasterxml.jackson.databind.JsonNode emailNode = jsonNode.get("email");
+            com.fasterxml.jackson.databind.JsonNode passwordNode = jsonNode.get("password");
+
+            if (emailNode == null || passwordNode == null) {
+                com.fasterxml.jackson.databind.node.ObjectNode errorJson = mapper.createObjectNode();
+                errorJson.put("message", "缺少必要参数");
+                String jsonError = mapper.writeValueAsString(errorJson);
+                return new ResponseEntity<>(jsonError, HttpStatus.BAD_REQUEST);
+            }
+            
+            String email = emailNode.asText();
+            String password = passwordNode.asText();
+
+            // 参数验证
+            if (email == null || email.trim().isEmpty() || 
+                password == null || password.trim().isEmpty()) {
+                com.fasterxml.jackson.databind.node.ObjectNode errorJson = mapper.createObjectNode();
+                errorJson.put("message", "邮箱和密码不能为空");
+                String jsonError = mapper.writeValueAsString(errorJson);
+                return new ResponseEntity<>(jsonError, HttpStatus.BAD_REQUEST);
+            }
+            
+            // 创建User对象进行登录验证
+            User user = new User();
+            user.email = email.trim();
+            user.password = password;
+            
+            String userid = db1.LoginUser(user);
+            if (userid != null) {
+                com.fasterxml.jackson.databind.node.ObjectNode responseJson = mapper.createObjectNode();
+                responseJson.put("userId", userid);
+                responseJson.put("userid", userid);
+                responseJson.put("message", "登录成功");
+                String jsonResponse = mapper.writeValueAsString(responseJson);
+                return new ResponseEntity<>(jsonResponse, HttpStatus.OK);
+            } else {
+                // 返回JSON格式的错误信息
+                com.fasterxml.jackson.databind.node.ObjectNode errorJson = mapper.createObjectNode();
+                errorJson.put("message", "登录失败，请检查账号密码");
+                String jsonError = mapper.writeValueAsString(errorJson);
+                return new ResponseEntity<>(jsonError, HttpStatus.UNAUTHORIZED);
+            }
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            com.fasterxml.jackson.databind.node.ObjectNode errorJson = mapper.createObjectNode();
+            try {
+                errorJson.put("message", "服务器内部错误");
+                String jsonError = mapper.writeValueAsString(errorJson);
+                return new ResponseEntity<>(jsonError, HttpStatus.INTERNAL_SERVER_ERROR);
+            } catch (JsonProcessingException ex) {
+                return new ResponseEntity<>("{\"message\":\"服务器内部错误\"}", HttpStatus.INTERNAL_SERVER_ERROR);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            com.fasterxml.jackson.databind.node.ObjectNode errorJson = mapper.createObjectNode();
+            try {
+                errorJson.put("message", "服务器内部错误");
+                String jsonError = mapper.writeValueAsString(errorJson);
+                return new ResponseEntity<>(jsonError, HttpStatus.INTERNAL_SERVER_ERROR);
+            } catch (JsonProcessingException ex) {
+                return new ResponseEntity<>("{\"message\":\"服务器内部错误\"}", HttpStatus.INTERNAL_SERVER_ERROR);
+            }
+        }
+    }
+
+    @Override
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> registerUser(
+        @RequestBody String requestBody
+    ) {
+        try {
+            System.out.println("Register request body: " + requestBody);
+            // 解析 JSON 数据
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            
+            // 安全地获取字段
+            com.fasterxml.jackson.databind.JsonNode usernameNode = jsonNode.get("username");
+            com.fasterxml.jackson.databind.JsonNode passwordNode = jsonNode.get("password");
+            com.fasterxml.jackson.databind.JsonNode inviteEmailNode = jsonNode.get("invite_email");
+            
+            if (usernameNode == null || passwordNode == null || inviteEmailNode == null) {
+                return new ResponseEntity<>(2, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+            
+            String username = usernameNode.asText();
+            String password = passwordNode.asText();
+            String inviteEmail = inviteEmailNode.asText();
+            
+            // 参数验证
+            if (username == null || username.trim().isEmpty() || 
+                password == null || password.trim().isEmpty() ||
+                inviteEmail == null || inviteEmail.trim().isEmpty()) {
+                return new ResponseEntity<>(2, HttpStatus.BAD_REQUEST);
+            }
+            
+            // 创建 User 对象
+            User user = new User();
+            user.userid = java.util.UUID.randomUUID().toString(); // 生成唯一用户ID
+            user.username = username.trim();
+            user.password = password;
+            user.email = inviteEmail.trim(); // 使用邀请邮箱作为用户邮箱
+            
+            // 设置默认值
+            user.sex = "m"; // 默认性别
+            user.school = ""; // 默认学校
+            user.pictureurl = ""; // 默认头像URL
+            user.profile = ""; // 默认个人简介
+            user.accountstate = false; // 默认账号状态为正常
+            user.invitetimes = 5; // 默认邀请次数
+            
+            // 设置时间字段
+            user.lastDetectedTime = new java.util.Date();
+            user.fakeLastDetectedTime = new java.util.Date();
+            
+            // 调用数据库注册方法
+            int ret = db1.RegisterUser(user);
+            System.out.println("Register result: " + ret);
+            
+            // // 如果注册成功，还需要创建对应的 UserPT 记录
+            // if (ret == 0) {
+            //     try {
+            //         entity.UserPT userPT = new entity.UserPT();
+            //         userPT.userid = user.userid;
+            //         userPT.magic = 100; // 初始魔力值
+            //         userPT.upload = 0L; // 初始上传量
+            //         userPT.download = 0L; // 初始下载量
+            //         userPT.share = 0.0; // 初始分享率
+            //         userPT.farmurl = ""; // 默认做种路径
+            //         userPT.viptime = 0; // 初始VIP次数
+            //         userPT.user = user; // 设置关联
+                    
+            //         int ptRet = db1.RegisterUserPT(userPT);
+            //         if (ptRet != 0) {
+            //             // 如果 UserPT 创建失败，记录日志但不影响主要注册流程
+            //             System.err.println("Warning: Failed to create UserPT for user " + user.userid);
+            //         }
+            //     } catch (Exception e) {
+            //         System.err.println("Warning: Exception creating UserPT: " + e.getMessage());
+            //     }
+            // }
+            
+            if (ret == 0) {
+                return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示注册成功
+            } else if (ret == 1) {
+                return new ResponseEntity<>(1, HttpStatus.CONFLICT); // 返回 1 表示邮箱重复
+            } else {
+                return new ResponseEntity<>(ret, HttpStatus.BAD_REQUEST); // 返回 2 表示未被邀请或其他错误
+            }
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>(2, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 2 表示处理失败
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>(2, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    public ResponseEntity<String> getForum() {
+        try {
+            Post[] posts = db1.GetPostList();
+            if (posts == null || posts.length == 0) {
+                return new ResponseEntity<>("[]", HttpStatus.OK); // 返回空数组表示没有帖子
+            }
+            String json = mapper.writeValueAsString(posts);
+            return new ResponseEntity<>(json, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", HttpStatus.INTERNAL_SERVER_ERROR);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
 }
\ No newline at end of file
