feat:增加美食朋友圈功能

This commit is contained in:
2025-06-25 16:27:02 +08:00
parent 78d24cf559
commit 5a29a2146e
36 changed files with 570 additions and 218 deletions

View File

@@ -22,41 +22,41 @@ public class FoodController {
@Operation(summary = "新增美食菜谱")
@PostMapping("/recipe")
public Boolean addFoodRecipe(@RequestBody @JsonView(WriteView.class) @Validated FoodRecipeDto foodRecipeDto) {
return foodService.addFoodRecipe(foodRecipeDto);
public Boolean addRecipe(@RequestBody @JsonView(WriteView.class) @Validated RecipeDto recipeDto) {
return foodService.addRecipe(recipeDto);
}
@Operation(summary = "更新美食菜谱")
@PutMapping("/recipe/{id}")
public Boolean updateFoodRecipe(@PathVariable("id") long id,
@RequestBody @JsonView(WriteView.class) FoodRecipeDto foodRecipeDto) {
return foodService.updateFoodRecipe(id, foodRecipeDto);
public Boolean updateRecipe(@PathVariable("id") long id,
@RequestBody @JsonView(WriteView.class) RecipeDto recipeDto) {
return foodService.updateRecipe(id, recipeDto);
}
@Operation(summary = "删除美食菜谱")
@DeleteMapping("/recipe/{id}")
public Boolean deleteFoodRecipe(@PathVariable("id") long id) {
return foodService.deleteFoodRecipe(id);
public Boolean deleteRecipe(@PathVariable("id") long id) {
return foodService.deleteRecipe(id);
}
@Operation(summary = "查询美食菜谱")
@GetMapping("/recipe")
public List<FoodSummaryDto> queryFoodSummary(FoodQueryVo foodQueryVo) {
return foodService.queryFoodSummary(foodQueryVo);
public List<SummaryDto> querySummary(FoodQueryVo foodQueryVo) {
return foodService.querySummary(foodQueryVo);
}
@Operation(summary = "分页查询美食菜谱")
@GetMapping("/recipe/page")
public IPage<FoodSummaryDto> queryFoodSummaryByPage(@RequestParam("currentPage") Integer currentPage,
@RequestParam("pageSize") Integer pageSize,
FoodQueryVo foodQueryVo) {
return foodService.queryFoodSummaryByPage(currentPage, pageSize, foodQueryVo);
public IPage<SummaryDto> querySummaryByPage(@RequestParam("currentPage") Integer currentPage,
@RequestParam("pageSize") Integer pageSize,
FoodQueryVo foodQueryVo) {
return foodService.querySummaryByPage(currentPage, pageSize, foodQueryVo);
}
@Operation(summary = "查询美食")
@GetMapping("/recipe/{id}")
public @JsonView(ReadView.class) FoodRecipeDto queryFoodRecipe(@PathVariable("id") long id) {
return foodService.queryFoodRecipe(id);
public @JsonView(ReadView.class) RecipeDto queryRecipe(@PathVariable("id") long id) {
return foodService.queryRecipe(id);
}
@Operation(summary = "查询所有美食名称")
@@ -67,58 +67,58 @@ public class FoodController {
@Operation(summary = "新增美食成果")
@PostMapping("/record")
public Boolean addFoodRecord(@RequestBody @JsonView(WriteView.class) @Validated FoodRecordDto foodRecordDto) {
return foodService.addFoodRecord(foodRecordDto);
public Boolean addRecord(@RequestBody @JsonView(WriteView.class) @Validated RecordDto recordDto) {
return foodService.addRecord(recordDto);
}
@Operation(summary = "更新美食成果")
@PutMapping("/record/{id}")
public Boolean updateFoodRecord(@PathVariable("id") long id,
@RequestBody @JsonView(WriteView.class) FoodRecordDto foodRecordDto) {
return foodService.updateFoodRecord(id, foodRecordDto);
public Boolean updateRecord(@PathVariable("id") long id,
@RequestBody @JsonView(WriteView.class) RecordDto recordDto) {
return foodService.updateRecord(id, recordDto);
}
@Operation(summary = "删除美食成果")
@DeleteMapping("/record/{id}")
public Boolean deleteFoodRecord(@PathVariable("id") long id) {
return foodService.deleteFoodRecord(id);
public Boolean deleteRecord(@PathVariable("id") long id) {
return foodService.deleteRecord(id);
}
@Operation(summary = "查询美食记录")
@GetMapping("/record")
public @JsonView(ReadView.class) List<FoodRecordDto> queryFoodRecord(@RequestParam("startDate") String startDate,
@RequestParam("endDate") String endDate) {
return foodService.queryFoodRecord(startDate, endDate);
public @JsonView(ReadView.class) List<RecordDto> queryRecord(@RequestParam("startDate") String startDate,
@RequestParam("endDate") String endDate) {
return foodService.queryRecord(startDate, endDate);
}
@Operation(summary = "查询美食类别")
@GetMapping("/category")
public List<String> queryFoodCategory() {
return foodService.queryFoodCategory();
public List<String> queryCategory() {
return foodService.queryCategory();
}
@Operation(summary = "查询美食统计")
@GetMapping("/stats")
public FoodStatsDto queryFoodStats() {
return foodService.queryFoodStats();
public StatsDto queryStats() {
return foodService.queryStats();
}
@Operation(summary = "查询美食记录统计")
@GetMapping("/stats/record")
public List<StatsChartDto> queryFoodRecordStats() {
return foodService.queryFoodRecordStats();
public List<StatsChartDto> queryRecordStats() {
return foodService.queryRecordStats();
}
@Operation(summary = "查询美食类别统计")
@GetMapping("/stats/category")
public List<StatsChartDto> queryFoodCategoryStats() {
return foodService.queryFoodCategoryStats();
public List<StatsChartDto> queryCategoryStats() {
return foodService.queryCategoryStats();
}
@Operation(summary = "查询美食排行榜统计")
@GetMapping("/stats/rank")
public List<StatsChartDto> queryFoodRankStats() {
return foodService.queryFoodRankStats();
public List<StatsChartDto> queryRankStats() {
return foodService.queryRankStats();
}
}

View File

@@ -0,0 +1,40 @@
package com.cxx.food.controller;
import com.cxx.food.dto.*;
import com.cxx.food.service.MomentService;
import com.fasterxml.jackson.annotation.JsonView;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/moment")
@Tag(name = "美食朋友圈")
public class MomentController {
@Resource
private MomentService momentService;
@Operation(summary = "新增朋友圈")
@PostMapping("")
public Boolean addMoment(@RequestBody @JsonView(WriteView.class) @Validated MomentDto momentDto) {
return momentService.addMoment(momentDto);
}
@Operation(summary = "查询朋友圈")
@GetMapping("")
public @JsonView(ReadView.class) List<MomentDto> queryMoment() {
return momentService.queryMoment();
}
@Operation(summary = "新增评论")
@PostMapping("/{id}/comment")
public Boolean addMoment(@PathVariable("id") long id,
@RequestBody @JsonView(WriteView.class) @Validated CommentDto commentDto) {
return momentService.addComment(id, commentDto);
}
}

View File

@@ -10,32 +10,32 @@ import java.util.List;
@Mapper
public interface FoodDao {
FoodRecipeDto queryFoodRecipe(@Param("id") Long id);
RecipeDto queryRecipe(@Param("id") Long id);
IPage<FoodSummaryDto> queryFoodSummaryByPage(IPage<FoodSummaryDto> page,
@Param("query") FoodQueryVo foodQueryVo);
IPage<SummaryDto> querySummaryByPage(IPage<SummaryDto> page,
@Param("query") FoodQueryVo foodQueryVo);
List<FoodSummaryDto> queryFoodSummary(@Param("query") FoodQueryVo foodQueryVo);
List<SummaryDto> querySummary(@Param("query") FoodQueryVo foodQueryVo);
List<FoodRecordDto> queryFoodRecordById(@Param("id") Long id);
List<RecordDto> queryRecordById(@Param("id") Long id);
List<FoodRecordDto> queryFoodRecord(@Param("startDate") String startDate,
@Param("endDate") String endDate);
List<RecordDto> queryRecord(@Param("startDate") String startDate,
@Param("endDate") String endDate);
FoodStatsDto queryFoodStats();
StatsDto queryStats();
List<StatsChartDto> queryFoodRecordStats();
List<StatsChartDto> queryRecordStats();
List<StatsChartDto> queryFoodCategoryStats();
List<StatsChartDto> queryCategoryStats();
List<StatsChartDto> queryFoodRankStats();
List<StatsChartDto> queryRankStats();
List<String> queryFoodCategory();
List<String> queryCategory();
void insertFoodMaterial(@Param("foodId") Long foodId,
@Param("list") List<FoodMaterialDto> list);
void insertMaterial(@Param("foodId") Long foodId,
@Param("list") List<MaterialDto> list);
void insertFoodStep(@Param("foodId") Long foodId,
@Param("list") List<FoodStepDto> list);
void insertStep(@Param("foodId") Long foodId,
@Param("list") List<StepDto> list);
}

View File

@@ -0,0 +1,14 @@
package com.cxx.food.dao;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cxx.food.dto.*;
import com.cxx.food.vo.FoodQueryVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface MomentDao {
List<MomentDto> queryMoment();
}

View File

@@ -0,0 +1,37 @@
package com.cxx.food.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonView;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
@Getter
@Setter
@JsonView(PlainView.class)
public class CommentDto {
@Schema(description = "id")
@JsonView(ReadView.class)
private Long id;
@Schema(description = "姓名")
@JsonView(ReadView.class)
private String username;
@Schema(description = "头像")
@JsonView(ReadView.class)
private String avatar;
@Schema(description = "评论内容")
@NotBlank(message = "内容不能为空")
private String content;
@Schema(description = "时间")
@JsonView(ReadView.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date date;
}

View File

@@ -8,7 +8,7 @@ import lombok.Setter;
@Getter
@Setter
@JsonView(PlainView.class)
public class FoodMaterialDto {
public class MaterialDto {
@Schema(description = "id")
private Long id;

View File

@@ -0,0 +1,41 @@
package com.cxx.food.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonView;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
import java.util.List;
@Getter
@Setter
@JsonView(PlainView.class)
public class MomentDto {
@Schema(description = "id")
@JsonView(ReadView.class)
private Long id;
@Schema(description = "姓名")
@JsonView(ReadView.class)
private String username;
@Schema(description = "头像")
@JsonView(ReadView.class)
private String avatar;
@Schema(description = "朋友圈内容")
@NotBlank(message = "内容不能为空")
private String content;
@Schema(description = "时间")
@JsonView(ReadView.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date date;
@Schema(description = "评论内容")
@JsonView(ReadView.class)
private List<CommentDto> commentList;
}

View File

@@ -12,7 +12,7 @@ import java.util.List;
@Getter
@Setter
@JsonView(PlainView.class)
public class FoodRecipeDto {
public class RecipeDto {
@Schema(description = "id")
@JsonView(ReadView.class)
private Long id;
@@ -29,14 +29,14 @@ public class FoodRecipeDto {
private Integer recommendRate;
@Schema(description = "美食食材")
private List<FoodMaterialDto> materialList;
private List<MaterialDto> materialList;
@Schema(description = "美食步骤")
private List<FoodStepDto> stepList;
private List<StepDto> stepList;
@Schema(description = "美食成果")
@JsonView(ReadView.class)
private List<FoodRecordDto> recordList;
private List<RecordDto> recordList;
@Schema(description = "备注")
private String remark;

View File

@@ -11,7 +11,7 @@ import java.util.Date;
@Getter
@Setter
@JsonView(PlainView.class)
public class FoodRecordDto {
public class RecordDto {
@Schema(description = "id")
@JsonView(ReadView.class)
private Long id;

View File

@@ -7,7 +7,7 @@ import lombok.Setter;
@Getter
@Setter
public class FoodStatsDto {
public class StatsDto {
@Schema(description = "菜谱总数")
private Integer recipeCount;

View File

@@ -8,7 +8,7 @@ import lombok.Setter;
@Getter
@Setter
@JsonView(PlainView.class)
public class FoodStepDto {
public class StepDto {
@Schema(description = "id")
private Long id;

View File

@@ -8,7 +8,7 @@ import java.util.List;
@Getter
@Setter
public class FoodSummaryDto {
public class SummaryDto {
@Schema(description = "id")
private Long id;
@@ -22,5 +22,5 @@ public class FoodSummaryDto {
private Integer recommendRate;
@Schema(description = "美食记录")
private List<FoodRecordDto> recordList;
private List<RecordDto> recordList;
}

View File

@@ -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("comment")
public class Comment extends AbstractEntity {
@TableField("moment_id")
private Long momentId;
@TableField("content")
private String content;
}

View File

@@ -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("moment")
public class Like extends AbstractEntity {
@TableField("moment_id")
private Long momentId;
@TableField("is_delete")
private Integer isDelete;
}

View File

@@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("food_material")
public class FoodMaterial extends AbstractIdEntity {
public class Material extends AbstractIdEntity {
@TableField("food_id")
private Long foodId;

View File

@@ -0,0 +1,15 @@
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("moment")
public class Moment extends AbstractEntity {
@TableField("content")
private String content;
}

View File

@@ -8,8 +8,8 @@ import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("food_recipe")
public class FoodRecipe extends AbstractEntity {
@TableName("recipe")
public class Recipe extends AbstractEntity {
@TableField("name")
private String name;

View File

@@ -10,8 +10,8 @@ import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("food_record")
public class FoodRecord extends AbstractIdEntity {
@TableName("record")
public class Record extends AbstractIdEntity {
@TableField("food_id")
private Long foodId;

View File

@@ -8,8 +8,8 @@ import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("food_step")
public class FoodStep extends AbstractIdEntity {
@TableName("step")
public class Step extends AbstractIdEntity {
@TableField("food_id")
private Long foodId;

View File

@@ -0,0 +1,21 @@
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("user")
public class User extends AbstractEntity {
@TableField("username")
private String username;
@TableField("password")
private String password;
@TableField("avatar")
private String avatar;
}

View File

@@ -1,9 +1,9 @@
package com.cxx.food.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cxx.food.entity.FoodStep;
import com.cxx.food.entity.Comment;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface FoodStepMapper extends BaseMapper<FoodStep> {
public interface CommentMapper extends BaseMapper<Comment> {
}

View File

@@ -1,9 +1,9 @@
package com.cxx.food.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cxx.food.entity.FoodRecipe;
import com.cxx.food.entity.Like;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface FoodRecipeMapper extends BaseMapper<FoodRecipe> {
public interface LikeMapper extends BaseMapper<Like> {
}

View File

@@ -1,9 +1,9 @@
package com.cxx.food.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cxx.food.entity.FoodRecord;
import com.cxx.food.entity.Material;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface FoodRecordMapper extends BaseMapper<FoodRecord> {
public interface MaterialMapper extends BaseMapper<Material> {
}

View File

@@ -1,9 +1,9 @@
package com.cxx.food.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cxx.food.entity.FoodMaterial;
import com.cxx.food.entity.Moment;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface FoodMaterialMapper extends BaseMapper<FoodMaterial> {
public interface MomentMapper extends BaseMapper<Moment> {
}

View File

@@ -0,0 +1,9 @@
package com.cxx.food.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cxx.food.entity.Recipe;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface RecipeMapper extends BaseMapper<Recipe> {
}

View File

@@ -0,0 +1,9 @@
package com.cxx.food.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cxx.food.entity.Record;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface RecordMapper extends BaseMapper<Record> {
}

View File

@@ -0,0 +1,9 @@
package com.cxx.food.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cxx.food.entity.Step;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface StepMapper extends BaseMapper<Step> {
}

View File

@@ -0,0 +1,9 @@
package com.cxx.food.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cxx.food.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}

View File

@@ -8,35 +8,35 @@ import com.cxx.food.vo.FoodQueryVo;
import java.util.List;
public interface FoodService {
Boolean addFoodRecipe(FoodRecipeDto foodRecipeDto);
Boolean addRecipe(RecipeDto recipeDto);
Boolean updateFoodRecipe(Long id, FoodRecipeDto foodRecipeDto);
Boolean updateRecipe(Long id, RecipeDto recipeDto);
Boolean deleteFoodRecipe(Long id);
Boolean deleteRecipe(Long id);
Boolean addFoodRecord(FoodRecordDto foodRecordDto);
Boolean addRecord(RecordDto foodRecordDto);
Boolean updateFoodRecord(Long id, FoodRecordDto foodRecordDto);
Boolean updateRecord(Long id, RecordDto recordDto);
Boolean deleteFoodRecord(Long id);
Boolean deleteRecord(Long id);
FoodRecipeDto queryFoodRecipe(Long id);
RecipeDto queryRecipe(Long id);
List<FoodSummaryDto> queryFoodSummary(FoodQueryVo foodQueryVo);
List<SummaryDto> querySummary(FoodQueryVo foodQueryVo);
IPage<FoodSummaryDto> queryFoodSummaryByPage(Integer currentPage, Integer pageSize, FoodQueryVo foodQueryVo);
IPage<SummaryDto> querySummaryByPage(Integer currentPage, Integer pageSize, FoodQueryVo foodQueryVo);
List<FoodRecordDto> queryFoodRecord(String startDate, String endDate);
List<RecordDto> queryRecord(String startDate, String endDate);
List<String> queryFoodName();
List<String> queryFoodCategory();
List<String> queryCategory();
FoodStatsDto queryFoodStats();
StatsDto queryStats();
List<StatsChartDto> queryFoodRecordStats();
List<StatsChartDto> queryRecordStats();
List<StatsChartDto> queryFoodCategoryStats();
List<StatsChartDto> queryCategoryStats();
List<StatsChartDto> queryFoodRankStats();
List<StatsChartDto> queryRankStats();
}

View File

@@ -0,0 +1,16 @@
package com.cxx.food.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cxx.food.dto.*;
import com.cxx.food.vo.FoodQueryVo;
import java.util.List;
public interface MomentService {
Boolean addMoment(MomentDto momentDto);
List<MomentDto> queryMoment();
Boolean addComment(Long momentId, CommentDto commentDto);
}

View File

@@ -6,14 +6,14 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cxx.food.dao.FoodDao;
import com.cxx.food.dto.*;
import com.cxx.food.entity.FoodMaterial;
import com.cxx.food.entity.FoodRecipe;
import com.cxx.food.entity.FoodRecord;
import com.cxx.food.entity.FoodStep;
import com.cxx.food.mapper.FoodMaterialMapper;
import com.cxx.food.mapper.FoodRecipeMapper;
import com.cxx.food.mapper.FoodRecordMapper;
import com.cxx.food.mapper.FoodStepMapper;
import com.cxx.food.entity.Material;
import com.cxx.food.entity.Recipe;
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.service.FoodService;
import com.cxx.food.vo.FoodQueryVo;
import com.cxx.framework.web.CustomException;
@@ -32,189 +32,189 @@ public class FoodServiceImpl implements FoodService {
private FoodDao foodDao;
@Resource
private FoodRecipeMapper foodRecipeMapper;
private RecipeMapper recipeMapper;
@Resource
private FoodMaterialMapper foodMaterialMapper;
private MaterialMapper materialMapper;
@Resource
private FoodStepMapper foodStepMapper;
private StepMapper stepMapper;
@Resource
private FoodRecordMapper foodRecordMapper;
private RecordMapper recordMapper;
@Override
@Transactional
public Boolean addFoodRecipe(FoodRecipeDto foodRecipeDto) {
LambdaQueryWrapper<FoodRecipe> queryWrapper = new LambdaQueryWrapper<>();
if (foodRecipeMapper.exists(queryWrapper.eq(FoodRecipe::getName, foodRecipeDto.getName()))) {
public Boolean addRecipe(RecipeDto recipeDto) {
LambdaQueryWrapper<Recipe> queryWrapper = new LambdaQueryWrapper<>();
if (recipeMapper.exists(queryWrapper.eq(Recipe::getName, recipeDto.getName()))) {
throw new CustomException("该菜谱已经存在");
}
FoodRecipe foodRecipe = new FoodRecipe();
BeanUtils.copyProperties(foodRecipeDto, foodRecipe);
foodRecipeMapper.insert(foodRecipe);
resetFoodRecipe(foodRecipe.getId(), foodRecipeDto);
Recipe recipe = new Recipe();
BeanUtils.copyProperties(recipeDto, recipe);
recipeMapper.insert(recipe);
resetFoodRecipe(recipe.getId(), recipeDto);
return Boolean.TRUE;
}
@Override
@Transactional
public Boolean updateFoodRecipe(Long id, FoodRecipeDto foodRecipeDto) {
if (foodRecipeMapper.selectById(id) == null) {
public Boolean updateRecipe(Long id, RecipeDto recipeDto) {
if (recipeMapper.selectById(id) == null) {
throw new CustomException("该菜谱不存在");
}
FoodRecipe foodRecipe = new FoodRecipe();
BeanUtils.copyProperties(foodRecipeDto, foodRecipe);
foodRecipe.setId(id);
foodRecipeMapper.updateById(foodRecipe);
resetFoodRecipe(foodRecipe.getId(), foodRecipeDto);
Recipe recipe = new Recipe();
BeanUtils.copyProperties(recipeDto, recipe);
recipe.setId(id);
recipeMapper.updateById(recipe);
resetFoodRecipe(recipe.getId(), recipeDto);
return Boolean.TRUE;
}
@Override
@Transactional
public Boolean deleteFoodRecipe(Long id) {
foodRecipeMapper.deleteById(id);
foodMaterialMapper.delete(Wrappers.lambdaQuery(FoodMaterial.class).eq(FoodMaterial::getFoodId, id));
foodStepMapper.delete(Wrappers.lambdaQuery(FoodStep.class).eq(FoodStep::getFoodId, id));
foodRecordMapper.delete(Wrappers.lambdaQuery(FoodRecord.class).eq(FoodRecord::getFoodId, id));
public Boolean deleteRecipe(Long id) {
recipeMapper.deleteById(id);
materialMapper.delete(Wrappers.lambdaQuery(Material.class).eq(Material::getFoodId, id));
stepMapper.delete(Wrappers.lambdaQuery(Step.class).eq(Step::getFoodId, id));
recordMapper.delete(Wrappers.lambdaQuery(Record.class).eq(Record::getFoodId, id));
return Boolean.TRUE;
}
@Override
public Boolean addFoodRecord(FoodRecordDto foodRecordDto) {
LambdaQueryWrapper<FoodRecipe> queryWrapper = new LambdaQueryWrapper<>();
FoodRecipe foodRecipe = foodRecipeMapper.selectOne(queryWrapper.eq(FoodRecipe::getName, foodRecordDto.getName()));
if (foodRecipe == null) {
public Boolean addRecord(RecordDto recordDto) {
LambdaQueryWrapper<Recipe> queryWrapper = new LambdaQueryWrapper<>();
Recipe recipe = recipeMapper.selectOne(queryWrapper.eq(Recipe::getName, recordDto.getName()));
if (recipe == null) {
throw new CustomException("该菜谱不存在");
}
FoodRecord foodRecord = new FoodRecord();
foodRecord.setFoodId(foodRecipe.getId());
BeanUtils.copyProperties(foodRecordDto, foodRecord);
foodRecordMapper.insert(foodRecord);
Record record = new Record();
record.setFoodId(recipe.getId());
BeanUtils.copyProperties(recordDto, record);
recordMapper.insert(record);
return Boolean.TRUE;
}
@Override
public Boolean updateFoodRecord(Long id, FoodRecordDto foodRecordDto) {
if (foodRecordMapper.selectById(id) == null) {
public Boolean updateRecord(Long id, RecordDto recordDto) {
if (recordMapper.selectById(id) == null) {
throw new CustomException("该成果不存在");
}
FoodRecord foodRecord = new FoodRecord();
BeanUtils.copyProperties(foodRecordDto, foodRecord);
foodRecord.setId(id);
foodRecordMapper.updateById(foodRecord);
Record record = new Record();
BeanUtils.copyProperties(recordDto, record);
record.setId(id);
recordMapper.updateById(record);
return Boolean.TRUE;
}
@Override
public Boolean deleteFoodRecord(Long id) {
foodRecordMapper.deleteById(id);
public Boolean deleteRecord(Long id) {
recordMapper.deleteById(id);
return Boolean.TRUE;
}
private void resetFoodRecipe(Long id, FoodRecipeDto foodRecipeDto) {
foodMaterialMapper.delete(Wrappers.lambdaQuery(FoodMaterial.class).eq(FoodMaterial::getFoodId, id));
foodStepMapper.delete(Wrappers.lambdaQuery(FoodStep.class).eq(FoodStep::getFoodId, id));
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));
insertFoodMaterial(id, foodRecipeDto.getMaterialList());
insertFoodStep(id, foodRecipeDto.getStepList());
insertMaterial(id, recipeDto.getMaterialList());
insertStep(id, recipeDto.getStepList());
}
private void insertFoodMaterial(Long foodId, List<FoodMaterialDto> foodMaterialList) {
if (foodMaterialList.isEmpty()) {
private void insertMaterial(Long foodId, List<MaterialDto> materialDtoList) {
if (materialDtoList.isEmpty()) {
return;
}
foodMaterialList.forEach((item) -> {
materialDtoList.forEach((item) -> {
item.setId(YitIdHelper.nextId());
});
foodDao.insertFoodMaterial(foodId, foodMaterialList);
foodDao.insertMaterial(foodId, materialDtoList);
}
private void insertFoodStep(Long foodId, List<FoodStepDto> foodStepList) {
if (foodStepList.isEmpty()) {
private void insertStep(Long foodId, List<StepDto> stepDtoList) {
if (stepDtoList.isEmpty()) {
return;
}
foodStepList.forEach((item) -> {
stepDtoList.forEach((item) -> {
item.setId(YitIdHelper.nextId());
});
foodDao.insertFoodStep(foodId, foodStepList);
foodDao.insertStep(foodId, stepDtoList);
}
@Override
public FoodRecipeDto queryFoodRecipe(Long id) {
if (foodRecipeMapper.selectById(id) == null) {
public RecipeDto queryRecipe(Long id) {
if (recipeMapper.selectById(id) == null) {
throw new CustomException("该美食不存在");
}
return foodDao.queryFoodRecipe(id);
return foodDao.queryRecipe(id);
}
@Override
public List<FoodSummaryDto> queryFoodSummary(FoodQueryVo foodQueryVo) {
return foodDao.queryFoodSummary(foodQueryVo);
public List<SummaryDto> querySummary(FoodQueryVo foodQueryVo) {
return foodDao.querySummary(foodQueryVo);
}
@Override
public IPage<FoodSummaryDto> queryFoodSummaryByPage(Integer currentPage, Integer pageSize, FoodQueryVo foodQueryVo) {
public IPage<SummaryDto> querySummaryByPage(Integer currentPage, Integer pageSize, FoodQueryVo foodQueryVo) {
// 这里只能先对主表进行分页 然后在查询子表信息
// 不能使用Left Join关联表查询因为这里是一对多数据关联查询会导致数据有重复
// 从而导致page计算错误会把重复的数据当成多条记录实际上只有1条记录
IPage<FoodSummaryDto> foodSummaryPage = foodDao.queryFoodSummaryByPage(new Page<>(currentPage, pageSize), foodQueryVo);
List<FoodSummaryDto> foodSummaryList = foodSummaryPage.getRecords();
for (FoodSummaryDto foodSummary : foodSummaryList) {
foodSummary.setRecordList(foodDao.queryFoodRecordById(foodSummary.getId()));
IPage<SummaryDto> summaryPage = foodDao.querySummaryByPage(new Page<>(currentPage, pageSize), foodQueryVo);
List<SummaryDto> summaryList = summaryPage.getRecords();
for (SummaryDto foodSummary : summaryList) {
foodSummary.setRecordList(foodDao.queryRecordById(foodSummary.getId()));
}
foodSummaryPage.setRecords(foodSummaryList);
return foodSummaryPage;
summaryPage.setRecords(summaryList);
return summaryPage;
}
@Override
public List<FoodRecordDto> queryFoodRecord(String startDate, String endDate) {
return foodDao.queryFoodRecord(startDate, endDate);
public List<RecordDto> queryRecord(String startDate, String endDate) {
return foodDao.queryRecord(startDate, endDate);
}
@Override
public List<String> queryFoodName() {
return foodRecipeMapper.selectList(null)
.stream().map(FoodRecipe::getName).collect(Collectors.toList());
return recipeMapper.selectList(null)
.stream().map(Recipe::getName).collect(Collectors.toList());
}
@Override
public List<String> queryFoodCategory() {
return foodDao.queryFoodCategory();
public List<String> queryCategory() {
return foodDao.queryCategory();
}
@Override
public FoodStatsDto queryFoodStats() {
return foodDao.queryFoodStats();
public StatsDto queryStats() {
return foodDao.queryStats();
}
@Override
public List<StatsChartDto> queryFoodRecordStats() {
return foodDao.queryFoodRecordStats();
public List<StatsChartDto> queryRecordStats() {
return foodDao.queryRecordStats();
}
@Override
public List<StatsChartDto> queryFoodCategoryStats() {
return foodDao.queryFoodCategoryStats();
public List<StatsChartDto> queryCategoryStats() {
return foodDao.queryCategoryStats();
}
@Override
public List<StatsChartDto> queryFoodRankStats() {
return foodDao.queryFoodRankStats();
public List<StatsChartDto> queryRankStats() {
return foodDao.queryRankStats();
}
}

View File

@@ -0,0 +1,53 @@
package com.cxx.food.service.impl;
import com.cxx.food.dao.MomentDao;
import com.cxx.food.dto.CommentDto;
import com.cxx.food.dto.MomentDto;
import com.cxx.food.entity.Comment;
import com.cxx.food.entity.Moment;
import com.cxx.food.mapper.CommentMapper;
import com.cxx.food.mapper.MomentMapper;
import com.cxx.food.service.MomentService;
import com.cxx.framework.web.CustomException;
import jakarta.annotation.Resource;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class MomentServiceImpl implements MomentService {
@Resource
private MomentDao momentDao;
@Resource
private MomentMapper momentMapper;
@Resource
private CommentMapper commentMapper;
@Override
public Boolean addMoment(MomentDto momentDto) {
Moment moment = new Moment();
BeanUtils.copyProperties(momentDto, moment);
return momentMapper.insert(moment) == 1;
}
@Override
public List<MomentDto> queryMoment() {
// TODO 只能查询好友的朋友圈
return momentDao.queryMoment();
}
@Override
public Boolean addComment(Long momentId, CommentDto commentDto) {
if (momentMapper.selectById(momentId) == null) {
throw new CustomException("该朋友圈不存在");
}
Comment comment = new Comment();
BeanUtils.copyProperties(commentDto, comment);
comment.setMomentId(momentId);
return commentMapper.insert(comment) == 1;
}
}

View File

@@ -19,7 +19,7 @@ public class SessionServiceImpl implements SessionService {
@Override
public SessionDto create(String name, String password) {
SessionDto sessionDto = new SessionDto();
StpUtil.login(name);
StpUtil.login(645808454946885L);
sessionDto.setSaToken(StpUtil.getTokenInfo());
return sessionDto;