diff --git a/.gitignore b/.gitignore
index 1d72d10..3c68961 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,6 @@
 target/
 .vscode/
 torrents/
+appeals/
+migrations/
 front/node_modules
\ No newline at end of file
diff --git a/appeals/0a905651-b07b-418c-9256-561ffef6fd27_550e8400-e29b-41d4-a716-4466554400006127619759885714672C8-Main+Memory.pdf b/appeals/0a905651-b07b-418c-9256-561ffef6fd27_550e8400-e29b-41d4-a716-4466554400006127619759885714672C8-Main+Memory.pdf
new file mode 100644
index 0000000..4249fe9
--- /dev/null
+++ b/appeals/0a905651-b07b-418c-9256-561ffef6fd27_550e8400-e29b-41d4-a716-4466554400006127619759885714672C8-Main+Memory.pdf
Binary files differ
diff --git a/appeals/1ec0d417-3e95-4db5-a09f-c969e0750310_550e8400-e29b-41d4-a716-44665544000019228163651766111265555.png b/appeals/1ec0d417-3e95-4db5-a09f-c969e0750310_550e8400-e29b-41d4-a716-44665544000019228163651766111265555.png
new file mode 100644
index 0000000..2b1f4cd
--- /dev/null
+++ b/appeals/1ec0d417-3e95-4db5-a09f-c969e0750310_550e8400-e29b-41d4-a716-44665544000019228163651766111265555.png
Binary files differ
diff --git a/appeals/3cd801c1-21a5-4d2c-a2ad-c038d10337db_550e8400-e29b-41d4-a716-44665544000014156435666049132835C8-Main+Memory.pdf b/appeals/3cd801c1-21a5-4d2c-a2ad-c038d10337db_550e8400-e29b-41d4-a716-44665544000014156435666049132835C8-Main+Memory.pdf
new file mode 100644
index 0000000..4249fe9
--- /dev/null
+++ b/appeals/3cd801c1-21a5-4d2c-a2ad-c038d10337db_550e8400-e29b-41d4-a716-44665544000014156435666049132835C8-Main+Memory.pdf
Binary files differ
diff --git a/migrations/1b19b0fa-c565-43c7-99f3-ed45f7df69e5_550e8400-e29b-41d4-a716-44665544000011275178369492505304C8-Main+Memory.pdf b/migrations/1b19b0fa-c565-43c7-99f3-ed45f7df69e5_550e8400-e29b-41d4-a716-44665544000011275178369492505304C8-Main+Memory.pdf
new file mode 100644
index 0000000..4249fe9
--- /dev/null
+++ b/migrations/1b19b0fa-c565-43c7-99f3-ed45f7df69e5_550e8400-e29b-41d4-a716-44665544000011275178369492505304C8-Main+Memory.pdf
Binary files differ
diff --git a/src/main/java/api/ApiApplication.java b/src/main/java/api/ApiApplication.java
index 1f39e69..c28da07 100644
--- a/src/main/java/api/ApiApplication.java
+++ b/src/main/java/api/ApiApplication.java
@@ -16,18 +16,4 @@
         }
         SpringApplication.run(ApiApplication.class, args);
     }
-
-    // @Bean
-    // public WebMvcConfigurer corsConfigurer() {
-    //     return new WebMvcConfigurer() {
-    //         @Override
-    //         public void addCorsMappings(CorsRegistry registry) {
-    //             registry.addMapping("/**")
-    //                     .allowedOrigins("*")
-    //                     .allowedMethods("*")
-    //                     .allowedHeaders("*")
-    //                     .exposedHeaders(HttpHeaders.CONTENT_DISPOSITION);
-    //         }
-    //     };
-    // }
 }
\ No newline at end of file
diff --git a/src/main/java/api/ApiController.java b/src/main/java/api/ApiController.java
index c2562bc..2c37f8b 100644
--- a/src/main/java/api/ApiController.java
+++ b/src/main/java/api/ApiController.java
@@ -1,6 +1,11 @@
 package api;
 
 import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.text.ParseException;
 
 import javax.annotation.PostConstruct;
 
@@ -15,19 +20,27 @@
 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 tracker.Tracker;
+import cheat.Cheat;
 
 import entity.Seed;
 import entity.User;
 import entity.Post;
+import entity.BegSeedDetail;
 import entity.PostReply;
+import entity.Profile;
 import entity.UserPT;
+import entity.config;
+import entity.Appeal;
+import entity.BegInfo;
+import entity.BegInfoDetail;
+import entity.UserStar;
+import entity.SeedWithVotes;
 
 import java.util.UUID;
 
@@ -36,12 +49,14 @@
 
     private static Database1 db1;
     private static Tracker tracker;
+    private static Cheat cheat;
     private static ObjectMapper mapper;
     private static HttpHeaders headers;
     private static HttpHeaders errorHeaders;
 
     @PostConstruct
     public void init() {
+        cheat = new Cheat();
         db1 = new Database1();
         tracker = new Tracker();
         mapper = new ObjectMapper();
@@ -77,7 +92,7 @@
                 // 如果注册种子失败，返回错误状态
                 return new ResponseEntity<>(ret, headers, HttpStatus.INTERNAL_SERVER_ERROR);
             }
-            File tempFile = File.createTempFile(seed.seedid, file.getOriginalFilename());
+            File tempFile = File.createTempFile(userid, file.getOriginalFilename());
             file.transferTo(tempFile);
             tracker.SaveTorrent(seed.seedid, tempFile);
             return new ResponseEntity<>(0, headers, HttpStatus.OK); // 返回 0 表示成功
