diff --git a/src/main/java/com/pt5/pthouduan/controller/TorrentController.java b/src/main/java/com/pt5/pthouduan/controller/TorrentController.java
index 71cc76f..e864f20 100644
--- a/src/main/java/com/pt5/pthouduan/controller/TorrentController.java
+++ b/src/main/java/com/pt5/pthouduan/controller/TorrentController.java
@@ -6,6 +6,7 @@
 import com.pt5.pthouduan.entity.TrackeredTorrentWithStats;
 import com.pt5.pthouduan.entity.User;
 import com.pt5.pthouduan.exception.TorrentNotFoundException;
+import com.pt5.pthouduan.mapper.TorrentMapper;
 import com.pt5.pthouduan.mapper.UserMapper;
 import com.pt5.pthouduan.service.TorrentService;
 //import com.pt5.pthouduan.service.TorrentStatsService;
@@ -24,6 +25,9 @@
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
+import java.math.BigInteger;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -44,106 +48,25 @@
     private Tracker tracker;
     @Autowired
     private PeerService peerService;
+    @Autowired
+    private TorrentMapper torrentMapper;
 //    @Autowired
 //    private TorrentStatsService statsService;
 //    @Autowired
 //    private TrackeredTorrentService trackeredTorrentService;
 
 
-    @GetMapping("/{infoHash}/seeders")
-    public ResponseEntity<List<PeerInfo>> getSeedersByInfoHash(@PathVariable String infoHash) {
-        List<PeerInfo> seeders = peerService.getSeedersByInfoHash(infoHash.toUpperCase());
-        System.out.println("Response: " + seeders);
-        return ResponseEntity.ok(seeders);
-    }
-    //添加搜索
-    @GetMapping("/search")
-    public ResponseEntity<List<Torrent>> searchTorrents(@RequestParam("keyword") String keyword) {
-        List<Torrent> result = torrentService.searchByKeyword(keyword);
-        return ResponseEntity.ok(result);
-    }
 
