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
diff --git a/src/main/java/database/DataManagerInterface.java b/src/main/java/database/DataManagerInterface.java
index e2fb1fb..1f4b510 100644
--- a/src/main/java/database/DataManagerInterface.java
+++ b/src/main/java/database/DataManagerInterface.java
@@ -22,9 +22,11 @@
     public Seed GetSeedInformation(String seedid);//返回种子的全部信息;
     public int RegisterSeed(Seed seedinfo);//添加一个新的种子，0成功，其他失败信息待定;
     public int UpdateSeed(Seed seedinfo);//接收新的种子然后更新其全部属性;
+    public int DeleteSeed(String seedid);//删除一个种子，返回状态：0 success，1 不存在,2其他原因
 
     public Seed[] SearchSeed(String userQ);//传入搜索的关键词或句子，返回搜索到的种子信息（按照公共字符数量排序）
     public Seed[] GetSeedListByTag(String tag);//获取某个标签下的种子列表
+    public Seed[] GetSeedListByUser(String userid);//获取某个用户的种子列表
 
     public int AddNotice(Notice notice);//返回状态：0 success，1 重复，2其他原因
     public boolean UpdateNotice(Notice notice);//返回状态：0 success，1 重复，2其他原因
diff --git a/src/main/java/database/Database1.java b/src/main/java/database/Database1.java
index b89dc18..8c3bbb4 100644
--- a/src/main/java/database/Database1.java
+++ b/src/main/java/database/Database1.java
@@ -130,28 +130,36 @@
             if (userinfo.userid == null) {
                 return 2; // userid为null直接返回错误
             }
+            
+            entitymanager.getTransaction().begin();
+            
             JPAQuery<User> query = new JPAQuery<>(entitymanager);
             QUser u = QUser.user;
             User updateUser = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
 
             if(updateUser == null){
+                entitymanager.getTransaction().rollback();
                 return 1;
             }
             // 只更新需要的字段，避免破坏持久化状态和关联关系
-            updateUser.email = userinfo.email;
-            updateUser.username = userinfo.username;
-            updateUser.password = userinfo.password;
-            updateUser.sex = userinfo.sex;
-            updateUser.school = userinfo.school;
-            updateUser.pictureurl = userinfo.pictureurl;
-            updateUser.profile = userinfo.profile;
+            if (userinfo.email != null) updateUser.email = userinfo.email;
+            if (userinfo.username != null) updateUser.username = userinfo.username;
+            if (userinfo.password != null) updateUser.password = userinfo.password;
+            if (userinfo.sex != null) updateUser.sex = userinfo.sex;
+            if (userinfo.school != null) updateUser.school = userinfo.school;
+            if (userinfo.pictureurl != null) updateUser.pictureurl = userinfo.pictureurl;
+            if (userinfo.profile != null) updateUser.profile = userinfo.profile;
             updateUser.accountstate = userinfo.accountstate;
             updateUser.invitetimes = userinfo.invitetimes;
             // 如有其他字段也一并赋值
             entitymanager.merge(updateUser);
+            entitymanager.getTransaction().commit();
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
             return 2;
         }
         
@@ -227,6 +235,35 @@
         return seeds.toArray(new Seed[0]);
     }
 
+    @Override
+    public Seed[] GetSeedListByUser(String userid){
+        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
+        QSeed s = QSeed.seed;
+        List<Seed> seeds = query.select(s).from(s).where(s.seeduserid.eq(userid)).fetch();
+        return seeds.toArray(new Seed[0]);
+    }
+
+    @Override
+    public int DeleteSeed(String seedid){
+        try {
+            entitymanager.getTransaction().begin();
+            Seed seed = entitymanager.find(Seed.class, seedid);
+            if (seed == null) {
+                entitymanager.getTransaction().rollback();
+                return 1; // 种子不存在
+            }
+            entitymanager.remove(seed);
+            entitymanager.getTransaction().commit();
+            return 0; // 成功删除
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            return 2; // 其他错误
+        }
+    }
+
     //添加一个新的种子，0成功，其他失败信息待定;
     @Override
     public int RegisterSeed(Seed seedinfo){
@@ -240,7 +277,7 @@
                 entitymanager.getTransaction().rollback();
                 return 2; // 用户不存在
             }
-            seed.user = user; // 设置种子的用户关联
+            seedinfo.user = user; // 设置种子的用户关联
             if (seed != null) {
                 entitymanager.getTransaction().rollback();
                 return 1;
diff --git a/src/main/java/database/Database2.java b/src/main/java/database/Database2.java
index d2d98c7..0e6dadf 100644
--- a/src/main/java/database/Database2.java
+++ b/src/main/java/database/Database2.java
@@ -138,6 +138,16 @@
     }
 
     @Override
+    public Seed[] GetSeedListByUser(String userid) {
+        return new Seed[0];
+    }
+
+    @Override
+    public int DeleteSeed(String seedid) {
+        return 0;
+    }
+
+    @Override
     public boolean AddCollect(String userid, String postid) {
         return false;
     }
diff --git a/src/main/java/entity/User.java b/src/main/java/entity/User.java
index f73c868..b53e2e2 100644
--- a/src/main/java/entity/User.java
+++ b/src/main/java/entity/User.java
@@ -13,6 +13,7 @@
 import javax.persistence.TemporalType;
 import javax.persistence.Transient;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.querydsl.core.annotations.QueryEntity;
 
 @QueryEntity
@@ -29,6 +30,7 @@
     @Column(name = "password", length = 255, nullable = false)
     public String password;
     @Column(name = "gender", nullable = false)
+    @JsonProperty("gender")
     public String sex;
 
     @Column(name = "detectedCount", nullable = false)
@@ -50,12 +52,15 @@
     @Column(name = "school")
     public String school;
     @Column(name = "avatar_url")
+    @JsonProperty("avatar_url")
     public String pictureurl;
     @Column(name = "bio")
     public String profile;
     @Column(name = "account_status", nullable = false)
+    @JsonProperty("account_status")
     public boolean accountstate;
     @Column(name = "invite_left", nullable = false)
+    @JsonProperty("invite_left")
     public int invitetimes;
     @OneToOne(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
     public UserPT userPT;
diff --git a/src/main/java/entity/config.java b/src/main/java/entity/config.java
index b4b7ea4..7ef6ab7 100644
--- a/src/main/java/entity/config.java
+++ b/src/main/java/entity/config.java
@@ -6,6 +6,7 @@
     public static final int BegVote=3;
     public static final int CheatTime=5;
     // 请根据实际环境修改为可达的地址
+    // public static final String SqlURL = "192.168.5.9:3306";
     public static final String SqlURL = "10.126.59.25:3306";
     public static final String Database = "pt_database_test";
     public static final String TestDatabase = "pt_database_test";
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
new file mode 100644
index 0000000..bafddce
--- /dev/null
+++ b/src/main/resources/application.properties
@@ -0,0 +1 @@
+server.port=8081
\ No newline at end of file
