diff --git a/src/main/java/com/ptp/ptplatform/controller/HelpCommentController.java b/src/main/java/com/ptp/ptplatform/controller/HelpCommentController.java
index 15504be..c937428 100644
--- a/src/main/java/com/ptp/ptplatform/controller/HelpCommentController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/HelpCommentController.java
@@ -1,24 +1,56 @@
 package com.ptp.ptplatform.controller;
 
+import com.ptp.ptplatform.entity.HelpComment;
 import com.ptp.ptplatform.service.HelpCommentService;
 import com.ptp.ptplatform.utils.Result;
 import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
+import java.time.LocalDateTime;
+import java.util.List;
+
 @RestController
 @RequestMapping("/help/comments")
 @AllArgsConstructor
 public class HelpCommentController {
-
     private final HelpCommentService commentService;
 
-    /**
-     * 点赞评论
-     * POST /help/comments/{commentId}/like
-     */
     @PostMapping("/{commentId}/like")
     public Result like(@PathVariable int commentId) {
         commentService.incrementLike(commentId);
         return Result.ok();
     }
+
+    // 获取评论的回复
+    @GetMapping("/{commentId}/replies")
+    public Result getReplies(@PathVariable int commentId) {
+        List<HelpComment> replies = commentService.getReplies(commentId);
+        return Result.ok().data("replies", replies);
+    }
+
+    @PostMapping("/{commentId}/replies")
+    public Result addReply(@PathVariable int commentId,
+                           @RequestBody HelpComment reply) {
+        HelpComment parentComment = commentService.getById(commentId);
+        if (parentComment == null) {
+            return Result.error(404).setMessage("被回复的评论不存在");
+        }
+
+        // 设置完整字段
+        reply.setPostId(parentComment.getPostId());
+        reply.setParentId(commentId);
+        reply.setAuthorId(reply.getAuthorId());
+        reply.setReplyTo(parentComment.getAuthorId());
+        reply.setCreateTime(LocalDateTime.now()); // 设置创建时间
+        reply.setLikeCount(0); // 初始化点赞数
+
+        commentService.save(reply);
+
+        // 返回完整的评论数据
+        return Result.ok()
+                .data("reply", reply)
+                .data("parentCommentId", commentId); // 同时返回父评论ID
+    }
+
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/controller/HelpPostController.java b/src/main/java/com/ptp/ptplatform/controller/HelpPostController.java
index 5fb626c..646ed76 100644
--- a/src/main/java/com/ptp/ptplatform/controller/HelpPostController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/HelpPostController.java
@@ -3,16 +3,19 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ptp.ptplatform.entity.HelpComment;
 import com.ptp.ptplatform.entity.HelpPost;
-import com.ptp.ptplatform.entity.SeedPost;
 import com.ptp.ptplatform.service.HelpCommentService;
 import com.ptp.ptplatform.service.HelpPostService;
 import com.ptp.ptplatform.utils.Result;
 import lombok.AllArgsConstructor;
-import lombok.Data;
 import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @RestController
 @RequestMapping("/help/posts")
@@ -28,56 +31,91 @@
         return Result.ok().data("post", post);
     }
 
-
-
     // 列表分页
     @GetMapping
     public Result listPosts(@RequestParam(defaultValue = "1") int page,
-                            @RequestParam(defaultValue = "10") int size) {
+                            @RequestParam(defaultValue = "5") int size) {
         IPage<HelpPost> ipage = postService.page(
                 new Page<>(page, size),
                 new QueryWrapper<HelpPost>().orderByDesc("create_time")
         );
         return Result.ok()
                 .data("records", ipage.getRecords())
-                .data("total",    ipage.getTotal());
+                .data("total", ipage.getTotal());
     }
 
