继续上一节的内容,本节是作业课程,要求独立完成套餐管理模块所有业务功能,包括:新增套餐、套餐分页查询、删除套餐、修改套餐、起售停售套餐。
新增套餐
页面原型:
其中的文件上传、和套餐分类查询已经完成。套餐分类查询的接口地址为/admin/category/list,根据请求参数的type值区分查询的分类类型:1为菜品分类,2为套餐分类,这里前端查询的是套餐分类。这些功能前面已经完成不再赘述。
在新增套餐时需要选择套餐里包含的菜品,所以需要先完成根据分类id查询菜品功能。
根据分类id查询菜品功能
根据分类id查询菜品接口:
先来完成根据分类id查询菜品:
Controller层
DishController.java
/**
* 根据分类id查询菜品
*
* @param categoryId
* @return
*/
@GetMapping("/list")
@ApiOperation("根据分类id查询菜品")
public Result<List<Dish>> getByCategory(Long categoryId){
log.info("根据分类id查询菜品:{}", categoryId);
List<Dish> list = dishService.getByCategoryID(categoryId);
return Result.success(list);
}
Service层实现类
DishServiceImpl.java
/**
* 根据分类id查询菜品信息
*
* @param categoryId
*/
public List<Dish> getByCategoryID(Long categoryId) {
Dish dish = Dish.builder()
.categoryId(categoryId)
.status(StatusConstant.ENABLE) // 新增套餐需要保证查询的菜品为销售状态
.build();
return dishMapper.list(dish);
}
Mapper层
DishMapper直接写一个动态条件查询菜品,后期用户端前端查询菜品时也还可以复用
/**
* 动态条件查询菜品
* @param dish
* @return
*/
List<Dish> list(Dish dish);
DishMapper.xml
<select id="list" resultType="Dish" parameterType="Dish">
select * from dish
<where>
<if test="name != null">
and name like concat('%',#{name},'%')
</if>
<if test="categoryId != null">
and category_id = #{categoryId}
</if>
<if test="status != null">
and status = #{status}
</if>
</where>
order by create_time desc
</select>
完成之后测试新增套餐时往套餐中加入菜品:
按道理来说,这里前端写了输入菜品名称进行搜索的,后端应该开发出动态条件查询菜品的功能,输入数据是分类id还有菜品名等,但是这里因为前后端的接口文档里这个接口只传入了一个分类id,因此这里新增套餐页面的添加菜品里的按名称进行搜索也是无法使用的,有兴趣的可以自己修改前端源码修改接口。
新增套餐功能
新增套餐接口:
下面来完成新增套餐:
Controller层
SetmealController
/**
* 套餐管理
*/
@RestController
@RequestMapping("/admin/setmeal")
@Slf4j
@Api(tags= "套餐相关接口") //描述类的作用
public class SetmealController {
@Autowired
private SetmealService setmealServices;
/**
* 新增套餐
*
* @param setmealDTO
* @return
*/
@PostMapping
@ApiOperation(value = "新增套餐")
public Result save(@RequestBody SetmealDTO setmealDTO){
log.info("新增套餐:{}",setmealDTO);
setmealServices.save(setmealDTO);
return Result.success();
}
}
Service层实现类
SetmealServiceImpl
@Service
public class SetmealServiceImpl implements SetmealService {
@Autowired
private SetmealMapper setmealMapper;
@Autowired
private SetmealDishMapper setmealDishMapper;
/**
* 新增套餐,同时需要保存套餐和菜品的关联关系
*
* @param setmealDTO
* @return
*/
@Transactional // 事务
public void save(SetmealDTO setmealDTO) {
Setmeal setmeal = new Setmeal();
BeanUtils.copyProperties(setmealDTO, setmeal); //套餐
List<SetmealDish> setmealDishlist = setmealDTO.getSetmealDishes(); // 套餐菜品关系
setmealMapper.insert(setmeal);
long setmealId = setmeal.getId(); //返回自动生成的套餐菜品表主键id
if (setmealDishlist != null && setmealDishlist.size() > 0) {
setmealDishlist.forEach(setmealDish -> {
setmealDish.setSetmealId(setmealId);
});
//向套餐菜品关系表插入n条数据
setmealDishMapper.insertBatch(setmealDishlist);
}
}
}
Mapper层
SetmealMapper
/**
* 新增套餐数据
*
* @param setmeal
*/
@AutoFill(OperationType.INSERT) // 公共字段填充
void insert<