新增套餐
在开发业务功能前,先将需要用到的类和接口基本结构创建好:
实体类SetmealDish
package com.itheima.reggie.entity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; /** * 套餐菜品关系 */ @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 isDeleted; }
DTO SetmealDto
package com.itheima.reggie.dto; import com.itheima.reggie.entity.Setmeal; import com.itheima.reggie.entity.SetmealDish; import lombok.Data; import java.util.List; @Data public class SetmealDto extends Setmeal { private List<SetmealDish> setmealDishes; private String categoryName; }
Mapper接口SetmealDishMapper
package com.itheima.reggie.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.itheima.reggie.entity.SetmealDish; import org.apache.ibatis.annotations.Mapper; @Mapper public interface SetmealDishMapper extends BaseMapper<SetmealDish> { }
业务层接口SetmealDishService
package com.itheima.reggie.service; import com.baomidou.mybatisplus.extension.service.IService; import com.itheima.reggie.dto.SetmealDto; import com.itheima.reggie.entity.Setmeal; public interface SetmealService extends IService<Setmeal> { //新增套餐保存套餐和菜品的关联关系 public void saveWithDish(SetmealDto setmealDto); } }
业务层实现类SetmealDishServicelmpl
@Slf4j @Service public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal>implements SetmealService { @Autowired private SetmealDishService setmealDishService; //新增套餐保存套餐和菜品的关联关系 @Override @Transactional public void saveWithDish(SetmealDto setmealDto) { //保存套餐的基本信息,操作setmeal,执行insert操作 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); } }
控制层SetmealController
//套餐管理 @RestController @RequestMapping("setmeal") @Slf4j public class SetmealController { @Autowired private SetmealService setmealService; @Autowired private SetmealDishService setmealDishService; //新增套餐 @PostMapping public R<String> save(@RequestBody SetmealDto setmealDto){ log.info("套餐信息:{}",setmealDto); setmealService.saveWithDish(setmealDto); return R.success("新增套餐成功!"); }
在dishController里编写
//根据条件查询对应菜品数据 @GetMapping("/list") public R<List<Dish>> list(Dish dish){ //构造查询对象 LambdaQueryWrapper<Dish> queryWrapper=new LambdaQueryWrapper<>(); queryWrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId()); //查询状态为1的 queryWrapper.eq(Dish::getStatus,1); //添加排序条件 queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime); List<Dish> list = dishService.list(queryWrapper); return R.success(list); }
套餐分页查询
在开发代码之前,需要梳理一下套餐分页查询时前端页面和服务端的交互过程:
1、页面(backend/page/combo/list.html)发送ajax请求,将分页查询参数(page、 pageSize.name)提交到服务端,获取分页数据。
2、页面发送请求,请求服务端进行图片下载,用于页面图片展示。
开发套餐信息分页查询功能,其实就是在服务端编写代码去处理前端页面发送的这2次请求即可。
//套餐分页查询 @GetMapping("/page") public R<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<>(); //添加查询条件 根据name进行like模糊查询 queryWrapper.like(name!=null,Setmeal::getName,name); //添加排序条件,根据更新时间 queryWrapper.orderByDesc(Setmeal::getUpdateTime); setmealService.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); //分类id 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 R.success(dtoPage); }
删除套餐
在开发代码之前,需要梳理一下删除套餐时前端页面和服务端的交互过程:
1、删除单个套餐时,页面发送ajax请求,根据套餐id删除对应套餐。
开发删除套餐功能,其实就是在服务端编写代码去处理前端页面发送的这2次请求即可。
观察删除单个套餐和批量删除套餐的请求信息可以发现,两种请求的地址和请求方式都是相同的。不同的则是传递的id个数,所以在服务端可以提供一个方法来统一处理。
在SetmealService中添加一个方法removeWithDish
//删除套餐,同时需要删除套餐和菜品的关联数据 public void removeWithDish(List<Long> ids);
在SermeaServiceimpl中实现这个removeWithDish方法
//删除套餐,同时需要删除套餐和菜品的关联数据 @Override @Transactional public void removeWithDish(List<Long> ids) { //查询套餐状态,确定是否可以删除 LambdaQueryWrapper<Setmeal> queryWrapper=new LambdaQueryWrapper(); queryWrapper.in(Setmeal::getId,ids); queryWrapper.eq(Setmeal::getStatus,1); int count=this.count(queryWrapper); if (count>0){ // 如果不能删除,抛出一个业务异常 throw new CustomException("套餐正在售卖中,不能删除"); } //如果可以删除,先删除套餐表中的数据setmeal this.removeByIds(ids); //删除关系表中的数据setmeal_dish LambdaQueryWrapper<SetmealDish> lambdaQueryWrapper=new LambdaQueryWrapper<>(); lambdaQueryWrapper.in(SetmealDish::getSetmealId,ids); setmealDishService.remove(lambdaQueryWrapper); }
在SermealController中调用该removeWithDish方法
//删除套餐 @DeleteMapping public R<String> delete(@RequestParam List<Long> ids){ log.info("ids:{}",ids); setmealService.removeWithDish(ids); return R.success("套餐数据删除成功"); }
美好的一天到此结束,下次继续努力!