diff --git a/src/main/java/api/ApiController.java b/src/main/java/api/ApiController.java
index d8528db..41d9052 100644
--- a/src/main/java/api/ApiController.java
+++ b/src/main/java/api/ApiController.java
@@ -14,14 +14,19 @@
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.PostMapping;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 import database.Database1;
-import entity.Seed;
 import tracker.Tracker;
 
+import entity.Seed;
+import entity.User;
+
+import java.util.UUID;
 
 @RestController
 public class ApiController implements ApiInterface {
@@ -29,6 +34,8 @@
     private static Database1 db1;
     private static Tracker tracker;
     private static ObjectMapper mapper;
+    private static HttpHeaders headers;
+    private static HttpHeaders errorHeaders;
 
     @PostConstruct
     public void init() {
@@ -36,6 +43,14 @@
         tracker = new Tracker();
         mapper = new ObjectMapper();
         mapper.configure(com.fasterxml.jackson.databind.SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
+        headers = new HttpHeaders();
+        headers.add("Access-Control-Allow-Origin", "*");
+        headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+        headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
+        errorHeaders = new HttpHeaders();
+        errorHeaders.add("Access-Control-Allow-Origin", "*");
+        errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+        errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
     }
 
     @Override
@@ -47,42 +62,24 @@
     ) {
         try {
             Seed seed = new Seed();
-            seed.seedid = "exampleSeedId"; // 示例种子ID
-            seed.seeduserid = userid; // 示例用户ID
-            seed.title = title; // 示例标题
-            seed.seedsize = "1GB"; // 示例种子大小
-            seed.seedtag = tag; // 示例标签
+            seed.seedid = UUID.randomUUID().toString(); // 生成唯一的种子ID
+            seed.seeduserid = userid;
+            seed.title = title;
+            seed.seedsize = "1GB";
+            seed.seedtag = tag;
             seed.url = "http://example.com/torrent"; // 示例URL
-
+            System.out.println("seed is null? " + (seed == null));
             int ret = db1.RegisterSeed(seed);
-            // System.out.println("RegisterSeed ret: " + ret);
-            // System.out.println(seed.seedid + " " + seed.seeduserid + " " + seed.title + " " + seed.seedsize + " " + seed.seedtag + " " + seed.url);
-
-            // Convert MultipartFile to File
+            if (ret != 0) {
+                // 如果注册种子失败，返回错误状态
+                return new ResponseEntity<>(ret, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            }
             File tempFile = File.createTempFile(seed.seedid, file.getOriginalFilename());
             file.transferTo(tempFile);
-
             tracker.SaveTorrent(seed.seedid, tempFile);
-
-            // Optionally, delete the temp file after saving if not needed
-            // tempFile.delete();
-
-            // 创建带有 CORS 响应头的 ResponseEntity
-            HttpHeaders headers = new HttpHeaders();
-            headers.add("Access-Control-Allow-Origin", "*"); // 允许所有域名访问，可以根据需要调整为特定域名
-            headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); // 允许的 HTTP 方法
-            headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization"); // 允许的请求头
-
             return new ResponseEntity<>(0, headers, HttpStatus.OK); // 返回 0 表示成功
         } catch (Exception e) {
             e.printStackTrace();
-
-            // 创建带有 CORS 响应头的错误 ResponseEntity
-            HttpHeaders errorHeaders = new HttpHeaders();
-            errorHeaders.add("Access-Control-Allow-Origin", "*");
-            errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
-            errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
-
             return new ResponseEntity<>(1, errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 1 表示失败
         }
     }
@@ -90,8 +87,8 @@
     @Override
     @CrossOrigin(origins = "*", allowedHeaders = "*") // 允许所有来源和头部
     public ResponseEntity<Resource> getTorrent(
-            @RequestParam("torrentId") String seedid,
-            @RequestParam("userId") String userid
+        @RequestParam("torrentId") String seedid,
+        @RequestParam("userId") String userid
     ) {
         File file = tracker.GetTTorent(seedid, userid);
         if (file != null) {
@@ -106,31 +103,187 @@
         }
     }
 
-    //无按标签查询的函数
     @Override
     public ResponseEntity<String> getSeedListByTag(
         @RequestParam("tag") String tag
     ) {
         try {
             Seed[] seeds = db1.GetSeedListByTag(tag);
+            if (seeds == null || seeds.length == 0) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 404 表示未找到种子
+            }
             String json = mapper.writeValueAsString(seeds);
-            // System.out.println("getSeedListByTag: " + json);
-            HttpHeaders headers = new HttpHeaders();
-            headers.add("Access-Control-Allow-Origin", "*");
-            headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
-            headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
             return new ResponseEntity<>(json, headers, HttpStatus.OK);
         } catch (JsonProcessingException e) {
             e.printStackTrace();
-            HttpHeaders errorHeaders = new HttpHeaders();
-            errorHeaders.add("Access-Control-Allow-Origin", "*");
-            errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
-            errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
             return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
         }
     }
 
     @Override
+    public ResponseEntity<String> getUserProfile(
+        @RequestParam("userid") String userid
+    ) {
+        try {
+            User user = db1.GetInformation(userid);
+            if (user == null) {
+                return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+            }
+            String json = mapper.writeValueAsString(user);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> changeProfile(
+        @RequestBody String requestBody
+    ) {
+        try {
+            // 解析 JSON 数据
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            
+            // 安全地获取 userid 字段
+            com.fasterxml.jackson.databind.JsonNode useridNode = jsonNode.get("userid");
+            if (useridNode == null) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+            }
+            String userid = useridNode.asText();
+            
+            // 添加参数验证
+            if (userid == null || userid.trim().isEmpty()) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+            }
+            
+            // 手动映射前端字段到 User 对象，处理类型转换
+            User user = new User();
+            user.userid = userid;
+            
+            // 安全地获取其他字段并进行类型转换
+            if (jsonNode.has("username") && !jsonNode.get("username").isNull()) {
+                user.username = jsonNode.get("username").asText();
+            }
+            if (jsonNode.has("school") && !jsonNode.get("school").isNull()) {
+                user.school = jsonNode.get("school").asText();
+            }
+            if (jsonNode.has("gender") && !jsonNode.get("gender").isNull()) {
+                user.sex = jsonNode.get("gender").asText();
+            }
+            if (jsonNode.has("avatar_url") && !jsonNode.get("avatar_url").isNull()) {
+                user.pictureurl = jsonNode.get("avatar_url").asText();
+            }
+            
+            // 处理 account_status 的类型转换（字符串/数字 -> 布尔值）
+            if (jsonNode.has("account_status") && !jsonNode.get("account_status").isNull()) {
+                com.fasterxml.jackson.databind.JsonNode statusNode = jsonNode.get("account_status");
+                if (statusNode.isTextual()) {
+                    String statusStr = statusNode.asText();
+                    user.accountstate = "1".equals(statusStr) || "封禁".equals(statusStr);
+                } else if (statusNode.isNumber()) {
+                    user.accountstate = statusNode.asInt() == 1;
+                } else if (statusNode.isBoolean()) {
+                    user.accountstate = statusNode.asBoolean();
+                }
+            }
+            
+            // 处理 invite_left 的类型转换（字符串 -> 整数）
+            if (jsonNode.has("invite_left") && !jsonNode.get("invite_left").isNull()) {
+                com.fasterxml.jackson.databind.JsonNode inviteNode = jsonNode.get("invite_left");
+                if (inviteNode.isTextual()) {
+                    try {
+                        user.invitetimes = Integer.parseInt(inviteNode.asText());
+                    } catch (NumberFormatException e) {
+                        user.invitetimes = 0; // 默认值
+                    }
+                } else if (inviteNode.isNumber()) {
+                    user.invitetimes = inviteNode.asInt();
+                }
+            }
+            
+            int ret = db1.UpdateInformation(user);
+            if (ret == 0) {
+                return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
+            } else {
+                return new ResponseEntity<>(ret, HttpStatus.INTERNAL_SERVER_ERROR); // 返回其他状态表示失败
+            }
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>(1, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 1 表示处理失败
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>(1, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    public ResponseEntity<String> getUserSeeds(
+        @RequestParam("userid") String userid
+    ) {
+        try {
+            Seed[] seeds = db1.GetSeedListByUser(userid);
+            if (seeds == null || seeds.length == 0) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 404 表示未找到种子
+            }
+            String json = mapper.writeValueAsString(seeds);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> deleteSeed(
+        @RequestBody String requestBody
+    ) {
+        try {
+            // 解析 JSON 数据
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            com.fasterxml.jackson.databind.JsonNode seedidNode = jsonNode.get("seedid");
+            if (seedidNode == null) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+            }
+            String seedid = seedidNode.asText();
+            
+            // 添加参数验证
+            if (seedid == null || seedid.trim().isEmpty()) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+            }
+            
+            int ret = db1.DeleteSeed(seedid);
+            if (ret == 0) {
+                return new ResponseEntity<>(0, HttpStatus.OK);
+            } else {
+                return new ResponseEntity<>(ret, HttpStatus.INTERNAL_SERVER_ERROR);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>(1, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    public ResponseEntity<String> getUserStat(
+        @RequestParam("userid") String userid
+    ) {
+        try {
+            User user = db1.GetInformation(userid);
+            if (user == null) {
+                return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+            }
+            String json = mapper.writeValueAsString(user);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
     public ResponseEntity<String> getTorrentDetail(
         @RequestParam("id") String seedid
     ) {
diff --git a/src/main/java/api/ApiInterface.java b/src/main/java/api/ApiInterface.java
index 6859aa6..2b4a3a3 100644
--- a/src/main/java/api/ApiInterface.java
+++ b/src/main/java/api/ApiInterface.java
@@ -8,6 +8,7 @@
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.bind.annotation.RequestBody;
 
 @RestController
 @RequestMapping("/api")
@@ -36,4 +37,29 @@
     ResponseEntity<String> getTorrentDetail(
         @RequestParam("id") String seedid
     );
+
+    @GetMapping("user-profile")
+    ResponseEntity<String> getUserProfile(
+        @RequestParam("id") String userid
+    );
+
+    @PostMapping("/change-profile")
+    ResponseEntity<Integer> changeProfile(
+        @RequestBody String requestBody
+    );
+
+    @GetMapping("/user-seeds")
+    ResponseEntity<String> getUserSeeds(
+        @RequestParam("userid") String userid
+    );
+
+    @PostMapping("/delete-seed")
+    ResponseEntity<Integer> deleteSeed(
+        @RequestBody String requestBody
+    );
+
+    @GetMapping("/user-stat")
+    ResponseEntity<String> getUserStat(
+        @RequestParam("userid") String userid
+    );
 }
\ No newline at end of file
