瑞吉外卖09-菜品模块的CRUD与启售、停售
需求分析
我们先看看这个页面,剥离出本质其实就是CRUD!
这里面还有一个 “启售” 和 “停售”,在黑马视频中是没有的,我们这里也将其一起来实现一下!
这里我们基本上在前面都有讲过一些,所以这里就不做过多的分析了!
请求参数
菜品分页查询
请求 | 说明 |
---|---|
请求方式 | GET |
请求路径 | /dish/page |
请求参数 | ?page=1&pageSize=10&name=xxx |
新增菜品
请求 | 说明 |
---|---|
请求方式 | POST |
请求路径 | /dish |
请求参数 | json格式 |
删除菜品
菜品修改
根据ID查询菜品及菜品口味信息
请求 | 说明 |
---|---|
请求方式 | GET |
请求路径 | /dish/{id} |
修改菜品及菜品口味信息
请求 | 说明 |
---|---|
请求方式 | PUT |
请求路径 | /dish |
请求参数 | json格式数据 |
起售停售
代码实现
Controller层
@RestController
@Slf4j
@RequestMapping("/dish")
public class DishController {
@Autowired
private DishService dishService;
/**
* 新增菜品
* @param dishDto
* @return
*/
@PostMapping
public R<String> saveDishWithFlavor(@RequestBody DishDto dishDto) {
return dishService.saveDishWithFlavor(dishDto);
}
/**
* 菜品管理-分页查询
* @param page
* @param pageSize
* @param name
* @return
*/
@GetMapping("/page")
public R<Page> pageByDish(int page,int pageSize,String name) {
return dishService.pageByDish(page, pageSize,name);
}
/**
* 修改菜品
* @param dishDto
* @return
*/
@PutMapping
public R<String> updateDishWithFlavor(@RequestBody DishDto dishDto) {
return dishService.updateDishWithFlavor(dishDto);
}
/**
* 根据id查询菜品信息与对应的口味信息
* @param id
* @return
*/
@GetMapping("/{id}")
public R<DishDto> getDishInfoById(@PathVariable Long id) {
return dishService.getDishInfoById(id);
}
/**
* 删除菜品
* @param ids
* @return
*
* @@RequestParam: 用于将请求参数区数据映射到功能处理方法的参数上
*/
@DeleteMapping
public R<String> deleteDish(@RequestParam List<Long> ids) {
log.info("ids:{}",ids);
return dishService.deleteDish(ids);
}
/**
* 起售菜品、停售菜品
* @param status
* @param ids
* @return
*
* http://localhost:8080/dish/status/0?ids=1413384757047271425
*/
@PostMapping("/status/{status}")
public R<String> sellStatus(@PathVariable("status") Integer status, @RequestParam List<Long> ids) {
return dishService.sellStatus(status, ids);
}
}
Service层
@Service
@Slf4j
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {
@Autowired
private DishFlavorMapper dishFlavorMapper;
@Autowired
private DishMapper dishMapper;
@Autowired
private CategoryMapper categoryMapper;
@Autowired
private DishFlavorService dishFlavorService;
@Override
@Transactional
public R<String> saveDishWithFlavor(DishDto dishDto) {
this.save(dishDto);
Long dishId = dishDto.getId();
List<DishFlavor> flavors = dishDto.getFlavors();
for (DishFlavor flavor : flavors) {
flavor.setDishId(dishId);
dishFlavorMapper.insert(flavor);
}
return R.success("新增菜品成功!");
}
@Override
public R<Page> pageByDish(int page, int pageSize, String name) {
Page<Dish> pageInfo = new Page<>(page, pageSize);
Page<DishDto> dishDtoPage = new Page<>();
LambdaQueryWrapper<Dish> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(name != null, Dish::getName, name);
lambdaQueryWrapper.orderByDesc(Dish::getUpdateTime);
dishMapper.selectPage(pageInfo, lambdaQueryWrapper);
BeanUtils.copyProperties(pageInfo, dishDtoPage, "records");
List<Dish> records = pageInfo.getRecords();
List<DishDto> collect = records.stream().map((item) -> {
DishDto dishDto = new DishDto();
BeanUtils.copyProperties(item,dishDto);
Long categoryId = item.getCategoryId();
Category category = categoryMapper.selectById(categoryId);
if (category != null) {
String categoryName = category.getName();
dishDto.setCategoryName(categoryName);
}
return dishDto;
}).collect(Collectors.toList());
dishDtoPage.setRecords(collect);
return R.success(dishDtoPage);
}
@Override
@Transactional
public R<String> updateDishWithFlavor(DishDto dishDto) {
this.updateById(dishDto);
LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DishFlavor::getDishId, dishDto.getId());
dishFlavorMapper.delete(queryWrapper);
List<DishFlavor> flavors = dishDto.getFlavors();
for (DishFlavor flavor : flavors) {
flavor.setDishId(dishDto.getId());
dishFlavorMapper.insert(flavor);
}
return R.success("修改成功!");
}
@Override
public R<DishDto> getDishInfoById(Long id) {
Dish dish = this.getById(id);
DishDto dishDto = new DishDto();
BeanUtils.copyProperties(dish, dishDto);
LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DishFlavor::getDishId,dish.getId());
List<DishFlavor> flavors = dishFlavorMapper.selectList(queryWrapper);
dishDto.setFlavors(flavors);
return R.success(dishDto);
}
@Override
@Transactional
public R<String> deleteDish(List<Long> ids) {
// 查菜品的状态,是否可以删除()
LambdaQueryWrapper<Dish> dishQueryWrapper = new LambdaQueryWrapper<>();
dishQueryWrapper.in(Dish::getId, ids);
dishQueryWrapper.eq(Dish::getStatus, 1);
int count = this.count(dishQueryWrapper);
if(count > 0) {
throw new CustomException("菜品正在售卖中!不能删除!");
}
// 删除dish
dishMapper.deleteBatchIds(ids);
// 删除dish_flavor
LambdaQueryWrapper<DishFlavor> dfQueryWrapper = new LambdaQueryWrapper<>();
dfQueryWrapper.in(DishFlavor::getDishId, ids);
dishFlavorMapper.delete(dfQueryWrapper);
return R.success("删除菜品成功!");
}
@Override
public R<String> sellStatus(Integer status, List<Long> ids) {
LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(ids != null, Dish::getId, ids);
List<Dish> list = dishMapper.selectList(queryWrapper);
for (Dish dish : list) {
if (dish != null) {
dish.setStatus(status);
dishMapper.updateById(dish);
}
}
return R.success("售卖状态修改成功");
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)