diff --git a/src/main/java/api/ApiController.java b/src/main/java/api/ApiController.java
index 7566108..42bc7e3 100644
--- a/src/main/java/api/ApiController.java
+++ b/src/main/java/api/ApiController.java
@@ -8,6 +8,7 @@
 import java.text.ParseException;
 
 import javax.annotation.PostConstruct;
+import javax.persistence.criteria.CriteriaBuilder.In;
 
 import org.springframework.core.io.FileSystemResource;
 import org.springframework.core.io.Resource;
@@ -41,6 +42,8 @@
 import entity.BegInfoDetail;
 import entity.UserStar;
 import entity.SeedWithVotes;
+import entity.SeedPromotion;
+import entity.SeedWithPromotionDTO;
 
 import java.util.UUID;
 
@@ -86,7 +89,6 @@
             seed.seedsize = "1GB";
             seed.seedtag = tag;
             seed.url = "http://example.com/torrent"; // 示例URL
-            System.out.println("seed is null? " + (seed == null));
             int ret = db1.RegisterSeed(seed);
             if (ret != 0) {
                 // 如果注册种子失败，返回错误状态
@@ -126,7 +128,7 @@
         @RequestParam("tag") String tag
     ) {
         try {
-            Seed[] seeds = db1.GetSeedListByTag(tag);
+            SeedWithPromotionDTO[] seeds = db1.GetSeedListByTag(tag);
             if (seeds == null) {
                 return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 404 表示未找到种子
             }
@@ -408,7 +410,6 @@
         @RequestBody String requestBody
     ) {
         try {
-            System.out.println("Register request body: " + requestBody);
             // 解析 JSON 数据
             com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
             
@@ -453,7 +454,6 @@
             
             // 调用数据库注册方法
             int ret = db1.RegisterUser(user);
-            System.out.println("Register result: " + ret);
             
             // // 如果注册成功，还需要创建对应的 UserPT 记录
             // if (ret == 0) {
@@ -993,19 +993,22 @@
             // 解析 JSON 数据
             com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
             com.fasterxml.jackson.databind.JsonNode migrationidNode = jsonNode.get("migration_id");
-            if (migrationidNode == null) {
+            com.fasterxml.jackson.databind.JsonNode grantedUploadedNode = jsonNode.get("granted_uploaded");
+            if (migrationidNode == null || grantedUploadedNode == null) {
                 return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
             }
             String migrationid = migrationidNode.asText();
-            System.out.println("Migration ID: " + migrationid);
+            Integer grantedUploaded = grantedUploadedNode != null ? grantedUploadedNode.asInt() : null;
+            if (grantedUploaded == null || grantedUploaded < 0) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 上传量必须为非负整数
+            }
             
             // 添加参数验证
             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);
+            boolean ret = db1.ExamTransmitProfile(migrationid, true, grantedUploaded);
             if (ret) {
                 return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
             } else {
@@ -1039,7 +1042,7 @@
                 return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
             }
             
-            boolean ret = db1.ExamTransmitProfile(migrationid, false);
+            boolean ret = db1.ExamTransmitProfile(migrationid, false, 0);
             if (ret) {
                 return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
             } else {
@@ -1100,7 +1103,6 @@
         @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() ||
@@ -1109,16 +1111,13 @@
             }
             
             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) {
@@ -1127,7 +1126,6 @@
                 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();
@@ -1190,7 +1188,6 @@
             } 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) {
@@ -1311,12 +1308,14 @@
     @CrossOrigin(origins = "*", allowedHeaders = "*")
     public ResponseEntity<Integer> migrateAccount(
         @RequestParam("userid") String userid,
-        @RequestParam("file") MultipartFile file
+        @RequestParam("file") MultipartFile file,
+        @RequestParam("uploadtogive") String uploadtogive
     ) {
         try {
             // 先进行参数验证
             if (userid == null || userid.trim().isEmpty() || 
-                file == null || file.isEmpty()) {
+                file == null || file.isEmpty() ||
+                uploadtogive == null || uploadtogive.trim().isEmpty()) {
                 return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
             }
             
@@ -1327,7 +1326,7 @@
             File tempFile = File.createTempFile(userid, file.getOriginalFilename());
             file.transferTo(tempFile);
 
-            int ret = db1.UploadMigration(userid, tempFile);
+            int ret = db1.UploadMigration(userid, tempFile, uploadtogive);
             if (ret == 0) {
                 return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
             } else if (ret == 1) {
@@ -1364,7 +1363,6 @@
         @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 表示参数不完整
             }
@@ -1415,7 +1413,6 @@
         @RequestBody String requestBody
     ) {
         try {
-            System.out.println("submitSeed called with requestBody: " + requestBody);
             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");
@@ -1436,7 +1433,6 @@
             }
 
             int ret = db1.SubmitBegSeed(begid, seedid, userid);
-            System.out.println("submitSeed result: " + ret);
             if (ret == 0) {
                 return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
             } else if (ret == 1) {
@@ -1545,4 +1541,95 @@
             return new ResponseEntity<>(1, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 1 表示处理失败
         }
     }
+
+    @Override
+    public ResponseEntity<String> getAllSeeds(){
+        try {
+            Seed[] allSeeds = db1.getAllSeeds();
+            if (allSeeds == null) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到种子列表
+            }
+            String json = mapper.writeValueAsString(allSeeds);
+            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> getAllSeedPromotions() {
+        try {
+            SeedPromotion[] promotions = db1.getAllSeedPromotions();
+            if (promotions == null) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到种子推广
+            }
+            String json = mapper.writeValueAsString(promotions);
+            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> createSeedPromotion(
+        @RequestBody String requestBody
+    ) {
+        try {
+            com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+            com.fasterxml.jackson.databind.JsonNode seedidNode = jsonNode.get("seed_id");
+            com.fasterxml.jackson.databind.JsonNode startTimeNode = jsonNode.get("start_time");
+            com.fasterxml.jackson.databind.JsonNode endTimeNode = jsonNode.get("end_time");
+            com.fasterxml.jackson.databind.JsonNode discountNode = jsonNode.get("discount");
+
+            if (seedidNode == null || startTimeNode == null || endTimeNode == null || discountNode == null) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+
+            String seedid = seedidNode.asText();
+            Date startTime;
+            Date endTime;
+            Integer discount = discountNode.asInt();
+            if (discount == null || discount < 0) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 折扣参数错误
+            }
+            try {
+                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm");
+                String startTimeStr = startTimeNode.asText();
+                startTime = dateFormat.parse(startTimeStr);
+                String endTimeStr = endTimeNode.asText();
+                endTime = dateFormat.parse(endTimeStr);
+            } catch (ParseException e) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 日期格式错误
+            }
+
+            if (seedid == null || seedid.trim().isEmpty() ||
+                startTime == null || endTime == null) {
+                return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST); // 参数不完整
+            }
+
+            int ret = db1.createSeedPromotion(seedid, startTime, endTime, discount);
+            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 (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);
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/api/ApiInterface.java b/src/main/java/api/ApiInterface.java
index 475b5d2..b395f7b 100644
--- a/src/main/java/api/ApiInterface.java
+++ b/src/main/java/api/ApiInterface.java
@@ -193,7 +193,8 @@
     @PostMapping("/migrate-account")
     ResponseEntity<Integer> migrateAccount(
         @RequestParam("userid") String userid,
-        @RequestParam("file") MultipartFile file
+        @RequestParam("file") MultipartFile file,
+        @RequestParam("uploadtogive") String uploadtogive
     );
 
     @GetMapping("/begseed-list")
@@ -223,4 +224,15 @@
     ResponseEntity<Integer> createBegSeed(
         @RequestBody String requestBody
     );
+
+    @GetMapping("/all-seeds")
+    ResponseEntity<String> getAllSeeds();
+
+    @GetMapping("/all-seed-promotions")
+    ResponseEntity<String> getAllSeedPromotions();
+
+    @PostMapping("/set-seed-promotion")
+    ResponseEntity<Integer> createSeedPromotion(
+        @RequestBody String requestBody
+    );
 }
\ No newline at end of file