-   //显示所有种子
-    @GetMapping("/list")
-    public List<Torrent> getAllTorrents() {
-        return torrentService.getAllTorrents();
-    }
-    // 按分类获取种子（带 category 参数）
-    @GetMapping("/listByCategory")
-    public List<Torrent> getTorrentsByCategory(@RequestParam(required = false) Integer categoryid) {
-        if (categoryid == null) {
-            return torrentService.getAllTorrents();
-        }
-        return torrentService.getTorrentsByCategory(categoryid); // 否则按分类过滤
-    }
-    @GetMapping("/listByCategorywithfilter")
-    public List<Torrent> getTorrentsByCategorywithFilter(
-            @RequestParam Integer categoryid,
-            @RequestParam Map<String, String> filters
-    ){
-        filters.remove("categoryid");
-        List<Torrent> torrents = torrentService.getTorrentsByCategorywithfilters(categoryid,filters);
-        return torrents;
-    }
-    // 获取单个种子详情
-    @GetMapping("/{id}")
-    public ResponseEntity<?> getTorrentById(@PathVariable Long id) {
-        try {
-            Torrent torrent = torrentService.getTorrentById(id);
-            if (torrent == null) {
-                return ResponseEntity.notFound().build(); // 如果种子不存在，返回 404
-            }
-            System.out.println(torrent);
-            return ResponseEntity.ok(torrent); // 返回种子详情
-        } catch (Exception e) {
-            return ResponseEntity.badRequest().body("获取种子详情失败: " + e.getMessage());
-        }
-    }
-//未更新前端前
-//    @PostMapping("/upload")
-//    public ResponseEntity<?> uploadTorrent(
-//            @RequestParam("file") MultipartFile torrentFile,
-//            @RequestParam("title") String title,
-//            @RequestParam("description") String description
-//            //@AuthenticationPrincipal User user
-//            //User user
-//    ){
-//        // 创建临时用户对象
-//        User user = new User(1L,"testuser");
-//        //user.setUserid(1L); // 设置测试用户ID
-//        try{
-//            //torrentService.Upload(torrentFile,title,description,user);
-//            return torrentService.Upload(torrentFile, title, description, user);
-//        }catch(Exception e){
-//            return ResponseEntity.badRequest().body("Upload failed:" + e.getMessage());
-//        }
-//    }
-//@PostMapping("/upload")
-//public ResponseEntity<?> uploadTorrent(
-//        @RequestParam("file") MultipartFile torrentFile,
-//        @RequestParam("title") String title,
-//        @RequestParam("description") String description,
-//        @RequestParam("categoryId") Integer categoryId,
-//        @RequestParam(value = "dpi",required = false) String dpi,
-//        @RequestParam(value = "caption", required = false) String caption){
-//    // 创建临时用户对象
-//    User user = new User(1L,"testuser");
-//    //user.setUserid(1L); // 设置测试用户ID
-//    try{
-//        //torrentService.Upload(torrentFile,title,description,user);
-//        return torrentService.Upload(torrentFile, title, description, categoryId, dpi,caption,user);
-//    }catch(Exception e){
-//        return ResponseEntity.badRequest().body("Upload failed:" + e.getMessage());
-//    }
-//}
 @PostMapping("/upload")
 public ResponseEntity<?> uploadTorrent(
-        @RequestParam("file") MultipartFile torrentFile,
+        @RequestParam("userid") Long userid,
+        @RequestParam("file") MultipartFile torrentFile,          // 种子文件
+        @RequestParam("coverImage") MultipartFile coverImage,    // 封面图片
         @RequestParam("title") String title,
         @RequestParam("description") String description,
         @RequestParam("categoryId") Integer categoryId,
         // 以下为通用扩展字段（根据类型选择性使用）
-        @RequestParam(value = "dpi",required = false) String dpi,
+        @RequestParam(value = "dpi", required = false) String dpi,
         @RequestParam(value = "caption", required = false) String caption,
         @RequestParam(value = "region", required = false) String region,
         @RequestParam(value = "year", required = false) Integer year,
@@ -157,10 +80,12 @@
         @RequestParam(value = "dataType", required = false) String dataType,
         @RequestParam(value = "source", required = false) String source,
         @RequestParam(value = "style", required = false) String style,
-        @RequestParam(value = "isMainland", required = false) Boolean isMainland){
+        @RequestParam(value = "isMainland", required = false) Boolean isMainland) {
+
     // 创建临时用户对象
-    User user = new User(1L,"testuser");
-    
+    //User user = new User(1L,"testuser");
+    //User user = userMapper.selectById(userid);
+
     // 构建扩展参数Map
     Map<String, String> extraParams = new HashMap<>();
 
@@ -182,33 +107,20 @@
     putIfNotNull(extraParams, "style", style);              // 音乐风格
     putIfNotNull(extraParams, "isMainland", isMainland != null ? isMainland.toString() : null); // 综艺是否大陆
     putIfNotNull(extraParams, "dataType", dataType);
-//    extraParams.put("region", "CN");
-//    extraParams.put("year", "2023");
-//    extraParams.put("genre", "Action");
-//    extraParams.put("encodeFormat", "H.264");
-//    extraParams.put("resolution", "1080p");
 
 
-    //user.setUserid(1L); // 设置测试用户ID
-    try{
-        //torrentService.Upload(torrentFile,title,description,user);
-        //return torrentService.Upload(torrentFile, title, description, categoryId, dpi,caption,user);
-
-//        return torrentService.uploadWithCategory(
-//                torrentFile, title, description, categoryId, user, dpi, caption,
-//                region, year, genre, format, resolution, codecFormat,
-//                platform, language, eventType, source, style, isMainland
-//        );
-        // 调用Service
-        return torrentService.uploadWithCategory(
+    try {
+        // 调用Service，传递封面图片
+        return torrentService.uploadWithCategoryAndCover(
                 torrentFile,
+                coverImage,          // 新增的封面图片参数
                 title,
                 description,
                 categoryId,
-                user,
+                userid,
                 extraParams
         );
-    }catch(Exception e){
+    } catch (Exception e) {
         return ResponseEntity.badRequest().body("Upload failed:" + e.getMessage());
     }
 }
@@ -246,12 +158,13 @@
 //        }
 //    }
 @GetMapping("/download/{id}")
-public ResponseEntity<byte[]> downloadTorrent(@PathVariable Long id, HttpServletRequest request){
+public ResponseEntity<byte[]> downloadTorrent(@PathVariable Long id, @RequestParam Long userId,HttpServletRequest request){
     try{
         //需要加入passkey
-        User user = new User(1L,"testuser");
-        user.setPasskey("111111");
-        String passkey = "111111";  // 先模拟一下,到时候记得改
+        //User user = userMapper.selectById(userId);
+        String passkey = userMapper.selectPasskeyByUserid(userId);
+//        user.setPasskey("111111");
+//        String passkey = "111111";  // 先模拟一下,到时候记得改
         //获取种子文件资源
         Torrent torrentFile = torrentService.getTorrentFile(id);            //确定文件内容类型
         // 2. 原子性更新下载次数（推荐直接通过 SQL 递增）
@@ -280,12 +193,24 @@
         }
         System.out.println("Modified torrent bytes: " + Arrays.toString(modifiedTorrent));
 
-        // 构建响应，下载.torrent文件
+//        // 构建响应，下载.torrent文件
+//        HttpHeaders headers = new HttpHeaders();
+//        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+//        headers.setContentDisposition(ContentDisposition.attachment()
+//                .filename(torrentFile.getFilename())
+//                .build());
+//
+//        return new ResponseEntity<>(modifiedTorrent, headers, HttpStatus.OK);
+        // 设置响应头，避免中文乱码
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
-        headers.setContentDisposition(ContentDisposition.attachment()
-                .filename(torrentFile.getFilename())
-                .build());
+
+        // 文件名处理：使用 RFC 5987 编码支持中文
+        String filename = torrentFile.getFilename();
+        String encodedFilename = URLEncoder.encode(filename, StandardCharsets.UTF_8).replaceAll("\\+", "%20");
+
+        headers.set(HttpHeaders.CONTENT_DISPOSITION,
+                "attachment; filename*=UTF-8''" + encodedFilename);
 
         return new ResponseEntity<>(modifiedTorrent, headers, HttpStatus.OK);
     }catch (TorrentNotFoundException e) {
diff --git a/src/main/java/com/pt5/pthouduan/entity/Torrent.java b/src/main/java/com/pt5/pthouduan/entity/Torrent.java
index fa078c8..d5e4513 100644
--- a/src/main/java/com/pt5/pthouduan/entity/Torrent.java
+++ b/src/main/java/com/pt5/pthouduan/entity/Torrent.java
@@ -58,6 +58,8 @@
 
     private String path;
 
+    private String coverImagePath; // 封面图片路径
+
 
 
 
@@ -78,6 +80,15 @@
         this.lastseed = lastseed;
     }
 
+    // getter 和 setter
+    public String getCoverImagePath() {
+        return coverImagePath;
+    }
+
+    public void setCoverImagePath(String coverImagePath) {
+        this.coverImagePath = coverImagePath;
+    }
+
 
 
     //private String createdBy;
diff --git a/src/main/java/com/pt5/pthouduan/mapper/TorrentMapper.java b/src/main/java/com/pt5/pthouduan/mapper/TorrentMapper.java
index e7ba2a3..2d3e7e3 100644
--- a/src/main/java/com/pt5/pthouduan/mapper/TorrentMapper.java
+++ b/src/main/java/com/pt5/pthouduan/mapper/TorrentMapper.java
@@ -2,9 +2,7 @@
 
 import com.pt5.pthouduan.entity.Torrent;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.*;
 
 import java.util.List;
 import java.util.Map;
@@ -38,4 +36,17 @@
     Torrent selectByinfohash(@Param("infohash") String infohash);
 
     List<Torrent> listByCategoryWithFilters(Integer categoryid, Map<String, String> filters, String extendTable);
+
+//    void delete(Torrent torrent);
+    @Delete("DELETE FROM torrent WHERE torrentid = #{id}")
+    void deleteById(Long id);
+
+    @Update("UPDATE torrent SET promotionid = #{promotionId} WHERE torrentid = #{torrentid}")
+    void setpromotion(Long torrentid, Long promotionId);
+
+    @Update("UPDATE torrent SET coverImagePath = #{coverImagePath} WHERE torrentid = #{torrentId}")
+    void updateCoverImagePath(Long torrentId, String coverImagePath);
+
+    @Update("UPDATE request_resource SET torrentid = #{torrentid} WHERE rewuestid = #{requestid}")
+    void updaterequest(int requestid,Long torrentid);
 }
diff --git a/src/main/java/com/pt5/pthouduan/mapper/UserMapper.java b/src/main/java/com/pt5/pthouduan/mapper/UserMapper.java
index 2f96180..47dcfc9 100644
--- a/src/main/java/com/pt5/pthouduan/mapper/UserMapper.java
+++ b/src/main/java/com/pt5/pthouduan/mapper/UserMapper.java
@@ -1,12 +1,13 @@
 package com.pt5.pthouduan.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.pt5.pthouduan.entity.PeerInfo;
 import com.pt5.pthouduan.entity.User;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.*;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -30,9 +31,24 @@
     @Select("SELECT credit FROM User WHERE username = #{username}")
     int getcreditByUsername(String username);
 
+    @Select("SELECT passkey FROM user WHERE userid = #{userid}")
+    String selectPasskeyByUserid(Long userid);
+
+    @Select("SELECT permission FROM user WHERE userid = #{userid}")
+    int getpermissionByUserid(Long userid);
+
+    @Select("SELECT username FROM user WHERE userid = #{userid}")
+    String selectUsernameByUserid(Long userid);
+
+    @Select("SELECT userid FROM user WHERE username = #{username}")
+    String selectUseridByusername(String username);
+
     @Update("UPDATE user SET credit = credit - #{price} WHERE username = #{username}")
     int deductCreditByUsername(@Param("username") String username, @Param("price") int price);
 
+    @Update("UPDATE user SET credit = credit + #{price} WHERE username = #{username}")
+    int addCreditByUsername(@Param("username") String username, @Param("price") int price);
+
     @Update("UPDATE user SET upload = upload + #{upload} WHERE username = #{username}")
     int increaseUploadByUsername(@Param("username") String username, @Param("upload") Integer upload);
 
@@ -45,13 +61,26 @@
     @Update("UPDATE user SET image = #{image} WHERE username = #{username}")
     int updateimage(@Param("username") String username, @Param("image") String image);
 
-    @Update("UPDATE user SET gradeId = #{gradeId} WHERE username = #{username}")
+    @Update("UPDATE user SET grade_id = #{gradeId} WHERE username = #{username}")
     int updateGrade(@Param("username") String username, @Param("gradeId") Integer gradeId);
 
     @Update("UPDATE user SET decoration = CONCAT(IFNULL(decoration, ''), ' ', #{newDecoration}) WHERE username = #{username}")
     int appendUserDecoration(@Param("username") String username, @Param("newDecoration") String newDecoration);
 
+    @Delete("DELETE FROM user WHERE username = #{username})")
+    int deleteByUsername(@Param("username") String username);
+
+    @Select("SELECT username, passkey, grade_id FROM user")
+    List<Map<String, Object>> selectAllUsersBasicInfo();
+
+    @Select("SELECT * FROM user")
+    List<Map<String, Object>> selectAllUsers();
+
+    @Select("SELECT * FROM user WHERE username REGEXP #{regexPattern}")
+    List<Map<String, Object>> selectUserByFuzzyKeyword(@Param("regexPattern") String regexPattern);
+
     boolean existsByPasskey(String passkey);
+
     void incrementUserTraffic( @Param("info_hash") String infoHash,@Param("passkey") String passkey, @Param("user_upload") long uploaded, @Param("user_download") long downloaded);
 
     String getUsernameByPasskey(String passkey);
diff --git a/src/main/java/com/pt5/pthouduan/service/TorrentService.java b/src/main/java/com/pt5/pthouduan/service/TorrentService.java
index 0d887da..2f51526 100644
--- a/src/main/java/com/pt5/pthouduan/service/TorrentService.java
+++ b/src/main/java/com/pt5/pthouduan/service/TorrentService.java
@@ -1,7 +1,6 @@
 package com.pt5.pthouduan.service;
 
 import com.pt5.pthouduan.entity.Torrent;
-import com.pt5.pthouduan.entity.TrackeredTorrentWithStats;
 import com.pt5.pthouduan.entity.User;
 import org.springframework.core.io.Resource;
 import org.springframework.http.ResponseEntity;
@@ -23,8 +22,13 @@
     List<Torrent> getTorrentsByCategory(Integer category);
     Torrent getTorrentById(Long id);
     List<Torrent> searchByKeyword(String keyword);
-    ResponseEntity<Resource> uploadWithCategory(MultipartFile torrentFile, String title, String description, Integer categoryId, User user, Map<String, String> extraParams) throws Exception;
-
+    ResponseEntity<Resource> uploadWithCategory(MultipartFile torrentFile, String title, String description, Integer categoryId, Long userid, Map<String, String> extraParams) throws Exception;
+    void deleteTorrent(Long userid,Long torrentId);
     List<Torrent> getTorrentsByCategorywithfilters(Integer categoryid, Map<String, String> filters);
+    void setPromotion(Long torrentId, Long promotionId, Long userid);
+    void addcredit(Long manageid,Long userid,Integer credit);
+    void deducecredit(Long manageid,Long userid,Integer credit);
+    ResponseEntity<?> uploadWithCategoryAndCover(MultipartFile torrentFile, MultipartFile coverImage, String title, String description, Integer categoryId, Long userid, Map<String, String> extraParams) throws Exception;
+    ResponseEntity<Resource> uploadtohelp(int requestId,MultipartFile torrentFile, MultipartFile coverImage, String title, String description, Integer categoryId, Long userid, Map<String, String> extraParams);
     //TrackeredTorrentWithStats.TorrentStats getTorrentStats(String infoHash);
 }
diff --git a/src/main/java/com/pt5/pthouduan/service/impl/TorrentServiceImpl.java b/src/main/java/com/pt5/pthouduan/service/impl/TorrentServiceImpl.java
index 93aad92..3433f61 100644
--- a/src/main/java/com/pt5/pthouduan/service/impl/TorrentServiceImpl.java
+++ b/src/main/java/com/pt5/pthouduan/service/impl/TorrentServiceImpl.java
@@ -1,9 +1,6 @@
 package com.pt5.pthouduan.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.pt5.pthouduan.entity.*;
-import com.pt5.pthouduan.exception.TorrentNotFoundException;
 import com.pt5.pthouduan.mapper.*;
 import com.pt5.pthouduan.service.TorrentService;
 import com.pt5.pthouduan.util.TorrentParser;
@@ -24,6 +21,7 @@
 
 import java.io.*;
 import java.net.MalformedURLException;
+import java.net.URLEncoder;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -38,8 +36,15 @@
 
     @Value("${tracker.url}")  //等等看看这个有没有传进来
     private String trackerUrl;
+    @Value("${torrent.file-save-dir}")
+    private String fileSaveDir;
+
+    @Value("${torrent.cover-image-dir}")
+    private String coverImageDir;
     @Autowired
     private TorrentMapper torrentMapper;
+    @Autowired
+    private UserMapper userMapper;
     @Autowired  // 确保使用接口类型（推荐）
     private Tracker tracker;
     @Autowired
@@ -174,12 +179,437 @@
 //    return new ResponseEntity<>(resource, headers, HttpStatus.OK);
     return ResponseEntity.ok()
             .header(HttpHeaders.CONTENT_DISPOSITION,
-                    "attachment; filename=\"" + torrentFile.getOriginalFilename() + "\"")
+                    "attachment; filename=\"" + URLEncoder.encode(torrentFile.getOriginalFilename(), "UTF-8") + "\"")
             .contentType(MediaType.parseMediaType("application/x-bittorrent"))
             .body(new ByteArrayResource(modifiedData));
 }
