diff --git a/pom.xml b/pom.xml
index af34658..65998ab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -108,6 +108,14 @@
         </dependency>
 
         <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.26</version>
+            <scope>provided</scope>
+        </dependency>
+
+
+        <dependency>
             <groupId>org.mybatis.spring.boot</groupId>
             <artifactId>mybatis-spring-boot-starter</artifactId>
             <version>3.0.3</version>
diff --git a/src/main/java/edu/bjtu/groupone/backend/api/TorrentController.java b/src/main/java/edu/bjtu/groupone/backend/api/TorrentController.java
index ef321b1..0e36a92 100644
--- a/src/main/java/edu/bjtu/groupone/backend/api/TorrentController.java
+++ b/src/main/java/edu/bjtu/groupone/backend/api/TorrentController.java
@@ -20,6 +20,7 @@
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
+import java.util.Map;
 
 @Tag(name = "Torrent 管理", description = "种子文件的上传、下载及列表查询")
 @RestController
@@ -75,32 +76,51 @@
 
     }
 
-    @Operation(summary = "下载种子文件", description = "根据 infoHash 返回对应的 .torrent 文件，支持断点续传")
+    @Operation(summary = "下载种子文件", description = "根据 infoHash 返回对应的种子文件 URL（由 OSS 提供）")
     @ApiResponses({
             @ApiResponse(
                     responseCode = "200",
-                    description = "返回 .torrent 文件流",
+                    description = "返回 OSS 上的种子文件下载地址",
                     content = @Content(
-                            mediaType = "application/x-bittorrent",
+                            mediaType = "application/json",
                             examples = @ExampleObject(
-                                    name = "下载文件示例",
-                                    value = "<二进制流略>"
+                                    name = "下载链接示例",
+                                    value = "{ \"url\": \"https://your-bucket.oss-cn-region.aliyuncs.com/abc.torrent\" }"
                             )
                     )
             ),
             @ApiResponse(responseCode = "404", description = "未找到对应的种子文件")
     })
     @GetMapping("/download/{infoHash}")
-    public ResponseEntity<Resource> downloadTorrent(
+    public ResponseEntity<?> downloadTorrent(
             @Parameter(description = "种子文件的唯一 infoHash", required = true, example = "207d69a047830000620c586e199fc3424e7e5dd8")
             @PathVariable String infoHash) {
         try {
-            Resource resource = torrentService.downloadTorrent(infoHash);
-            return ResponseEntity.ok()
-                    .header("Content-Disposition", "attachment; filename=\"" + infoHash + ".torrent\"")
-                    .body(resource);
+            String url = torrentService.getTorrentUrl(infoHash);
+            if (url != null) {
+                return ResponseEntity.ok(Map.of("url", url));
+            } else {
+                return ResponseEntity.status(HttpStatus.NOT_FOUND).body("未找到对应的种子文件");
+            }
         } catch (Exception ex) {
-            return ResponseEntity.notFound().build();
+            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("下载链接生成失败");
+        }
+    }
+
+    @Operation(summary = "删除种子文件", description = "根据 infoHash 删除服务器上对应的 .torrent 文件和数据库记录")
+    @ApiResponses({
+            @ApiResponse(responseCode = "200", description = "删除成功"),
+            @ApiResponse(responseCode = "404", description = "未找到对应的种子文件")
+    })
+    @DeleteMapping("/delete/{infoHash}")
+    public ResponseEntity<?> deleteTorrent(
+            @Parameter(description = "种子文件的唯一 infoHash", required = true, example = "207d69a047830000620c586e199fc3424e7e5dd8")
+            @PathVariable String infoHash) {
+        boolean deleted = torrentService.deleteTorrent(infoHash);
+        if (deleted) {
+            return ResponseEntity.ok("删除成功");
+        } else {
+            return ResponseEntity.status(HttpStatus.NOT_FOUND).body("未找到对应的种子文件");
         }
     }
 
@@ -132,7 +152,7 @@
                     )
             )
     )
