From 7c033e2cbe76558f3cd41f933cb94e70e3e16d6a Mon Sep 17 00:00:00 2001 From: Cxx0822 <1556464090@qq.com> Date: Wed, 2 Jul 2025 19:55:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E8=8F=9C=E8=B0=B1?= =?UTF-8?q?=E6=94=B6=E8=97=8F=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cxx/food/controller/FoodController.java | 18 +++ src/main/java/com/cxx/food/dao/FoodDao.java | 2 + src/main/java/com/cxx/food/dto/RecipeDto.java | 19 ++++ .../java/com/cxx/food/dto/SummaryDto.java | 15 +++ .../com/cxx/food/entity/FavouriteRecord.java | 18 +++ src/main/java/com/cxx/food/entity/Recipe.java | 3 + .../food/mapper/FavouriteRecordMapper.java | 9 ++ .../cxx/food/service/FavouriteService.java | 10 ++ .../com/cxx/food/service/FoodService.java | 6 + .../service/impl/FavouriteServiceImpl.java | 49 ++++++++ .../food/service/impl/FoodServiceImpl.java | 33 +++++- src/main/resources/mapper/FoodMapper.xml | 105 ++++++++++++++++-- 12 files changed, 270 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/cxx/food/entity/FavouriteRecord.java create mode 100644 src/main/java/com/cxx/food/mapper/FavouriteRecordMapper.java create mode 100644 src/main/java/com/cxx/food/service/FavouriteService.java create mode 100644 src/main/java/com/cxx/food/service/impl/FavouriteServiceImpl.java diff --git a/src/main/java/com/cxx/food/controller/FoodController.java b/src/main/java/com/cxx/food/controller/FoodController.java index 3c3abcf..3da9118 100644 --- a/src/main/java/com/cxx/food/controller/FoodController.java +++ b/src/main/java/com/cxx/food/controller/FoodController.java @@ -45,6 +45,12 @@ public class FoodController { return foodService.queryRecipeByUser(id); } + @Operation(summary = "查询用户收藏菜谱") + @GetMapping("/recipe/user/favourite") + public List queryRecipeUserFavourite() { + return foodService.queryRecipeUserFavourite(); + } + @Operation(summary = "查询美食菜谱") @GetMapping("/recipe") public List queryRecipeSummary(FoodQueryVo foodQueryVo) { @@ -116,6 +122,18 @@ public class FoodController { return foodService.deleteLike(id); } + @Operation(summary = "增加收藏") + @PostMapping("/recipe/{id}/favourite") + public Boolean addFavourite(@PathVariable("id") long id) { + return foodService.addFavourite(id); + } + + @Operation(summary = "取消收藏") + @DeleteMapping("/recipe/{id}/favourite") + public Boolean deleteFavourite(@PathVariable("id") long id) { + return foodService.deleteFavourite(id); + } + @Operation(summary = "查询美食类别") @GetMapping("/category") public List queryCategory() { diff --git a/src/main/java/com/cxx/food/dao/FoodDao.java b/src/main/java/com/cxx/food/dao/FoodDao.java index 713e041..c2baf65 100644 --- a/src/main/java/com/cxx/food/dao/FoodDao.java +++ b/src/main/java/com/cxx/food/dao/FoodDao.java @@ -14,6 +14,8 @@ public interface FoodDao { List queryRecipeByUser(@Param("id") Long id); + List queryRecipeUserFavourite(@Param("user") String user); + IPage querySummaryByPage(IPage page, @Param("query") FoodQueryVo foodQueryVo); diff --git a/src/main/java/com/cxx/food/dto/RecipeDto.java b/src/main/java/com/cxx/food/dto/RecipeDto.java index c052349..7c4a58b 100644 --- a/src/main/java/com/cxx/food/dto/RecipeDto.java +++ b/src/main/java/com/cxx/food/dto/RecipeDto.java @@ -28,6 +28,9 @@ public class RecipeDto { @Range(min = 0, max = 5, message = "推荐指数在0-5之间") private Integer recommendRate; + @Schema(description = "是否分享") + private Boolean isShare; + @Schema(description = "美食食材") private List materialList; @@ -41,10 +44,26 @@ public class RecipeDto { @Schema(description = "备注") private String remark; + @Schema(description = "用户id") + @JsonView(ReadView.class) + private Long userId; + + @Schema(description = "姓名") + @JsonView(ReadView.class) + private String username; + + @Schema(description = "头像") + @JsonView(ReadView.class) + private String avatar; + @Schema(description = "点赞用户") @JsonView(ReadView.class) private List likeList; + @Schema(description = "收藏用户") + @JsonView(ReadView.class) + private List favouriteList; + @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 10fb2c1..07fc86e 100644 --- a/src/main/java/com/cxx/food/dto/SummaryDto.java +++ b/src/main/java/com/cxx/food/dto/SummaryDto.java @@ -21,12 +21,27 @@ public class SummaryDto { @Schema(description = "推荐指数") private Integer recommendRate; + @Schema(description = "是否共享") + private Boolean isShare; + @Schema(description = "美食记录") private List recordList; @Schema(description = "点赞总数") private Integer likeCount; + @Schema(description = "收藏总数") + private Integer favouriteCount; + @Schema(description = "评论总数") private Integer commentCount; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "姓名") + private String username; + + @Schema(description = "头像") + private String avatar; } diff --git a/src/main/java/com/cxx/food/entity/FavouriteRecord.java b/src/main/java/com/cxx/food/entity/FavouriteRecord.java new file mode 100644 index 0000000..7162364 --- /dev/null +++ b/src/main/java/com/cxx/food/entity/FavouriteRecord.java @@ -0,0 +1,18 @@ +package com.cxx.food.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("favourite_record") +public class FavouriteRecord extends AbstractEntity { + @TableField("type") + private String type; + + @TableField("subject_id") + private Long subjectId; +} diff --git a/src/main/java/com/cxx/food/entity/Recipe.java b/src/main/java/com/cxx/food/entity/Recipe.java index f06b41a..47d9704 100644 --- a/src/main/java/com/cxx/food/entity/Recipe.java +++ b/src/main/java/com/cxx/food/entity/Recipe.java @@ -19,6 +19,9 @@ public class Recipe extends AbstractEntity { @TableField("recommend_rate") private Integer recommendRate; + @TableField("is_share") + private Integer isShare; + @TableField("remark") private String remark; } diff --git a/src/main/java/com/cxx/food/mapper/FavouriteRecordMapper.java b/src/main/java/com/cxx/food/mapper/FavouriteRecordMapper.java new file mode 100644 index 0000000..778996a --- /dev/null +++ b/src/main/java/com/cxx/food/mapper/FavouriteRecordMapper.java @@ -0,0 +1,9 @@ +package com.cxx.food.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.food.entity.FavouriteRecord; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FavouriteRecordMapper extends BaseMapper { +} \ No newline at end of file diff --git a/src/main/java/com/cxx/food/service/FavouriteService.java b/src/main/java/com/cxx/food/service/FavouriteService.java new file mode 100644 index 0000000..65f492d --- /dev/null +++ b/src/main/java/com/cxx/food/service/FavouriteService.java @@ -0,0 +1,10 @@ +package com.cxx.food.service; + + +import com.cxx.food.constant.BizType; + +public interface FavouriteService { + Boolean addFavourite(BizType type, Long subjectId); + + Boolean deleteFavourite(Long subjectId); +} diff --git a/src/main/java/com/cxx/food/service/FoodService.java b/src/main/java/com/cxx/food/service/FoodService.java index e425ce3..91b5734 100644 --- a/src/main/java/com/cxx/food/service/FoodService.java +++ b/src/main/java/com/cxx/food/service/FoodService.java @@ -26,10 +26,16 @@ public interface FoodService { Boolean deleteLike(Long recipeId); + Boolean addFavourite(Long recipeId); + + Boolean deleteFavourite(Long recipeId); + RecipeDto queryRecipeById(Long id); List queryRecipeByUser(Long id); + List queryRecipeUserFavourite(); + List queryRecipeSummary(FoodQueryVo foodQueryVo); IPage querySummaryByPage(Integer currentPage, Integer pageSize, FoodQueryVo foodQueryVo); diff --git a/src/main/java/com/cxx/food/service/impl/FavouriteServiceImpl.java b/src/main/java/com/cxx/food/service/impl/FavouriteServiceImpl.java new file mode 100644 index 0000000..05faaf6 --- /dev/null +++ b/src/main/java/com/cxx/food/service/impl/FavouriteServiceImpl.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.FavouriteRecord; +import com.cxx.food.mapper.FavouriteRecordMapper; +import com.cxx.food.service.FavouriteService; +import com.cxx.framework.web.CustomException; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + + +@Service +public class FavouriteServiceImpl implements FavouriteService { + @Resource + private FavouriteRecordMapper favouriteRecordMapper; + + + @Override + public Boolean addFavourite(BizType type, Long subjectId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(FavouriteRecord::getSubjectId, subjectId).eq(FavouriteRecord::getCreateBy, StpUtil.getLoginIdAsString()); + FavouriteRecord favourite = favouriteRecordMapper.selectOne(queryWrapper); + + if (favourite != null) { + throw new CustomException("已经收藏了"); + } + + FavouriteRecord newFavourite = new FavouriteRecord(); + newFavourite.setType(type.getCode()); + newFavourite.setSubjectId(subjectId); + return favouriteRecordMapper.insert(newFavourite) == 1; + } + + @Override + public Boolean deleteFavourite(Long subjectId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(FavouriteRecord::getSubjectId, subjectId).eq(FavouriteRecord::getCreateBy, StpUtil.getLoginIdAsString()); + FavouriteRecord favourite = favouriteRecordMapper.selectOne(queryWrapper); + + if (favourite == null) { + throw new CustomException("该记录不存在"); + } + + return favouriteRecordMapper.deleteById(favourite) == 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 1f0ddad..fccb149 100644 --- a/src/main/java/com/cxx/food/service/impl/FoodServiceImpl.java +++ b/src/main/java/com/cxx/food/service/impl/FoodServiceImpl.java @@ -12,6 +12,7 @@ import com.cxx.food.entity.*; import com.cxx.food.entity.Record; import com.cxx.food.mapper.*; import com.cxx.food.service.CommentService; +import com.cxx.food.service.FavouriteService; import com.cxx.food.service.FoodService; import com.cxx.food.service.LikeService; import com.cxx.food.vo.FoodQueryVo; @@ -42,15 +43,15 @@ public class FoodServiceImpl implements FoodService { @Resource private RecordMapper recordMapper; - @Resource - private CommentRecordMapper commentRecordMapper; - @Resource private LikeService likeService; @Resource private CommentService commentService; + @Resource + private FavouriteService favouriteService; + @Override @Transactional public Boolean addRecipe(RecipeDto recipeDto) { @@ -60,6 +61,7 @@ public class FoodServiceImpl implements FoodService { } Recipe recipe = new Recipe(); + recipe.setIsShare(recipeDto.getIsShare() ? 1 : 0); BeanUtils.copyProperties(recipeDto, recipe); recipeMapper.insert(recipe); resetFoodRecipe(recipe.getId(), recipeDto); @@ -75,6 +77,7 @@ public class FoodServiceImpl implements FoodService { } Recipe recipe = new Recipe(); + recipe.setIsShare(recipeDto.getIsShare() ? 1 : 0); BeanUtils.copyProperties(recipeDto, recipe); recipe.setId(id); recipeMapper.updateById(recipe); @@ -104,6 +107,7 @@ public class FoodServiceImpl implements FoodService { newRecipe.setName(recordDto.getName()); newRecipe.setCategory("其他"); newRecipe.setRecommendRate(0); + newRecipe.setIsShare(0); newRecipe.setRemark(""); recipeMapper.insert(newRecipe); recipeId = newRecipe.getId(); @@ -113,7 +117,7 @@ public class FoodServiceImpl implements FoodService { Record record = new Record(); record.setFoodId(recipeId); - record.setPerson((String) StpUtil.getLoginId()); + record.setPerson(StpUtil.getLoginIdAsString()); BeanUtils.copyProperties(recordDto, record); recordMapper.insert(record); @@ -123,7 +127,7 @@ public class FoodServiceImpl implements FoodService { @Override public Boolean updateRecord(Long id, RecordDto recordDto) { if (recordMapper.selectById(id) == null) { - throw new CustomException("该成果不存在"); + throw new CustomException("该记录不存在"); } Record record = new Record(); @@ -164,6 +168,20 @@ public class FoodServiceImpl implements FoodService { return likeService.deleteLike(recipeId); } + @Override + public Boolean addFavourite(Long recipeId) { + if (recipeMapper.selectById(recipeId) == null) { + throw new CustomException("该菜谱不存在"); + } + + return favouriteService.addFavourite(BizType.RECIPE, recipeId); + } + + @Override + public Boolean deleteFavourite(Long recipeId) { + return favouriteService.deleteFavourite(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)); @@ -208,6 +226,11 @@ public class FoodServiceImpl implements FoodService { return foodDao.queryRecipeByUser(id); } + @Override + public List queryRecipeUserFavourite() { + return foodDao.queryRecipeUserFavourite(StpUtil.getLoginIdAsString()); + } + @Override public List queryRecipeSummary(FoodQueryVo foodQueryVo) { return foodDao.queryRecipeSummary(foodQueryVo, StpUtil.getLoginIdAsString()); diff --git a/src/main/resources/mapper/FoodMapper.xml b/src/main/resources/mapper/FoodMapper.xml index b60be88..e713da9 100644 --- a/src/main/resources/mapper/FoodMapper.xml +++ b/src/main/resources/mapper/FoodMapper.xml @@ -6,7 +6,11 @@ + + + + @@ -19,6 +23,9 @@ + + @@ -52,7 +59,12 @@ + + + + + @@ -77,6 +89,13 @@ AND type = 'recipe' + + + + @@ -171,7 +240,8 @@ SELECT a.id AS id, a.name AS name, a.category AS category, - a.recommend_rate AS recommendRate + a.recommend_rate AS recommendRate, + a.is_share AS isShare FROM recipe a @@ -185,13 +255,19 @@ a.name AS name, a.category AS category, a.recommend_rate AS recommendRate, + a.is_share AS isShare, + u.id AS userId, + u.username AS username, + u.avatar AS avatar, b.person AS person, b.date AS date, b.image_url AS imageUrl, COALESCE(c.like_count, 0) AS likeCount, - COALESCE(d.comment_count, 0) AS commentCount + COALESCE(d.comment_count, 0) AS commentCount, + COALESCE(e.favourite_count, 0) AS favouriteCount FROM recipe a LEFT JOIN record b ON a.id = b.food_id + LEFT JOIN user u ON a.create_by = u.id LEFT JOIN ( SELECT subject_id, COUNT(id) AS like_count FROM like_record @@ -204,6 +280,11 @@ WHERE type = 'recipe' GROUP BY subject_id ) d ON a.id = d.subject_id + LEFT JOIN (SELECT subject_id, COUNT(id) AS favourite_count + FROM favourite_record + WHERE type = 'recipe' + GROUP BY subject_id + ) e ON a.id = e.subject_id a.category = #{query.category}