+
     @Override
-    public ResponseEntity<Resource> uploadWithCategory(MultipartFile torrentFile, String title, String description, Integer categoryId, User user, Map<String, String> extraParams ) throws Exception {
+    public void deleteTorrent(Long userid,Long torrentId) {
+        // 1. 验证权限
+        Torrent torrent = torrentMapper.selectById(torrentId);
+
+        if (userMapper.getpermissionByUserid(userid) != 1  &&
+                !torrent.getUploader_id().equals(userid) ){
+            throw new SecurityException("无权删除此资源");
+        }
+
+
+        // 3. 删除数据库记录（级联删除依赖数据库外键配置）
+        torrentMapper.deleteById(torrent.getTorrentid());
+    }
+
+    public void setPromotion(Long torrentId, Long promotionId, Long userId) {
+        // 1. 检查种子是否存在
+        Torrent torrent = torrentMapper.selectById(torrentId);
+
+        // 2. 检查权限（假设只有上传者或管理员可以修改）
+        int permission = userMapper.getpermissionByUserid(userId);
+        if (permission != 1) {
+            throw new SecurityException("无权修改该种子");
+        }
+
+        // 3. 设置促销类型
+        //1-上传加倍；2-下载减半；3-免费下载；NULL-没有促销
+        torrentMapper.setpromotion(torrentId,promotionId);
+    }
+
+    @Override
+    public void addcredit(Long manageid, Long userid, Integer credit) {
+        int permission = userMapper.getpermissionByUserid(manageid);
+        if (permission != 1) {
+            throw new SecurityException("无权修改该种子");
+        }
+        String username = userMapper.selectUsernameByUserid(userid);
+
+        userMapper.addCreditByUsername(username,credit);
+    }
+
+    @Override
+    public void deducecredit(Long manageid, Long userid, Integer credit) {
+        int permission = userMapper.getpermissionByUserid(manageid);
+        if (permission != 1) {
+            throw new SecurityException("无权修改该种子");
+        }
+        String username = userMapper.selectUsernameByUserid(userid);
+
+        userMapper.deductCreditByUsername(username,credit);
+    }
+
+    @Override
+    public ResponseEntity<Resource> uploadWithCategoryAndCover(MultipartFile torrentFile, MultipartFile coverImage, String title, String description, Integer categoryId, Long userid, Map<String, String> extraParams) throws Exception {
+        try {
+            // === 1. 基础校验 ===
+            if (torrentFile.isEmpty()) {
+                throw new IllegalArgumentException("Torrent file cannot be empty");
+            }
+            File dir = new File(fileSaveDir);
+            if (!dir.exists()) {
+                boolean created = dir.mkdirs();  // 递归创建目录
+                if (!created) {
+                    throw new IOException("无法创建目录：" + fileSaveDir);
+                }
+            }
+
+            // === 2. 注入passkey ===
+            byte[] modifiedData = addPasskeyToTorrent(torrentFile.getBytes(), userMapper.selectPasskeyByUserid(userid));
+            Torrent torrent = TorrentParser.parse(modifiedData);
+
+            System.out.println("是否已存在 info_hash：" + torrentMapper.existsByInfoHash(torrent.getInfoHash()));
+
+            // === 3. 检查重复 ===
+            if (torrentMapper.existsByInfoHash(torrent.getInfoHash()) >= 1) {
+                throw new IllegalArgumentException("Torrent already exists");
+            }
+
+            // === 4. 存储种子文件 ===
+            String fileSavePath = fileSaveDir + torrentFile.getOriginalFilename();
+            Files.write(new File(fileSavePath).toPath(), modifiedData);
+            System.out.println("Modified torrent file size: " + modifiedData.length);
+
+            // === 5. 注册到Tracker ===
+            TrackedTorrent trackedTorrent = TrackedTorrent.load(new File(fileSavePath));
+            tracker.announce(trackedTorrent);
+
+            // === 6. 存入数据库主表 ===
+            Torrent entity = new Torrent();
+            entity.setInfoHash(torrent.getInfoHash());
+            entity.setUploader_id(userid);
+            entity.setTorrentTitle(title);
+            entity.setDescription(description);
+            entity.setTorrentSize(torrent.getTorrentSize());
+            entity.setFilename(torrentFile.getOriginalFilename());
+            entity.setCategoryid(categoryId);
+            entity.setUploadTime(LocalDateTime.now());
+            entity.setPath(fileSavePath);
+
+            torrentMapper.save(entity);
+
+
+
+            // === 7. 分类插入扩展信息 ===
+            switch (categoryId) {
+                case 1:
+                    MovieInfo movie = new MovieInfo();
+                    movie.setTorrentid(entity.getTorrentid());
+                    movie.setRegion(extraParams.get("region"));
+                    movie.setYear(extraParams.get("year") != null ? Integer.parseInt(extraParams.get("year")) : null);
+                    movie.setGenre(extraParams.get("genre"));
+                    movie.setCodecFormat(extraParams.get("codecFormat"));
+                    movie.setResolution(extraParams.get("resolution"));
+                    movieInfoMapper.insert(movie);
+                    break;
+                case 3:
+                    MusicInfo music = new MusicInfo();
+                    music.setTorrentid(entity.getTorrentid());
+                    music.setGenre(extraParams.get("genre"));
+                    music.setRegion(extraParams.get("region"));
+                    music.setStyle(extraParams.get("style"));
+                    music.setFormat(extraParams.get("format"));
+                    musicInfoMapper.insert(music);
+                    break;
+                case 5:
+                    GameInfo game = new GameInfo();
+                    game.setTorrentid(entity.getTorrentid());
+                    game.setPlatform(extraParams.get("platform"));
+                    game.setGenre(extraParams.get("genre"));
+                    game.setFormat(extraParams.get("dataType"));
+                    game.setLanguage(extraParams.get("language"));
+                    gameInfoMapper.insert(game);
+                    break;
+                case 2:
+                    TvInfo tv = new TvInfo();
+                    tv.setTorrentId(entity.getTorrentid());
+                    tv.setRegion(extraParams.get("region"));
+                    tv.setFormat(extraParams.get("format"));
+                    tv.setGenre(extraParams.get("genre"));
+                    tvInfoMapper.insert(tv);
+                    break;
+                case 4:
+                    AnimeInfo anime = new AnimeInfo();
+                    anime.setTorrentid(entity.getTorrentid());
+                    anime.setGenre(extraParams.get("genre"));
+                    anime.setFormat(extraParams.get("format"));
+                    anime.setResolution(extraParams.get("resolution"));
+                    animeInfoMapper.insert(anime);
+                    break;
+                case 9:
+                    EduInfo learning = new EduInfo();
+                    learning.setTorrentid(entity.getTorrentid());
+                    learning.setGenre(extraParams.get("genre"));
+                    learning.setFormat(extraParams.get("format"));
+                    eduInfoMapper.insert(learning);
+                    break;
+                case 8:
+                    SoftwareInfo software = new SoftwareInfo();
+                    software.setTorrentid(entity.getTorrentid());
+                    software.setPlatform(extraParams.get("platform"));
+                    software.setGenre(extraParams.get("genre"));
+                    software.setFormat(extraParams.get("format"));
+                    softwareInfoMapper.insert(software);
+                    break;
+                case 6:
+                    ShowInfo variety = new ShowInfo();
+                    variety.setTorrentid(entity.getTorrentid());
+                    variety.setIsMainland(Boolean.valueOf(extraParams.get("mainland")));
+                    variety.setGenre(extraParams.get("genre"));
+                    variety.setFormat(extraParams.get("format"));
+                    showInfoMapper.insert(variety);
+                    break;
+                case 7:
+                    SportInfo sports = new SportInfo();
+                    sports.setTorrentid(entity.getTorrentid());
+                    sports.setGenre(extraParams.get("genre"));
+                    sports.setEventType(extraParams.get("eventType"));
+                    sports.setFormat(extraParams.get("format"));
+                    sportInfoMapper.insert(sports);
+                    break;
+                case 10:
+                    DocumentaryInfo doc = new DocumentaryInfo();
+                    doc.setTorrentid(entity.getTorrentid());
+                    doc.setYear(extraParams.get("year") != null ? Integer.parseInt(extraParams.get("year")) : null);
+                    doc.setSource(extraParams.get("source"));
+                    doc.setFormat(extraParams.get("format"));
+                    documentaryInfoMapper.insert(doc);
+                    break;
+                case 11:
+                    OtherInfo other = new OtherInfo();
+                    other.setTorrentid(entity.getTorrentid());
+                    other.setGenre(extraParams.get("genre"));
+                    otherInfoMapper.insert(other);
+                    break;
+                default:
+                    System.out.println("不支持的分类，或无扩展表记录");
+            }
+
+            // === 8. 封面图片处理 ===
+            if (coverImage != null && !coverImage.isEmpty()) {
+                String coverImagePath = storeCoverImage(coverImage);
+                System.out.println(coverImagePath);
+                entity.setCoverImagePath(coverImagePath);
+                torrentMapper.updateCoverImagePath(entity.getTorrentid(), coverImagePath);
+            }
+
+            System.out.println("运行到这里了");
+
+            // === 9. 返回修改后的torrent文件 ===
+            return ResponseEntity.ok()
+                    .header(HttpHeaders.CONTENT_DISPOSITION,
+                            "attachment; filename=\"" + URLEncoder.encode(torrentFile.getOriginalFilename(), "UTF-8") + "\"")
+                    .contentType(MediaType.parseMediaType("application/x-bittorrent"))
+                    .cacheControl(CacheControl.noCache())
+                    .body(new ByteArrayResource(modifiedData));
+        } catch (Exception e) {
+            System.err.println("上传失败，发生异常：" + e.getMessage());
+            e.printStackTrace();  // 打印完整堆栈
+            return ResponseEntity.status(500).body(new ByteArrayResource(("上传失败: " + e.getMessage()).getBytes()));
+        }
+    }
+
+    @Override
+    public ResponseEntity<Resource> uploadtohelp(int requestId,MultipartFile torrentFile, MultipartFile coverImage, String title, String description, Integer categoryId, Long userid, Map<String, String> extraParams) {
+        try {
+            // === 1. 基础校验 ===
+            if (torrentFile.isEmpty()) {
+                throw new IllegalArgumentException("Torrent file cannot be empty");
+            }
+            File dir = new File(fileSaveDir);
+            if (!dir.exists()) {
+                boolean created = dir.mkdirs();  // 递归创建目录
+                if (!created) {
+                    throw new IOException("无法创建目录：" + fileSaveDir);
+                }
+            }
+
+            // === 2. 注入passkey ===
+            byte[] modifiedData = addPasskeyToTorrent(torrentFile.getBytes(), userMapper.selectPasskeyByUserid(userid));
+            Torrent torrent = TorrentParser.parse(modifiedData);
+
+            System.out.println("是否已存在 info_hash：" + torrentMapper.existsByInfoHash(torrent.getInfoHash()));
+
+            // === 3. 检查重复 ===
+            if (torrentMapper.existsByInfoHash(torrent.getInfoHash()) >= 1) {
+                throw new IllegalArgumentException("Torrent already exists");
+            }
+
+            // === 4. 存储种子文件 ===
+            String fileSavePath = fileSaveDir + torrentFile.getOriginalFilename();
+            Files.write(new File(fileSavePath).toPath(), modifiedData);
+            System.out.println("Modified torrent file size: " + modifiedData.length);
+
+            // === 5. 注册到Tracker ===
+            TrackedTorrent trackedTorrent = TrackedTorrent.load(new File(fileSavePath));
+            tracker.announce(trackedTorrent);
+
+            // === 6. 存入数据库主表 ===
+            Torrent entity = new Torrent();
+            entity.setInfoHash(torrent.getInfoHash());
+            entity.setUploader_id(userid);
+            entity.setTorrentTitle(title);
+            entity.setDescription(description);
+            entity.setTorrentSize(torrent.getTorrentSize());
+            entity.setFilename(torrentFile.getOriginalFilename());
+            entity.setCategoryid(categoryId);
+            entity.setUploadTime(LocalDateTime.now());
+            entity.setPath(fileSavePath);
+
+            torrentMapper.save(entity);
+
+            torrentMapper.updaterequest(requestId,entity.getTorrentid());
+
+
+            // === 7. 分类插入扩展信息 ===
+            switch (categoryId) {
+                case 1:
+                    MovieInfo movie = new MovieInfo();
+                    movie.setTorrentid(entity.getTorrentid());
+                    movie.setRegion(extraParams.get("region"));
+                    movie.setYear(extraParams.get("year") != null ? Integer.parseInt(extraParams.get("year")) : null);
+                    movie.setGenre(extraParams.get("genre"));
+                    movie.setCodecFormat(extraParams.get("codecFormat"));
+                    movie.setResolution(extraParams.get("resolution"));
+                    movieInfoMapper.insert(movie);
+                    break;
+                case 3:
+                    MusicInfo music = new MusicInfo();
+                    music.setTorrentid(entity.getTorrentid());
+                    music.setGenre(extraParams.get("genre"));
+                    music.setRegion(extraParams.get("region"));
+                    music.setStyle(extraParams.get("style"));
+                    music.setFormat(extraParams.get("format"));
+                    musicInfoMapper.insert(music);
+                    break;
+                case 5:
+                    GameInfo game = new GameInfo();
+                    game.setTorrentid(entity.getTorrentid());
+                    game.setPlatform(extraParams.get("platform"));
+                    game.setGenre(extraParams.get("genre"));
+                    game.setFormat(extraParams.get("dataType"));
+                    game.setLanguage(extraParams.get("language"));
+                    gameInfoMapper.insert(game);
+                    break;
+                case 2:
+                    TvInfo tv = new TvInfo();
+                    tv.setTorrentId(entity.getTorrentid());
+                    tv.setRegion(extraParams.get("region"));
+                    tv.setFormat(extraParams.get("format"));
+                    tv.setGenre(extraParams.get("genre"));
+                    tvInfoMapper.insert(tv);
+                    break;
+                case 4:
+                    AnimeInfo anime = new AnimeInfo();
+                    anime.setTorrentid(entity.getTorrentid());
+                    anime.setGenre(extraParams.get("genre"));
+                    anime.setFormat(extraParams.get("format"));
+                    anime.setResolution(extraParams.get("resolution"));
+                    animeInfoMapper.insert(anime);
+                    break;
+                case 9:
+                    EduInfo learning = new EduInfo();
+                    learning.setTorrentid(entity.getTorrentid());
+                    learning.setGenre(extraParams.get("genre"));
+                    learning.setFormat(extraParams.get("format"));
+                    eduInfoMapper.insert(learning);
+                    break;
+                case 8:
+                    SoftwareInfo software = new SoftwareInfo();
+                    software.setTorrentid(entity.getTorrentid());
+                    software.setPlatform(extraParams.get("platform"));
+                    software.setGenre(extraParams.get("genre"));
+                    software.setFormat(extraParams.get("format"));
+                    softwareInfoMapper.insert(software);
+                    break;
+                case 6:
+                    ShowInfo variety = new ShowInfo();
+                    variety.setTorrentid(entity.getTorrentid());
+                    variety.setIsMainland(Boolean.valueOf(extraParams.get("mainland")));
+                    variety.setGenre(extraParams.get("genre"));
+                    variety.setFormat(extraParams.get("format"));
+                    showInfoMapper.insert(variety);
+                    break;
+                case 7:
+                    SportInfo sports = new SportInfo();
+                    sports.setTorrentid(entity.getTorrentid());
+                    sports.setGenre(extraParams.get("genre"));
+                    sports.setEventType(extraParams.get("eventType"));
+                    sports.setFormat(extraParams.get("format"));
+                    sportInfoMapper.insert(sports);
+                    break;
+                case 10:
+                    DocumentaryInfo doc = new DocumentaryInfo();
+                    doc.setTorrentid(entity.getTorrentid());
+                    doc.setYear(extraParams.get("year") != null ? Integer.parseInt(extraParams.get("year")) : null);
+                    doc.setSource(extraParams.get("source"));
+                    doc.setFormat(extraParams.get("format"));
+                    documentaryInfoMapper.insert(doc);
+                    break;
+                case 11:
+                    OtherInfo other = new OtherInfo();
+                    other.setTorrentid(entity.getTorrentid());
+                    other.setGenre(extraParams.get("genre"));
+                    otherInfoMapper.insert(other);
+                    break;
+                default:
+                    System.out.println("不支持的分类，或无扩展表记录");
+            }
+
+            // === 8. 封面图片处理 ===
+            if (coverImage != null && !coverImage.isEmpty()) {
+                String coverImagePath = storeCoverImage(coverImage);
+                System.out.println(coverImagePath);
+                entity.setCoverImagePath(coverImagePath);
+                torrentMapper.updateCoverImagePath(entity.getTorrentid(), coverImagePath);
+            }
+
+            System.out.println("运行到这里了");
+
+            // === 9. 返回修改后的torrent文件 ===
+            return ResponseEntity.ok()
+                    .header(HttpHeaders.CONTENT_DISPOSITION,
+                            "attachment; filename=\"" + URLEncoder.encode(torrentFile.getOriginalFilename(), "UTF-8") + "\"")
+                    .contentType(MediaType.parseMediaType("application/x-bittorrent"))
+                    .cacheControl(CacheControl.noCache())
+                    .body(new ByteArrayResource(modifiedData));
+        } catch (Exception e) {
+            System.err.println("上传失败，发生异常：" + e.getMessage());
+            e.printStackTrace();  // 打印完整堆栈
+            return ResponseEntity.status(500).body(new ByteArrayResource(("上传失败: " + e.getMessage()).getBytes()));
+        }
+    }
+
+    /**
+     * 存储封面图片
+     *
+     * @param coverImage 封面图片文件
+     * @return 封面图片的存储路径
+     */
+    private String storeCoverImage(MultipartFile coverImage) throws IOException {
+        // 这里可以使用你现有的 FileStorageService 或自定义存储逻辑
+        // 假设使用 FileStorageService
+        System.out.println("运行到这里了图片");
+        File dir = new File(coverImageDir);
+        if (!dir.exists()) {
+            boolean created = dir.mkdirs();  // 递归创建目录
+            if (!created) {
+                throw new IOException("无法创建目录：" + coverImageDir);
+            }
+        }
+        //String coverImageDir = "D:/torrenttest/covers/"; // 封面图片存储目录
+        String filename = System.currentTimeMillis()+"_"+coverImage.getOriginalFilename();
+        Path coverImagePath = Paths.get(coverImageDir, filename);
+
+        try {
+            Files.createDirectories(coverImagePath.getParent()); // 创建目录
+            Files.copy(coverImage.getInputStream(), coverImagePath, StandardCopyOption.REPLACE_EXISTING);
+        } catch (IOException e) {
+            throw new RuntimeException("无法存储封面图片", e);
+        }
+
+        return "http://localhost:8080/"+coverImageDir+filename; // 返回相对路径
+    }
+
+    @Override
+    public ResponseEntity<Resource> uploadWithCategory(MultipartFile torrentFile, String title, String description, Integer categoryId, Long userid, Map<String, String> extraParams ) throws Exception {
         //读取torrent文件
         InputStream inputStream = torrentFile.getInputStream();
         // === 1. 基础校验 ===
@@ -187,7 +617,7 @@
             throw new IllegalArgumentException("Torrent file cannot be empty");
         }
         // === 2. 注入passkey ===
-        byte[] modifiedData = addPasskeyToTorrent(torrentFile.getBytes(), "111111");
+        byte[] modifiedData = addPasskeyToTorrent(torrentFile.getBytes(),userMapper.selectPasskeyByUserid(userid) );
         Torrent torrent = TorrentParser.parse(modifiedData);
         // === 4. 检查重复 ===
         if (torrentMapper.existsByInfoHash(torrent.getInfoHash()) >= 1) {
@@ -202,7 +632,7 @@
         //存入数据库
         Torrent entity = new Torrent();
         entity.setInfoHash(torrent.getInfoHash());
-        entity.setUploader_id(user.getUserid());
+        entity.setUploader_id(userid);
         entity.setTorrentTitle(title);
         entity.setDescription(description);
         entity.setTorrentSize(torrent.getTorrentSize());
@@ -368,6 +798,7 @@
         return torrentMapper.searchByKeyword(keyword);
     }
 
+
     private String getExtendTableByCategoryId(Integer categoryid) {
         switch(categoryid) {
             case 1:return "movie_info";
