【外卖系统】day05
套餐管理
Target1:新增套餐


1.2已经在之前的controller中编写完毕,从第3点开始写
根据传入的菜品id,封装成对象dish(提高可拓展性), 然后进行条件查询(注意当菜品状态为1时才满足要求)
@GetMapping("/list")
public R<List<Dish>> getDish(Dish dish){
//条件构造器
QueryWrapper<Dish> wrapper = new QueryWrapper<>();
wrapper.eq(dish.getCategoryId() != null,"category_id",dish.getCategoryId());
//状态为起售状态:1
wrapper.eq("status",1);
//排序
wrapper.orderByAsc("sort").orderByDesc("update_time");
List<Dish> list = dishService.list(wrapper);
return R.success(list);
}
编写service方法来保存套餐和菜品信息
@Autowired
private SetmealDishService setmealDishService;
/**
* 保存套餐和对应菜品的关系表
* @param setmealDto
*/
@Override
public void saveWithDish(SetmealDto setmealDto) {
//保存套餐信息
this.save(setmealDto);
//标注对应套餐id
List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
for (SetmealDish setmealDish : setmealDishes) {
setmealDish.setSetmealId(setmealDto.getId());
}
//保存套餐对应菜品的信息
setmealDishService.saveBatch(setmealDishes);
}
Target2:套餐信息查询

/**
* 套餐分页查询
* @param page
* @param pageSize
* @param name
* @return
*/
@GetMapping("/page")
public R<Page> page(@Param("page") int page,
@Param("pageSize") int pageSize,
@Param("name") String name
){
//构造分页查询器
Page<Setmeal> pageinfo = new Page<>(page,pageSize);
Page<SetmealDto> dtoPage = new Page<>();
//构造条件查询器
QueryWrapper<Setmeal> wrapper = new QueryWrapper<>();
wrapper.like(StringUtils.isNotEmpty(name),"name",name);
wrapper.orderByDesc("update_time");
setmealService.page(pageinfo,wrapper);
//对象拷贝,除了records
BeanUtils.copyProperties(pageinfo,dtoPage,"records");
//得到setmeal的records
List<Setmeal> SetmealList = pageinfo.getRecords();
//创建一个dto的records对象
List<SetmealDto> dtoRecords = new ArrayList<>();
//遍历
for (Setmeal setmeal : SetmealList) {
SetmealDto setmealDto = new SetmealDto();
//得到分类id
Long categoryId = setmeal.getCategoryId();
//查询分类id得到菜品
Category category = categoryService.getById(categoryId);
//将Dto菜品名幅值
setmealDto.setCategoryName(category.getName());
//将其他属性拷贝
BeanUtils.copyProperties(setmeal,setmealDto);
//添加
dtoRecords.add(setmealDto);
}
dtoPage.setRecords(dtoRecords);
return R.success(dtoPage);
}
Target3:删除套餐

编写删除对应套餐和菜品的方法,
注意:若套餐再售卖中,则抛出异常不能删除
@Transactional
@Override
public void removeWihtDish(List<Long> ids) {
//查询套餐信息,判断是否可以删除,起售中不可删除
QueryWrapper<Setmeal> setmealWrapper = new QueryWrapper<>();
setmealWrapper.in("id",ids);
setmealWrapper.eq("status",1);
//查询是否有满足条件的
int count = this.count(setmealWrapper);
if(count > 0){
throw new CustomException("菜品正在售卖,请停售再删除");
}
//删除套餐
this.removeByIds(ids);
QueryWrapper<SetmealDish> setmealDishQueryWrapper = new QueryWrapper<>();
setmealDishQueryWrapper.in("setmeal_id",ids);
//删除对应套餐的菜品
setmealDishService.remove(setmealDishQueryWrapper);
}
注意sql in的用法
手机验证码登录


首先在loginCheckFilter中设置移动端页面过滤条件,使移动端页面可以放行
@Autowired
private UserService userService;
@PostMapping("/login")
public R<User> login(@RequestBody Map map, HttpServletRequest request){
/*
* 正常手机获取验证码登录逻辑:
* 1.手机点击获取验证码,会发送ajax请求到服务端
* 2.服务端接收到请求后,通过调用api生成验证码并保存到session,同时使用阿里云服务发送到我们手机上
* 3.用户输入验证码之后,点击登录发送第二次ajax请求
* 4.服务端首先先判断输入的验证码与Session中保存的验证码是否相同,若相同,
* 5.继续判断手机号,若手机号对应的用户不存在,则新建用户
* 6.返回
* */
//没有验证码,因此只判断手机号
String phone = (String)map.get("phone");
//创建条件构造器
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("phone",phone);
//查询
User user = userService.getOne(wrapper);
//用户不存在新建用户
if(user == null){
user = new User();
user.setPhone(phone);
user.setStatus(1);
userService.save(user);
}
request.getSession().setAttribute("user",user.getId());
return R.success(user);
}
浙公网安备 33010602011771号