这是对应的视频链接【黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis plus开发核心技术的真java实战项目-哔哩哔哩】 https://b23.tv/3nr8oMw
大家如果做了可以一起探讨一下,我在这实现了那些视频中没有完成的功能
有关套餐的实体类
@Data
public 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;
}
@Data
public class SetmealDto extends Setmeal {
private List<SetmealDish> setmealDishes;
private String categoryName;
}
@Data
public 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;
}
@Data
public 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
@Slf4j
public 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")
@Slf4j
public 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);
}