> 文档中心 > 最新Springboot+mp核心技术外卖入门实战项目(三)

最新Springboot+mp核心技术外卖入门实战项目(三)

有关套餐的实体类

@Datapublic class Setmeal implements Serializable {    private static final long serialVersionUID = 1L;    private Long id;    //分类id    private Long categoryId;    //套餐名称    private String name;    //套餐价格    private BigDecimal price;    //状态 0:停用 1:启用    private Integer status;    //编码    private String code;    //描述信息    private String description;    //图片    private String image;    @TableField(fill = FieldFill.INSERT)    private LocalDateTime createTime;    @TableField(fill = FieldFill.INSERT_UPDATE)    private LocalDateTime updateTime; @TableField(fill = FieldFill.INSERT)    private Long createUser; @TableField(fill = FieldFill.INSERT_UPDATE)    private Long updateUser;}@Datapublic class SetmealDto extends Setmeal {    private List<SetmealDish> setmealDishes;    private String categoryName;}@Datapublic class SetmealDish implements Serializable {    private static final long serialVersionUID = 1L;    private Long id; //套餐id    private Long setmealId;    //菜品id    private Long dishId;    //菜品名称 (冗余字段)    private String name;    //菜品原价    private BigDecimal price;    //份数    private Integer copies;    //排序    private Integer sort;    @TableField(fill = FieldFill.INSERT)    private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE)    private LocalDateTime updateTime;    @TableField(fill = FieldFill.INSERT)    private Long createUser;    @TableField(fill = FieldFill.INSERT_UPDATE)    private Long updateUser;    //是否删除    private Integer deleted;}@Datapublic class SetmealDto extends Setmeal {    private List<SetmealDish> setmealDishes;    private String categoryName;}

已经写出的接口

/** * @author William * @create 2022-04-22 16:04 */public interface IDishService extends IService<Dish> {    //新增菜品,同时插入菜品对应的口味数据,需要操作dish和dish_flavor两张表    void saveWithFlavor(DishDto dishDto);    Page<DishDto> page(int page, int pageSize, String name);    //根据id查询菜品信息和对应的口味信息    DishDto getByIdWithFlavor(Long id);    void updateWithFlavor(DishDto dishDto);    //根据条件查询对应的菜品数据    List<Dish> list(Dish dish);}

服务层实现类

/** * @author William * @create 2022-04-22 16:12 */@Service@Slf4jpublic class SetmealServiceImpl extends ServiceImpl<SetmealDAO, Setmeal> implements ISetmealService {    @Autowired    private ISetmealDishService setmealDishService;    @Autowired    private ICategoryService categoryService;    /**    * 新增套餐,同时需要保存套餐和菜品的关联关系    *@Param [setmealDto]    *@Return    */    @Override    @Transactional    public void saveWithDish(SetmealDto setmealDto) { this.save(setmealDto);//因为这两个之间有映射关系 对应属性会自动保存 List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes(); setmealDishes.stream().map((item) -> {     item.setSetmealId(setmealDto.getId());     return item; }).collect(Collectors.toList()); //保存套餐和菜品的关联关系,操作setmeal_dish,执行insert操作 setmealDishService.saveBatch(setmealDishes);    }    /**    * 套餐分页查询功能    *@Param [page, pageSize, name]    *@Return    */    @Override    public Page page(int page, int pageSize, String name) { Page<Setmeal> pageInfo = new Page<>(page, pageSize); Page<SetmealDto> dtoPage = new Page<>(); LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.like(name != null, Setmeal::getName, name)      .orderByDesc(Setmeal::getUpdateTime); this.page(pageInfo, queryWrapper); //对象拷贝 BeanUtils.copyProperties(pageInfo, dtoPage, "records"); List<Setmeal> records = pageInfo.getRecords(); List<SetmealDto> list = records.stream().map((item) -> {     SetmealDto setmealDto = new SetmealDto();     //对象拷贝     BeanUtils.copyProperties(item, setmealDto);     Long categoryId = item.getCategoryId();     //根据分类id查询分类对象     Category category = categoryService.getById(categoryId);     if (category != null) {  //分类名称  String categoryName = category.getName();  setmealDto.setCategoryName(categoryName);     }     return setmealDto; }).collect(Collectors.toList()); dtoPage.setRecords(list); return dtoPage;    }    /**    * 删除套餐,同时需要删除套餐和菜品的关联数据    *@Param [ids]    *@Return    */    @Override    @Transactional    public void removeWithDish(List<Long> ids) { //select count(*) from setmeal where id in(1, 2, 3) and status = 1 //查询套餐状态,确定是否可用删除 LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(Setmeal::getId, ids)      .eq(Setmeal::getStatus, 1); int count = this.count(queryWrapper); if(count > 0){     //如果不能删除,抛出一个业务异常     throw new CustomException("套餐正在售卖中,不能删除"); } //可以删除就先删除套餐表中的数据 -- setmeal this.removeByIds(ids); //删除关系表中的数据 -- setmeal_dish //此时不能直接使用setmealDishService.removeByIds(ids) 当前套餐id并不是关系表中的id //delete from setmeal_dish where setmeal_id in (1, 2, 3) LambdaQueryWrapper<SetmealDish> LambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper.in(SetmealDish::getSetmealId, ids); setmealDishService.remove(LambdaQueryWrapper);    }}

套餐controller层

/** * 套餐管理 * @author William * @create 2022-04-22 16:14 */@RestController@RequestMapping("/setmeal")@Slf4jpublic class SetmealController {    @Autowired    private ISetmealService setmealService;    @Autowired    private ISetmealDishService setmealDishService;    @ApiOperation(value = "保存", notes = "新增套餐")    @PostMapping    public R<String> save(@RequestBody SetmealDto setmealDto){ log.info("套餐信息:{}", setmealDto); setmealService.saveWithDish(setmealDto); return R.success("新增套餐成功");    }    @ApiOperation(value = "查询", notes = "套餐分页查询")    @GetMapping("/page")    public R<Page> page(int page, int pageSize, String name){ Page<Setmeal> pageInfo = setmealService.page(page, pageSize, name); return R.success(pageInfo);    }    @ApiOperation(value = "删除", notes = "删除单个或多个套餐")    @DeleteMapping    public R<String> delete(@RequestParam List<Long> ids){ log.info("ids:{}",ids); setmealService.removeWithDish(ids); return R.success("套餐数据删除成功");    }}

我们在完善套餐功能时还在dish中增加了一个功能,因为增加套餐时需要查询正在售卖的菜品,停售的菜品是不能加入到套餐中的

//根据条件查询对应的菜品数据    List<Dish> list(Dish dish);/**    * 根据条件查询对应的菜品数据    *@Param [dish]    *@Return    */    @Override    public List<Dish> list(Dish dish) { LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(dish.getCategoryId() != null, Dish::getCategoryId, dish.getCategoryId())      .eq(Dish::getStatus, 1)//添加条件 状态为1(起售)      .orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime); return this.list(queryWrapper);    }@ApiOperation(value = "查询", notes = "根据条件查询对应的菜品数据")    @GetMapping("/list")    public R<List<Dish>> list(Dish dish){ List<Dish> list = dishService.list(dish); return R.success(list);    }

网赚站