diff --git a/.gitignore b/.gitignore
index a221ac1..764386a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 target/
 .vscode/
+torrents/
\ No newline at end of file
diff --git a/src/main/java/api/ApiApplication.java b/src/main/java/api/ApiApplication.java
index 93eb640..6d65a81 100644
--- a/src/main/java/api/ApiApplication.java
+++ b/src/main/java/api/ApiApplication.java
@@ -8,4 +8,18 @@
     public static void main(String[] args) {
         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 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
diff --git a/src/main/java/api/ApiInterface.java b/src/main/java/api/ApiInterface.java
index ab3408c..6859aa6 100644
--- a/src/main/java/api/ApiInterface.java
+++ b/src/main/java/api/ApiInterface.java
@@ -23,8 +23,17 @@
 
     @GetMapping("/get-torrent")
     ResponseEntity<Resource> getTorrent(
-        @RequestParam("seedid") String seedid,
-        @RequestParam("userid") String userid,
-        @RequestParam("ip") String ip
+        @RequestParam("torrentId") String seedid,
+        @RequestParam("userId") String userid
+    );
+
+    @GetMapping("/get-seed-list-by-tag")
+    ResponseEntity<String> getSeedListByTag(
+        @RequestParam("tag") String tag
+    );
+
+    @GetMapping("/torrent-detail")
+    ResponseEntity<String> getTorrentDetail(
+        @RequestParam("id") String seedid
     );
 }
\ No newline at end of file
diff --git a/src/main/java/database/DataManagerInterface.java b/src/main/java/database/DataManagerInterface.java
index b92d18d..e737daa 100644
--- a/src/main/java/database/DataManagerInterface.java
+++ b/src/main/java/database/DataManagerInterface.java
@@ -23,7 +23,8 @@
     public int UpdateSeed(Seed seedinfo);//接收新的种子然后更新其全部属性;
 
     public Seed[] SearchSeed(String userQ);//传入搜索的关键词或句子，返回搜索到的种子信息（按照公共字符数量排序）
-    
+    public Seed[] GetSeedListByTag(String tag);//获取某个标签下的种子列表
+
     public int AddNotice(Notice notice);//返回状态：0 success，1 重复，2其他原因
     public boolean UpdateNotice(Notice notice);//返回状态：0 success，1 重复，2其他原因
     public boolean DeleteNotice(String noticeid);//删除公告，返回状态：0 success，1 重复，2其他原因
diff --git a/src/main/java/database/Database1.java b/src/main/java/database/Database1.java
index f835288..ed64717 100644
--- a/src/main/java/database/Database1.java
+++ b/src/main/java/database/Database1.java
@@ -156,20 +156,40 @@
         return seed;
     }
 
+    @Override
+    public Seed[] GetSeedListByTag(String tag){
+        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
+        QSeed s = QSeed.seed;
+        List<Seed> seeds = query.select(s).from(s).where(s.seedtag.eq(tag)).fetch();
+        return seeds.toArray(new Seed[0]);
+    }
+
     //添加一个新的种子，0成功，其他失败信息待定;
     @Override
     public int RegisterSeed(Seed seedinfo){
         try {
+            entitymanager.getTransaction().begin();
             JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
             QSeed s = QSeed.seed;
             Seed seed = query.select(s).from(s).where(s.seedid.eq(seedinfo.seedid)).fetchOne();
+            User user = entitymanager.find(User.class, seedinfo.seeduserid);
+            if (user == null) {
+                entitymanager.getTransaction().rollback();
+                return 2; // 用户不存在
+            }
+            seed.user = user; // 设置种子的用户关联
             if (seed != null) {
+                entitymanager.getTransaction().rollback();
                 return 1;
             }
             entitymanager.persist(seedinfo);
+            entitymanager.getTransaction().commit();
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
             return 2;
         }
     }
diff --git a/src/main/java/database/Database2.java b/src/main/java/database/Database2.java
index 8ea93b0..5152e47 100644
--- a/src/main/java/database/Database2.java
+++ b/src/main/java/database/Database2.java
@@ -128,6 +128,11 @@
     }
 
     @Override
+    public Seed[] GetSeedListByTag(String tag) {
+        return new Seed[0];
+    }
+
+    @Override
     public boolean AddCollect(String userid, String postid) {
         return false;
     }
diff --git a/src/main/java/tracker/Tracker.java b/src/main/java/tracker/Tracker.java
index da92c17..008ac4a 100644
--- a/src/main/java/tracker/Tracker.java
+++ b/src/main/java/tracker/Tracker.java
@@ -186,7 +186,7 @@
         }
     }
     @Override
-    public File GetTTorent(String seedid, String userid, String ip) {
+    public File GetTTorent(String seedid, String userid) {
         EntityManager em = emf.createEntityManager();
         EntityTransaction tx = em.getTransaction();
         File file = null;
@@ -203,7 +203,6 @@
             SeedDownload sd = new SeedDownload();
             sd.seedId = seedid;
             sd.userId = userid;
-            sd.clientIp = ip;
             LocalDateTime now = LocalDateTime.now();
             sd.downloadStart = now;
             sd.downloadEnd = now;
diff --git a/src/main/java/tracker/TrackerInterface.java b/src/main/java/tracker/TrackerInterface.java
index eb9d002..b65b8be 100644
--- a/src/main/java/tracker/TrackerInterface.java
+++ b/src/main/java/tracker/TrackerInterface.java
@@ -1,7 +1,6 @@
 package tracker;
 import java.io.File;
 
-import entity.TTorent;
 import entity.TransRecord;
 public interface TrackerInterface{
     public boolean AddUpLoad(String userid,int upload);//给用户新增上传量，返回0成功，返回1失败;
@@ -12,7 +11,7 @@
     public boolean ReduceMagic(String userid,int magic);//给用户减少魔力值，返回0成功，返回1失败;
 
     public int SaveTorrent(String seedid,File TTorent);//保存seedid对应的ttorent信息
-    public File GetTTorent(String seedid,String userid,String ip);//根据种子id获得ttorent信息然后构建Ttorent文件并返回,同时记录用户的下载行为
+    public File GetTTorent(String seedid,String userid);//根据种子id获得ttorent信息然后构建Ttorent文件并返回,同时记录用户的下载行为
     
     public int AddRecord(TransRecord rd);//新增一个seedid对应的种子的传输任务记录
 }
\ No newline at end of file
diff --git a/src/test/java/trackertest/TrackerTest.java b/src/test/java/trackertest/TrackerTest.java
index 8f45a4a..c307ba6 100644
--- a/src/test/java/trackertest/TrackerTest.java
+++ b/src/test/java/trackertest/TrackerTest.java
@@ -8,15 +8,18 @@
 import java.util.UUID;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
+
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.EntityTransaction;
 import javax.persistence.Persistence;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.DynamicTest;
 import org.junit.jupiter.api.TestFactory;
+
 import entity.Seed;
 import entity.TransRecord;
 import entity.TransportId;
@@ -327,7 +330,7 @@
                 Assertions.assertNotNull(seed.url, "Seed.url 应已被更新");
                 // 调用 GetTTorent 并断言路径一致
                 String uid = userIds.get(0), ip = "127.0.0.1";
-                File ret = tracker.GetTTorent(sid, uid, ip);
+                File ret = tracker.GetTTorent(sid, uid);
                 File expected = new File(seed.url);
                 Assertions.assertNotNull(ret, "应返回文件对象");
                 Assertions.assertEquals(
