首先看下对应的前端代码(index.html)
//菜单中减少选中的商品
async subtractCart(item){
let params = {
dishId:item.id,
}
if(!Array.isArray(item.flavors)){
params = {
setmealId:item.id,
}
}
const res = await updateCartApi(params)
if(res.code === 1){
this.dishList.forEach(dish=>{
if(dish.id === item.id){
dish.number = (res.data.number === 0 ? undefined : res.data.number)
}
})
if(this.setMealDialog.show){
item.number = (res.data.number === 0 ? undefined : res.data.number)
}
this.getCartData()
}else{
this.$notify({ type:'warning', message:res.msg});
}
},
对应的ajax请求为
//购物车中修改商品
function updateCartApi(data){
return $axios({
'url': '/shoppingCart/sub',
'method': 'post',
data
})
}
通过前端可以看到在前端提交数据后,发送的资源路径为"/sub",同时要减一的为菜品时,套餐的setmealId为null,反之dishId为null。而前端发送ajax请求后,通过this.getCartData()会自动显示更新后的购物车数据,因此后端只需要返回修改成功的标识字符串即可。
当该菜品(套餐)的数目(number)大于1时,通过将number属性减一后对表进行更新即可,否则说明数目为1,直接将该菜品(套餐)从表中删除,对应的后端代码为
@PostMapping("/sub")
public R<String> sub(@RequestBody ShoppingCart shoppingCart){
//设置用户id
shoppingCart.setUserId(BaseContext.getCurrentId());
Long dishId = shoppingCart.getDishId();
LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ShoppingCart::getUserId,shoppingCart.getUserId());
if(dishId != null ){ //删除的是菜品
queryWrapper.eq(ShoppingCart::getDishId,dishId);
ShoppingCart cartOne = shoppingCartService.getOne(queryWrapper);
int number = cartOne.getNumber();
if(number > 1){
cartOne.setNumber(number-1);
shoppingCartService.updateById(cartOne);
}else{
//只有一份,直接删除
shoppingCartService.removeById(cartOne.getId());
}
return R.success("删除菜品成功");
}else{ //删除的是套餐
queryWrapper.eq(ShoppingCart::getSetmealId,shoppingCart.getSetmealId());
ShoppingCart cartOne = shoppingCartService.getOne(queryWrapper);
int number = cartOne.getNumber();
if(number > 1){
cartOne.setNumber(number-1);
shoppingCartService.updateById(cartOne);
}else{
//只有一份,直接删除
shoppingCartService.removeById(cartOne.getId());
}
return R.success("删除套餐成功");
}
}