一、需求分析
套餐就是菜品的集合。
后台系统中可以管理套餐信息,通过新增套餐功能来添加一个新的套餐,在添加套餐时需要选择当前套餐所属的套餐分类和包含的菜品,并且需要上传套餐对应的图片,在移动端会按照套餐分类来展示对应的套餐。
数据模型
新增套餐,其实就是将新增页面录入的套餐信息插入到setmeal表,还需要向setmeal_dish表插入套餐和菜品关联数据。
所以在新增套餐时,涉及到两个表:
setmeal 套餐表
setmeal_dish套餐菜品关系表
二、代码开发 - 准备工作
在开发业务功能前,先将需要用到的类和接口基本结构创建好:
- 实体类SetmealDish
- DTO SetmealDto
- Mapper接口SetmealDishMapper
- 业务层接口SetmealDishService
- 业务层实现类SetmealDishServicelmpl
- 控制层SetmealController
梳理交互过程
在开发代码之前,需要梳理一下新增套餐时前端页面和服务端的交互过程:
1、页面(backend/page/comboladd.html)发送ajax请求,请求服务端获取套餐分类数据并展示到下拉框中2、页面发送ajax请求,请求服务端获取菜品分类数据并展示到添加菜品窗口中
3、页面发送ajax请求,请求服务端,根据菜品分类查询对应的菜品数据并展示到添加菜品窗口中
4、页面发送请求进行图片上传,请求服务端将图片保存到服务器
5、页面发送请求进行图片下载,将上传的图片进行回显
6、点击保存按钮,发送ajax请求,将套餐相关数据以json形式提交到服务端
开发新增套餐功能,其实就是在服务端编写代码去处理前端页面发送的这6次请求即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| /** * 根据条件查询对应的菜品数据 * @param dish * @return */ @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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| package com.itheima.reggie.controller;
import com.itheima.reggie.common.R; import com.itheima.reggie.dto.SetmealDto; import com.itheima.reggie.service.CategoryService; import com.itheima.reggie.service.SetmealDishService; import com.itheima.reggie.service.SetmealService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
/** * 套餐管理 */ @RestController @RequestMapping("/setmeal") @Slf4j public class SetmealController {
@Autowired private SetmealService setmealService;
@Autowired private CategoryService categoryService;
@Autowired private SetmealDishService setmealDishService;
/** * 新增套餐 * @param setmealDto * @return */ @PostMapping public R<String> save(@RequestBody SetmealDto setmealDto){ log.info("套餐信息:{}",setmealDto);
setmealService.saveWithDish(setmealDto);
return R.success("新增套餐成功"); }
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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> { /** * 新增套餐,同时需要保存套餐和菜品的关系 * @param setmealDto */ public void saveWithDish(SetmealDto setmealDto); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| package com.itheima.reggie.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.itheima.reggie.dto.SetmealDto; import com.itheima.reggie.entity.Setmeal; import com.itheima.reggie.entity.SetmealDish; import com.itheima.reggie.mapper.SetmealMapper; import com.itheima.reggie.service.SetmealDishService; import com.itheima.reggie.service.SetmealService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.stream.Collectors;
@Service @Slf4j public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {
@Autowired private SetmealDishService setmealDishService; /** * 新增套餐,同时需要保存套餐和菜品的关系 * @param setmealDto */ @Transactional public void saveWithDish(SetmealDto setmealDto) { //保存套餐的基本信息,执行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); } }
|