-    // 帖子详情 + 评论
-    @GetMapping("/{postId}")
-    public Result getPost(@PathVariable int postId) {
-        HelpPost post = postService.getById(postId);
-        List<HelpComment> comments = commentService.list(
+    @GetMapping("/{Id}")
+    public Result getPost(@PathVariable int Id) {
+        HelpPost post = postService.getById(Id);
+        if (post == null) {
+            return Result.error(404).setMessage("帖子不存在");
+        }
+
+        // 获取所有评论（按创建时间排序）
+        List<HelpComment> allComments = commentService.list(
                 new QueryWrapper<HelpComment>()
-                        .eq("post_id", postId)
+                        .eq("post_id", Id)
                         .orderByAsc("create_time")
         );
+
+        // 构建评论树形结构
+        List<HelpComment> rootComments = new ArrayList<>();
+        Map<Integer, HelpComment> commentMap = new HashMap<>();
+
+        // 第一遍：初始化所有评论到map中
+        for (HelpComment comment : allComments) {
+            comment.setReplies(new ArrayList<>()); // 初始化replies列表
+            commentMap.put(comment.getId(), comment);
+        }
+
+        // 第二遍：构建父子关系
+        for (HelpComment comment : allComments) {
+            if (comment.getParentId() == 0) {
+                rootComments.add(comment);
+            } else {
+                HelpComment parent = commentMap.get(comment.getParentId());
+                if (parent != null) {
+                    parent.getReplies().add(comment);
+                }
+            }
+        }
+
         return Result.ok()
-                .data("post",     post)
-                .data("comments", comments);
+                .data("post", post)
+                .data("comments", rootComments);
     }
 
     // 点赞帖子
-    @PostMapping("/{postId}/like")
-    public Result likePost(@PathVariable int postId) {
-        postService.incrementLike(postId);
+    @PostMapping("/{Id}/like")
+    public Result likePost(@PathVariable int Id) {
+        postService.incrementLike(Id);
         return Result.ok();
     }
-    // 发布评论
-    @PostMapping("/{postId}/comments")
-    public Result comment(@PathVariable int postId,
-                          @RequestBody HelpComment comment) {
-        comment.setPostId(postId);
-        commentService.save(comment);
-        postService.incrementReplyCount(postId);
-        return Result.ok()
-                .data("commentId", comment.getId());
-    }
 
-    @Data
-    @AllArgsConstructor
-    static class HelpDetailResponse {
-        private HelpPost post;
-        private List<HelpComment> comments;
+    @PostMapping("/{Id}/comments")
+    public Result comment(@PathVariable int Id,
+                          @RequestBody HelpComment comment) {
+        // 设置评论信息
+        comment.setPostId(Id);
+        comment.setCreateTime(LocalDateTime.now());
+        comment.setLikeCount(0); // 初始化点赞数
+        comment.setParentId(0);  // 默认父评论ID
+        comment.setReplyTo(null); // 主评论 replyTo=null
+
+        // 保存评论
+        boolean saved = commentService.save(comment);
+        if (!saved) {
+            return Result.error(404).setMessage("评论保存失败");
+        }
+
+        // 更新回复数
+        postService.incrementReplyCount(Id);
+
+        // 获取更新后的完整评论（包含数据库生成的ID和时间）
+        HelpComment newComment = commentService.getById(comment.getId());
+
+        return Result.ok()
+                .data("comment", newComment)  // 返回完整评论数据
+                .data("newReplyCount", postService.getById(Id).getReplyCount());
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/controller/SeedCommentController.java b/src/main/java/com/ptp/ptplatform/controller/SeedCommentController.java
deleted file mode 100644
index 635080f..0000000
--- a/src/main/java/com/ptp/ptplatform/controller/SeedCommentController.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.ptp.ptplatform.controller;
-
-import com.ptp.ptplatform.service.SeedCommentService;
-import com.ptp.ptplatform.utils.Result;
-import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
-
-@RestController
-@RequestMapping("/seed/comments")
-@AllArgsConstructor
-public class SeedCommentController {
-    private final SeedCommentService commentService;
-
-    @PostMapping("/{commentId}/like")
-    public Result like(@PathVariable int commentId) {
-        commentService.incrementLike(commentId);
-        return Result.ok();
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/controller/SeedPostController.java b/src/main/java/com/ptp/ptplatform/controller/SeedPostController.java
deleted file mode 100644
index f481b9b..0000000
--- a/src/main/java/com/ptp/ptplatform/controller/SeedPostController.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.ptp.ptplatform.controller;
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.ptp.ptplatform.entity.HelpPost;
-import com.ptp.ptplatform.entity.SeedComment;
-import com.ptp.ptplatform.entity.SeedPost;
-import com.ptp.ptplatform.service.SeedCommentService;
-import com.ptp.ptplatform.service.SeedPostService;
-import com.ptp.ptplatform.utils.Result;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import org.springframework.web.bind.annotation.*;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import java.util.List;
-
-@RestController
-@RequestMapping("/seed/posts")
-@AllArgsConstructor
-public class SeedPostController {
-    private final SeedPostService postService;
-    private final SeedCommentService commentService;
-
-    // 创建帖子
-    @PostMapping
-    public Result createPost(@RequestBody SeedPost post) {
-        postService.save(post);
-        return Result.ok().data("post", post);
-    }
-
-
-    // 列表分页
-    @GetMapping
-    public Result listPosts(@RequestParam(defaultValue = "1") int page,
-                            @RequestParam(defaultValue = "10") int size) {
-        IPage<SeedPost> ipage = postService.page(
-                new Page<>(page, size),
-                new QueryWrapper<SeedPost>().orderByDesc("create_time")
-        );
-        return Result.ok()
-                .data("records", ipage.getRecords())
-                .data("total",    ipage.getTotal());
-    }
-
-    // 帖子详情 + 评论
-    @GetMapping("/{postId}")
-    public Result getPost(@PathVariable int postId) {
-        SeedPost post = postService.getById(postId);
-        List<SeedComment> comments = commentService.list(
-                new QueryWrapper<SeedComment>()
-                        .eq("post_id", postId)
-                        .orderByAsc("create_time")
-        );
-        return Result.ok()
-                .data("post",     post)
-                .data("comments", comments);
-    }
-
-    // 点赞帖子
-    @PostMapping("/{postId}/like")
-    public Result likePost(@PathVariable int postId) {
-        postService.incrementLike(postId);
-        return Result.ok();
-    }
-    // 发布评论
-    @PostMapping("/{postId}/comments")
-    public Result comment(@PathVariable int postId,
-                          @RequestBody SeedComment comment) {
-        comment.setPostId(postId);
-        commentService.save(comment);
-        postService.incrementReplyCount(postId);
-        return Result.ok()
-                .data("commentId", comment.getId());
-    }
-
-    @Data
-    @AllArgsConstructor
-    static class SeedDetailResponse {
-        private SeedPost post;
-        private List<SeedComment> comments;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/controller/TorrentCommentController.java b/src/main/java/com/ptp/ptplatform/controller/TorrentCommentController.java
new file mode 100644
index 0000000..1140ff7
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/controller/TorrentCommentController.java
@@ -0,0 +1,55 @@
+package com.ptp.ptplatform.controller;
+
+import com.ptp.ptplatform.entity.TorrentComment;
+import com.ptp.ptplatform.service.TorrentCommentService;
+import com.ptp.ptplatform.utils.Result;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@RestController
+@RequestMapping("/torrent/comments")
+@AllArgsConstructor
+public class TorrentCommentController {
+    private final TorrentCommentService commentService;
+
+    @PostMapping("/{commentId}/like")
+    public Result like(@PathVariable int commentId) {
+        commentService.incrementLike(commentId);
+        return Result.ok();
+    }
+
+    // 获取评论的回复
+    @GetMapping("/{commentId}/replies")
+    public Result getReplies(@PathVariable int commentId) {
+        List<TorrentComment> replies = commentService.getReplies(commentId);
+        return Result.ok().data("replies", replies);
+    }
+
+    @PostMapping("/{commentId}/replies")
+    public Result addReply(@PathVariable int commentId,
+                           @RequestBody TorrentComment reply) {
+        TorrentComment parentComment = commentService.getById(commentId);
+        if (parentComment == null) {
+            return Result.error(404).setMessage("被回复的评论不存在");
+        }
+
+        // 设置完整字段
+        reply.setPostId(parentComment.getPostId());
+        reply.setParentId(commentId);
+        reply.setAuthorId(reply.getAuthorId());
+        reply.setReplyTo(parentComment.getAuthorId());
+        reply.setCreateTime(LocalDateTime.now()); // 设置创建时间
+        reply.setLikeCount(0); // 初始化点赞数
+
+        commentService.save(reply);
+
+        // 返回完整的评论数据
+        return Result.ok()
+                .data("reply", reply)
+                .data("parentCommentId", commentId); // 同时返回父评论ID
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/controller/TorrentController.java b/src/main/java/com/ptp/ptplatform/controller/TorrentController.java
new file mode 100644
index 0000000..3c71ba1
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/controller/TorrentController.java
@@ -0,0 +1,121 @@
+package com.ptp.ptplatform.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ptp.ptplatform.entity.TorrentComment;
+import com.ptp.ptplatform.entity.Torrent;
+import com.ptp.ptplatform.service.TorrentCommentService;
+import com.ptp.ptplatform.service.TorrentService;
+import com.ptp.ptplatform.utils.Result;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/torrent")
+@AllArgsConstructor
+public class TorrentController {
+    private final TorrentService postService;
+    private final TorrentCommentService commentService;
+
+    // 创建帖子
+    @PostMapping
+    public Result createTorrent(@RequestBody Torrent torrent) {
+        postService.save(torrent);
+        return Result.ok().data("post", torrent);
+    }
+
+    // 列表分页
+    @GetMapping
+    public Result listPosts(@RequestParam(defaultValue = "1") int page,
+                            @RequestParam(defaultValue = "5") int size) {
+        IPage<Torrent> ipage = postService.page(
+                new Page<>(page, size),
+                new QueryWrapper<Torrent>().orderByDesc("create_time")
+        );
+        return Result.ok()
+                .data("records", ipage.getRecords())
+                .data("total", ipage.getTotal());
+    }
+
+    @GetMapping("/{Id}")
+    public Result getPost(@PathVariable int Id) {
+        Torrent torrent = postService.getById(Id);
+        if (torrent == null) {
+            return Result.error(404).setMessage("种子不存在"); // 明确设置404状态码
+        }
+
+        // 获取所有评论（按创建时间排序）
+        List<TorrentComment> allComments = commentService.list(
+                new QueryWrapper<TorrentComment>()
+                        .eq("post_id", Id)
+                        .orderByAsc("create_time")
+        );
+
+        // 构建评论树形结构
+        List<TorrentComment> rootComments = new ArrayList<>();
+        Map<Integer, TorrentComment> commentMap = new HashMap<>();
+
+        // 第一遍：初始化所有评论到map中
+        for (TorrentComment comment : allComments) {
+            comment.setReplies(new ArrayList<>()); // 初始化replies列表
+            commentMap.put(comment.getId(), comment);
+        }
+
+        // 第二遍：构建父子关系
+        for (TorrentComment comment : allComments) {
+            if (comment.getParentId() == 0) {
+                rootComments.add(comment);
+            } else {
+                TorrentComment parent = commentMap.get(comment.getParentId());
+                if (parent != null) {
+                    parent.getReplies().add(comment);
+                }
+            }
+        }
+
+        return Result.ok()
+                .data("torrent", torrent)
+                .data("comments", rootComments);
+    }
+
+    // 点赞帖子
+    @PostMapping("/{Id}/like")
+    public Result likePost(@PathVariable int Id) {
+        postService.incrementLike(Id);
+        return Result.ok();
+    }
+
+    @PostMapping("/{Id}/comments")
+    public Result comment(@PathVariable int Id,
+                          @RequestBody TorrentComment comment) {
+        // 设置评论信息
+        comment.setPostId(Id);
+        comment.setCreateTime(LocalDateTime.now());
+        comment.setLikeCount(0); // 初始化点赞数
+        comment.setParentId(0);  // 默认父评论ID
+        comment.setReplyTo(null); // 主评论 replyTo=null
+
+        // 保存评论
+        boolean saved = commentService.save(comment);
+        if (!saved) {
+            return Result.error(404).setMessage("评论保存失败");
+        }
+
+        // 更新回复数
+        postService.incrementReplyCount(Id);
+
+        // 获取更新后的完整评论（包含数据库生成的ID和时间）
+        TorrentComment newComment = commentService.getById(comment.getId());
+
+        return Result.ok()
+                .data("comment", newComment)  // 返回完整评论数据
+                .data("newReplyCount", postService.getById(Id).getReplyCount());
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/controller/UserController.java b/src/main/java/com/ptp/ptplatform/controller/UserController.java
index 0b1dcb2..9265ce7 100644
--- a/src/main/java/com/ptp/ptplatform/controller/UserController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/UserController.java
@@ -42,10 +42,10 @@
                 String token = JwtUtils.generateToken(user.getUsername());
                 return Result.ok().data("token", token);  // 返回令牌给前端
             } else {
-                return Result.error().setMessage("密码错误");
+                return Result.error(404).setMessage("密码错误");
             }
         } else {
-            return Result.error().setMessage("用户不存在");
+            return Result.error(404).setMessage("用户不存在");
         }
     }
 
@@ -67,15 +67,15 @@
 
                     return Result.ok().setMessage("新建用户成功");
                 } else {
-                    return Result.error().setMessage("邀请码已经被使用，注册失败");
+                    return Result.error(404).setMessage("邀请码已经被使用，注册失败");
                 }
 
             } else {
-                return Result.error().setMessage("邀请码不存在，注册失败");
+                return Result.error(404).setMessage("邀请码不存在，注册失败");
             }
 
         } else {
-            return Result.error().setMessage("用户名已存在，注册失败");
+            return Result.error(404).setMessage("用户名已存在，注册失败");
         }
 
 
diff --git a/src/main/java/com/ptp/ptplatform/entity/HelpComment.java b/src/main/java/com/ptp/ptplatform/entity/HelpComment.java
index 405e91d..5821868 100644
--- a/src/main/java/com/ptp/ptplatform/entity/HelpComment.java
+++ b/src/main/java/com/ptp/ptplatform/entity/HelpComment.java
@@ -1,10 +1,13 @@
 package com.ptp.ptplatform.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
 
 @Data
 @TableName("help_comments")
@@ -12,8 +15,22 @@
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;        // 使用包装类型以支持 null
     private Integer postId;
-    private Integer authorId;
+    private String authorId;
     private String content;
     private Integer likeCount;
     private LocalDateTime createTime;
+    private Integer parentId;  // 新增字段，用于回复功能，0表示主评论，非0表示回复某条评论
+    private String replyTo;
+
+    @TableField(exist = false)
+    private List<HelpComment> replies = new ArrayList<>(); // 必须初始化
+
+    // 确保有getter和setter
+    public List<HelpComment> getReplies() {
+        return replies;
+    }
+
+    public void setReplies(List<HelpComment> replies) {
+        this.replies = replies;
+    }
 }
diff --git a/src/main/java/com/ptp/ptplatform/entity/HelpPost.java b/src/main/java/com/ptp/ptplatform/entity/HelpPost.java
index b77fe0b..be0bd02 100644
--- a/src/main/java/com/ptp/ptplatform/entity/HelpPost.java
+++ b/src/main/java/com/ptp/ptplatform/entity/HelpPost.java
@@ -11,7 +11,7 @@
 public class HelpPost {
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;        // 使用包装类型以支持 null
-    private Integer authorId;
+    private String authorId;
     private String title;
     private String content;
     private Integer likeCount;
diff --git a/src/main/java/com/ptp/ptplatform/entity/SeedComment.java b/src/main/java/com/ptp/ptplatform/entity/SeedComment.java
deleted file mode 100644
index 48121b5..0000000
--- a/src/main/java/com/ptp/ptplatform/entity/SeedComment.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.ptp.ptplatform.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import java.time.LocalDateTime;
-
-@Data
-@TableName("seed_comments")
-public class SeedComment {
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;        // 使用包装类型以支持 null
-    private Integer postId;
-    private Integer authorId;
-    private String content;
-    private Integer likeCount;
-    private LocalDateTime createTime;
-}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/entity/SeedPost.java b/src/main/java/com/ptp/ptplatform/entity/SeedPost.java
deleted file mode 100644
index b8f74ef..0000000
--- a/src/main/java/com/ptp/ptplatform/entity/SeedPost.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.ptp.ptplatform.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import java.time.LocalDateTime;
-
-@Data
-@TableName("seed_posts")
-public class SeedPost {
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;        // 使用包装类型以支持 null
-    private Integer authorId;
-    private String title;
-    private String content;
-    private Integer likeCount;
-    private Integer replyCount;
-    private LocalDateTime createTime;
-}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/entity/Torrent.java b/src/main/java/com/ptp/ptplatform/entity/Torrent.java
new file mode 100644
index 0000000..2c6c6d3
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/entity/Torrent.java
@@ -0,0 +1,39 @@
+package com.ptp.ptplatform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("torrent")
+public class Torrent {
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("torrentName") // 明确指定数据库列名
+    private String torrentName;
+
+    private String description;
+    private String category;
+    private String region;
+    private String resolution;
+    private String subtitle;
+    private Long size;
+    private String hash;
+
+    private LocalDateTime createTime;
+
+    private String username;
+
+    @TableField("filePath") // 明确指定数据库列名
+    private String filePath;
+
+    private Integer likeCount;
+    private Integer replyCount;
+
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/entity/TorrentComment.java b/src/main/java/com/ptp/ptplatform/entity/TorrentComment.java
new file mode 100644
index 0000000..d2b4694
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/entity/TorrentComment.java
@@ -0,0 +1,36 @@
+package com.ptp.ptplatform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@TableName("torrent_comments")
+public class TorrentComment {
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    private Integer postId;
+    private String authorId;
+    private String content;
+    private Integer likeCount;
+    private LocalDateTime createTime;
+    private Integer parentId;
+    private String replyTo;
+
+    @TableField(exist = false)
+    private List<TorrentComment> replies = new ArrayList<>(); // 必须初始化
+
+    // 确保有getter和setter
+    public List<TorrentComment> getReplies() {
+        return replies;
+    }
+
+    public void setReplies(List<TorrentComment> replies) {
+        this.replies = replies;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/entity/USER.java b/src/main/java/com/ptp/ptplatform/entity/USER.java
index 84e5c33..a33847c 100644
--- a/src/main/java/com/ptp/ptplatform/entity/USER.java
+++ b/src/main/java/com/ptp/ptplatform/entity/USER.java
@@ -2,13 +2,13 @@
 // @GeneratedValue(strategy = GenerationType.IDENTITY) 对于一些需要自动生成的主键id进行注解
 
 package com.ptp.ptplatform.entity;
-
 import jakarta.persistence.*;
 
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.Date;
 
+
 @Table(name = "user")
 public class USER {
 
diff --git a/src/main/java/com/ptp/ptplatform/mapper/SeedCommentMapper.java b/src/main/java/com/ptp/ptplatform/mapper/SeedCommentMapper.java
deleted file mode 100644
index d72619b..0000000
--- a/src/main/java/com/ptp/ptplatform/mapper/SeedCommentMapper.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.ptp.ptplatform.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ptp.ptplatform.entity.SeedComment;
-import org.apache.ibatis.annotations.Mapper;
-
-@Mapper
-public interface SeedCommentMapper extends BaseMapper<SeedComment> {}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/mapper/SeedPostMapper.java b/src/main/java/com/ptp/ptplatform/mapper/SeedPostMapper.java
deleted file mode 100644
index 134212d..0000000
--- a/src/main/java/com/ptp/ptplatform/mapper/SeedPostMapper.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.ptp.ptplatform.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ptp.ptplatform.entity.SeedPost;
-import org.apache.ibatis.annotations.Mapper;
-
-@Mapper
-public interface SeedPostMapper extends BaseMapper<SeedPost> {}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/mapper/TorrentCommentMapper.java b/src/main/java/com/ptp/ptplatform/mapper/TorrentCommentMapper.java
new file mode 100644
index 0000000..b330ce6
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/mapper/TorrentCommentMapper.java
@@ -0,0 +1,8 @@
+package com.ptp.ptplatform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ptp.ptplatform.entity.TorrentComment;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface TorrentCommentMapper extends BaseMapper<TorrentComment> {}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/mapper/TorrentMapper.java b/src/main/java/com/ptp/ptplatform/mapper/TorrentMapper.java
new file mode 100644
index 0000000..ff612b3
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/mapper/TorrentMapper.java
@@ -0,0 +1,8 @@
+package com.ptp.ptplatform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ptp.ptplatform.entity.Torrent;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface TorrentMapper extends BaseMapper<Torrent> {}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/service/HelpCommentService.java b/src/main/java/com/ptp/ptplatform/service/HelpCommentService.java
index dcab060..14622ab 100644
--- a/src/main/java/com/ptp/ptplatform/service/HelpCommentService.java
+++ b/src/main/java/com/ptp/ptplatform/service/HelpCommentService.java
@@ -3,6 +3,9 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ptp.ptplatform.entity.HelpComment;
 
+import java.util.List;
+
 public interface HelpCommentService extends IService<HelpComment> {
     void incrementLike(int commentId);
+    List<HelpComment> getReplies(int parentId); // 新增方法
 }
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/service/SeedCommentService.java b/src/main/java/com/ptp/ptplatform/service/SeedCommentService.java
deleted file mode 100644
index dec7f16..0000000
--- a/src/main/java/com/ptp/ptplatform/service/SeedCommentService.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.ptp.ptplatform.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.ptp.ptplatform.entity.SeedComment;
-
-public interface SeedCommentService extends IService<SeedComment> {
-    void incrementLike(int commentId);
-}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/service/SeedPostService.java b/src/main/java/com/ptp/ptplatform/service/SeedPostService.java
deleted file mode 100644
index 40605a8..0000000
--- a/src/main/java/com/ptp/ptplatform/service/SeedPostService.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.ptp.ptplatform.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.ptp.ptplatform.entity.SeedPost;
-
-public interface SeedPostService extends IService<SeedPost> {
-    void incrementLike(int postId);
-    void incrementReplyCount(int postId);
-}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/service/TorrentCommentService.java b/src/main/java/com/ptp/ptplatform/service/TorrentCommentService.java
new file mode 100644
index 0000000..3b60257
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/TorrentCommentService.java
@@ -0,0 +1,11 @@
+package com.ptp.ptplatform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ptp.ptplatform.entity.TorrentComment;
+
+import java.util.List;
+
+public interface TorrentCommentService extends IService<TorrentComment> {
+    void incrementLike(int commentId);
+    List<TorrentComment> getReplies(int parentId);
+}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/service/TorrentService.java b/src/main/java/com/ptp/ptplatform/service/TorrentService.java
new file mode 100644
index 0000000..f3d0222
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/TorrentService.java
@@ -0,0 +1,11 @@
+package com.ptp.ptplatform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ptp.ptplatform.entity.Torrent;
+
+public interface TorrentService extends IService<Torrent> {
+    Torrent getTorrentById(Integer id);  // Add this method
+    void incrementLike(int postId);
+    void incrementReplyCount(int postId);
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/service/impl/HelpCommentServiceImpl.java b/src/main/java/com/ptp/ptplatform/service/impl/HelpCommentServiceImpl.java
index dbaed2a..4f47e78 100644
--- a/src/main/java/com/ptp/ptplatform/service/impl/HelpCommentServiceImpl.java
+++ b/src/main/java/com/ptp/ptplatform/service/impl/HelpCommentServiceImpl.java
@@ -1,14 +1,19 @@
 package com.ptp.ptplatform.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ptp.ptplatform.entity.HelpComment;
 import com.ptp.ptplatform.mapper.HelpCommentMapper;
 import com.ptp.ptplatform.service.HelpCommentService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
 
 @Service
-public class HelpCommentServiceImpl extends ServiceImpl<HelpCommentMapper, HelpComment> implements HelpCommentService {
+public class HelpCommentServiceImpl
+        extends ServiceImpl<HelpCommentMapper, HelpComment>
+        implements HelpCommentService {
+
     @Override
     @Transactional
     public void incrementLike(int commentId) {
@@ -18,4 +23,14 @@
                         .setSql("like_count = like_count + 1")
         );
     }
+
+    @Override
+    @Transactional(readOnly = true)
+    public List<HelpComment> getReplies(int parentId) {
+        return this.baseMapper.selectList(
+                new QueryWrapper<HelpComment>()
+                        .eq("parent_id", parentId)
+                        .orderByAsc("create_time")
+        );
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/service/impl/SeedCommentServiceImpl.java b/src/main/java/com/ptp/ptplatform/service/impl/SeedCommentServiceImpl.java
deleted file mode 100644
index 537194a..0000000
--- a/src/main/java/com/ptp/ptplatform/service/impl/SeedCommentServiceImpl.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.ptp.ptplatform.service.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ptp.ptplatform.entity.SeedComment;
-import com.ptp.ptplatform.mapper.SeedCommentMapper;
-import com.ptp.ptplatform.service.SeedCommentService;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-@Service
-public class SeedCommentServiceImpl extends ServiceImpl<SeedCommentMapper, SeedComment> implements SeedCommentService {
-    @Override
-    @Transactional
-    public void incrementLike(int commentId) {
-        this.update(null,
-                new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<SeedComment>()
-                        .eq("id", commentId)
-                        .setSql("like_count = like_count + 1")
-        );
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/service/impl/TorrentCommentServiceImpl.java b/src/main/java/com/ptp/ptplatform/service/impl/TorrentCommentServiceImpl.java
new file mode 100644
index 0000000..540df71
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/impl/TorrentCommentServiceImpl.java
@@ -0,0 +1,34 @@
+package com.ptp.ptplatform.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ptp.ptplatform.entity.TorrentComment;
+import com.ptp.ptplatform.mapper.TorrentCommentMapper;
+import com.ptp.ptplatform.service.TorrentCommentService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+public class TorrentCommentServiceImpl extends ServiceImpl<TorrentCommentMapper, TorrentComment> implements TorrentCommentService {
+    @Override
+    @Transactional
+    public void incrementLike(int commentId) {
+        this.update(null,
+                new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<TorrentComment>()
+                        .eq("id", commentId)
+                        .setSql("like_count = like_count + 1")
+        );
+    }
+
+    @Override
+    @Transactional(readOnly = true)
+    public List<TorrentComment> getReplies(int parentId) {
+        return this.baseMapper.selectList(
+                new QueryWrapper<TorrentComment>()
+                        .eq("parent_id", parentId)
+                        .orderByAsc("create_time")
+        );
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/service/impl/SeedPostServiceImpl.java b/src/main/java/com/ptp/ptplatform/service/impl/TorrentServiceImpl.java
similarity index 64%
rename from src/main/java/com/ptp/ptplatform/service/impl/SeedPostServiceImpl.java
rename to src/main/java/com/ptp/ptplatform/service/impl/TorrentServiceImpl.java
index 05cf06c..a6eba54 100644
--- a/src/main/java/com/ptp/ptplatform/service/impl/SeedPostServiceImpl.java
+++ b/src/main/java/com/ptp/ptplatform/service/impl/TorrentServiceImpl.java
@@ -1,19 +1,24 @@
 package com.ptp.ptplatform.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ptp.ptplatform.entity.SeedPost;
-import com.ptp.ptplatform.mapper.SeedPostMapper;
-import com.ptp.ptplatform.service.SeedPostService;
+import com.ptp.ptplatform.entity.Torrent;
+import com.ptp.ptplatform.mapper.TorrentMapper;
+import com.ptp.ptplatform.service.TorrentService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 @Service
-public class SeedPostServiceImpl extends ServiceImpl<SeedPostMapper, SeedPost> implements SeedPostService {
+public class TorrentServiceImpl extends ServiceImpl<TorrentMapper, Torrent> implements TorrentService {
+
+    @Override
+    public Torrent getTorrentById(Integer id) {
+        return this.getById(id); // 直接调用 MyBatis-Plus 提供的 getById 方法
+    }
     @Override
     @Transactional
     public void incrementLike(int postId) {
         this.update(null,
-                new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<SeedPost>()
+                new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<Torrent>()
                         .eq("id", postId)
                         .setSql("like_count = like_count + 1")
         );
@@ -23,9 +28,10 @@
     @Transactional
     public void incrementReplyCount(int postId) {
         this.update(null,
-                new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<SeedPost>()
+                new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<Torrent>()
                         .eq("id", postId)
                         .setSql("reply_count = reply_count + 1")
         );
     }
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/utils/Result.java b/src/main/java/com/ptp/ptplatform/utils/Result.java
index 04a3290..0bda7eb 100644
--- a/src/main/java/com/ptp/ptplatform/utils/Result.java
+++ b/src/main/java/com/ptp/ptplatform/utils/Result.java
@@ -44,7 +44,7 @@
         return result;
     }
 
-    public static Result error() {
+    public static Result error(int i) {
         Result result = new Result();
         result.setSuccess(false);
         result.setCode(resultCode.ERROR);
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 588221c..730af5c 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -15,10 +15,9 @@
 # database setting
 spring.datasourse.type=com.alibaba.druid.pool.DruidDataSource
 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
-spring.datasource.url=jdbc:mysql://localhost:3306/ptpdata?useUnicode=true&characterEncoding=utf8
-spring.datasource.username=root
-#spring.datasource.password=yumu1412
-spring.datasource.password=root
+spring.datasource.url=jdbc:mysql://202.205.102.121:3306/G2ptpdatadevelop?useUnicode=true&characterEncoding=utf8
+spring.datasource.username=team2
+spring.datasource.password=123456
 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
 
 # Hibernate properties
