diff --git a/src/main/java/api/ApiController.java b/src/main/java/api/ApiController.java
index a683b0e..d8528db 100644
--- a/src/main/java/api/ApiController.java
+++ b/src/main/java/api/ApiController.java
@@ -2,25 +2,41 @@
 
 import java.io.File;
 
+import javax.annotation.PostConstruct;
+
 import org.springframework.core.io.FileSystemResource;
 import org.springframework.core.io.Resource;
 import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.bind.annotation.CrossOrigin;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 import database.Database1;
 import entity.Seed;
 import tracker.Tracker;
 
+
 @RestController
 public class ApiController implements ApiInterface {
 
-    private static Database1 db;
-
+    private static Database1 db1;
     private static Tracker tracker;
+    private static ObjectMapper mapper;
+
+    @PostConstruct
+    public void init() {
+        db1 = new Database1();
+        tracker = new Tracker();
+        mapper = new ObjectMapper();
+        mapper.configure(com.fasterxml.jackson.databind.SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
+    }
 
     @Override
     public ResponseEntity<Integer> saveTorrent(
@@ -37,42 +53,106 @@
             seed.seedsize = "1GB"; // 示例种子大小
             seed.seedtag = tag; // 示例标签
             seed.url = "http://example.com/torrent"; // 示例URL
-            db = new Database1();
-            tracker = new Tracker();
-            int ret = db.RegisterSeed(seed);
-            System.out.println("RegisterSeed ret: " + ret);
-            System.out.println(seed.seedid + " " + seed.seeduserid + " " + seed.title + " " + seed.seedsize + " " + seed.seedtag + " " + seed.url);
+
+            int ret = db1.RegisterSeed(seed);
+            // System.out.println("RegisterSeed ret: " + ret);
+            // System.out.println(seed.seedid + " " + seed.seeduserid + " " + seed.title + " " + seed.seedsize + " " + seed.seedtag + " " + seed.url);
+
             // Convert MultipartFile to File
             File tempFile = File.createTempFile(seed.seedid, file.getOriginalFilename());
             file.transferTo(tempFile);
+
             tracker.SaveTorrent(seed.seedid, tempFile);
+
             // Optionally, delete the temp file after saving if not needed
             // tempFile.delete();
-            return ResponseEntity.ok(0); // 返回 0 表示成功
+
+            // 创建带有 CORS 响应头的 ResponseEntity
+            HttpHeaders headers = new HttpHeaders();
+            headers.add("Access-Control-Allow-Origin", "*"); // 允许所有域名访问，可以根据需要调整为特定域名
+            headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); // 允许的 HTTP 方法
+            headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization"); // 允许的请求头
+
+            return new ResponseEntity<>(0, headers, HttpStatus.OK); // 返回 0 表示成功
         } catch (Exception e) {
             e.printStackTrace();
-            return ResponseEntity.status(500).body(1); // 返回 1 表示失败
+
+            // 创建带有 CORS 响应头的错误 ResponseEntity
+            HttpHeaders errorHeaders = new HttpHeaders();
+            errorHeaders.add("Access-Control-Allow-Origin", "*");
+            errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+            errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
+
+            return new ResponseEntity<>(1, errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 1 表示失败
         }
     }
 
     @Override
+    @CrossOrigin(origins = "*", allowedHeaders = "*") // 允许所有来源和头部
     public ResponseEntity<Resource> getTorrent(
-        @RequestParam("seedid") String seedid,
-        @RequestParam("userid") String userid,
-        @RequestParam("ip") String ip
+            @RequestParam("torrentId") String seedid,
+            @RequestParam("userId") String userid
     ) {
-        // 实现获取种子文件的逻辑
-        // 示例：从本地目录中查找文件
-        tracker = new Tracker();
-        File file = tracker.GetTTorent(seedid, userid, ip);
+        File file = tracker.GetTTorent(seedid, userid);
         if (file != null) {
             FileSystemResource resource = new FileSystemResource(file);
             return ResponseEntity.ok()
                 .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getName() + "\"")
+                .header(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION) // 关键：允许前端访问Content-Disposition
                 .contentType(MediaType.APPLICATION_OCTET_STREAM)
                 .body(resource);
         } else {
-            return ResponseEntity.notFound().build(); // 返回 404 表示文件未找到
+            return ResponseEntity.notFound().build();
+        }
+    }
+
+    //无按标签查询的函数
+    @Override
+    public ResponseEntity<String> getSeedListByTag(
+        @RequestParam("tag") String tag
+    ) {
+        try {
+            Seed[] seeds = db1.GetSeedListByTag(tag);
+            String json = mapper.writeValueAsString(seeds);
+            // System.out.println("getSeedListByTag: " + json);
+            HttpHeaders headers = new HttpHeaders();
+            headers.add("Access-Control-Allow-Origin", "*");
+            headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+            headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            HttpHeaders errorHeaders = new HttpHeaders();
+            errorHeaders.add("Access-Control-Allow-Origin", "*");
+            errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+            errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    public ResponseEntity<String> getTorrentDetail(
+        @RequestParam("id") String seedid
+    ) {
+        try {
+            Seed seed = db1.GetSeedInformation(seedid);
+            if (seed != null) {
+                String json = mapper.writeValueAsString(seed);
+                HttpHeaders headers = new HttpHeaders();
+                headers.add("Access-Control-Allow-Origin", "*");
+                headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+                headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
+                return new ResponseEntity<>(json, headers, HttpStatus.OK);
+            } else {
+                return ResponseEntity.notFound().build(); // 返回 404 表示种子未找到
+            }
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            HttpHeaders errorHeaders = new HttpHeaders();
+            errorHeaders.add("Access-Control-Allow-Origin", "*");
+            errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+            errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
+            return new ResponseEntity<>("{}", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
         }
     }
 }
\ No newline at end of file
