diff --git a/ruoyi-admin/src/main/java/com/ruoyi/torrent/controller/BtTorrentController.java b/ruoyi-admin/src/main/java/com/ruoyi/torrent/controller/BtTorrentController.java
index 15dc9f3..559547b 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/torrent/controller/BtTorrentController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/torrent/controller/BtTorrentController.java
@@ -6,6 +6,7 @@
 import java.nio.charset.StandardCharsets;
 import java.util.*;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ruoyi.common.utils.http.HttpUtils;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.JsonNode;
@@ -61,6 +62,33 @@
     @Autowired
     private IBtTorrentAnnounceService btTorrentAnnounceService;
     private static final String RECOMMEND_API = "http://127.0.0.1:5000/recommend_torrents";
+    private String sendJsonPost(String url, String jsonBody) throws IOException {
+        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
+        connection.setRequestMethod("POST");
+        connection.setDoOutput(true);
+        connection.setRequestProperty("Content-Type", "application/json");
+        connection.setRequestProperty("Accept", "application/json");
+
+        try (OutputStream os = connection.getOutputStream()) {
+            os.write(jsonBody.getBytes(StandardCharsets.UTF_8));
+        }
+
+        try (InputStream is = connection.getInputStream()) {
+            return new String(is.readAllBytes(), StandardCharsets.UTF_8);
+        }
+    }
+    public static class TorrentRecommendationRequest {
+        @JsonProperty("torrent_ids")
+        private List<Long> ids;
+
+        public List<Long> getIds() {
+            return ids;
+        }
+
+        public void setIds(List<Long> ids) {
+            this.ids = ids;
+        }
+    }
 
     private String torrentPath= "torrents";
 
@@ -92,9 +120,6 @@
                 }
                 TorrentFileUtil.uploadFile(file,torrentPath+"/"+SecurityUtils.getUserId());
 
-
-
-
                 // Assuming the Flask server responds with JSON, parse the response
                 String responseBody = new String(connection.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
                 parseTorrentData(responseBody);
@@ -155,7 +180,6 @@
                 btTorrentFileService.insertBtTorrentFile(btFile);
             }
             );
-
             // Convert btTorrentAnnounceNode to List<BtTorrentAnnounce>
             List<BtTorrentAnnounce> btTorrentAnnounceList = new ArrayList<>();
             if (btTorrentAnnounceNode.isArray()) {
@@ -170,18 +194,9 @@
                         btTorrentAnnounceService.insertBtTorrentAnnounce(btTorrentAnnounce);
                     }
             );
-
-
-
-
-
-
-
-
         } catch (Exception e) {
             e.printStackTrace();
             // Handle the error (e.g., return null or an error message)
-
         }
     }
 
@@ -227,22 +242,41 @@
      */
     @PreAuthorize("@ss.hasPermi('system:torrent:list')")
     @PostMapping("/recommend")
-    public TableDataInfo recommendTorrents(@RequestParam("user_id") String userId) {
+    public TableDataInfo recommendTorrents() {
+        // 假设当前用户的 user_id 是通过 SecurityContext 或 session 中获取的
+        String userId = String.valueOf(getUserId());  // 获取当前用户的 user_id
+
+        if (userId == null || userId.isEmpty()) {
+            TableDataInfo error = new TableDataInfo();
+            error.setCode(400);
+            error.setMsg("用户ID无效或未登录");
+            return error;
+        }
+
+        System.out.println("当前用户ID: " + userId);  // 打印调试信息
+
         try {
-            // 1. 构造 JSON 请求体
+            // 1. 构造 JSON 请求体，包含用户ID
             String jsonRequest = "{\"user_id\": \"" + userId + "\"}";
 
-            // 2. 向 Flask 服务发 POST 请求，返回 JSON 数组
-            String jsonResponse = HttpUtils.sendPost(RECOMMEND_API, jsonRequest);
+            // 2. 向 Flask 服务发 POST 请求，返回 JSON 响应
+            String jsonResponse = sendJsonPost(RECOMMEND_API, jsonRequest);
 
-            // 3. 使用 Jackson 解析 JSON 数组为 List<Long>
+            // 3. 使用 Jackson 解析 JSON 响应为 TorrentRecommendationRequest 对象
             ObjectMapper mapper = new ObjectMapper();
-            List<Long> idList = mapper.readValue(jsonResponse, new TypeReference<List<Long>>() {});
+            TorrentRecommendationRequest recommendationRequest = mapper.readValue(jsonResponse, TorrentRecommendationRequest.class);
 
-            // 4. 根据 ID 查询完整种子信息，并保持推荐顺序
+            // 4. 提取 ids 字段
+            List<Long> idList = recommendationRequest.getIds();
+
+            if (idList == null || idList.isEmpty()) {
+                throw new RuntimeException("推荐的种子ID列表为空");
+            }
+
+            // 5. 根据种子ID查询完整的种子信息，保持推荐顺序
             List<BtTorrent> resultList = btTorrentService.selectBtTorrentsByIdsOrdered(idList);
 
-            // 5. 封装成 TableDataInfo 返回
+            // 6. 封装查询结果并返回
             TableDataInfo rsp = new TableDataInfo();
             rsp.setCode(200);
             rsp.setMsg("推荐成功");
@@ -251,7 +285,9 @@
             return rsp;
 
         } catch (Exception e) {
-            e.printStackTrace();
+            e.printStackTrace();  // 打印异常信息
+
+            // 如果出错，返回错误信息
             TableDataInfo error = new TableDataInfo();
             error.setCode(500);
             error.setMsg("推荐失败：" + e.getMessage());
@@ -259,6 +295,7 @@
         }
     }
 
+
     /**
      * 导出种子主列表
      */
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/torrent/mapper/BtTorrentMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/torrent/mapper/BtTorrentMapper.java
index 529043c..05fc282 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/torrent/mapper/BtTorrentMapper.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/torrent/mapper/BtTorrentMapper.java
@@ -68,5 +68,5 @@
      * @param ids 种子ID列表
      * @return 种子列表
      */
-    List<BtTorrent> selectBtTorrentsByIdsOrdered(@Param("list") List<Long> ids);
+    public List<BtTorrent> selectBtTorrentsByIdsOrdered(@Param("list") List<Long> ids);
 }
diff --git a/ruoyi-admin/src/main/resources/mapper/system/BtTorrentMapper.xml b/ruoyi-admin/src/main/resources/mapper/system/BtTorrentMapper.xml
index 4f5cf3f..097d7b8 100644
--- a/ruoyi-admin/src/main/resources/mapper/system/BtTorrentMapper.xml
+++ b/ruoyi-admin/src/main/resources/mapper/system/BtTorrentMapper.xml
@@ -45,14 +45,14 @@
         where torrent_id = #{torrentId}
     </select>
 
-    <select id="selectBtTorrentsByIdsOrdered" resultType="BtTorrent">
+    <select id="selectBtTorrentsByIdsOrdered" resultMap="BtTorrentResult">
         SELECT * FROM bt_torrent
-        WHERE id IN
-        <foreach collection="list" item="id" open="(" separator="," close=")">
+        WHERE torrent_id IN  <!-- 修改这里 -->
+        <foreach item="id" collection="list" open="(" separator="," close=")">
             #{id}
         </foreach>
-        ORDER BY FIELD(id
-        <foreach collection="list" item="id" separator=",">
+        ORDER BY FIELD(torrent_id,  <!-- 修改这里 -->
+        <foreach item="id" collection="list" separator=",">
             #{id}
         </foreach>
         )