@@ -112,7 +127,7 @@
     ) {
         try {
             Seed[] seeds = db1.GetSeedListByTag(tag);
-            if (seeds == null || seeds.length == 0) {
+            if (seeds == null) {
                 return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 404 表示未找到种子
             }
             String json = mapper.writeValueAsString(seeds);
@@ -227,7 +242,7 @@
     ) {
         try {
             Seed[] seeds = db1.GetSeedListByUser(userid);
-            if (seeds == null || seeds.length == 0) {
+            if (seeds == null) {
                 return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 404 表示未找到种子
             }
             String json = mapper.writeValueAsString(seeds);
@@ -484,7 +499,7 @@
     public ResponseEntity<String> getForum() {
         try {
             Post[] posts = db1.GetPostList();
-            if (posts == null || posts.length == 0) {
+            if (posts == null) {
                 return new ResponseEntity<>("[]", HttpStatus.OK); // 返回空数组表示没有帖子
             }
             String json = mapper.writeValueAsString(posts);
@@ -645,7 +660,7 @@
     ) {
         try {
             Seed[] seeds = db1.SearchSeed(query);
-            if (seeds == null || seeds.length == 0) {
+            if (seeds == null) {
                 return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到种子
             }
             
@@ -680,7 +695,7 @@
     ) {
         try {
             Post[] posts = db1.SearchPost(query);
-            if (posts == null || posts.length == 0) {
+            if (posts == null) {
                 return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到帖子
             }
             String json = mapper.writeValueAsString(posts);
@@ -713,4 +728,820 @@
             return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
         }
     }
+
+    @Override
+    public ResponseEntity<String> getConfig(
+        @RequestParam("userid") String userid
+    ) {
+        try {
+            int ret = db1.CheckAdmin(userid);
+            if (ret != 0) {
+                return new ResponseEntity<>("", errorHeaders, HttpStatus.UNAUTHORIZED); // 返回 401 表示未授权
+            }
+            // 创建配置信息的 JSON 对象
+            Map<String, Object> configData = new HashMap<>();
+            configData.put("FarmNumber", config.getFarmNumber());
+            configData.put("FakeTime", config.getFakeTime());
+            configData.put("BegVote", config.getBegVote());
+            configData.put("CheatTime", config.getCheatTime());
+            
+            String json = mapper.writeValueAsString(configData);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    public ResponseEntity<String> getCheatUsers(
+        @RequestParam("userid") String userid
+    ) {
+        try {
+            int ret = db1.CheckAdmin(userid);
+            if (ret != 0) {
+                return new ResponseEntity<>("", errorHeaders, HttpStatus.UNAUTHORIZED); // 返回 401 表示未授权
+            }
+            User[] cheatUsers = cheat.GetCheatUsers();
+            if (cheatUsers == null) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到作弊用户
+            }
+            String json = mapper.writeValueAsString(cheatUsers);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    public ResponseEntity<String> getSuspiciousUsers(
+        @RequestParam("userid") String userid
+    ) {
+        try {
+            int ret = db1.CheckAdmin(userid);
+            if (ret != 0) {
+                return new ResponseEntity<>("", errorHeaders, HttpStatus.UNAUTHORIZED); // 返回 401 表示未授权
+            }
+            User[] suspiciousUsers = cheat.GetSuspiciousUsers();
+            if (suspiciousUsers == null) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到可疑用户
+            }
+            String json = mapper.writeValueAsString(suspiciousUsers);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> unbanUser(
+        @RequestBody String requestBody
+    ) {
+        try {
+            // 解析 JSON 数据
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            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);
+            }
+            
+            int ret = cheat.UnbanUser(userid);
+            if (ret == 0) {
+                return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
+            } else if (ret == 1) {
+                return new ResponseEntity<>(1, HttpStatus.NOT_FOUND); // 返回 1 表示用户不存在
+            } else if (ret == 2) {
+                return new ResponseEntity<>(2, HttpStatus.CONFLICT); // 返回 2 表示用户未被封禁
+            } else {
+                return new ResponseEntity<>(3, 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
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> banUser(
+        @RequestBody String requestBody
+    ) {
+        try {
+            // 解析 JSON 数据
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            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);
+            }
+            
+            int ret = cheat.BanUser(userid);
+            if (ret == 0) {
+                return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
+            } else if (ret == 1) {
+                return new ResponseEntity<>(1, HttpStatus.NOT_FOUND); // 返回 1 表示用户不存在
+            } else if (ret == 2) {
+                return new ResponseEntity<>(2, HttpStatus.CONFLICT); // 返回 2 表示用户已被封禁
+            } else {
+                return new ResponseEntity<>(3, 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> getAppeals() {
+        try {
+            Appeal[] appeals = cheat.GetAppealList();
+            if (appeals == null) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到申诉
+            }
+            String json = mapper.writeValueAsString(appeals);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    public ResponseEntity<String> getMigrations() {
+        try {
+            Profile[] migrations = db1.GetTransmitProfileList();
+            if (migrations == null) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到迁移记录
+            }
+            String json = mapper.writeValueAsString(migrations);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> approveAppeal(
+        @RequestBody String requestBody
+    ) {
+        try {
+            // 解析 JSON 数据
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            com.fasterxml.jackson.databind.JsonNode appealidNode = jsonNode.get("appealid");
+            if (appealidNode == null) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+            String appealid = appealidNode.asText();
+            
+            // 添加参数验证
+            if (appealid == null || appealid.trim().isEmpty()) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+            }
+            
+            boolean ret = cheat.HandleAppeal(appealid, 1);
+            if (ret) {
+                return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
+            } else {
+                return new ResponseEntity<>(1, 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
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> rejectAppeal(
+        @RequestBody String requestBody
+    ) {
+        try {
+            // 解析 JSON 数据
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            com.fasterxml.jackson.databind.JsonNode appealidNode = jsonNode.get("appealid");
+            if (appealidNode == null) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+            String appealid = appealidNode.asText();
+            
+            // 添加参数验证
+            if (appealid == null || appealid.trim().isEmpty()) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+            }
+            
+            boolean ret = cheat.HandleAppeal(appealid, 2);
+            if (ret) {
+                return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
+            } else {
+                return new ResponseEntity<>(1, 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
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> approveMigration(
+        @RequestBody String requestBody
+    ) {
+        try {
+            // 解析 JSON 数据
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            com.fasterxml.jackson.databind.JsonNode migrationidNode = jsonNode.get("migration_id");
+            if (migrationidNode == null) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+            String migrationid = migrationidNode.asText();
+            System.out.println("Migration ID: " + migrationid);
+            
+            // 添加参数验证
+            if (migrationid == null || migrationid.trim().isEmpty()) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+            }
+            
+            boolean ret = db1.ExamTransmitProfile(migrationid, true);
+            System.out.println("Migration approval result: " + ret);
+            if (ret) {
+                return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
+            } else {
+                return new ResponseEntity<>(1, 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
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> rejectMigration(
+        @RequestBody String requestBody
+    ) {
+        try {
+            // 解析 JSON 数据
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            com.fasterxml.jackson.databind.JsonNode migrationidNode = jsonNode.get("migration_id");
+            if (migrationidNode == null) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+            String migrationid = migrationidNode.asText();
+            
+            // 添加参数验证
+            if (migrationid == null || migrationid.trim().isEmpty()) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+            }
+            
+            boolean ret = db1.ExamTransmitProfile(migrationid, false);
+            if (ret) {
+                return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
+            } else {
+                return new ResponseEntity<>(1, 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
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> inviteUser(
+        @RequestBody String requestBody
+    ) {
+        try {
+            // 解析 JSON 数据
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            com.fasterxml.jackson.databind.JsonNode useridNode = jsonNode.get("userid");
+            com.fasterxml.jackson.databind.JsonNode emailNode = jsonNode.get("invite_email");
+            if (useridNode == null || emailNode == null) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+            String userid = useridNode.asText();
+            String email = emailNode.asText();
+            
+            // 添加参数验证
+            if (email == null || email.trim().isEmpty()) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+            }
+            
+            int ret = db1.InviteNewUser(userid, email);
+            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<>(2, 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
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> submitAppeal(
+        @RequestParam("userid") String userid,
+        @RequestParam("content") String content,
+        @RequestParam("file") MultipartFile file
+    ) {
+        try {
+            System.out.println("Submit appeal request: userid=" + userid + ", content=" + content);
+            // 先进行参数验证
+            if (userid == null || userid.trim().isEmpty() || 
+                content == null || content.trim().isEmpty() ||
+                file == null || file.isEmpty()) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+            }
+            
+            if (file.getSize() > 100 * 1024 * 1024) {
+                System.out.println("File size exceeds limit: " + file.getSize() + " bytes");
+                return new ResponseEntity<>(3, HttpStatus.PAYLOAD_TOO_LARGE); // 返回 3 表示文件过大
+            }
+            
+            System.out.println("Submit appeal request: userid=" + userid + ", content=" + content);
+            File tempFile = File.createTempFile(userid, file.getOriginalFilename());
+            file.transferTo(tempFile);
+            
+            int ret = cheat.SubmitAppeal(userid, content, tempFile);
+            System.out.println("Submit appeal result: " + ret);
+            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<>(2, HttpStatus.INTERNAL_SERVER_ERROR); // 返回其他状态表示失败
+            }
+        } catch (org.springframework.web.multipart.MaxUploadSizeExceededException e) {
+            System.out.println("File upload size exceeded: " + e.getMessage());
+            return new ResponseEntity<>(3, HttpStatus.PAYLOAD_TOO_LARGE); // 返回 3 表示文件过大
+        } 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> getUserStats(
+        @RequestParam("userid") String userid
+    ) {
+        try {
+            if (userid == null || userid.trim().isEmpty()) {
+                return new ResponseEntity<>("", errorHeaders, HttpStatus.BAD_REQUEST); // 返回 400 表示参数不完整
+            }
+
+            UserPT userPT = db1.GetInformationPT(userid);
+            if (userPT == null) {
+                return new ResponseEntity<>("", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到用户PT信息
+            }   
+
+            String json = mapper.writeValueAsString(userPT);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 500 表示处理失败
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> magicExchange(
+        @RequestBody String requestBody
+    ) {
+        try {
+            // 解析 JSON 数据
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            com.fasterxml.jackson.databind.JsonNode useridNode = jsonNode.get("userid");
+            com.fasterxml.jackson.databind.JsonNode magicNode = jsonNode.get("magic");
+            com.fasterxml.jackson.databind.JsonNode typeNode = jsonNode.get("exchangeType");
+
+            if (useridNode == null || magicNode == null || typeNode == null) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+            String userid = useridNode.asText();
+            int magic = magicNode.asInt();
+            String exchangeType = typeNode.asText();
+
+            boolean ret = false;
+            if( "uploaded".equals(exchangeType) ) {
+                ret = db1.ExchangeMagicToUpload(userid, magic);
+            } else if( "downloaded".equals(exchangeType) ) {
+                ret = db1.ExchangeMagicToDownload(userid, magic);
+            } else if( "vip_downloads".equals(exchangeType) ) {
+                ret = db1.ExchangeMagicToVip(userid, magic);
+            } else {
+                System.out.println("Invalid exchange type: " + exchangeType);
+                return new ResponseEntity<>(2, HttpStatus.BAD_REQUEST); // 返回 2 表示交换类型错误
+            }
+            if (!ret) {
+                return new ResponseEntity<>(1, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 1 表示处理失败
+            }
+            return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
+        } 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> getUserFavorites(
+        @RequestParam("userid") String userid
+    ) {
+        try {
+            if (userid == null || userid.trim().isEmpty()) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.BAD_REQUEST); // 返回 400 表示参数不完整
+            }
+
+            UserStar[] favorites = db1.GetUserStarList(userid);
+            if (favorites == null) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到用户收藏
+            }
+
+            String json = mapper.writeValueAsString(favorites);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 500 表示处理失败
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> removeFavorite(
+        @RequestBody String requestBody
+    ) {
+        try {
+            // 解析 JSON 数据
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            com.fasterxml.jackson.databind.JsonNode useridNode = jsonNode.get("userid");
+            com.fasterxml.jackson.databind.JsonNode seedidNode = jsonNode.get("seedid");
+            if (useridNode == null || seedidNode == null) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+
+            String userid = useridNode.asText();
+            String seedid = seedidNode.asText();
+
+            // 添加参数验证
+            if (userid == null || userid.trim().isEmpty() || 
+                seedid == null || seedid.trim().isEmpty()) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+            }
+
+            boolean ret = db1.DeleteCollect(userid, seedid);
+            if (ret) {
+                return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
+            } else {
+                return new ResponseEntity<>(2, 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
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> addFavorite(
+        @RequestBody String requestBody
+    ) {
+        try {
+            // 解析 JSON 数据
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            com.fasterxml.jackson.databind.JsonNode useridNode = jsonNode.get("userid");
+            com.fasterxml.jackson.databind.JsonNode seedidNode = jsonNode.get("seedid");
+            if (useridNode == null || seedidNode == null) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+
+            String userid = useridNode.asText();
+            String seedid = seedidNode.asText();
+
+            // 添加参数验证
+            if (userid == null || userid.trim().isEmpty() || 
+                seedid == null || seedid.trim().isEmpty()) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+            }
+
+            boolean ret = db1.AddCollect(userid, seedid);
+            if (ret) {
+                return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
+            } else {
+                return new ResponseEntity<>(2, 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
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> migrateAccount(
+        @RequestParam("userid") String userid,
+        @RequestParam("file") MultipartFile file
+    ) {
+        try {
+            // 先进行参数验证
+            if (userid == null || userid.trim().isEmpty() || 
+                file == null || file.isEmpty()) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+            }
+            
+            if (file.getSize() > 100 * 1024 * 1024) {
+                System.out.println("File size exceeds limit: " + file.getSize() + " bytes");
+                return new ResponseEntity<>(3, HttpStatus.PAYLOAD_TOO_LARGE); // 返回 3 表示文件过大
+            }
+            
+            File tempFile = File.createTempFile(userid, file.getOriginalFilename());
+            file.transferTo(tempFile);
+
+            int ret = db1.UploadMigration(userid, tempFile);
+            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<>(2, 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> getBegSeedList() {
+        try {
+            BegSeedDetail[] begSeedList = db1.GetBegList();
+            if (begSeedList == null) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到种子列表
+            }
+            String json = mapper.writeValueAsString(begSeedList);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 500 表示处理失败
+        }
+    }
+
+    @Override
+    public ResponseEntity<String> getBegSeedDetail(
+        @RequestParam("begid") String begid
+    ) {
+        try {
+            System.out.println("getBegSeedDetail called with begid: " + begid);
+            if (begid == null || begid.trim().isEmpty()) {
+                return new ResponseEntity<>("", errorHeaders, HttpStatus.BAD_REQUEST); // 返回 400 表示参数不完整
+            }
+
+            BegSeedDetail begSeedDetail = db1.GetBegSeedDetail(begid);
+            if (begSeedDetail == null) {
+                return new ResponseEntity<>("", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到种子详情
+            }
+            String json = mapper.writeValueAsString(begSeedDetail);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 500 表示处理失败
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    public ResponseEntity<String> getBegSeedSubmissions(
+        @RequestParam("begid") String begid
+    ) {
+        try {
+            if (begid == null || begid.trim().isEmpty()) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.BAD_REQUEST); // 返回 400 表示参数不完整
+            }
+
+            SeedWithVotes[] submissionsWithVotes = db1.GetBegSeedListWithVotes(begid);
+            if (submissionsWithVotes == null) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到提交记录
+            }
+
+            String json = mapper.writeValueAsString(submissionsWithVotes);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 500 表示处理失败
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> submitSeed(
+        @RequestBody String requestBody
+    ) {
+        try {
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            com.fasterxml.jackson.databind.JsonNode begidNode = jsonNode.get("begid");
+            com.fasterxml.jackson.databind.JsonNode useridNode = jsonNode.get("userid");
+            com.fasterxml.jackson.databind.JsonNode seedidNode = jsonNode.get("seedid");
+            
+            if (begidNode == null || useridNode == null || seedidNode == null) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+
+            String begid = begidNode.asText();
+            String userid = useridNode.asText();
+            String seedid = seedidNode.asText();
+
+            if (begid == null || begid.trim().isEmpty() || 
+                userid == null || userid.trim().isEmpty() || 
+                seedid == null || seedid.trim().isEmpty()) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+
+            int ret = db1.SubmitBegSeed(begid, seedid, userid);
+            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<>(2, HttpStatus.INTERNAL_SERVER_ERROR); // 返回其他状态表示失败
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>(1, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 1 表示处理失败
+        }
+    }
+
+    @Override
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> voteSeed(
+        @RequestBody String requestBody
+    ) {
+        try {
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            com.fasterxml.jackson.databind.JsonNode begidNode = jsonNode.get("begid");
+            com.fasterxml.jackson.databind.JsonNode useridNode = jsonNode.get("userid");
+            com.fasterxml.jackson.databind.JsonNode seedidNode = jsonNode.get("seedid");
+
+            if (begidNode == null || useridNode == null || seedidNode == null) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+
+            String begid = begidNode.asText();
+            String userid = useridNode.asText();
+            String seedid = seedidNode.asText();
+
+            if (begid == null || begid.trim().isEmpty() || 
+                userid == null || userid.trim().isEmpty() || 
+                seedid == null || seedid.trim().isEmpty()) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+
+            int ret = db1.VoteSeed(begid, seedid, userid);
+            if (ret == 0) {
+                return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
+            } else if (ret == 1) {
+                return new ResponseEntity<>(3, HttpStatus.CONFLICT); // 返回 1 表示投票失败或其他错误
+            } else {
+                return new ResponseEntity<>(2, HttpStatus.INTERNAL_SERVER_ERROR); // 返回其他状态表示失败
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>(1, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 1 表示处理失败
+        }
+    }
+
+    @Override
+    @CrossOrigin(origins = "*", allowedHeaders = "*")
+    public ResponseEntity<Integer> createBegSeed(
+        @RequestBody String requestBody
+    ) {
+        try {
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            com.fasterxml.jackson.databind.JsonNode useridNode = jsonNode.get("userid");
+            com.fasterxml.jackson.databind.JsonNode infoNode = jsonNode.get("info");
+            com.fasterxml.jackson.databind.JsonNode rewardNode = jsonNode.get("reward_magic");
+            com.fasterxml.jackson.databind.JsonNode dedlineNode = jsonNode.get("deadline");
+
+            if (useridNode == null || infoNode == null || rewardNode == null || dedlineNode == null) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+
+            String userid = useridNode.asText();
+            String info = infoNode.asText();
+
+            if (userid == null || userid.trim().isEmpty() ||
+                info == null || info.trim().isEmpty() ||
+                rewardNode.asInt() <= 0 ){
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+
+            // 解析日期字符串
+            Date endTime;
+            try {
+                String deadlineStr = dedlineNode.asText();
+                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm");
+                endTime = dateFormat.parse(deadlineStr);
+            } catch (ParseException e) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 日期格式错误
+            }
+
+            BegInfo beg = new BegInfo();
+            beg.begid = java.util.UUID.randomUUID().toString();
+            beg.begnumbers = 0; // 初始提交数为0
+            beg.magic = rewardNode.asInt();
+            beg.endtime = endTime;
+            beg.hasseed = 0; // 初始状态为未开始
+
+            // int ret = db1.AddBegSeed(beg);
+            int ret = db1.createBagSeed(beg, userid, info);
+            if (ret == 0) {
+                return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
+            } else if (ret == 1) {
+                return new ResponseEntity<>(2, HttpStatus.CONFLICT); // 返回 1 表示创建失败或其他错误
+            } else {
+                return new ResponseEntity<>(3, HttpStatus.INTERNAL_SERVER_ERROR); // 返回其他状态表示失败
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>(1, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 1 表示处理失败
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/api/ApiInterface.java b/src/main/java/api/ApiInterface.java
index 2d79fa7..475b5d2 100644
--- a/src/main/java/api/ApiInterface.java
+++ b/src/main/java/api/ApiInterface.java
@@ -101,4 +101,126 @@
     ResponseEntity<String> getUserPT(
         @RequestParam("userid") String userid
     );
+
+    @GetMapping("/admin/config")
+    ResponseEntity<String> getConfig(
+        @RequestParam("userid") String userid
+    );
+
+    @GetMapping("/admin/cheat-users")
+    ResponseEntity<String> getCheatUsers(
+        @RequestParam("userid") String userid
+    );
+
+    @GetMapping("/admin/suspicious-users")
+    ResponseEntity<String> getSuspiciousUsers(
+        @RequestParam("userid") String userid
+    );
+
+    @PostMapping("/admin/unban-user")
+    ResponseEntity<Integer> unbanUser(
+        @RequestBody String requestBody
+    );
+
+    @PostMapping("/admin/ban-user")
+    ResponseEntity<Integer> banUser(
+        @RequestBody String requestBody
+    );
+
+    @GetMapping("/appeals")
+    ResponseEntity<String> getAppeals();
+
+    @GetMapping("/migrations")
+    ResponseEntity<String> getMigrations();
+
+    @PostMapping("/appeals-approve")
+    ResponseEntity<Integer> approveAppeal(
+        @RequestBody String requestBody
+    );
+
+    @PostMapping("/appeals-reject")
+    ResponseEntity<Integer> rejectAppeal(
+        @RequestBody String requestBody
+    );
+
+    @PostMapping("/migrations-approve")
+    ResponseEntity<Integer> approveMigration(
+        @RequestBody String requestBody
+    );
+
+    @PostMapping("/migrations-reject")
+    ResponseEntity<Integer> rejectMigration(
+        @RequestBody String requestBody
+    );
+
+    @PostMapping("/invite")
+    ResponseEntity<Integer> inviteUser(
+        @RequestBody String requestBody
+    );
+
+    @PostMapping("/submit-appeal")
+    ResponseEntity<Integer> submitAppeal(
+        @RequestParam("userid") String userid,
+        @RequestParam("content") String content,
+        @RequestParam("file") MultipartFile file
+    );
+    
+    @GetMapping("/user-stats")
+    ResponseEntity<String> getUserStats(
+        @RequestParam("userid") String userid
+    );
+
+    @PostMapping("/exchange")
+    ResponseEntity<Integer> magicExchange(
+        @RequestBody String requestBody
+    );
+
+    @GetMapping("/user-favorites")
+    ResponseEntity<String> getUserFavorites(
+        @RequestParam("userid") String userid
+    );
+
+    @PostMapping("/remove-favorite")
+    ResponseEntity<Integer> removeFavorite(
+        @RequestBody String requestBody
+    );
+
+    @PostMapping("/add-favorite")
+    ResponseEntity<Integer> addFavorite(
+        @RequestBody String requestBody
+    );
+
+    @PostMapping("/migrate-account")
+    ResponseEntity<Integer> migrateAccount(
+        @RequestParam("userid") String userid,
+        @RequestParam("file") MultipartFile file
+    );
+
+    @GetMapping("/begseed-list")
+    ResponseEntity<String> getBegSeedList();
+
+    @GetMapping("/begseed-detail")
+    ResponseEntity<String> getBegSeedDetail(
+        @RequestParam("begid") String begid
+    );
+
+    @GetMapping("/begseed-submissions")
+    ResponseEntity<String> getBegSeedSubmissions(
+        @RequestParam("begid") String begid
+    );
+
+    @PostMapping("/submit-seed")
+    ResponseEntity<Integer> submitSeed(
+        @RequestBody String requestBody
+    );
+
+    @PostMapping("/vote-seed")
+    ResponseEntity<Integer> voteSeed(
+        @RequestBody String requestBody
+    );
+
+    @PostMapping("/create-begseed")
+    ResponseEntity<Integer> createBegSeed(
+        @RequestBody String requestBody
+    );
 }
\ No newline at end of file
diff --git a/src/main/java/cheat/Cheat.java b/src/main/java/cheat/Cheat.java
index 3eecaff..cb35c05 100644
--- a/src/main/java/cheat/Cheat.java
+++ b/src/main/java/cheat/Cheat.java
@@ -1,13 +1,22 @@
 package cheat;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
 import javax.persistence.PersistenceContext;
 import javax.transaction.Transactional;
 
 import org.apache.commons.lang3.tuple.Pair;
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
 
 import com.querydsl.jpa.impl.JPAQueryFactory;
 
@@ -16,19 +25,37 @@
 import entity.QSeed;
 import entity.User;
 import entity.config;
+import entity.QUser;
+import entity.TTorent;
 
 public class Cheat implements CheatInterfnterface {
 
     @PersistenceContext
-    private EntityManager entityManager;
+    private EntityManagerFactory emf;
+
+    public Cheat() {
+        config cfg = new config();
+        Map<String,Object> props = new HashMap<>();
+        props.put("javax.persistence.jdbc.url",
+                  "jdbc:mysql://" + cfg.SqlURL + "/" + cfg.Database);
+        props.put("javax.persistence.jdbc.user", cfg.SqlUsername);
+        props.put("javax.persistence.jdbc.password", cfg.SqlPassword);
+        this.emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
+    }
 
     @Override
     @Transactional
     public boolean AddAppeal(Appeal appeal) {
+        EntityManager entityManager = emf.createEntityManager();
         try {
+            entityManager.getTransaction().begin();
             entityManager.persist(appeal);
+            entityManager.getTransaction().commit();
         } catch (Exception e) {
             e.printStackTrace();
+            if (entityManager.getTransaction().isActive()) {
+                entityManager.getTransaction().rollback();
+            }
             return false;
         }
         return true;
@@ -37,6 +64,7 @@
     @Override
     public Appeal GetAppeal(String appealid) {
         try {
+            EntityManager entityManager = emf.createEntityManager();
             JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
             QAppeal qAppeal = QAppeal.appeal;
             Appeal appeal = queryFactory
@@ -52,6 +80,7 @@
 
     @Override
     public Appeal[] GetAppealList() {
+        EntityManager entityManager = emf.createEntityManager();
         try {
             JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
             QAppeal qAppeal = QAppeal.appeal;
@@ -62,29 +91,44 @@
         } catch (Exception e) {
             e.printStackTrace();
             return null;
+        } finally {
+            if (entityManager != null) {
+                entityManager.close();
+            }
         }
     }
 
     @Override
     public boolean HandleAppeal(String appealid, Integer status) {
+        EntityManager entityManager = emf.createEntityManager();
         try {
             Appeal appeal = GetAppeal(appealid);
             if (appeal != null) {
                 appeal.status = status;
+                entityManager.getTransaction().begin();
                 entityManager.merge(appeal);
                 User user = entityManager.find(User.class, appeal.appealuserid);
-                if (user != null && user.accountstate != false) {
+                // if (user != null && user.accountstate != false) {
+                if (user != null) {
                     if (status == 1) {
                         user.accountstate = false;
                     }
                     entityManager.merge(user);
                 }
+                entityManager.getTransaction().commit();
                 return true;
             }
             return false;
         } catch (Exception e) {
             e.printStackTrace();
+            if (emf.createEntityManager().getTransaction().isActive()) {
+                emf.createEntityManager().getTransaction().rollback();
+            }
             return false;
+        } finally {
+            if (entityManager != null) {
+                entityManager.close();
+            }
         }
     }
 
@@ -92,12 +136,13 @@
     public Pair<String, String>[] GetFakeSeed() {
         List<Pair<String, String>> fakeSeeds = new ArrayList<>();
         try {
+            EntityManager entityManager = emf.createEntityManager();
             JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
             QSeed qSeed = QSeed.seed;
             List<com.querydsl.core.Tuple> results = queryFactory
                 .select(qSeed.seedid, qSeed.seeduserid)
                 .from(qSeed)
-                .where(qSeed.faketime.gt(new config().FakeTime))
+                .where(qSeed.faketime.gt(config.getFakeTime()))
                 .fetch();
             for (com.querydsl.core.Tuple result : results) {
                 String seedid = result.get(qSeed.seedid);
@@ -115,6 +160,7 @@
     public String[] GetPunishedUserList() {
         List<String> punishedUsers = new ArrayList<>();
         try {
+            EntityManager entityManager = emf.createEntityManager();
             JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
             entity.QUser qUser = entity.QUser.user;
             List<String> results = queryFactory
@@ -187,12 +233,13 @@
 
     @Override
     public void PunishUser(){
+        EntityManager entityManager = emf.createEntityManager();
         JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
         entity.QUser qUser = entity.QUser.user;
         List<User> users = queryFactory
             .selectFrom(qUser)
-            .where(qUser.detectedCount.gt(new entity.config().CheatTime) 
-                .or(qUser.fakeDetectedCount.gt(new entity.config().FakeTime)))
+            .where(qUser.detectedCount.gt(config.getCheatTime()) 
+                .or(qUser.fakeDetectedCount.gt(config.getFakeTime())))
             .fetch();
 
         for (User user : users) {
@@ -200,4 +247,147 @@
             entityManager.merge(user);
         }
     }
+
+    @Override
+    public User[] GetCheatUsers() {
+        EntityManager entityManager = emf.createEntityManager();
+        List<User> cheatUsers = new ArrayList<>();
+        try {
+            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            QUser qUser = QUser.user;
+            cheatUsers = queryFactory
+                .selectFrom(qUser)
+                .where(qUser.accountstate.eq(true))
+                .fetch();
+            return cheatUsers.toArray(new User[0]);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        } finally {
+            if (entityManager != null){
+                entityManager.close();
+            }
+        }
+    }
+
+    @Override
+    public User[] GetSuspiciousUsers() {
+        EntityManager entityManager = emf.createEntityManager();
+        List<User> suspiciousUsers = new ArrayList<>();
+        try {
+            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            QUser qUser = QUser.user;
+            suspiciousUsers = queryFactory
+                .selectFrom(qUser)
+                .where((qUser.detectedCount.gt(0)
+                    .or(qUser.fakeDetectedCount.gt(0)))
+                    .and(qUser.accountstate.eq(false)))
+                .fetch();
+            return suspiciousUsers.toArray(new User[0]);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        } finally {
+            if (entityManager != null){
+                entityManager.close();
+            }
+        }
+    }
+    
+    @Override
+    public int UnbanUser(String userid) {
+        EntityManager entityManager = emf.createEntityManager();
+        try {
+            User user = entityManager.find(User.class, userid);
+            if (user == null) {
+                return 1; // 用户不存在
+            }
+            if (user.accountstate) {
+                user.accountstate = false; // 解封用户
+                entityManager.getTransaction().begin();
+                entityManager.merge(user);
+                entityManager.getTransaction().commit();
+                return 0; // 成功解封
+            }
+            return 2; // 用户未被封禁
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entityManager.getTransaction().isActive()) {
+                entityManager.getTransaction().rollback();
+            }
+            return -1; // 出现异常
+        } finally {
+            if (entityManager != null){
+                entityManager.close();
+            }
+        }
+    }
+
+    @Override
+    public int BanUser(String userid) {
+        EntityManager entityManager = emf.createEntityManager();
+        try {
+            User user = entityManager.find(User.class, userid);
+            if (user == null) {
+                return 1; // 用户不存在
+            }
+            if (!user.accountstate) {
+                user.accountstate = true; // 封禁用户
+                entityManager.getTransaction().begin();
+                entityManager.merge(user);
+                entityManager.getTransaction().commit();
+                return 0; // 成功封禁
+            }
+            return 2; // 用户已被封禁
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entityManager.getTransaction().isActive()) {
+                entityManager.getTransaction().rollback();
+            }
+            return -1; // 出现异常
+        } finally {
+            if (entityManager != null){
+                entityManager.close();
+            }
+        }
+    }
+
+    @Override
+    public int SubmitAppeal(String userid, String content, File file) {
+        EntityManager entityManager = emf.createEntityManager();
+        try {
+            User user = entityManager.find(User.class, userid);
+            if (user == null) {
+                return 1; // 用户不存在
+            }
+            Appeal appeal = new Appeal();
+            appeal.appealid = java.util.UUID.randomUUID().toString();
+            appeal.appealuserid = userid;
+            appeal.content = content;
+            appeal.user = user; // 设置关联的用户
+            Path storageDir = Paths.get(config.APPEAL_STORAGE_DIR);
+            if (!Files.exists(storageDir)) {
+                Files.createDirectories(storageDir);
+            }
+            String filename = file.getName();
+            Path target = storageDir.resolve(appeal.appealid + "_" + filename);
+            Files.copy(file.toPath(), target, StandardCopyOption.REPLACE_EXISTING);
+            appeal.status = 0; // 初始状态为未处理
+            appeal.fileURL = target.toString(); // 设置文件存储路径
+            entityManager.getTransaction().begin();
+            entityManager.persist(appeal);
+            entityManager.getTransaction().commit();
+            return 0; // 成功提交申诉
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entityManager.getTransaction().isActive()) {
+                entityManager.getTransaction().rollback();
+            }
+            return -1; // 出现异常
+        } finally {
+            if (entityManager != null){
+                entityManager.close();
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/cheat/CheatInterfnterface.java b/src/main/java/cheat/CheatInterfnterface.java
index e7e4942..81aeb2c 100644
--- a/src/main/java/cheat/CheatInterfnterface.java
+++ b/src/main/java/cheat/CheatInterfnterface.java
@@ -1,6 +1,9 @@
 package cheat;
 import org.apache.commons.lang3.tuple.Pair;
 import entity.Appeal;
+import entity.User;
+import java.io.File;
+
 public interface CheatInterfnterface{
     public Pair<String,String>[] GetFakeSeed();//返回做假种的列表，<seedid,userid>
     public void DetectFakeSeed();//检测所有种子是否为假种，并将检测结果写入数据表
@@ -15,4 +18,12 @@
     public Appeal[] GetAppealList();//获取所有申诉列表
     public boolean HandleAppeal(String appealid, Integer status);//处理申诉
     // status = 0表示未处理， = 1表示通过， = 2表示拒绝
+
+    public User[] GetCheatUsers();//获取作弊用户列表，返回User对象数组
+    public User[] GetSuspiciousUsers();//获取可疑用户列表，返回User对象数组
+    public int UnbanUser(String userid);//解封用户，返回0表示成功，1表示用户不存在，2表示用户未被封禁
+    public int BanUser(String userid);//封禁用户，返回0表示成功，1表示用户不存在，2表示用户已被封禁
+
+    public int SubmitAppeal(String userid, String content, File file); // 添加新的申诉，返回0表示成功，1表示用户不存在，2表示内容不合法
+
 }
diff --git a/src/main/java/database/DataManagerInterface.java b/src/main/java/database/DataManagerInterface.java
index b02f4a6..0c4dc7d 100644
--- a/src/main/java/database/DataManagerInterface.java
+++ b/src/main/java/database/DataManagerInterface.java
@@ -1,13 +1,17 @@
 package database;
 
 import entity.BegInfo;
+import entity.BegSeedDetail;
 import entity.Notice;
 import entity.Post;
 import entity.Profile;
 import entity.Seed;
 import entity.User;
 import entity.UserPT;
+import entity.UserStar;
 import entity.PostReply;
+import entity.SeedWithVotes;
+import java.io.File;
 public interface DataManagerInterface{
 //DB1
 
@@ -38,7 +42,9 @@
 
     public boolean AddCollect(String userid,String seedid);//添加一个收藏，返回状态：0 success，1 不存在,2其他原因
     public boolean DeleteCollect(String userid,String seedid);//删除一个收藏，返回状态：0 success，1 不存在,2其他原因
-    
+    public UserStar[] GetUserStarList(String userid);//获取用户的收藏列表
+
+    public int CheckAdmin(String userid);//检查用户是否为管理员，返回状态：0 success，1 不存在,2其他原因
 
 
 // ----------------------------------------------------------------------------------------------------
@@ -50,6 +56,11 @@
     public int VoteSeed(String begId, String seedId, String userId);//求种结果投票，返回状态：0 success，1 重复，2其他原因
     public int SubmitSeed(String begid,Seed seed);//提交种子，返回状态：0 success，1 重复，2其他原因
     public void SettleBeg();//结算所有求种信息，求种信息中需要增加Beg截止日期，默认14天，期间投票>的则Beg成功，否则Beg失败，并发放对应奖励
+    public BegSeedDetail[] GetBegList();//获取所有求种信息（包含BegSeed表内容和BegInfo的Info字段）
+    public BegInfo GetBegDetail(String begid);//获取一个求种信息的详细信息
+    public BegSeedDetail GetBegSeedDetail(String begid);//获取一个求种信息的详细信息（包含BegSeed表数据和BegInfo表的Info字段）
+    public SeedWithVotes[] GetBegSeedListWithVotes(String begid);//获取一个求种信息下的种子列表（包含投票信息）
+    public int SubmitBegSeed(String begid, String seedid, String userid);//提交一个种子到求种信息中，返回状态：0 success，1 重复，2其他原因
 
     public Post[] SearchPost(String userQ);//传入搜索的关键词或句子，返回搜索到的帖子信息（按照公共字符数量排序）
     public Post[] GetPostList();//获取用户的帖子列表
@@ -72,5 +83,7 @@
     public Profile GetTransmitProfile(String profileid);//获取迁移信息
     public boolean ExamTransmitProfile(String profileid,boolean result);//审核迁移信息,0成功，1失败
     public Profile[] GetTransmitProfileList();//获取所有迁移信息
-
+    public int InviteNewUser(String inviterid, String invitedemail);//邀请新用户，返回状态：0 success，1 重复，2其他原因
+    public int UploadMigration(String userid, File file);
+    public int createBagSeed(BegInfo begInfo, String userid, String info);
 }   
\ No newline at end of file
diff --git a/src/main/java/database/Database1.java b/src/main/java/database/Database1.java
index b91e471..26ddc29 100644
--- a/src/main/java/database/Database1.java
+++ b/src/main/java/database/Database1.java
@@ -4,8 +4,14 @@
 import java.util.UUID;
 import java.util.HashMap;
 import java.util.List;
+import java.util.ArrayList;
 import java.util.Map;
 import java.util.Date;
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
@@ -17,10 +23,14 @@
 import com.querydsl.core.Tuple;
 
 import entity.BegInfo;
+import entity.BegInfoDetail;
+import entity.BegSeedDetail;
 import entity.Notice;
 import entity.Post;
 import entity.PostReply;
 import entity.Profile;
+import entity.SeedWithVotes;
+import entity.QAdmin;
 import entity.QBegInfo;
 import entity.QNotice;
 import entity.QProfile;
@@ -40,6 +50,12 @@
 import entity.PostReply;
 import entity.QPostReply;
 import entity.UserInvite;
+import entity.QAdmin;
+import entity.UserStar;
+import entity.QUserStar;
+import entity.SubmitSeed;
+import entity.SubmitSeedId;
+
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -210,8 +226,16 @@
     @Override
     public UserPT GetInformationPT(String userid){
         EntityManager entitymanager = createEntityManager();
-        UserPT userPT = entitymanager.find(UserPT.class, userid);
-        return userPT;
+        try {
+            UserPT userPT = entitymanager.find(UserPT.class, userid);
+            if (userPT == null) {
+                return null; // 用户PT信息不存在
+            }
+            return userPT;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null; // 出现异常，返回null
+        }
     }
 
     //返回状态：0 success，1 邮箱重复，2其他原因
@@ -527,8 +551,8 @@
     //邀请用户，返回状态：0 success，1 剩余次数不足，2,3其他原因
     @Override
     public int InviteUser(String inviterid,String inviteemail){
+        EntityManager entitymanager = createEntityManager();
         try {
-            EntityManager entitymanager = createEntityManager();
             User user = entitymanager.find(User.class, inviterid);
             if (user == null || !user.email.equals(inviteemail)) {
                 return 3;
@@ -537,61 +561,88 @@
                 return 1;
             }
             user.invitetimes -= 1;
+            entitymanager.getTransaction().begin();
             entitymanager.merge(user);
+            entitymanager.getTransaction().commit();
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
             return 2;
         }
-        
     }
 
     //添加一个收藏，返回状态：0 success，1 不存在,2其他原因
     @Override
     public boolean AddCollect(String userid,String seedid){
         EntityManager entitymanager = createEntityManager();
-        JPAQuery<User> query2 = new JPAQuery<>(entitymanager);
-        QUser u2 = QUser.user;
-        User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
-        if (user == null) {
-            return false;
-        }
-        JPAQuery<Seed> query3 = new JPAQuery<>(entitymanager);
-        QSeed p = QSeed.seed;
-        Seed seed = query3.select(p).from(p).where(p.seedid.eq(seedid)).fetchOne();
-        if (seed == null) {
-            return false;
-        }
-        JPAQuery<String> query = new JPAQuery<>(entitymanager);
-        QUserStar u = QUserStar.userStar;
-        List<String> allSeedId = query.select(u.seedid).from(u).where(u.userid.eq(userid)).fetch();
+        try {
+            JPAQuery<User> query2 = new JPAQuery<>(entitymanager);
+            QUser u2 = QUser.user;
+            User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
+            if (user == null) {
+                return false;
+            }
+            JPAQuery<Seed> query3 = new JPAQuery<>(entitymanager);
+            QSeed p = QSeed.seed;
+            Seed seed = query3.select(p).from(p).where(p.seedid.eq(seedid)).fetchOne();
+            if (seed == null) {
+                return false;
+            }
+            JPAQuery<String> query = new JPAQuery<>(entitymanager);
+            QUserStar u = QUserStar.userStar;
+            List<String> allSeedId = query.select(u.seedid).from(u).where(u.userid.eq(userid)).fetch();
 
-        if (allSeedId.contains(seedid)) {
+            if (allSeedId.contains(seedid)) {
+                return false;
+            }
+            UserStar userStar = new UserStar();
+            userStar.userid = userid;
+            userStar.seedid = seedid;
+            entitymanager.getTransaction().begin();
+            entitymanager.persist(userStar);
+            entitymanager.getTransaction().commit();
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
             return false;
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
         }
-        UserStar userStar = new UserStar();
-        userStar.userid = userid;
-        userStar.seedid = seedid;
-        entitymanager.persist(userStar);
-        return true;
     }
 
     //删除一个收藏，返回状态：0 success，1 不存在,2其他原因
     @Override
-    public boolean DeleteCollect(String userid,String seedid){
+    public boolean DeleteCollect(String userid, String seedid){
+        EntityManager entitymanager = createEntityManager();
         try {
-            EntityManager entitymanager = createEntityManager();
             JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
             QUserStar u = QUserStar.userStar;
             UserStar userStar = query.select(u).from(u).where(u.userid.eq(userid).and(u.seedid.eq(seedid))).fetchOne();
             if (userStar == null) {
                 return true; // 收藏不存在
             }
+            entitymanager.getTransaction().begin();
             entitymanager.remove(userStar);
+            entitymanager.getTransaction().commit();
             return true;
         } catch (Exception e) {
             e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
             return false;
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
         }
         
     }
@@ -1199,7 +1250,7 @@
 
             // 1:1兑换，直接加上魔力值（假设单位是MB）
             userPT.magic -= magic;
-            userPT.upload += magic;
+            userPT.upload += magic * 10000000;
 
             // 更新分享率
             if (userPT.download > 0) {
@@ -1216,6 +1267,7 @@
             if (tx != null && tx.isActive()) {
                 tx.rollback();
             }
+            e.printStackTrace();
             logger.error("魔力值兑换上传量时发生错误: {}", e.getMessage());
             return false;
         } finally {
@@ -1254,7 +1306,7 @@
 
             // 1:1兑换，直接减去魔力值对应的下载量（假设单位是MB）
             userPT.magic -= magic;
-            userPT.download = Math.max(0, userPT.download - magic);
+            userPT.download = Math.max(0, userPT.download - magic * 10000000);
 
             // 更新分享率
             if (userPT.download > 0) {
@@ -1308,7 +1360,7 @@
 
             // 1:1兑换VIP下载次数
             userPT.magic -= magic;
-            userPT.viptime += magic;
+            userPT.viptime += magic / 100;
 
             em.merge(userPT);
             tx.commit();
@@ -1456,10 +1508,13 @@
                     profile.uploadgived = String.valueOf(uploadToGive);
 
                     em.merge(userPT);
+                    em.merge(profile);
                 }
+            } else {
+                // 如果审核不通过，删除迁移申请
+                em.remove(profile);
+                logger.info("迁移申请 {} 审核不通过，已删除", profileid);
             }
-
-            em.merge(profile);
             tx.commit();
 
             logger.info("成功审核迁移申请 {}, 结果: {}", profileid, result);
@@ -1509,19 +1564,35 @@
     @Override
     public Post[] GetPostList() {
         EntityManager entitymanager = createEntityManager();
-        JPAQuery<Post> query = new JPAQuery<>(entitymanager);
-        QPost p = QPost.post;
-        List<Post> posts = query.select(p).from(p).fetch();
-        return posts.toArray(new Post[0]);
+        try{
+            JPAQuery<Post> query = new JPAQuery<>(entitymanager);
+            QPost p = QPost.post;
+            List<Post> posts = query.select(p).from(p).fetch();
+            return posts.toArray(new Post[0]);
+        } catch (Exception e) {
+            logger.error("获取帖子列表时发生错误: {}", e.getMessage());
+            return new Post[0];
+        } finally {
+            entitymanager.close();
+            logger.info("Post list retrieved successfully.");
+        }
     }
 
     @Override
     public Post GetPost(String postid) {
         EntityManager entitymanager = createEntityManager();
-        JPAQuery<Post> query = new JPAQuery<>(entitymanager);
-        QPost p = QPost.post;
-        Post post = query.select(p).from(p).where(p.postid.eq(postid)).fetchOne();
-        return post;
+        try {
+            JPAQuery<Post> query = new JPAQuery<>(entitymanager);
+            QPost p = QPost.post;
+            Post post = query.select(p).from(p).where(p.postid.eq(postid)).fetchOne();
+            return post;
+        } catch (Exception e) {
+            logger.error("获取帖子列表时发生错误: {}", e.getMessage());
+            return new Post();
+        } finally {
+            entitymanager.close();
+            logger.info("Post list retrieved successfully.");
+        }
     }
 
     @Override
@@ -1536,28 +1607,408 @@
     @Override
     public Post[] SearchPost(String postQ) {
         EntityManager entitymanager = createEntityManager();
-        JPAQuery<Post> query = new JPAQuery<>(entitymanager);
-        QPost p = QPost.post;
-        List<Post> posts = query.select(p).from(p).fetch();
+        try {
+            JPAQuery<Post> query = new JPAQuery<>(entitymanager);
+            QPost p = QPost.post;
+            List<Post> posts = query.select(p).from(p).fetch();
 
-        if (posts == null || postQ == null || postQ.trim().isEmpty()) {
+            if (posts == null || postQ == null || postQ.trim().isEmpty()) {
+                return posts.toArray(new Post[0]);
+            }
+
+            String processedQuery = postQ.toLowerCase().trim();
+            Map<Post, Integer> postCountMap = new HashMap<>();
+            for(Post post : posts){
+                String title = post.posttitle.toLowerCase().trim();
+                int count = countCommonCharacter(processedQuery, title);
+                postCountMap.put(post, count);
+            }
+            posts.sort((s1, s2) -> {
+                int count1 = postCountMap.getOrDefault(s1, 0);
+                int count2 = postCountMap.getOrDefault(s2, 0);
+                return Integer.compare(count2, count1);
+            });
+
             return posts.toArray(new Post[0]);
+        } catch (Exception e) {
+            logger.error("搜索帖子时发生错误: {}", e.getMessage());
+            return new Post[0];
+        } finally {
+            entitymanager.close();
+            logger.info("Post search completed successfully.");
         }
-
-        String processedQuery = postQ.toLowerCase().trim();
-        Map<Post, Integer> postCountMap = new HashMap<>();
-        for(Post post : posts){
-            String title = post.posttitle.toLowerCase().trim();
-            int count = countCommonCharacter(processedQuery, title);
-            postCountMap.put(post, count);
-        }
-        posts.sort((s1, s2) -> {
-            int count1 = postCountMap.getOrDefault(s1, 0);
-            int count2 = postCountMap.getOrDefault(s2, 0);
-            return Integer.compare(count2, count1);
-        });
-
-        return posts.toArray(new Post[0]);
     }
-}
 
+    @Override
+    public int CheckAdmin(String userid) {
+        if (userid == null || userid.isEmpty()) {
+            logger.warn("参数无效: userid为空");
+            return 2; // 参数无效
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        JPAQuery<String> query = new JPAQuery<>(entitymanager);
+        QAdmin a = QAdmin.admin;
+        String adminId = query.select(a.userId).from(a).where(a.userId.eq(userid)).fetchOne();
+        if (adminId == null) {
+            logger.warn("用户 {} 不是管理员", userid);
+            return 1; // 用户不是管理员
+        } else {
+            logger.info("用户 {} 是管理员", userid);
+            return 0; // 用户是管理员
+        }
+    }
+
+    @Override
+    public int InviteNewUser(String inviterid, String invitedemail) {
+        EntityManager entitymanager = createEntityManager();
+        try {
+            User user = entitymanager.find(User.class, inviterid);
+            if (user == null) {
+                return 3;
+            }
+            if (user.invitetimes <= 0) {
+                return 1;
+            }
+            user.invitetimes -= 1;
+
+            UserInvite invite = new UserInvite();
+            invite.userId = inviterid;
+            invite.inviterEmail = invitedemail;
+            invite.inviterRegistered = false;
+            invite.user = user;
+
+            entitymanager.getTransaction().begin();
+            entitymanager.merge(user);
+            entitymanager.persist(invite);
+            entitymanager.getTransaction().commit();
+            return 0;
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            return 2;
+        }
+    }
+
+    @Override
+    public UserStar[] GetUserStarList(String userid) {
+        if (userid == null || userid.isEmpty()) {
+            logger.warn("参数无效: userid为空");
+            return new UserStar[0];
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        try {
+            JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
+            QUserStar us = QUserStar.userStar;
+            List<UserStar> stars = query.select(us).from(us).where(us.userid.eq(userid)).fetch();
+            return stars.toArray(new UserStar[0]);
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            return new UserStar[0];
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public int UploadMigration(String userid, File file) {
+        if (userid == null || userid.isEmpty() || file == null) {
+            return 2; // 参数无效
+        }
+
+        EntityManager entitymanager = createEntityManager();
+
+        try {
+            // 检查用户是否存在
+            User user = entitymanager.find(User.class, userid);
+            if (user == null) {
+                return 1; // 用户不存在
+            }
+
+            // 创建迁移记录
+            Profile migration = new Profile();
+            migration.profileurl = java.util.UUID.randomUUID().toString();
+            migration.userid = userid;
+            migration.uploadtogive = "0"; // 初始上传量为0
+            migration.magictogive = "0"; // 初始魔力值为0
+            migration.downloadgived = "0"; // 初始下载量为0
+            migration.uploadgived = "0"; // 初始上传量为0
+            migration.magicgived = "0"; // 初始魔力值为0
+            migration.downloadgived = "0"; // 初始下载量为0
+            migration.exampass = false; // 初始审核状态为未通过
+            migration.user = user;
+            Path storageDir = Paths.get(config.MIGRATION_STORAGE_DIR);
+            if (!Files.exists(storageDir)) {
+                Files.createDirectories(storageDir);
+            }
+            String filename = file.getName();
+            Path target = storageDir.resolve(migration.profileurl + "_" + filename);
+            Files.copy(file.toPath(), target, StandardCopyOption.REPLACE_EXISTING);
+            migration.applicationurl = target.toString(); // 设置迁移文件的存储路径
+
+            entitymanager.getTransaction().begin();
+            entitymanager.persist(migration);
+            entitymanager.getTransaction().commit();
+
+            return 0; // 成功
+
+        } catch (Exception e) {
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            e.printStackTrace();
+            return 2; // 其他错误
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public BegSeedDetail[] GetBegList() {
+        EntityManager entitymanager = createEntityManager();
+        try {
+            JPAQuery<BegInfo> query = new JPAQuery<>(entitymanager);
+            QBegInfo b = QBegInfo.begInfo;
+            List<BegInfo> begList = query.select(b).from(b).fetch();
+            
+            List<BegSeedDetail> begSeedDetailList = new ArrayList<>();
+            for (BegInfo begInfo : begList) {
+                // 查询对应的BegInfo表的Info字段
+                BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begInfo.begid);
+                // 构造BegSeedDetail对象
+                BegSeedDetail begSeedDetail = new BegSeedDetail(begInfo, begInfoDetail);
+                begSeedDetailList.add(begSeedDetail);
+            }
+            
+            return begSeedDetailList.toArray(new BegSeedDetail[0]);
+        } catch (Exception e) {
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            e.printStackTrace();
+            return new BegSeedDetail[0];
+        } finally {
+            if(entitymanager != null){
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public BegInfo GetBegDetail(String begid) {
+        EntityManager entitymanager = createEntityManager();
+        try {
+            JPAQuery<BegInfo> query = new JPAQuery<>(entitymanager);
+            QBegInfo b = QBegInfo.begInfo;
+            BegInfo begDetail = query.select(b).from(b).where(b.begid.eq(begid)).fetchOne();
+            return begDetail;
+        } catch (Exception e) {
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            e.printStackTrace();
+            return null;
+        } finally {
+            if(entitymanager != null){
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public BegSeedDetail GetBegSeedDetail(String begid) {
+        if (begid == null || begid.isEmpty()) {
+            return null;
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        try {
+            // 查询 BegSeed 表数据
+            JPAQuery<BegInfo> begQuery = new JPAQuery<>(entitymanager);
+            QBegInfo b = QBegInfo.begInfo;
+            BegInfo begInfo = begQuery.select(b).from(b).where(b.begid.eq(begid)).fetchOne();
+            
+            if (begInfo == null) {
+                return null;
+            }
+
+            // 查询 BegInfo 表的 Info 字段
+            BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begid);
+            
+            // 构造返回对象
+            return new BegSeedDetail(begInfo, begInfoDetail);
+        } catch (Exception e) {
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            e.printStackTrace();
+            return null;
+        } finally {
+            if(entitymanager != null){
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public SeedWithVotes[] GetBegSeedListWithVotes(String begid) {
+        if (begid == null || begid.isEmpty()) {
+            return new SeedWithVotes[0];
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        try {
+            JPAQuery<Tuple> query = new JPAQuery<>(entitymanager);
+            QSubmitSeed ss = QSubmitSeed.submitSeed;
+            QSeed s = QSeed.seed;
+
+            List<Tuple> results = query.select(s, ss.votes)
+                    .from(ss)
+                    .join(ss.seed, s)
+                    .where(ss.begInfo.begid.eq(begid))
+                    .fetch();
+
+            List<SeedWithVotes> seedsWithVotes = new java.util.ArrayList<>();
+            for (Tuple result : results) {
+                Seed seed = result.get(s);
+                Integer votes = result.get(ss.votes);
+                seedsWithVotes.add(new SeedWithVotes(seed, votes != null ? votes : 0));
+            }
+
+            return seedsWithVotes.toArray(new SeedWithVotes[0]);
+        } catch (Exception e) {
+            return new SeedWithVotes[0];
+        } finally {
+            entitymanager.close();
+        }
+    }
+
+    @Override
+    public int SubmitBegSeed(String begid, String seedid, String userid) {
+        if (begid == null || begid.isEmpty() || seedid == null || seedid.isEmpty() || userid == null || userid.isEmpty()) {
+            return 2; // 参数无效
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        EntityTransaction tx = entitymanager.getTransaction();
+
+        try {
+            tx.begin();
+            
+            // 检查种子信息是否存在
+            Seed seed = entitymanager.find(Seed.class, seedid);
+            if (seed == null || !seed.seeduserid.equals(userid)) {
+                return 1;
+            }
+
+            // int ret = SubmitSeed(begid, seed);
+            BegInfo begInfo = entitymanager.find(BegInfo.class, begid);
+            if (begInfo == null) {
+                return 2;
+            }
+
+            // 检查种子是否已提交过
+            QSubmitSeed ss = QSubmitSeed.submitSeed;
+            SubmitSeed submitSeed = new JPAQuery<>(entitymanager)
+                    .select(ss)
+                    .from(ss)
+                    .where(ss.begInfo.begid.eq(begid))
+                    .where(ss.seed.seedid.eq(seed.seedid))
+                    .fetchOne();
+
+            submitSeed = new SubmitSeed();
+            submitSeed.begInfo = begInfo;
+            submitSeed.seed = seed;
+            submitSeed.votes = 0; // 初始投票数为0
+            BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begid);
+            if (begInfoDetail == null) {
+                return 1;
+            }
+
+            entitymanager.getTransaction().begin();
+            entitymanager.persist(submitSeed);
+            entitymanager.getTransaction().commit();
+
+            // 创建提交记录
+            entitymanager.createNativeQuery("INSERT INTO SubmitSeed (beg_id, seed_id, votes) VALUES (?, ?, 0)")
+                    .setParameter(1, begid)
+                    .setParameter(2, seed.seedid)
+                    .executeUpdate();
+            return 0;
+
+        } catch (Exception e) {
+            if (tx.isActive()) {
+                tx.rollback();
+            }
+            return 3; // 其他错误
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public int createBagSeed(BegInfo begInfo, String userid, String info) {
+        if (begInfo == null || begInfo.begid == null || begInfo.begid.isEmpty()) {
+            return 2; // 参数无效
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        try {
+            BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begInfo.begid);
+            if (begInfoDetail != null) {
+                return 1; // 已存在
+            }
+
+            User user = entitymanager.find(User.class, userid);
+            if (user == null) {
+                return 2; // 用户不存在
+            }
+
+            UserPT userPT = entitymanager.find(UserPT.class, userid);
+            if (userPT == null) {
+                return 2; // 用户PT信息不存在
+            }
+
+            if (userPT.magic < begInfo.magic) {
+                return 3; // 魔力值不足
+            }
+
+            begInfoDetail = new BegInfoDetail();
+            begInfoDetail.begId = begInfo.begid;
+            begInfoDetail.info = info;
+            begInfoDetail.userId = userid;
+            begInfoDetail.user = user;
+            userPT.magic -= begInfo.magic; // 扣除魔力值
+
+            entitymanager.getTransaction().begin();
+            entitymanager.persist(userPT);
+            entitymanager.persist(begInfo);
+            entitymanager.persist(begInfoDetail);
+            entitymanager.getTransaction().commit();
+
+            return 0;
+        } catch (Exception e) {
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            e.printStackTrace();
+            return 2; // 其他错误
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/database/Database2.java b/src/main/java/database/Database2.java
index 0166081..91dc8ff 100644
--- a/src/main/java/database/Database2.java
+++ b/src/main/java/database/Database2.java
@@ -3,9 +3,11 @@
 import java.util.Calendar;
 import java.util.UUID;
 import java.util.List;
+import java.util.ArrayList;
 import java.util.Map;
 import java.util.Date;
 import java.util.HashMap;
+import java.io.File;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
@@ -25,9 +27,13 @@
 import entity.config;
 import entity.Notice;
 import entity.BegInfo;
+import entity.BegInfoDetail;
+import entity.BegSeedDetail;
 import entity.Post;
 import entity.PostReply;
 import entity.Profile;
+import entity.UserStar;
+import entity.SeedWithVotes;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -1121,4 +1127,108 @@
     public Post[] SearchPost(String userQ) {
         return null;
     }
+
+    @Override
+    public int CheckAdmin(String userid) {
+        return 0;
+    }
+
+    @Override
+    public int InviteNewUser(String inviterid, String invitedemail) {
+        return 0;
+    }
+
+    @Override
+    public UserStar[] GetUserStarList(String userid) {
+        return new UserStar[0];
+    }
+
+    @Override
+    public int UploadMigration(String userid, File file){
+        return 0;
+    }
+
+    @Override
+    public BegSeedDetail[] GetBegList() {
+        EntityManager em = null;
+        try {
+            em = emf.createEntityManager();
+            
+            JPAQuery<BegInfo> query = new JPAQuery<>(em);
+            QBegInfo b = QBegInfo.begInfo;
+            List<BegInfo> begList = query.select(b).from(b).fetch();
+            
+            List<BegSeedDetail> begSeedDetailList = new ArrayList<>();
+            for (BegInfo begInfo : begList) {
+                // 查询对应的BegInfo表的Info字段
+                BegInfoDetail begInfoDetail = em.find(BegInfoDetail.class, begInfo.begid);
+                // 构造BegSeedDetail对象
+                BegSeedDetail begSeedDetail = new BegSeedDetail(begInfo, begInfoDetail);
+                begSeedDetailList.add(begSeedDetail);
+            }
+            
+            return begSeedDetailList.toArray(new BegSeedDetail[0]);
+        } catch (Exception e) {
+            logger.error("Error getting BegList: {}", e.getMessage(), e);
+            return new BegSeedDetail[0];
+        } finally {
+            if (em != null) {
+                em.close();
+            }
+        }
+    }
+
+    @Override
+    public BegInfo GetBegDetail(String begid) {
+        return null;
+    }
+
+    @Override
+    public BegSeedDetail GetBegSeedDetail(String begid) {
+        if (begid == null || begid.isEmpty()) {
+            return null;
+        }
+
+        EntityManager em = null;
+        try {
+            em = emf.createEntityManager();
+            
+            // 查询 BegSeed 表数据
+            JPAQuery<BegInfo> begQuery = new JPAQuery<>(em);
+            QBegInfo b = QBegInfo.begInfo;
+            BegInfo begInfo = begQuery.select(b).from(b).where(b.begid.eq(begid)).fetchOne();
+            
+            if (begInfo == null) {
+                return null;
+            }
+
+            // 查询 BegInfo 表的 Info 字段
+            BegInfoDetail begInfoDetail = em.find(BegInfoDetail.class, begid);
+            
+            // 构造返回对象
+            return new BegSeedDetail(begInfo, begInfoDetail);
+        } catch (Exception e) {
+            logger.error("Error getting BegSeedDetail: {}", e.getMessage(), e);
+            return null;
+        } finally {
+            if (em != null) {
+                em.close();
+            }
+        }
+    }
+
+    @Override
+    public SeedWithVotes[] GetBegSeedListWithVotes(String begid) {
+        return new SeedWithVotes[0];
+    }
+
+    @Override
+    public int SubmitBegSeed(String begid, String seedid, String userid) {
+        return 0;
+    }
+
+    @Override
+    public int createBagSeed(BegInfo begInfo, String userid, String info) {
+        return 0;
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/entity/Admin.java b/src/main/java/entity/Admin.java
new file mode 100644
index 0000000..d943295
--- /dev/null
+++ b/src/main/java/entity/Admin.java
@@ -0,0 +1,25 @@
+package entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import com.querydsl.core.annotations.QueryEntity;
+
+@QueryEntity
+@Entity(name = "Admin")
+@Table(name = "admin")
+public class Admin {
+    
+    @Id
+    @Column(name = "user_id", length = 36, nullable = false)
+    public String userId;
+    
+    public Admin() {
+    }
+    
+    public Admin(String userId) {
+        this.userId = userId;
+    }
+}
diff --git a/src/main/java/entity/BegInfoDetail.java b/src/main/java/entity/BegInfoDetail.java
new file mode 100644
index 0000000..75bd842
--- /dev/null
+++ b/src/main/java/entity/BegInfoDetail.java
@@ -0,0 +1,35 @@
+package entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "BegDetail")
+public class BegInfoDetail {
+    @Id
+    @Column(name = "beg_id", length = 64, nullable = false)
+    public String begId;
+
+    @Column(name = "user_id", length = 36, nullable = false)
+    public String userId;
+
+    @Column(name = "Info", nullable = false, columnDefinition = "TEXT")
+    public String info;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "user_id", insertable = false, updatable = false)
+    public User user;
+
+    public BegInfoDetail() {}
+
+    public BegInfoDetail(String begId, String userId, String info) {
+        this.begId = begId;
+        this.userId = userId;
+        this.info = info;
+    }
+}
diff --git a/src/main/java/entity/BegSeedDetail.java b/src/main/java/entity/BegSeedDetail.java
new file mode 100644
index 0000000..82dd9ec
--- /dev/null
+++ b/src/main/java/entity/BegSeedDetail.java
@@ -0,0 +1,45 @@
+package entity;
+
+import java.util.Date;
+
+/**
+ * 包含 BegSeed 表数据和对应 BegInfo 表 Info 字段的复合类
+ * 用于 getBegSeedDetail 方法返回完整的求种详情
+ */
+public class BegSeedDetail {
+    // BegSeed 表的字段
+    public String begid;
+    public int begnumbers;
+    public int magic;
+    public Date endtime;
+    public int hasseed;
+    
+    // BegInfo 表的 Info 字段
+    public String info;
+
+    public BegSeedDetail() {}
+
+    public BegSeedDetail(String begid, int begnumbers, int magic, Date endtime, int hasseed, String info) {
+        this.begid = begid;
+        this.begnumbers = begnumbers;
+        this.magic = magic;
+        this.endtime = endtime;
+        this.hasseed = hasseed;
+        this.info = info;
+    }
+
+    // 从 BegInfo 和 BegInfoDetail 构造
+    public BegSeedDetail(BegInfo begInfo, BegInfoDetail begInfoDetail) {
+        if (begInfo != null) {
+            this.begid = begInfo.begid;
+            this.begnumbers = begInfo.begnumbers;
+            this.magic = begInfo.magic;
+            this.endtime = begInfo.endtime;
+            this.hasseed = begInfo.hasseed;
+        }
+        
+        if (begInfoDetail != null) {
+            this.info = begInfoDetail.info;
+        }
+    }
+}
diff --git a/src/main/java/entity/SeedWithVotes.java b/src/main/java/entity/SeedWithVotes.java
new file mode 100644
index 0000000..96a2ba1
--- /dev/null
+++ b/src/main/java/entity/SeedWithVotes.java
@@ -0,0 +1,17 @@
+package entity;
+
+/**
+ * 包含种子信息和投票数的复合类
+ */
+public class SeedWithVotes {
+    public Seed seed;
+    public int votes;
+    
+    public SeedWithVotes() {
+    }
+    
+    public SeedWithVotes(Seed seed, int votes) {
+        this.seed = seed;
+        this.votes = votes;
+    }
+}
diff --git a/src/main/java/entity/config.java b/src/main/java/entity/config.java
index 3b9341b..0230066 100644
--- a/src/main/java/entity/config.java
+++ b/src/main/java/entity/config.java
@@ -1,19 +1,88 @@
 package entity;
 
 public class config {
-    public static final String TrackerURL="";
-    public static final int FarmNumber=3;
-    public static final int FakeTime=3;
-    public static final int BegVote=3;
-    public static final int CheatTime=5;
-    // 请根据实际环境修改为可达的地址
+    // 可配置的参数 - 使用静态变量而非final，以便动态修改
+    private static int farmNumber = 3;
+    private static int fakeTime = 3;
+    private static int begVote = 3;
+    private static int cheatTime = 5;
+    
+    // 数据库相关配置 - 保持final，因为运行时不应修改
     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";
     public static final String SqlPassword = "123456";
     public static final String SqlUsername = "root";
     public static final String TORRENT_STORAGE_DIR = "torrents";
-    public static final String trackerHost="0.0.0.0";
-    public static final int trackerPort=6969;
-    public static final int capturePort=6970;
+    public static final String APPEAL_STORAGE_DIR = "appeals";
+    public static final String MIGRATION_STORAGE_DIR = "migrations";
+    public static final String trackerHost = "0.0.0.0";
+    public static final int trackerPort = 6969;
+    public static final int capturePort = 6970;
+    
+    // FarmNumber 的 getter 和 setter
+    public static int getFarmNumber() {
+        return farmNumber;
+    }
+    
+    public static void setFarmNumber(int farmNumber) {
+        if (farmNumber > 0) {
+            config.farmNumber = farmNumber;
+        } else {
+            throw new IllegalArgumentException("FarmNumber must be positive");
+        }
+    }
+    
+    // FakeTime 的 getter 和 setter
+    public static int getFakeTime() {
+        return fakeTime;
+    }
+    
+    public static void setFakeTime(int fakeTime) {
+        if (fakeTime > 0) {
+            config.fakeTime = fakeTime;
+        } else {
+            throw new IllegalArgumentException("FakeTime must be positive");
+        }
+    }
+    
+    // BegVote 的 getter 和 setter
+    public static int getBegVote() {
+        return begVote;
+    }
+    
+    public static void setBegVote(int begVote) {
+        if (begVote > 0) {
+            config.begVote = begVote;
+        } else {
+            throw new IllegalArgumentException("BegVote must be positive");
+        }
+    }
+    
+    // CheatTime 的 getter 和 setter
+    public static int getCheatTime() {
+        return cheatTime;
+    }
+    
+    public static void setCheatTime(int cheatTime) {
+        if (cheatTime > 0) {
+            config.cheatTime = cheatTime;
+        } else {
+            throw new IllegalArgumentException("CheatTime must be positive");
+        }
+    }
+    
+    // 获取所有配置参数的方法
+    public static String getAllConfigs() {
+        return String.format("Config: FarmNumber=%d, FakeTime=%d, BegVote=%d, CheatTime=%d",
+                farmNumber, fakeTime, begVote, cheatTime);
+    }
+    
+    // 重置所有参数为默认值
+    public static void resetToDefaults() {
+        farmNumber = 3;
+        fakeTime = 3;
+        begVote = 3;
+        cheatTime = 5;
+    }
 }
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index bafddce..3c8a9f3 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1 +1,5 @@
-server.port=8081
\ No newline at end of file
+server.port=8082
+
+# 文件上传配置
+spring.servlet.multipart.max-file-size=100MB
+spring.servlet.multipart.max-request-size=100MB
\ No newline at end of file
diff --git a/src/test/java/cheattest/cheatsystest.java b/src/test/java/cheattest/cheatsystest.java
index 72873dc..a70de9b 100644
--- a/src/test/java/cheattest/cheatsystest.java
+++ b/src/test/java/cheattest/cheatsystest.java
@@ -283,7 +283,7 @@
                 Seed seed = new Seed();
                 seed.seedid = seedId;
                 seed.seeduserid = userId;
-                seed.faketime = 100 + i; // 设置为大于 config.FakeTime 的值
+                seed.faketime = 100 + i; // 设置为大于 config.getFakeTime() 的值
                 seed.lastfakecheck = new Date();
                 seed.outurl = "http://example.com/fake" + i;
                 seed.title = "Fake Seed " + i;
@@ -369,8 +369,8 @@
         return IntStream.range(0, 10)
             .mapToObj(i -> DynamicTest.dynamicTest("PunishUser test #" + i, () -> {
                 // 配置参数
-                int cheatTime = config.CheatTime;
-                int fakeTime = config.FakeTime;
+                int cheatTime = config.getCheatTime();
+                int fakeTime = config.getFakeTime();
 
                 // 插入用户 1（作弊用户）
                 String userId1 = UUID.randomUUID().toString();
diff --git "a/\345\274\200\345\217\221\346\226\207\346\241\243/create.sql" "b/\345\274\200\345\217\221\346\226\207\346\241\243/create.sql"
index 24fe897..2f66b7c 100644
--- "a/\345\274\200\345\217\221\346\226\207\346\241\243/create.sql"
+++ "b/\345\274\200\345\217\221\346\226\207\346\241\243/create.sql"
@@ -190,6 +190,8 @@
     FOREIGN KEY (`seed_id`) REFERENCES `Seed` (`seed_id`) ON DELETE CASCADE
 ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
 
+<<<<<<< Updated upstream
+<<<<<<< Updated upstream
 -- 种子促销表
 CREATE TABLE `SeedPromotion` (
     `promotion_id` VARCHAR(64) NOT NULL,
@@ -199,4 +201,15 @@
     `discount` TINYINT NOT NULL DEFAULT 1 COMMENT '折扣率, 1表示无折扣',
     PRIMARY KEY (`promotion_id`),
     FOREIGN KEY (`seed_id`) REFERENCES `Seed` (`seed_id`) ON DELETE CASCADE
-) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
\ No newline at end of file
+) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
+
+CREATE TABLE `BegInfo` (
+    `beg_id` varchar(64) NOT NULL,
+    `user_id` varchar(36) NOT NULL,
+    `Info` text NOT NULL,
+    PRIMARY KEY (`beg_id`),
+    CONSTRAINT `fk_BegInfo_BegSeed` FOREIGN KEY (`beg_id`) REFERENCES `BegSeed` (`beg_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+    CONSTRAINT `fk_BegInfo_User` FOREIGN KEY (`user_id`) REFERENCES `User` (`user_id`) ON DELETE CASCADE
+
+) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci
+
