diff --git a/src/main/java/api/ApiController.java b/src/main/java/api/ApiController.java
index 326255d..c2562bc 100644
--- a/src/main/java/api/ApiController.java
+++ b/src/main/java/api/ApiController.java
@@ -27,6 +27,7 @@
 import entity.User;
 import entity.Post;
 import entity.PostReply;
+import entity.UserPT;
 
 import java.util.UUID;
 
@@ -548,7 +549,6 @@
             // 添加 replies 数组
             com.fasterxml.jackson.databind.node.ArrayNode repliesArray = mapper.createArrayNode();
             if (replies != null) {
-                System.out.println("Replies count: " + replies.length);
                 for (PostReply reply : replies) {
                     com.fasterxml.jackson.databind.node.ObjectNode replyJson = mapper.createObjectNode();
                     replyJson.put("replyid", reply.replyid);
@@ -602,7 +602,6 @@
         @RequestBody String requestBody
     ) {
         try {
-            System.out.println("Add reply request body: " + requestBody);
             // 解析 JSON 数据
             com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
             com.fasterxml.jackson.databind.JsonNode postidNode = jsonNode.get("postid");
@@ -617,10 +616,6 @@
             String authorid = authoridNode.asText();
             String content = contentNode.asText();
 
-            System.out.println("Post ID: " + postid);
-            System.out.println("Author ID: " + authorid);
-            System.out.println("Content: " + content);
-
             // 参数验证
             if (postid == null || postid.trim().isEmpty() || 
                 authorid == null || authorid.trim().isEmpty() || 
@@ -629,7 +624,6 @@
             }
             
             int ret = db1.AddComment(postid, authorid, content);
-            System.out.println("Add comment result: " + ret);
             if (ret == 0) {
                 return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
             } else {
@@ -649,20 +643,74 @@
         @RequestParam("tag") String tag,
         @RequestParam("keyword") String query
     ) {
-        return null;
-    //     try {
-    //         Seed[] seeds = db1.SearchSeeds(query);
-    //         if (seeds == null || seeds.length == 0) {
-    //             return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 404 表示未找到种子
-    //         }
-    //         String json = mapper.writeValueAsString(seeds);
-    //         return new ResponseEntity<>(json, headers, HttpStatus.OK);
-    //     } catch (JsonProcessingException e) {
-    //         e.printStackTrace();
-    //         return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
-    //     } catch (Exception e) {
-    //         e.printStackTrace();
-    //         return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
-    //     }
+        try {
+            Seed[] seeds = db1.SearchSeed(query);
+            if (seeds == null || seeds.length == 0) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到种子
+            }
+            
+            // 过滤掉与前端要求tag不同的种子
+            java.util.List<Seed> filteredSeeds = new java.util.ArrayList<>();
+            for (Seed seed : seeds) {
+                if (seed.seedtag != null && seed.seedtag.equals(tag)) {
+                    filteredSeeds.add(seed);
+                }
+            }
+            
+            // 如果过滤后没有匹配的种子，返回空数组
+            if (filteredSeeds.isEmpty()) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND);
+            }
+            
+            Seed[] filteredSeedsArray = filteredSeeds.toArray(new Seed[0]);
+            String json = mapper.writeValueAsString(filteredSeedsArray);
+            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> searchPosts(
+        @RequestParam("keyword") String query
+    ) {
+        try {
+            Post[] posts = db1.SearchPost(query);
+            if (posts == null || posts.length == 0) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到帖子
+            }
+            String json = mapper.writeValueAsString(posts);
+            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> getUserPT(
+        @RequestParam("userid") String userid
+    ) {
+        try {
+            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);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
     }
 }
\ No newline at end of file
