diff --git a/pom.xml b/pom.xml
index 8e12b26..a1921d6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -51,6 +51,11 @@
             <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
             <version>3.5.10.1</version>
         </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-jsqlparser</artifactId>
+            <version>3.5.10.1</version> <!-- 确保版本和 MyBatis Plus 主包一致 -->
+        </dependency>
         <!-- 数据库-->
         <!-- Mysql依赖包 -->
         <dependency>
@@ -107,6 +112,19 @@
             <scope>test</scope>
         </dependency>
 
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.32</version>  <!-- 请根据需要选择最新版本 -->
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.jayway.jsonpath</groupId>
+            <artifactId>json-path</artifactId>
+            <version>2.9.0</version>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/src/main/java/com/ptp/ptplatform/config/MybatisPlusConfig.java b/src/main/java/com/ptp/ptplatform/config/MybatisPlusConfig.java
new file mode 100644
index 0000000..5b34097
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/config/MybatisPlusConfig.java
@@ -0,0 +1,19 @@
+package com.ptp.ptplatform.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MybatisPlusConfig {
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(
+                new PaginationInnerInterceptor(DbType.MYSQL)
+        );
+        return interceptor;
+    }
+}
diff --git a/src/main/java/com/ptp/ptplatform/controller/HelpCommentController.java b/src/main/java/com/ptp/ptplatform/controller/HelpCommentController.java
new file mode 100644
index 0000000..15504be
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/controller/HelpCommentController.java
@@ -0,0 +1,24 @@
+package com.ptp.ptplatform.controller;
+
+import com.ptp.ptplatform.service.HelpCommentService;
+import com.ptp.ptplatform.utils.Result;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+@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();
+    }
+}
\ 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
new file mode 100644
index 0000000..5fb626c
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/controller/HelpPostController.java
@@ -0,0 +1,83 @@
+package com.ptp.ptplatform.controller;
+
+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.util.List;
+
+@RestController
+@RequestMapping("/help/posts")
+@AllArgsConstructor
+public class HelpPostController {
+    private final HelpPostService postService;
+    private final HelpCommentService commentService;
+
+    // 创建帖子
+    @PostMapping
+    public Result createPost(@RequestBody HelpPost 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<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());
+    }
+
+    // 帖子详情 + 评论
+    @GetMapping("/{postId}")
+    public Result getPost(@PathVariable int postId) {
+        HelpPost post = postService.getById(postId);
+        List<HelpComment> comments = commentService.list(
+                new QueryWrapper<HelpComment>()
+                        .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 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;
+    }
+}
\ 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
new file mode 100644
index 0000000..635080f
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/controller/SeedCommentController.java
@@ -0,0 +1,19 @@
+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
new file mode 100644
index 0000000..f481b9b
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/controller/SeedPostController.java
@@ -0,0 +1,82 @@
+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/entity/HelpComment.java b/src/main/java/com/ptp/ptplatform/entity/HelpComment.java
new file mode 100644
index 0000000..405e91d
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/entity/HelpComment.java
@@ -0,0 +1,19 @@
+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("help_comments")
+public class HelpComment {
+    @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;
+}
diff --git a/src/main/java/com/ptp/ptplatform/entity/HelpPost.java b/src/main/java/com/ptp/ptplatform/entity/HelpPost.java
new file mode 100644
index 0000000..b77fe0b
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/entity/HelpPost.java
@@ -0,0 +1,20 @@
+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("help_posts")
+public class HelpPost {
+    @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/SeedComment.java b/src/main/java/com/ptp/ptplatform/entity/SeedComment.java
new file mode 100644
index 0000000..48121b5
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/entity/SeedComment.java
@@ -0,0 +1,19 @@
+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
new file mode 100644
index 0000000..b8f74ef
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/entity/SeedPost.java
@@ -0,0 +1,20 @@
+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/mapper/HelpCommentMapper.java b/src/main/java/com/ptp/ptplatform/mapper/HelpCommentMapper.java
new file mode 100644
index 0000000..00ed3e3
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/mapper/HelpCommentMapper.java
@@ -0,0 +1,8 @@
+package com.ptp.ptplatform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ptp.ptplatform.entity.HelpComment;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface HelpCommentMapper extends BaseMapper<HelpComment> {}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/mapper/HelpPostMapper.java b/src/main/java/com/ptp/ptplatform/mapper/HelpPostMapper.java
new file mode 100644
index 0000000..29260da
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/mapper/HelpPostMapper.java
@@ -0,0 +1,8 @@
+package com.ptp.ptplatform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ptp.ptplatform.entity.HelpPost;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface HelpPostMapper extends BaseMapper<HelpPost> {}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/mapper/SeedCommentMapper.java b/src/main/java/com/ptp/ptplatform/mapper/SeedCommentMapper.java
new file mode 100644
index 0000000..d72619b
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/mapper/SeedCommentMapper.java
@@ -0,0 +1,8 @@
+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
new file mode 100644
index 0000000..134212d
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/mapper/SeedPostMapper.java
@@ -0,0 +1,8 @@
+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/service/HelpCommentService.java b/src/main/java/com/ptp/ptplatform/service/HelpCommentService.java
new file mode 100644
index 0000000..dcab060
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/HelpCommentService.java
@@ -0,0 +1,8 @@
+package com.ptp.ptplatform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ptp.ptplatform.entity.HelpComment;
+
+public interface HelpCommentService extends IService<HelpComment> {
+    void incrementLike(int commentId);
+}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/service/HelpPostService.java b/src/main/java/com/ptp/ptplatform/service/HelpPostService.java
new file mode 100644
index 0000000..541f927
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/HelpPostService.java
@@ -0,0 +1,9 @@
+package com.ptp.ptplatform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ptp.ptplatform.entity.HelpPost;
+
+public interface HelpPostService extends IService<HelpPost> {
+    void incrementLike(int postId);
+    void incrementReplyCount(int postId);
+}
\ 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
new file mode 100644
index 0000000..dec7f16
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/SeedCommentService.java
@@ -0,0 +1,8 @@
+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
new file mode 100644
index 0000000..40605a8
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/SeedPostService.java
@@ -0,0 +1,9 @@
+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/impl/HelpCommentServiceImpl.java b/src/main/java/com/ptp/ptplatform/service/impl/HelpCommentServiceImpl.java
new file mode 100644
index 0000000..dbaed2a
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/impl/HelpCommentServiceImpl.java
@@ -0,0 +1,21 @@
+package com.ptp.ptplatform.service.impl;
+
+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;
+
+@Service
+public class HelpCommentServiceImpl extends ServiceImpl<HelpCommentMapper, HelpComment> implements HelpCommentService {
+    @Override
+    @Transactional
+    public void incrementLike(int commentId) {
+        this.update(null,
+                new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<HelpComment>()
+                        .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/HelpPostServiceImpl.java b/src/main/java/com/ptp/ptplatform/service/impl/HelpPostServiceImpl.java
new file mode 100644
index 0000000..5e8d5d0
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/impl/HelpPostServiceImpl.java
@@ -0,0 +1,31 @@
+package com.ptp.ptplatform.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ptp.ptplatform.entity.HelpPost;
+import com.ptp.ptplatform.mapper.HelpPostMapper;
+import com.ptp.ptplatform.service.HelpPostService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class HelpPostServiceImpl extends ServiceImpl<HelpPostMapper, HelpPost> implements HelpPostService {
+    @Override
+    @Transactional
+    public void incrementLike(int postId) {
+        this.update(null,
+                new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<HelpPost>()
+                        .eq("id", postId)
+                        .setSql("like_count = like_count + 1")
+        );
+    }
+
+    @Override
+    @Transactional
+    public void incrementReplyCount(int postId) {
+        this.update(null,
+                new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<HelpPost>()
+                        .eq("id", postId)
+                        .setSql("reply_count = reply_count + 1")
+        );
+    }
+}
\ 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
new file mode 100644
index 0000000..537194a
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/impl/SeedCommentServiceImpl.java
@@ -0,0 +1,21 @@
+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/SeedPostServiceImpl.java b/src/main/java/com/ptp/ptplatform/service/impl/SeedPostServiceImpl.java
new file mode 100644
index 0000000..05cf06c
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/impl/SeedPostServiceImpl.java
@@ -0,0 +1,31 @@
+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 org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class SeedPostServiceImpl extends ServiceImpl<SeedPostMapper, SeedPost> implements SeedPostService {
+    @Override
+    @Transactional
+    public void incrementLike(int postId) {
+        this.update(null,
+                new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<SeedPost>()
+                        .eq("id", postId)
+                        .setSql("like_count = like_count + 1")
+        );
+    }
+
+    @Override
+    @Transactional
+    public void incrementReplyCount(int postId) {
+        this.update(null,
+                new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<SeedPost>()
+                        .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/resultCode.java b/src/main/java/com/ptp/ptplatform/utils/resultCode.java
index abd93d9..70afcb7 100644
--- a/src/main/java/com/ptp/ptplatform/utils/resultCode.java
+++ b/src/main/java/com/ptp/ptplatform/utils/resultCode.java
@@ -4,5 +4,4 @@
 public interface resultCode {
     public static Integer SUCCESS = 200;
     public static Integer ERROR = 500;
-
 }
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index e1226b0..588221c 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -17,7 +17,8 @@
 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=yumu1412
+spring.datasource.password=root
 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
 
 # Hibernate properties
diff --git a/src/test/java/com/ptp/ptplatform/controller/HelpPostControllerTest.java b/src/test/java/com/ptp/ptplatform/controller/HelpPostControllerTest.java
new file mode 100644
index 0000000..61d6aff
--- /dev/null
+++ b/src/test/java/com/ptp/ptplatform/controller/HelpPostControllerTest.java
@@ -0,0 +1,104 @@
+// src/test/java/com/ptp/ptplatform/controller/HelpPostControllerTest.java
+package com.ptp.ptplatform.controller;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ptp.ptplatform.entity.HelpComment;
+import com.ptp.ptplatform.entity.HelpPost;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+
+import java.util.List;
+
+import static org.hamcrest.Matchers.*;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+@SpringBootTest
+@AutoConfigureMockMvc
+public class HelpPostControllerTest {
+
+    @Autowired MockMvc mockMvc;
+    @Autowired ObjectMapper objectMapper;
+
+    private int postId;
+
+    @BeforeEach
+    void setup() throws Exception {
+        // 1. 创建一个帖子
+        HelpPost post = new HelpPost();
+        post.setAuthorId(1001);
+        post.setTitle("测试帮助帖");
+        post.setContent("帮助区内容示例");
+        String body = objectMapper.writeValueAsString(post);
+
+        // 2. 调接口，拿到完整的 JSON
+        String json = mockMvc.perform(post("/help/posts")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(body))
+                .andExpect(status().isOk())
+                .andReturn().getResponse().getContentAsString();
+
+        // 3. 解析 JSON，取到 data.post.id
+        JsonNode node = objectMapper.readTree(json);
+        postId = node.path("data").path("post").path("id").asInt();
+    }
+
+    @Test
+    void testHelpPostLifecycle() throws Exception {
+        // —— 列表分页 ——
+        mockMvc.perform(get("/help/posts")
+                        .param("page", "1")
+                        .param("size", "5"))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.data.records[0].id", is(postId)));
+
+        // —— 详情（此时无评论） ——
+        mockMvc.perform(get("/help/posts/{id}", postId))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.data.post.id", is(postId)))
+                .andExpect(jsonPath("$.data.comments", hasSize(0)));
+
+        // —— 点赞帖子 ——
+        mockMvc.perform(post("/help/posts/{id}/like", postId))
+                .andExpect(status().isOk());
+
+        mockMvc.perform(get("/help/posts/{id}", postId))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.data.post.likeCount", is(1)));
+
+        // —— 发布评论 ——
+        HelpComment comment = new HelpComment();
+        comment.setAuthorId(2002);
+        comment.setContent("测试帮助评论");
+        String cbody = objectMapper.writeValueAsString(comment);
+
+        String cres = mockMvc.perform(post("/help/posts/{id}/comments", postId)
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(cbody))
+                .andExpect(status().isOk())
+                .andReturn().getResponse().getContentAsString();
+
+        // 解析 commentId
+        JsonNode cnode = objectMapper.readTree(cres);
+        int commentId = cnode.path("data").path("commentId").asInt();
+
+        // 列详情确认评论出现
+        mockMvc.perform(get("/help/posts/{id}", postId))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.data.comments[0].id", is(commentId)));
+
+        // —— 评论点赞 ——
+        mockMvc.perform(post("/help/comments/{id}/like", commentId))
+                .andExpect(status().isOk());
+
+        mockMvc.perform(get("/help/posts/{id}", postId))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.data.comments[0].likeCount", is(1)));
+    }
+}
diff --git a/src/test/java/com/ptp/ptplatform/controller/SeedPostControllerTest.java b/src/test/java/com/ptp/ptplatform/controller/SeedPostControllerTest.java
new file mode 100644
index 0000000..95c431f
--- /dev/null
+++ b/src/test/java/com/ptp/ptplatform/controller/SeedPostControllerTest.java
@@ -0,0 +1,105 @@
+package com.ptp.ptplatform.controller;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ptp.ptplatform.entity.SeedComment;
+import com.ptp.ptplatform.entity.SeedPost;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+
+import static org.hamcrest.Matchers.*;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+@SpringBootTest
+@AutoConfigureMockMvc
+public class SeedPostControllerTest {
+
+    @Autowired
+    private MockMvc mockMvc;
+
+    @Autowired
+    private ObjectMapper objectMapper;
+
+    private int postId;
+
+    @BeforeEach
+    void setup() throws Exception {
+        SeedPost post = new SeedPost();
+        post.setAuthorId(3003);
+        post.setTitle("测试求种帖");
+        post.setContent("求种区内容示例");
+        String json = objectMapper.writeValueAsString(post);
+
+        String result = mockMvc.perform(post("/seed/posts")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(json))
+                .andExpect(status().isOk())
+                .andReturn()
+                .getResponse()
+                .getContentAsString();
+
+        // 从 Result.data.post.id 里取出刚创建的 postId
+        JsonNode node = objectMapper.readTree(result);
+        postId = node.path("data").path("post").path("id").asInt();
+    }
+
+    @Test
+    void testSeedPostLifecycle() throws Exception {
+        // 列表分页
+        mockMvc.perform(get("/seed/posts")
+                        .param("page", "1")
+                        .param("size", "5"))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.data.records[0].id", is(postId)));
+
+        // 详情（无评论）
+        mockMvc.perform(get("/seed/posts/{id}", postId))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.data.post.id", is(postId)))
+                .andExpect(jsonPath("$.data.comments", hasSize(0)));
+
+        // 点赞
+        mockMvc.perform(post("/seed/posts/{id}/like", postId))
+                .andExpect(status().isOk());
+
+        mockMvc.perform(get("/seed/posts/{id}", postId))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.data.post.likeCount", is(1)));
+
+        // 发布评论
+        SeedComment comment = new SeedComment();
+        comment.setAuthorId(4004);
+        comment.setContent("测试求种评论");
+        String cjson = objectMapper.writeValueAsString(comment);
+
+        String cres = mockMvc.perform(post("/seed/posts/{id}/comments", postId)
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content(cjson))
+                .andExpect(status().isOk())
+                .andReturn()
+                .getResponse()
+                .getContentAsString();
+
+        // 从 Result.data.commentId 中取出 commentId
+        JsonNode cnode = objectMapper.readTree(cres);
+        int commentId = cnode.path("data").path("commentId").asInt();
+
+        mockMvc.perform(get("/seed/posts/{id}", postId))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.data.comments[0].id", is(commentId)));
+
+        // 点赞评论
+        mockMvc.perform(post("/seed/comments/{id}/like", commentId))
+                .andExpect(status().isOk());
+
+        mockMvc.perform(get("/seed/posts/{id}", postId))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.data.comments[0].likeCount", is(1)));
+    }
+}
diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml
index 45122fa..45b607b 100644
--- a/src/test/resources/application-test.yml
+++ b/src/test/resources/application-test.yml
@@ -2,7 +2,14 @@
 spring:
   application:
     name: PTPlatform-test  # 区分测试环境
-  
+
+  spring:
+    sql:
+      init:
+        mode: always             # 一定要始终执行，不论你用的是哪个 profile
+        schema-locations: classpath:schema.sql
+
+
   # 数据源配置 (H2 内存数据库)
   datasource:
     url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=MYSQL  # 模拟MySQL语法
@@ -10,7 +17,6 @@
     username: sa
     password:
 
-  
   # JPA/Hibernate 配置
   jpa:
     hibernate:
diff --git a/src/test/resources/schema.sql b/src/test/resources/schema.sql
new file mode 100644
index 0000000..677d41c
--- /dev/null
+++ b/src/test/resources/schema.sql
@@ -0,0 +1,40 @@
+CREATE TABLE IF NOT EXISTS help_posts (
+                                          id INT AUTO_INCREMENT PRIMARY KEY,
+                                          author_id INT NOT NULL,
+                                          title VARCHAR(255) NOT NULL,
+                                          content TEXT NOT NULL,
+                                          like_count INT NOT NULL DEFAULT 0,
+                                          reply_count INT NOT NULL DEFAULT 0,
+                                          create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP()
+);
+
+
+CREATE TABLE IF NOT EXISTS help_comments (
+                               id INT AUTO_INCREMENT PRIMARY KEY,
+                               post_id INT NOT NULL,
+                               author_id INT NOT NULL,
+                               content TEXT NOT NULL,
+                               like_count INT NOT NULL DEFAULT 0,
+                               create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(),
+                               CONSTRAINT fk_help_comments_post FOREIGN KEY (post_id) REFERENCES help_posts(id) ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS seed_posts (
+                            id INT AUTO_INCREMENT PRIMARY KEY,
+                            author_id INT NOT NULL,
+                            title VARCHAR(255) NOT NULL,
+                            content TEXT NOT NULL,
+                            like_count INT NOT NULL DEFAULT 0,
+                            reply_count INT NOT NULL DEFAULT 0,
+                            create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP()
+);
+
+CREATE TABLE IF NOT EXISTS seed_comments (
+                               id INT AUTO_INCREMENT PRIMARY KEY,
+                               post_id INT NOT NULL,
+                               author_id INT NOT NULL,
+                               content TEXT NOT NULL,
+                               like_count INT NOT NULL DEFAULT 0,
+                               create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(),
+                               CONSTRAINT fk_seed_comments_post FOREIGN KEY (post_id) REFERENCES seed_posts(id) ON DELETE CASCADE
+);
