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;
+    }
 }
