From bde024527f0976dcd1c1196219df0f58432244df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=85=83=E7=9A=93?= Date: Sun, 1 Sep 2024 16:55:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=A4=BE=E5=8C=BA=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CommentController.java | 200 +++++++++--------- .../controller/InteractionController.java | 78 ++++++- .../tutorial/controller/PostController.java | 17 ++ .../com/ivmiku/tutorial/entity/Comment.java | 2 + .../com/ivmiku/tutorial/entity/Favorite.java | 2 + .../com/ivmiku/tutorial/entity/Likee.java | 2 + .../tutorial/service/CommentService.java | 2 +- .../tutorial/service/InteractionService.java | 13 +- .../tutorial/service/TutorialsService.java | 2 + .../service/impl/CommentServiceImpl.java | 23 ++ .../service/impl/InteractionServiceImpl.java | 98 ++++++++- .../service/impl/TutorialsServiceImpl.java | 10 + .../main/resources/mapper/CommentMapper.xml | 3 +- .../main/resources/mapper/FavoriteMapper.xml | 3 +- .../src/main/resources/mapper/LikeMapper.xml | 3 +- 15 files changed, 352 insertions(+), 106 deletions(-) diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommentController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommentController.java index 28a986b..af8dc9a 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommentController.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommentController.java @@ -38,46 +38,27 @@ public class CommentController { /** * 创建评论接口。 - * - * @param content 评论内容 - * @param postId 帖子的ID - * @param mentionedUserId 提及的用户ID(可选) - * @param imageFiles 图片文件(可选) - * @param videoFile 视频文件(可选) - * @return 返回操作结果 */ @PostMapping("/create") @Operation(summary = "创建评论") public Result createComment(@RequestParam("content") String content, - @RequestParam("postId") Long postId, + @RequestParam(value = "postId", required = false) Long postId, + @RequestParam(value = "tutorialId", required = false) Long tutorialId, @RequestParam(value = "mentionedUserId", required = false) String mentionedUserId, @RequestParam(value = "imageFiles", required = false) MultipartFile[] imageFiles, - @RequestParam(value = "videoFile", required = false) MultipartFile videoFile) { + @RequestParam(value = "videoFile", required = false) MultipartFile videoFile, + @RequestParam("type") String type) { + logger.info("创建评论请求开始,用户ID:{}", StpUtil.getLoginIdAsString()); - Comment comment = new Comment(); - comment.setUserOpenid(StpUtil.getLoginIdAsString()); - comment.setPostId(postId); - comment.setContent(content); - comment.setParentCommentId(0l); - comment.setMentionedUserId(mentionedUserId); + if (!isValidCommentType(type)) { + return Result.error("无效的评论类型"); + } + + Comment comment = createCommentObject(content, postId, tutorialId, mentionedUserId, type); try { - // 上传视频 - if (videoFile != null && !videoFile.isEmpty()) { - String uploadResult = fileService.uploadMinio(videoFile); - comment.setVideoUrl(uploadResult); - } - - // 上传图片 - if (imageFiles != null && imageFiles.length > 0) { - StringBuilder imageUrls = new StringBuilder(); - for (MultipartFile file : imageFiles) { - String uploadResult = fileService.uploadMinio(file); - imageUrls.append(uploadResult + ";"); - } - comment.setImageUrls(imageUrls.toString()); - } + processFileUploads(comment, imageFiles, videoFile); } catch (Exception e) { logger.error("文件上传失败", e); return Result.error("文件上传失败"); @@ -90,55 +71,34 @@ public class CommentController { /** * 回复评论接口。 - * - * @param parentCommentId 父评论的ID - * @param postId 帖子的ID - * @param content 回复内容 - * @param mentionedUserId 提及的用户ID(可选) - * @param imageFiles 图片文件(可选) - * @param videoFile 视频文件(可选) - * @return 返回操作结果 */ @PostMapping("/reply") @Operation(summary = "回复评论") public Result replyComment(@RequestParam Long parentCommentId, - @RequestParam Long postId, - @RequestParam String content, - @RequestParam(required = false) String mentionedUserId, + @RequestParam("content") String content, + @RequestParam(value = "postId", required = false) Long postId, + @RequestParam(value = "tutorialId", required = false) Long tutorialId, + @RequestParam(value = "mentionedUserId", required = false) String mentionedUserId, @RequestParam(value = "imageFiles", required = false) MultipartFile[] imageFiles, - @RequestParam(value = "videoFile", required = false) MultipartFile videoFile) { + @RequestParam(value = "videoFile", required = false) MultipartFile videoFile, + @RequestParam("type") String type) { + logger.info("回复评论请求开始,用户ID:{}", StpUtil.getLoginIdAsString()); - // 检查父评论是否存在 Comment parentComment = commentService.getCommentById(parentCommentId); if (parentComment == null) { - logger.warn("父评论ID:{}不存在", parentCommentId); return Result.error("父评论不存在"); } - Comment reply = new Comment(); - reply.setUserOpenid(StpUtil.getLoginIdAsString()); + if (!isValidCommentType(type)) { + return Result.error("无效的评论类型"); + } + + Comment reply = createCommentObject(content, postId, tutorialId, mentionedUserId, type); reply.setParentCommentId(parentCommentId); - reply.setPostId(postId); - reply.setContent(content); - reply.setMentionedUserId(mentionedUserId); try { - // 上传视频 - if (videoFile != null && !videoFile.isEmpty()) { - String uploadResult = fileService.uploadMinio(videoFile); - reply.setVideoUrl(uploadResult); - } - - // 上传图片 - if (imageFiles != null && imageFiles.length > 0) { - StringBuilder imageUrls = new StringBuilder(); - for (MultipartFile file : imageFiles) { - String uploadResult = fileService.uploadMinio(file); - imageUrls.append(uploadResult + ";"); - } - reply.setImageUrls(imageUrls.toString()); - } + processFileUploads(reply, imageFiles, videoFile); } catch (Exception e) { logger.error("文件上传失败", e); return Result.error("文件上传失败"); @@ -149,6 +109,41 @@ public class CommentController { return Result.ok(reply); } + // 工具方法:创建评论对象 + private Comment createCommentObject(String content, Long postId, Long tutorialId, String mentionedUserId, String type) { + Comment comment = new Comment(); + comment.setUserOpenid(StpUtil.getLoginIdAsString()); + comment.setContent(content); + comment.setMentionedUserId(mentionedUserId); + + if ("post".equals(type)) { + comment.setPostId(postId); + } else if ("tutorial".equals(type)) { + comment.setTutorialId(tutorialId); + } + return comment; + } + + // 工具方法:处理文件上传 + private void processFileUploads(Comment comment, MultipartFile[] imageFiles, MultipartFile videoFile) throws Exception { + if (videoFile != null && !videoFile.isEmpty()) { + comment.setVideoUrl(fileService.uploadMinio(videoFile)); + } + + if (imageFiles != null && imageFiles.length > 0) { + StringBuilder imageUrls = new StringBuilder(); + for (MultipartFile file : imageFiles) { + imageUrls.append(fileService.uploadMinio(file)).append(";"); + } + comment.setImageUrls(imageUrls.toString()); + } + } + + // 工具方法:校验评论类型 + private boolean isValidCommentType(String type) { + return "post".equals(type) || "tutorial".equals(type); + } + /** * 获取评论详情接口。 * @@ -216,6 +211,21 @@ public class CommentController { return Result.ok(comments); } + /** + * 获取教程下的所有评论。 + * + * @param tutorialId 帖子的唯一标识ID + * @return 返回操作结果和评论列表 + */ + @PostMapping("/tutorial/{tutorialId}") + @Operation(summary = "获取教程下的所有评论") + public Result getTutorialComments(@PathVariable("tutorialId") Long tutorialId, @RequestBody Pages pages) { + logger.info("获取教程ID:{}的评论列表", tutorialId); + logger.info("获取pageSize:{}", pages.getPageSize()); + IPage comments = commentService.getTutorialComments(tutorialId, pages.getPageNum(), pages.getPageSize()); + return Result.ok(comments); + } + /** * 获取评论下的所有回复。 * @@ -230,35 +240,35 @@ public class CommentController { return Result.ok(replies); } - /** - * @评论接口。 - * - * @param comment 包含@信息的评论数据 - * @return 返回操作结果 - */ - @PostMapping("/mention") - @Operation(summary = "@评论") - public Result mentionUser(@RequestBody Comment comment) { - logger.info("用户ID:{}提交@评论请求", StpUtil.getLoginIdAsString()); - - // 检查父评论是否存在(如果有父评论ID) - if (comment.getParentCommentId() != null) { - Comment parentComment = commentService.getCommentById(comment.getParentCommentId()); - if (parentComment == null) { - logger.warn("父评论ID:{}不存在", comment.getParentCommentId()); - return Result.error("父评论不存在"); - } - } - - // 检查帖子ID是否存在 - if (comment.getPostId() == null) { - logger.warn("帖子ID不能为空"); - return Result.error("帖子ID不能为空"); - } - - comment.setUserOpenid(StpUtil.getLoginIdAsString()); - commentService.createComment(comment); - logger.info("@评论创建成功,评论ID:{}", comment.getCommentId()); - return Result.ok(); - } +// /** +// * @评论接口。 +// * +// * @param comment 包含@信息的评论数据 +// * @return 返回操作结果 +// */ +// @PostMapping("/mention") +// @Operation(summary = "@评论") +// public Result mentionUser(@RequestBody Comment comment) { +// logger.info("用户ID:{}提交@评论请求", StpUtil.getLoginIdAsString()); +// +// // 检查父评论是否存在(如果有父评论ID) +// if (comment.getParentCommentId() != null) { +// Comment parentComment = commentService.getCommentById(comment.getParentCommentId()); +// if (parentComment == null) { +// logger.warn("父评论ID:{}不存在", comment.getParentCommentId()); +// return Result.error("父评论不存在"); +// } +// } +// +// // 检查帖子ID是否存在 +// if (comment.getPostId() == null) { +// logger.warn("帖子ID不能为空"); +// return Result.error("帖子ID不能为空"); +// } +// +// comment.setUserOpenid(StpUtil.getLoginIdAsString()); +// commentService.createComment(comment); +// logger.info("@评论创建成功,评论ID:{}", comment.getCommentId()); +// return Result.ok(); +// } } diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/InteractionController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/InteractionController.java index b1e0f62..1dacc59 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/InteractionController.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/InteractionController.java @@ -4,7 +4,10 @@ import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.lang.hash.Hash; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ivmiku.tutorial.entity.Pages; import com.ivmiku.tutorial.entity.Post; +import com.ivmiku.tutorial.entity.Tutorials; import com.ivmiku.tutorial.response.Result; import com.ivmiku.tutorial.service.InteractionService; import io.swagger.v3.oas.annotations.Operation; @@ -124,10 +127,10 @@ public class InteractionController { */ @GetMapping("/getFavoritePosts") @Operation(summary = "获取用户收藏的帖子") - public Result getFavoritePosts() { + public Result getFavoritePosts(@RequestBody Pages pages) { String userOpenid = StpUtil.getLoginIdAsString(); log.info("用户 {} 正在获取收藏的帖子", userOpenid); - IPage favoritePost = interactionService.getFavoritePosts(userOpenid); + IPage favoritePost = interactionService.getFavoritePosts(userOpenid, pages.getPageNum(), pages.getPageSize()); HashMap data = new HashMap<>(); if (favoritePost != null) { log.info("用户 {} 收藏的帖子获取成功", userOpenid); @@ -149,4 +152,75 @@ public class InteractionController { HashMap res = interactionService.getLikeCount(userOpenid); return Result.ok(); } + + /** + * 对官方教程点赞 + * @param tutorialId 教程ID + * @return 操作结果 + */ + @PostMapping("/likeOfficialTutorial") + @Operation(summary = "对官方教程点赞") + public Result likeOfficialTutorial(@RequestParam Long tutorialId) { + String userOpenid = StpUtil.getLoginIdAsString(); + log.info("用户 {} 正在对官方教程 {} 点赞", userOpenid, tutorialId); + interactionService.likeOfficialTutorial(userOpenid, tutorialId); + return Result.ok(); + } + + /** + * 收藏官方教程 + * @param tutorialId 教程ID + * @return 操作结果 + */ + @PostMapping("/favoriteOfficialTutorial") + @Operation(summary = "收藏官方教程") + public Result favoriteOfficialTutorial(@RequestParam Long tutorialId) { + String userOpenid = StpUtil.getLoginIdAsString(); + log.info("用户 {} 正在收藏官方教程 {}", userOpenid, tutorialId); + interactionService.favoriteOfficialTutorial(userOpenid, tutorialId); + return Result.ok(); + } + + /** + * 取消对官方教程的点赞 + * @param tutorialId 教程ID + * @return 操作结果 + */ + @DeleteMapping("/unlikeOfficialTutorial") + @Operation(summary = "取消对官方教程的点赞") + public Result unlikeOfficialTutorial(@RequestParam Long tutorialId) { + String userOpenid = StpUtil.getLoginIdAsString(); + log.info("用户 {} 正在取消对官方教程 {} 的点赞", userOpenid, tutorialId); + interactionService.unlikeOfficialTutorial(userOpenid, tutorialId); + return Result.ok(); + } + + /** + * 取消收藏官方教程 + * @param tutorialId 教程ID + * @return 操作结果 + */ + @DeleteMapping("/unfavoriteOfficialTutorial") + @Operation(summary = "取消收藏官方教程") + public Result unfavoriteOfficialTutorial(@RequestParam Long tutorialId) { + String userOpenid = StpUtil.getLoginIdAsString(); + log.info("用户 {} 正在取消收藏官方教程 {}", userOpenid, tutorialId); + interactionService.unfavoriteOfficialTutorial(userOpenid, tutorialId); + return Result.ok(); + } + + /** + * 获取用户收藏的官方教程 + * @return 用户收藏的官方教程列表 + */ + @GetMapping("/getFavoriteOfficialTutorials") + @Operation(summary = "获取用户收藏的官方教程") + public Result getFavoriteOfficialTutorials(@RequestBody Pages pages) { + String userOpenid = StpUtil.getLoginIdAsString(); + log.info("用户 {} 正在获取收藏的官方教程", userOpenid); + IPage favoriteTutorials = interactionService.getFavoriteOfficialTutorials(userOpenid, pages.getPageNum(), pages.getPageSize()); + HashMap data = new HashMap<>(); + data.put("list", favoriteTutorials); + return Result.ok(data); + } } diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java index 5a2c476..718fb77 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java @@ -221,6 +221,23 @@ public class PostController { return Result.ok(history); } + /** + * 删除用户的搜索历史 + */ + @DeleteMapping("/deleteSearchHistory") + @Operation(summary = "删除用户的搜索历史") + public Result deleteSearchHistory() { + String userId = StpUtil.getLoginIdAsString(); // 获取当前登录用户的ID + String key = "search_history:" + userId; + + // 删除Redis中的搜索历史 + redisTemplate.delete(key); + + logger.info("用户ID:{}的搜索历史已删除", userId); + return Result.ok("搜索历史已删除"); + } + + /** * 根据关键字搜索帖子,包括标题和内容 */ diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/entity/Comment.java b/community-8073/src/main/java/com/ivmiku/tutorial/entity/Comment.java index 5eb554c..0cad272 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/entity/Comment.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/entity/Comment.java @@ -21,6 +21,8 @@ public class Comment implements Serializable { private Long postId; + private Long tutorialId; // 新增字段 + private String content; private Long parentCommentId; diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/entity/Favorite.java b/community-8073/src/main/java/com/ivmiku/tutorial/entity/Favorite.java index 7d38acf..c14b4a3 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/entity/Favorite.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/entity/Favorite.java @@ -22,5 +22,7 @@ public class Favorite implements Serializable { private Integer isDeleted; + private Long tutorialId; // 新增字段 + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/entity/Likee.java b/community-8073/src/main/java/com/ivmiku/tutorial/entity/Likee.java index f972a11..f68c6c5 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/entity/Likee.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/entity/Likee.java @@ -20,6 +20,8 @@ public class Likee implements Serializable { private Long commentId; + private Long tutorialId; // 新增字段 + private Integer isDeleted; private static final long serialVersionUID = 1L; diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/CommentService.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/CommentService.java index 5d17878..93e95c8 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/service/CommentService.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/CommentService.java @@ -68,5 +68,5 @@ public interface CommentService extends IService { void createReply(Long parentCommentId, Long postId, String content, String mentionedUserId); - + IPage getTutorialComments(Long tutorialId, Integer pageNum, Integer pageSize); } diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/InteractionService.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/InteractionService.java index bf8c9f0..02fa73a 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/service/InteractionService.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/InteractionService.java @@ -2,6 +2,7 @@ package com.ivmiku.tutorial.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ivmiku.tutorial.entity.Post; +import com.ivmiku.tutorial.entity.Tutorials; import java.util.HashMap; import java.util.List; @@ -17,7 +18,17 @@ public interface InteractionService { void likeComment(String userOpenid, Long commentId); void unlikeComment(String userOpenid, Long commentId); - IPage getFavoritePosts(String userOpenid); + IPage getFavoritePosts(String userOpenid, int pageNum, int pageSize); HashMap getLikeCount(String userOpenid); + + void likeOfficialTutorial(String userOpenid, Long tutorialId); + + void favoriteOfficialTutorial(String userOpenid, Long tutorialId); + + void unlikeOfficialTutorial(String userOpenid, Long tutorialId); + + void unfavoriteOfficialTutorial(String userOpenid, Long tutorialId); + + IPage getFavoriteOfficialTutorials(String userOpenid, int pageNum, int pageSize); } diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/TutorialsService.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/TutorialsService.java index b4f0217..98477be 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/service/TutorialsService.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/TutorialsService.java @@ -15,4 +15,6 @@ public interface TutorialsService extends IService { void createTutorial(Tutorials tutorial); List getTutorialsByTagId(Long tagId); + + List getTutorialsByIds(List tutorialIds); } diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/CommentServiceImpl.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/CommentServiceImpl.java index 67acb96..55d409a 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/CommentServiceImpl.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/CommentServiceImpl.java @@ -190,4 +190,27 @@ public class CommentServiceImpl extends ServiceImpl impl logger.info("评论回复成功,评论ID:{}", reply.getCommentId()); } + @Override + public IPage getTutorialComments(Long tutorialId, Integer pageNum, Integer pageSize) { + logger.info("开始获取帖子ID:{}的评论列表,第{}页,每页{}条", tutorialId, pageNum, pageSize); + + // 设置分页参数 +// PageHelper.startPage(pageNum, pageSize); + IPage page = new Page<>(pageNum, pageSize); + + // 查询评论 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Comment::getTutorialId, tutorialId).eq(Comment::getIsDeleted, 0); + IPage comments = commentMapper.selectPage(page, wrapper); + + if (comments != null) { + logger.info("获取教程ID:{}的评论列表成功", tutorialId); + } else { + logger.warn("教程ID:{}的评论列表为空", tutorialId); + } + + // 使用 PageInfo 包装结果 + return comments; + } + } diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/InteractionServiceImpl.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/InteractionServiceImpl.java index 1a4f10c..89ded28 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/InteractionServiceImpl.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/InteractionServiceImpl.java @@ -3,18 +3,22 @@ package com.ivmiku.tutorial.service.impl; import cn.hutool.core.lang.hash.Hash; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ivmiku.tutorial.entity.Favorite; import com.ivmiku.tutorial.entity.Likee; import com.ivmiku.tutorial.entity.Post; +import com.ivmiku.tutorial.entity.Tutorials; import com.ivmiku.tutorial.mapper.FavoriteMapper; import com.ivmiku.tutorial.mapper.LikeMapper; import com.ivmiku.tutorial.service.InteractionService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ivmiku.tutorial.service.PostService; +import com.ivmiku.tutorial.service.TutorialsService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -34,6 +38,9 @@ public class InteractionServiceImpl implements InteractionService { @Resource private PostService postService; + @Resource + private TutorialsService tutorialService; + @Override public void favoritePost(String userOpenid, Long postId) { log.info("User {} is favoriting post {}", userOpenid, postId); @@ -107,13 +114,13 @@ public class InteractionServiceImpl implements InteractionService { } @Override - public IPage getFavoritePosts(String userOpenid) { + public IPage getFavoritePosts(String userOpenid, int pageNum, int pageSize) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Favorite::getUserOpenid, userOpenid); List favorites = favoriteMapper.selectList(wrapper); if (favorites != null && !favorites.isEmpty()) { List postIds = favorites.stream().map(Favorite::getPostId).toList(); - return postService.getPostList(userOpenid, 1, 10); + return postService.getPostList(userOpenid, pageNum, pageSize); } return null; } @@ -157,8 +164,91 @@ public class InteractionServiceImpl implements InteractionService { } else { res.put("favoriteCount", 0L); // 如果为空,设置为0 } - Long myTotalPost = getFavoritePosts(userOpenid).getTotal(); - res.put("myTotalPost", myTotalPost); return res; } + + @Override + public void likeOfficialTutorial(String userOpenid, Long tutorialId) { + log.info("User {} is liking tutorial {}", userOpenid, tutorialId); + Likee likee = new Likee(); + likee.setUserOpenid(userOpenid); + likee.setTutorialId(tutorialId); + likee.setIsDeleted(0); + likeMapper.insert(likee); + } + + @Override + public void favoriteOfficialTutorial(String userOpenid, Long tutorialId) { + log.info("User {} is favoriting tutorial {}", userOpenid, tutorialId); + Favorite favorite = new Favorite(); + favorite.setUserOpenid(userOpenid); + favorite.setTutorialId(tutorialId); + favorite.setIsDeleted(0); + favoriteMapper.insert(favorite); + } + + @Override + public void unlikeOfficialTutorial(String userOpenid, Long tutorialId) { + log.info("User {} is unliking tutorial {}", userOpenid, tutorialId); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_openid", userOpenid) + .eq("tutorial_id", tutorialId) + .eq("is_deleted", 0); + Likee likee = likeMapper.selectOne(queryWrapper); + if (likee != null) { + likee.setIsDeleted(1); + likeMapper.updateById(likee); + } + } + + @Override + public void unfavoriteOfficialTutorial(String userOpenid, Long tutorialId) { + log.info("User {} is unfavoriting tutorial {}", userOpenid, tutorialId); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_openid", userOpenid) + .eq("tutorial_id", tutorialId) + .eq("is_deleted", 0); + Favorite favorite = favoriteMapper.selectOne(queryWrapper); + if (favorite != null) { + favorite.setIsDeleted(1); + favoriteMapper.updateById(favorite); + } + } + + + @Override + public IPage getFavoriteOfficialTutorials(String userOpenid, int pageNum, int pageSize) { + // 创建分页对象 + IPage page = new Page<>(pageNum, pageSize); + + // 创建查询条件,筛选出用户收藏的且未被删除的教程 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Favorite::getUserOpenid, userOpenid) + .isNotNull(Favorite::getTutorialId) // 确保教程ID不为空 + .eq(Favorite::getIsDeleted, 0); // 只获取未删除的收藏记录 + + // 分页查询收藏的教程ID + IPage favoritePage = favoriteMapper.selectPage(page, wrapper); + + // 提取出所有收藏的教程ID + List tutorialIds = favoritePage.getRecords().stream() + .map(Favorite::getTutorialId) + .toList(); + + if (tutorialIds.isEmpty()) { + return new Page<>(); // 如果没有收藏记录,返回空的分页对象 + } + + // 通过教程ID列表查询对应的教程实体,并将分页结果映射到教程分页 + List tutorials = tutorialService.getTutorialsByIds(tutorialIds); + + // 创建一个新的分页对象,用于返回教程数据 + IPage tutorialPage = new Page<>(pageNum, pageSize); + tutorialPage.setRecords(tutorials); + tutorialPage.setTotal(favoritePage.getTotal()); // 设置总记录数 + + return tutorialPage; + } + + } diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/TutorialsServiceImpl.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/TutorialsServiceImpl.java index 867c270..253f527 100644 --- a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/TutorialsServiceImpl.java +++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/TutorialsServiceImpl.java @@ -31,6 +31,16 @@ public class TutorialsServiceImpl extends ServiceImpl getTutorialsByIds(List tutorialIds) { + if (tutorialIds != null && !tutorialIds.isEmpty()) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("tutorial_id", tutorialIds); + return tutorialsMapper.selectList(queryWrapper); + } + return null; + } + @Override public void createTutorial(Tutorials tutorial) { this.save(tutorial); diff --git a/community-8073/src/main/resources/mapper/CommentMapper.xml b/community-8073/src/main/resources/mapper/CommentMapper.xml index ba57632..c2f0e03 100644 --- a/community-8073/src/main/resources/mapper/CommentMapper.xml +++ b/community-8073/src/main/resources/mapper/CommentMapper.xml @@ -8,6 +8,7 @@ + @@ -19,7 +20,7 @@ - comment_id, user_openid, post_id, content, + comment_id, user_openid, post_id, tutorialId, content, parent_comment_id, is_deleted, created_at, updated_at, mentioned_user_id, image_urls, video_url diff --git a/community-8073/src/main/resources/mapper/FavoriteMapper.xml b/community-8073/src/main/resources/mapper/FavoriteMapper.xml index 9053e01..cd30d0e 100644 --- a/community-8073/src/main/resources/mapper/FavoriteMapper.xml +++ b/community-8073/src/main/resources/mapper/FavoriteMapper.xml @@ -8,11 +8,12 @@ + - id,user_openid,post_id, + id,user_openid, post_id, tutorialId, is_deleted diff --git a/community-8073/src/main/resources/mapper/LikeMapper.xml b/community-8073/src/main/resources/mapper/LikeMapper.xml index 9845bac..b626775 100644 --- a/community-8073/src/main/resources/mapper/LikeMapper.xml +++ b/community-8073/src/main/resources/mapper/LikeMapper.xml @@ -8,12 +8,13 @@ + - id,user_openid,post_id, + id,user_openid,post_id,tutorialId, comment_id,is_deleted