-    @PostMapping("/getTorrentList")
+    @GetMapping("/getTorrentList")
     public ResponseEntity<?> getTorrentList() throws Exception {
 
         List<Torrent> list = torrentService.getTorrentList();
diff --git a/src/main/java/edu/bjtu/groupone/backend/mapper/TorrentMapper.java b/src/main/java/edu/bjtu/groupone/backend/mapper/TorrentMapper.java
index 3977ea4..454aeaa 100644
--- a/src/main/java/edu/bjtu/groupone/backend/mapper/TorrentMapper.java
+++ b/src/main/java/edu/bjtu/groupone/backend/mapper/TorrentMapper.java
@@ -1,17 +1,28 @@
 package edu.bjtu.groupone.backend.mapper;
 
 import edu.bjtu.groupone.backend.domain.entity.Torrent;
+import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
 import java.util.List;
 
+@Mapper
 public interface TorrentMapper {
-    @Insert("insert into torrents (name,info_hash,size,uploader_id,url) values (#{name},#{infoHash},#{size},#{uploaderId},#{url})")
+
+    @Insert("INSERT INTO torrents (name, info_hash, size, uploader_id, url) " +
+            "VALUES (#{name}, #{infoHash}, #{size}, #{uploaderId}, #{url})")
     void insertTorrent(Torrent torrent);
 
-    Torrent selectByInfoHash(String infoHash);
+    @Select("SELECT * FROM torrents WHERE info_hash = #{infoHash}")
+    Torrent selectByInfoHash(@Param("infoHash") String infoHash);
 
-    @Select("select * from torrents")
+    @Delete("DELETE FROM torrents WHERE info_hash = #{infoHash}")
+    void deleteByInfoHash(@Param("infoHash") String infoHash);
+
+    @Select("SELECT * FROM torrents")
     List<Torrent> getTorrentList();
+
 }
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/TorrentService.java b/src/main/java/edu/bjtu/groupone/backend/service/TorrentService.java
index 9c51eef..3c87e63 100644
--- a/src/main/java/edu/bjtu/groupone/backend/service/TorrentService.java
+++ b/src/main/java/edu/bjtu/groupone/backend/service/TorrentService.java
@@ -9,7 +9,9 @@
 public interface TorrentService {
     Torrent uploadTorrent(MultipartFile file, Long userId) throws Exception;
 
-    Resource downloadTorrent(String infoHash) throws Exception;
+    String getTorrentUrl(String infoHash);
+
+    boolean deleteTorrent(String infoHash);
 
     List<Torrent> getTorrentList();
 }
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/impl/TorrentServiceImpl.java b/src/main/java/edu/bjtu/groupone/backend/service/impl/TorrentServiceImpl.java
index 74c8216..0c195d6 100644
--- a/src/main/java/edu/bjtu/groupone/backend/service/impl/TorrentServiceImpl.java
+++ b/src/main/java/edu/bjtu/groupone/backend/service/impl/TorrentServiceImpl.java
@@ -11,6 +11,7 @@
 import java.util.List;
 import java.util.Map;
 
+import lombok.extern.slf4j.Slf4j;
 import org.hibernate.sql.Alias;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -20,6 +21,7 @@
 import org.springframework.web.multipart.MultipartFile;
 
 @Service
+@Slf4j
 public class TorrentServiceImpl implements TorrentService {
     @Value("${torrent.storage.path}")
     private String storagePath;
@@ -59,20 +61,62 @@
         return torrent;
     }
 
-    public Resource downloadTorrent(String infoHash) throws Exception {
-        Torrent torrent = this.torrentMapper.selectByInfoHash(infoHash);
+    @Override
+    public String getTorrentUrl(String infoHash) {
+        log.info("[getTorrentUrl] 开始，infoHash = {}", infoHash);
+        Torrent torrent;
+        try {
+            torrent = torrentMapper.selectByInfoHash(infoHash);
+            log.info("[getTorrentUrl] 查询到的 Torrent = {}", torrent);
+        } catch (Exception e) {
+            log.error("[getTorrentUrl] 数据库查询异常，infoHash = {}", infoHash, e);
+            // 将异常向上抛出，Controller 会捕获并返回 500
+            throw new RuntimeException("查询种子信息失败", e);
+        }
+
         if (torrent == null) {
-            throw new IllegalArgumentException("种子不存在");
-        } else {
-            File file = new File(torrent.getFilePath());
-            if (!file.exists()) {
-                throw new IllegalStateException("种子文件不存在");
-            } else {
-                return new FileSystemResource(file);
+            log.warn("[getTorrentUrl] 未找到 infoHash 对应的记录: {}", infoHash);
+            return null;
+        }
+
+        String url = torrent.getUrl();
+        if (url == null || url.isBlank()) {
+            log.warn("[getTorrentUrl] URL 为空，infoHash = {}", infoHash);
+            return null;
+        }
+
+        log.info("[getTorrentUrl] 返回 URL = {}", url);
+        return url;
+    }
+
+    @Override
+    public boolean deleteTorrent(String infoHash) {
+        // 1. 查询种子信息
+        Torrent torrent = torrentMapper.selectByInfoHash(infoHash);
+        if (torrent == null) {
+            return false; // 没有记录，返回失败
+        }
+
+        // 2. 删除本地文件
+        File file = new File(torrent.getFilePath());
+        if (file.exists()) {
+            boolean deleted = file.delete();
+            if (!deleted) {
+                System.err.println("文件删除失败：" + file.getAbsolutePath());
             }
         }
+
+        // 3. 删除数据库记录
+        torrentMapper.deleteByInfoHash(infoHash);
+
+        // 4. 可选：删除 OSS 上的副本（如果你愿意）
+        // aliOSSUtils.delete(torrent.getUrl());  // 需要你实现 delete 方法
+
+        return true;
     }
 
+
+
     @Override
     public List<Torrent> getTorrentList() {
         return torrentMapper.getTorrentList();
