目录
菜品启售和停售
菜品批量启售和批量停售
菜品的批量删除
套餐管理的启售,停售
套餐管理的修改
手机端减少购物车中的菜品或者套餐数量(前端展示有一点小问题)
用户查看自己订单
这个是自己基于学习B站 黑马瑞吉外卖项目,补充一些视频里面没有定义的功能或者是需要自己实现的功能;仅供学习参考,本人可能代码不太规范,但是功能自己测试是没有问题的;
黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis plus开发核心技术的真java实战项目_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV13a411q753?spm_id_from=333.337.search-card.all.click
菜品启售和停售
前端发过来的请求(使用的是post方式):http://localhost:8080/dish/status/1?ids=1516568538387079169
后端接受的请求:
@PostMapping("/status/{status}")
public R status(@PathVariable("status") Integer status,Long ids){
log.info("status:{}",status);
log.info("ids:{}",ids);
return null;
}
先看看后端能不能接收到前端传过来的数据:
发现可以接收到前端参数后,开始补全controller层代码:在DishController中添加下面的接口代码;
@PostMapping("/status/{status}")
public R status(@PathVariable("status") Integer status,Long ids){
log.info("status:{}",status);
log.info("ids:{}",ids);
Dish dish = dishService.getById(ids);
if (dish != null){
dish.setStatus(status);
dishService.updateById(dish);
return R.success("开始启售");
}
return R.error("售卖状态设置异常");
}
菜品批量启售和批量停售
把上面对单个菜品的售卖状态的方法进行修改;
@PostMapping("/status/{status}")
//这个参数这里一定记得加注解才能获取到参数,否则这里非常容易出问题
public R status(@PathVariable("status") Integer status,@RequestParam List ids){
//log.info("status:{}",status);
//log.info("ids:{}",ids);
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper();
queryWrapper.in(ids !=null,Dish::getId,ids);
//根据数据进行批量查询
List list = dishService.list(queryWrapper);
for (Dish dish : list) {
if (dish != null){
dish.setStatus(status);
dishService.updateById(dish);
}
}
return R.success("售卖状态修改成功");
}
注意:controller层的代码是不可以直接写业务的,建议把它抽离到service层,controller调用一下service的方法就行;下面的批量删除功能是抽离的,controller没有写业务代码;
菜品的批量删除
前端发来的请求:
在DishController中添加接口:
@DeleteMapping public Rdelete(@RequestParam("ids") List ids){ dishService.deleteByIds(ids); return R.success("菜品删除成功"); }
DishServicez中添加相关的方法:
//根据传过来的id批量或者是单个的删除菜品 void deleteByIds(Listids);
在实现类实现该方法:
@Override @Transactional public void deleteByIds(Listids) { //构造条件查询器 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); //先查询该菜品是否在售卖,如果是则抛出业务异常 queryWrapper.in(ids!=null,Dish::getId,ids); List list = this.list(queryWrapper); for (Dish dish : list) { Integer status = dish.getStatus(); //如果不是在售卖,则可以删除 if (status == 0){ this.removeById(dish.getId()); }else { //此时应该回滚,因为可能前面的删除了,但是后面的是正在售卖 throw new CustomException("删除菜品中有正在售卖菜品,无法全部删除"); } } }
功能测试:单个删除,批量删除,批量删除中有启售的...
测试成功!
套餐管理的启售,停售
前端发来的请求:
根据前面菜品模块自己实现的功能,我们可以知道,我们只需要写一个批量处理的方法就可以完成单个或者是批量套餐的启售,停售;
SetmealController中的controller层代码:
@PostMapping("/status/{status}")
//这个参数这里一定记得加注解才能获取到参数,否则这里非常容易出问题
public R status(@PathVariable("status") Integer status,@RequestParam List ids){
setmealService.updateSetmealStatusById(status,ids);
return R.success("售卖状态修改成功");
}
SetmealService中添加下面方法:
void updateSetmealStatusById(Integer status,Listids);
该方法的实现:
@Override public void updateSetmealStatusById(Integer status, Listids) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); queryWrapper.in(ids !=null,Setmeal::getId,ids); List list = this.list(queryWrapper); for (Setmeal setmeal : list) { if (setmeal != null){ setmeal.setStatus(status); this.updateById(setmeal); } } }
记得功能测试,我自己测试的时候是没有问题的;
套餐管理的修改
分为两步:数据回显示,和提交修改数据到数据库
前端点击套餐修改,前端发过来的请求:
请求方式是:get
携带的参数是:stemealId
然后我们发现在弹出编辑窗口是没有数据的:并且报了一个404,那就是说是**在数据回显的时候报错了**,没有找到具体的回显接口来处理这个请求;
SetmealController 中添加下面的代码:
@GetMapping("/{id}")
public R getData(@PathVariable Long id){
SetmealDto setmealDto = setmealService.getDate(id);
return R.success(setmealDto);
}
SetmealService添加下面的代码:
SetmealDto getDate(Long id);
该方法的实现:
@Override
public SetmealDto getDate(Long id) {
Setmeal setmeal = this.getById(id);
SetmealDto setmealDto = new SetmealDto();
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper();
//在关联表中查询,setmealdish
queryWrapper.eq(id!=null,SetmealDish::getSetmealId,id);
if (setmeal != null){
BeanUtils.copyProperties(setmeal,setmealDto);
List list = setmealDishService.list(queryWrapper);
setmealDto.setSetmealDishes(list);
return setmealDto;
}
return null;
}
测试:数据回显成功:
修改完成后,点击保存,我们发现前端发出一个put请求:
携带的参数为:
根据前端传过来的数据和需要的返回值,我们就可以知道controller层方法的返回值和用什么参数来接收前端传给我们的数据;
controller层代码:
@PutMapping public Redit(@RequestBody SetmealDto setmealDto){ setmealService.updateById(setmealDto); return R.success("套餐修改成功"); }
手机端减少购物车中的菜品或者套餐数量(前端展示有一点小问题)
前端请求: http://localhost:8080/shoppingCart/sub
请求方式:post
携带参数可能是dish_id 也可能是 setmealId,所以我们需要实体类shoppingCart来接收;
遇到的bug: 就是购物车里面的菜品和套餐的数量可能会减少至负数!!!所以这里要判断和需要前端处理;
而且不知道为什么。。。。上面的数量已经为0了,但是下面的加减还是可以变话的就导致了数据库中的数据可以为负数。。。前端的问题,,,暂时使用一个简单的做法解决。。。把数据库的该字段设置为无符号字段,所以当num数小于0的时候就会报错(500接口异常),但是左下角的小购物车还是会显示菜品为0
在ShoppingCartController中添加下面的接口方法来接收请求:
@PostMapping("/sub")
@Transactional
public R sub(@RequestBody ShoppingCart shoppingCart){
Long dishId = shoppingCart.getDishId();
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
//代表数量减少的是菜品数量
if (dishId != null){
//通过dishId查出购物车对象
queryWrapper.eq(ShoppingCart::getDishId,dishId);
ShoppingCart cart1 = shoppingCartService.getOne(queryWrapper);
cart1.setNumber(cart1.getNumber()-1);
//对数据进行更新操作
shoppingCartService.updateById(cart1);
return R.success(cart1);
}
Long setmealId = shoppingCart.getSetmealId();
if (setmealId != null){
//代表是套餐数量减少
queryWrapper.eq(ShoppingCart::getSetmealId,setmealId);
ShoppingCart cart2 = shoppingCartService.getOne(queryWrapper);
cart2.setNumber(cart2.getNumber()-1);
//对数据进行更新操作
shoppingCartService.updateById(cart2);
return R.success(cart2);
}
return R.error("操作异常");
}
用户查看自己订单
在OrderController中添加下面的方法;
@GetMapping("/userPage")
public R page(int page, int pageSize){
//分页构造器对象
Page pageInfo = new Page<>(page,pageSize);
//构造条件查询对象
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
//添加排序条件,根据更新时间降序排列
queryWrapper.orderByDesc(Orders::getOrderTime);
orderService.page(pageInfo,queryWrapper);
return R.success(pageInfo);
}



