在正确基点上继续开发
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
+);