diff --git a/src/main/java/com/cxx/food/constant/BizType.java b/src/main/java/com/cxx/food/constant/BizType.java new file mode 100644 index 0000000..0b53023 --- /dev/null +++ b/src/main/java/com/cxx/food/constant/BizType.java @@ -0,0 +1,16 @@ +package com.cxx.food.constant; + +public enum BizType { + RECIPE("recipe"), + MOMENT("moment"); + + private final String code; + + private BizType(String code) { + this.code = code; + } + + public String getCode() { + return code; + } +} diff --git a/src/main/java/com/cxx/food/controller/FoodController.java b/src/main/java/com/cxx/food/controller/FoodController.java index 7698c5d..55e65a8 100644 --- a/src/main/java/com/cxx/food/controller/FoodController.java +++ b/src/main/java/com/cxx/food/controller/FoodController.java @@ -91,6 +91,25 @@ public class FoodController { return foodService.queryRecord(startDate, endDate); } + @Operation(summary = "新增评论") + @PostMapping("/recipe/{id}/comment") + public Boolean addComment(@PathVariable("id") long id, + @RequestParam String content) { + return foodService.addComment(id, content); + } + + @Operation(summary = "增加点赞") + @PostMapping("/recipe/{id}/like") + public Boolean addLike(@PathVariable("id") long id) { + return foodService.addLike(id); + } + + @Operation(summary = "取消点赞") + @DeleteMapping("/recipe/{id}/like") + public Boolean deleteLike(@PathVariable("id") long id) { + return foodService.deleteLike(id); + } + @Operation(summary = "查询美食类别") @GetMapping("/category") public List queryCategory() { diff --git a/src/main/java/com/cxx/food/dto/RecipeDto.java b/src/main/java/com/cxx/food/dto/RecipeDto.java index a21a55d..c052349 100644 --- a/src/main/java/com/cxx/food/dto/RecipeDto.java +++ b/src/main/java/com/cxx/food/dto/RecipeDto.java @@ -40,4 +40,12 @@ public class RecipeDto { @Schema(description = "备注") private String remark; + + @Schema(description = "点赞用户") + @JsonView(ReadView.class) + private List likeList; + + @Schema(description = "评论内容") + @JsonView(ReadView.class) + private List commentList; } diff --git a/src/main/java/com/cxx/food/dto/SummaryDto.java b/src/main/java/com/cxx/food/dto/SummaryDto.java index 506c856..10fb2c1 100644 --- a/src/main/java/com/cxx/food/dto/SummaryDto.java +++ b/src/main/java/com/cxx/food/dto/SummaryDto.java @@ -23,4 +23,10 @@ public class SummaryDto { @Schema(description = "美食记录") private List recordList; + + @Schema(description = "点赞总数") + private Integer likeCount; + + @Schema(description = "评论总数") + private Integer commentCount; } diff --git a/src/main/java/com/cxx/food/entity/Comment.java b/src/main/java/com/cxx/food/entity/CommentRecord.java similarity index 63% rename from src/main/java/com/cxx/food/entity/Comment.java rename to src/main/java/com/cxx/food/entity/CommentRecord.java index 88fbec0..aa0882f 100644 --- a/src/main/java/com/cxx/food/entity/Comment.java +++ b/src/main/java/com/cxx/food/entity/CommentRecord.java @@ -6,12 +6,15 @@ import com.cxx.framework.data.AbstractEntity; import lombok.Data; import lombok.EqualsAndHashCode; -@Data +@Data @EqualsAndHashCode(callSuper = true) -@TableName("comment") -public class Comment extends AbstractEntity { - @TableField("moment_id") - private Long momentId; +@TableName("comment_record") +public class CommentRecord extends AbstractEntity { + @TableField("type") + private String type; + + @TableField("subject_id") + private Long subjectId; @TableField("content") private String content; diff --git a/src/main/java/com/cxx/food/entity/MomentLike.java b/src/main/java/com/cxx/food/entity/LikeRecord.java similarity index 60% rename from src/main/java/com/cxx/food/entity/MomentLike.java rename to src/main/java/com/cxx/food/entity/LikeRecord.java index a50ef8f..ceda517 100644 --- a/src/main/java/com/cxx/food/entity/MomentLike.java +++ b/src/main/java/com/cxx/food/entity/LikeRecord.java @@ -8,11 +8,11 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) -@TableName("moment_like") -public class MomentLike extends AbstractEntity { - @TableField("moment_id") - private Long momentId; +@TableName("like_record") +public class LikeRecord extends AbstractEntity { + @TableField("type") + private String type; - @TableField("is_delete") - private Integer isDelete; + @TableField("subject_id") + private Long subjectId; } diff --git a/src/main/java/com/cxx/food/mapper/CommentMapper.java b/src/main/java/com/cxx/food/mapper/CommentRecordMapper.java similarity index 55% rename from src/main/java/com/cxx/food/mapper/CommentMapper.java rename to src/main/java/com/cxx/food/mapper/CommentRecordMapper.java index 0f75712..e43edd1 100644 --- a/src/main/java/com/cxx/food/mapper/CommentMapper.java +++ b/src/main/java/com/cxx/food/mapper/CommentRecordMapper.java @@ -1,9 +1,9 @@ package com.cxx.food.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.cxx.food.entity.Comment; +import com.cxx.food.entity.CommentRecord; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface CommentMapper extends BaseMapper { +public interface CommentRecordMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/cxx/food/mapper/MomentLikeMapper.java b/src/main/java/com/cxx/food/mapper/LikeRecordMapper.java similarity index 58% rename from src/main/java/com/cxx/food/mapper/MomentLikeMapper.java rename to src/main/java/com/cxx/food/mapper/LikeRecordMapper.java index b1e8085..d3b02c1 100644 --- a/src/main/java/com/cxx/food/mapper/MomentLikeMapper.java +++ b/src/main/java/com/cxx/food/mapper/LikeRecordMapper.java @@ -1,9 +1,9 @@ package com.cxx.food.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.cxx.food.entity.MomentLike; +import com.cxx.food.entity.LikeRecord; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface MomentLikeMapper extends BaseMapper { +public interface LikeRecordMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/cxx/food/service/CommentService.java b/src/main/java/com/cxx/food/service/CommentService.java new file mode 100644 index 0000000..c834719 --- /dev/null +++ b/src/main/java/com/cxx/food/service/CommentService.java @@ -0,0 +1,8 @@ +package com.cxx.food.service; + + +import com.cxx.food.constant.BizType; + +public interface CommentService { + Boolean addComment(BizType type, Long subjectId, String content); +} diff --git a/src/main/java/com/cxx/food/service/FoodService.java b/src/main/java/com/cxx/food/service/FoodService.java index f8ed04a..0f1dd8c 100644 --- a/src/main/java/com/cxx/food/service/FoodService.java +++ b/src/main/java/com/cxx/food/service/FoodService.java @@ -20,6 +20,12 @@ public interface FoodService { Boolean deleteRecord(Long id); + Boolean addComment(Long recipeId, String content); + + Boolean addLike(Long recipeId); + + Boolean deleteLike(Long recipeId); + RecipeDto queryRecipe(Long id); List querySummary(FoodQueryVo foodQueryVo); diff --git a/src/main/java/com/cxx/food/service/LikeService.java b/src/main/java/com/cxx/food/service/LikeService.java new file mode 100644 index 0000000..5352545 --- /dev/null +++ b/src/main/java/com/cxx/food/service/LikeService.java @@ -0,0 +1,10 @@ +package com.cxx.food.service; + + +import com.cxx.food.constant.BizType; + +public interface LikeService { + Boolean addLike(BizType type, Long subjectId); + + Boolean deleteLike(Long subjectId); +} diff --git a/src/main/java/com/cxx/food/service/impl/CommentServiceImpl.java b/src/main/java/com/cxx/food/service/impl/CommentServiceImpl.java new file mode 100644 index 0000000..4f45de3 --- /dev/null +++ b/src/main/java/com/cxx/food/service/impl/CommentServiceImpl.java @@ -0,0 +1,25 @@ +package com.cxx.food.service.impl; + + +import com.cxx.food.constant.BizType; +import com.cxx.food.entity.CommentRecord; +import com.cxx.food.mapper.CommentRecordMapper; +import com.cxx.food.service.CommentService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + + +@Service +public class CommentServiceImpl implements CommentService { + @Resource + private CommentRecordMapper commentRecordMapper; + + @Override + public Boolean addComment(BizType type, Long subjectId, String content) { + CommentRecord comment = new CommentRecord(); + comment.setType(type.getCode()); + comment.setContent(content); + comment.setSubjectId(subjectId); + return commentRecordMapper.insert(comment) == 1; + } +} diff --git a/src/main/java/com/cxx/food/service/impl/FoodServiceImpl.java b/src/main/java/com/cxx/food/service/impl/FoodServiceImpl.java index c48c82c..db2cee5 100644 --- a/src/main/java/com/cxx/food/service/impl/FoodServiceImpl.java +++ b/src/main/java/com/cxx/food/service/impl/FoodServiceImpl.java @@ -2,21 +2,18 @@ package com.cxx.food.service.impl; import cn.dev33.satoken.stp.StpUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.cxx.food.constant.BizType; import com.cxx.food.dao.FoodDao; import com.cxx.food.dto.*; -import com.cxx.food.entity.Material; -import com.cxx.food.entity.Recipe; +import com.cxx.food.entity.*; import com.cxx.food.entity.Record; -import com.cxx.food.entity.Step; -import com.cxx.food.mapper.MaterialMapper; -import com.cxx.food.mapper.RecipeMapper; -import com.cxx.food.mapper.RecordMapper; -import com.cxx.food.mapper.StepMapper; +import com.cxx.food.mapper.*; +import com.cxx.food.service.CommentService; import com.cxx.food.service.FoodService; +import com.cxx.food.service.LikeService; import com.cxx.food.vo.FoodQueryVo; import com.cxx.framework.web.CustomException; import com.github.yitter.idgen.YitIdHelper; @@ -45,6 +42,15 @@ public class FoodServiceImpl implements FoodService { @Resource private RecordMapper recordMapper; + @Resource + private CommentRecordMapper commentRecordMapper; + + @Resource + private LikeService likeService; + + @Resource + private CommentService commentService; + @Override @Transactional public Boolean addRecipe(RecipeDto recipeDto) { @@ -135,6 +141,29 @@ public class FoodServiceImpl implements FoodService { return Boolean.TRUE; } + @Override + public Boolean addComment(Long recipeId, String content) { + if (recipeMapper.selectById(recipeId) == null) { + throw new CustomException("该菜谱不存在"); + } + + return commentService.addComment(BizType.RECIPE, recipeId, content); + } + + @Override + public Boolean addLike(Long recipeId) { + if (recipeMapper.selectById(recipeId) == null) { + throw new CustomException("该菜谱不存在"); + } + + return likeService.addLike(BizType.RECIPE, recipeId); + } + + @Override + public Boolean deleteLike(Long recipeId) { + return likeService.deleteLike(recipeId); + } + private void resetFoodRecipe(Long id, RecipeDto recipeDto) { materialMapper.delete(Wrappers.lambdaQuery(Material.class).eq(Material::getFoodId, id)); stepMapper.delete(Wrappers.lambdaQuery(Step.class).eq(Step::getFoodId, id)); diff --git a/src/main/java/com/cxx/food/service/impl/LikeServiceImpl.java b/src/main/java/com/cxx/food/service/impl/LikeServiceImpl.java new file mode 100644 index 0000000..465f17b --- /dev/null +++ b/src/main/java/com/cxx/food/service/impl/LikeServiceImpl.java @@ -0,0 +1,49 @@ +package com.cxx.food.service.impl; + + +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.cxx.food.constant.BizType; +import com.cxx.food.entity.LikeRecord; +import com.cxx.food.mapper.LikeRecordMapper; +import com.cxx.food.service.LikeService; +import com.cxx.framework.web.CustomException; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + + +@Service +public class LikeServiceImpl implements LikeService { + @Resource + private LikeRecordMapper likeRecordMapper; + + + @Override + public Boolean addLike(BizType type, Long subjectId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(LikeRecord::getSubjectId, subjectId).eq(LikeRecord::getCreateBy, StpUtil.getLoginIdAsString()); + LikeRecord like = likeRecordMapper.selectOne(queryWrapper); + + if (like != null) { + throw new CustomException("已经点赞了"); + } + + LikeRecord newLike = new LikeRecord(); + newLike.setType(type.getCode()); + newLike.setSubjectId(subjectId); + return likeRecordMapper.insert(newLike) == 1; + } + + @Override + public Boolean deleteLike(Long subjectId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(LikeRecord::getSubjectId, subjectId).eq(LikeRecord::getCreateBy, StpUtil.getLoginIdAsString()); + LikeRecord like = likeRecordMapper.selectOne(queryWrapper); + + if (like == null) { + throw new CustomException("该记录不存在"); + } + + return likeRecordMapper.deleteById(like) == 1; + } +} diff --git a/src/main/java/com/cxx/food/service/impl/MomentServiceImpl.java b/src/main/java/com/cxx/food/service/impl/MomentServiceImpl.java index f4fbf32..5bf7add 100644 --- a/src/main/java/com/cxx/food/service/impl/MomentServiceImpl.java +++ b/src/main/java/com/cxx/food/service/impl/MomentServiceImpl.java @@ -1,15 +1,14 @@ package com.cxx.food.service.impl; -import cn.dev33.satoken.stp.StpUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.cxx.food.constant.BizType; import com.cxx.food.dao.MomentDao; import com.cxx.food.dto.MomentDto; import com.cxx.food.entity.*; -import com.cxx.food.mapper.CommentMapper; -import com.cxx.food.mapper.MomentLikeMapper; import com.cxx.food.mapper.MomentImageMapper; import com.cxx.food.mapper.MomentMapper; +import com.cxx.food.service.CommentService; +import com.cxx.food.service.LikeService; import com.cxx.food.service.MomentService; import com.cxx.framework.web.CustomException; import jakarta.annotation.Resource; @@ -27,10 +26,10 @@ public class MomentServiceImpl implements MomentService { private MomentMapper momentMapper; @Resource - private CommentMapper commentMapper; + private LikeService likeService; @Resource - private MomentLikeMapper momentLikeMapper; + private CommentService commentService; @Resource private MomentImageMapper momentImageMapper; @@ -86,45 +85,21 @@ public class MomentServiceImpl implements MomentService { throw new CustomException("该朋友圈不存在"); } - Comment comment = new Comment(); - comment.setContent(content); - comment.setMomentId(momentId); - return commentMapper.insert(comment) == 1; + return commentService.addComment(BizType.MOMENT, momentId, content); } @Override public Boolean addLike(Long momentId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(MomentLike::getMomentId, momentId).eq(MomentLike::getCreateBy, StpUtil.getLoginIdAsString()); - MomentLike like = momentLikeMapper.selectOne(queryWrapper); - - if (like != null) { - if (like.getIsDelete() == 0) { - throw new CustomException("已经点赞了"); - } else { - like.setIsDelete(0); - return momentLikeMapper.updateById(like) == 1; - } + if (momentMapper.selectById(momentId) == null) { + throw new CustomException("该朋友圈不存在"); } - MomentLike newLike = new MomentLike(); - newLike.setMomentId(momentId); - newLike.setIsDelete(0); - return momentLikeMapper.insert(newLike) == 1; + return likeService.addLike(BizType.MOMENT, momentId); } @Override public Boolean deleteLike(Long momentId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(MomentLike::getMomentId, momentId).eq(MomentLike::getCreateBy, StpUtil.getLoginIdAsString()); - MomentLike like = momentLikeMapper.selectOne(queryWrapper); - - if (like == null) { - throw new CustomException("该朋友圈不存在"); - } - - like.setIsDelete(1); - return momentLikeMapper.updateById(like) == 1; + return likeService.deleteLike(momentId); } private void deleteMomentImage(Long id) { diff --git a/src/main/resources/mapper/FoodMapper.xml b/src/main/resources/mapper/FoodMapper.xml index af56bf1..a49918e 100644 --- a/src/main/resources/mapper/FoodMapper.xml +++ b/src/main/resources/mapper/FoodMapper.xml @@ -16,6 +16,12 @@ + + + + @@ -34,6 +40,8 @@ + + @@ -44,14 +52,43 @@ + + - - + + + + + + + + + + + + + + + - SELECT a.id AS id, b.username AS username, b.avatar AS avatar, a.content AS content, a.create_time AS date - FROM comment AS a + FROM comment_record AS a LEFT JOIN user AS b ON a.create_by = b.id - WHERE moment_id = #{id} + WHERE subject_id = #{id} + AND type = 'moment'