在正确基点上继续开发

Change-Id: Id4ef3e3bd2627176ea8254561140a7bf570f9cdb
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
+);