目录
一、新增套餐
1.1 需求分析
1.2 数据模型
1.3 代码开发
二、套餐信息分页查询
2.1 需求分析
2.2 代码开发
三、删除套餐
3.1 需求分析
3.2 代码开发
一、新增套餐
1.1 需求分析
1.2 数据模型
1.3 代码开发
创建mapper:
package com.learn.reggie.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.learn.reggie.entity.SetmealDish;import org.apache.ibatis.annotations.Mapper;/*** @author 咕咕猫* @version 1.0*/@Mapperpublic interface SetmealDishMapper extends BaseMapper<SetmealDish> {}
创建service:
package com.learn.reggie.service;import com.baomidou.mybatisplus.extension.service.IService;import com.learn.reggie.entity.SetmealDish;/*** @author 咕咕猫* @version 1.0*/public interface SetmealDishService extends IService<SetmealDish> {}
package com.learn.reggie.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.learn.reggie.entity.SetmealDish;import com.learn.reggie.mapper.SetmealDishMapper;import com.learn.reggie.service.SetmealDishService;import com.learn.reggie.service.SetmealService;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;/*** @author 咕咕猫* @version 1.0*/@Service@Slf4jpublic class SetmealDishServiceImpl extends ServiceImpl<SetmealDishMapper, SetmealDish> implements SetmealDishService {}
添加菜品数据回显
controller层代码:
第一个交互前面写了;分类管理通过type的值来控制在前端展示的是 菜品分类(type=1) 或者是 套餐分类(type=2)
第二个交互前面也写了,在categorycontroller里面的list方法;
第四和第五前面也写了;
第三个交互:前端请求的地址;
在DishController书写代码:
/*** 根据条件查询对应的菜品数据** @param dish* @return*/@GetMapping("/list")public R<List<Dish>> list(Dish dish) {//这里可以传categoryId,但是为了代码通用性更强,这里直接使用dish类来接受(因为dish里面是有categoryId的),以后传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);}
控制台输出的sql语句:
SELECT id,name,category_id,price,code,image,description,status,sort,create_time,update_time,create_user,update_user,is_deleted FROM dish WHERE (category_id = ? AND status = ?) ORDER BY sort ASC,update_time DESC
保存添加套餐
实现要求:点击保存按钮,发送ajax请求,将套餐相关的数据以json形式提交到服务端;
前端提交请求:
前端携带的参数:重要
根据前端传过来的数据我们可以在后端确定我们需要在后端使用什么来接受前端的参数;
编写controller:上面的dishList,我们数据库并不需要这个数据,所以接收数据的实体类没有dishList这个属性也没有关系,前端传过来的数据都是自动映射到接收数据的实体类的属性上的,没有对应起来就不会映射。
涉及两张表的操作:套餐表和菜品表;
/*** 新增套餐* 涉及两张表的操作:套餐表和菜品表;* @param setmealDto* @return*/@PostMappingpublic R<String> save(@RequestBody SetmealDto setmealDto){setmealService.saveWithDish(setmealDto);return R.success("新增套餐成功");}
SetmealService中添加自定义的方法:
/*** 新增套餐,同时需要保存套餐和菜品的关联关系* @param setmealDto*/void saveWithDish(SetmealDto setmealDto);
package com.learn.reggie.service.impl;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.mon.CustomException;import com.learn.reggie.dto.SetmealDto;import com.learn.reggie.entity.Setmeal;import com.learn.reggie.entity.SetmealDish;import com.learn.reggie.mapper.SetmealMapper;import com.learn.reggie.service.SetmealDishService;import com.learn.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;/*** @author 咕咕猫* @version 1.0*/@Service@Slf4jpublic class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {@Autowiredprivate SetmealDishService setmealDishService;/*** 新增套餐,同时需要保存套餐和菜品的关联关系* @param setmealDto*/@Transactionalpublic void saveWithDish(SetmealDto setmealDto) {//保存套餐的基本信息,操作setmeal,执行insert操作this.save(setmealDto);//保存套餐和菜品的关联信息,操作setmeal_dish,执行insert操作List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();//注意上面拿到的setmealDishes是没有setmeanlId这个的值的,通过debug可以发现setmealDishes.stream().map((item) -> {item.setSetmealId(setmealDto.getId());return item; //这里返回的就是集合的泛型}).collect(Collectors.toList());setmealDishService.saveBatch(setmealDishes); //批量保存}
二、套餐信息分页查询
2.1 需求分析
2.2 代码开发
前端发起的请求以及携带的参数:
查询分页:
controller层代码编写:
/*** 套餐分页查询* @param page* @param pageSize* @param name* @return*/@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);//分类idLong 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);}
三、删除套餐
3.1 需求分析
3.2 代码开发
单个套餐删除前端发的请求和携带的参数:
套餐批量删除前端发的请求和携带的参数:
controller层开发
在SetmealService中添加自定义的方法:
/*** 删除套餐,同时需要删除套餐和菜品的关联数据* @param ids*/void removeWithDish(List<Long> ids);
实现该方法:
/*** 删除套餐,同时需要删除套餐和菜品的关联数据* @param ids*/@Transactionalpublic 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);queryWrapper.eq(Setmeal::getStatus,1);int count = this.count(queryWrapper);if (count > 0) {//如果不能删除,抛出一个业务异常throw new CustomException("套餐正在售卖中,不能删除");}//如果可以删除,先删除套餐表中的数据——setmealthis.removeByIds(ids);//delete from setmeal_dish where setmeal_id in (1,2,3)LambdaQueryWrapper<SetmealDish> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.in(SetmealDish::getSetmealId,ids);//删除关系表中的数据——setmeal_dishsetmealDishService.remove(lambdaQueryWrapper);}
如果觉得《瑞吉外卖(5)—套餐管理业务开发》对你有帮助,请点赞、收藏,并留下你的观点哦!