瑞吉外卖-购物车sub方法解决方案

该代码段展示了一个处理购物车中商品或套餐数量减少的逻辑。当用户点击减号时,系统首先检查商品是否存在,如果存在则更新数量,若数量为1则删除该条目。此过程涉及到数据库查询、条件判断和更新操作,确保购物车状态与前端显示一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决了购物车清空,但是页面没恢复的情况(仅供参考)

在这里插入图片描述
在这里插入图片描述

@PostMapping("/sub")
    public R<ShoppingCart> sub(@RequestBody ShoppingCart shoppingCart){
        //设置用户id,指定当前是哪个用户的购物车数据
        Long currentId = BaseContext.getCurrentId();
        shoppingCart.setUserId(currentId);
        Long dishId = shoppingCart.getDishId();
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId,currentId);
        if(dishId != null){
            //添加到购物车的是菜品
            queryWrapper.eq(ShoppingCart::getDishId,dishId);
        }else{
            //添加到购物车的是套餐
            queryWrapper.eq(ShoppingCart::getSetmealId,shoppingCart.getSetmealId());
        }
        ShoppingCart cartServiceOne1 = shoppingCartService.getOne(queryWrapper);
        //这一大堆我直接抄的上面的懒得写了可优化主要看下面
        
            //如果已经存在,就在原来数量基础上加一
            //先获取number的数据
            Integer number = cartServiceOne1.getNumber();
        if (number!=1){//如果不等于1 比如等于2345 就正常减1
            cartServiceOne1.setNumber(number - 1);
            shoppingCartService.updateById(cartServiceOne1);
        }else {//如果等于1 点击了减号先设为0在删除 因为前端代码是根据number的值显示“加减”还是“选择规格“ 又兴趣的可以看前端代码174行那几行
            Long id = cartServiceOne1.getId();
            cartServiceOne1.setNumber(0);//这句很关键 删除前先把number设为0 前端根据这个判断显示
            shoppingCartService.removeById(id);
        }
        return R.success(cartServiceOne1);
    }
### 外卖移动端购物车实现方案 #### 处理菜品/套餐减少逻辑 为了防止菜品数量变为负数以及订单总金额异常,在处理菜品减少操作时应加入条件判断: 当用户尝试减少菜品数量时,需先验证该菜品当前数量是否大于零。只有在满足此条件下才允许执行减法运算,并更新数据库记录[^1]。 ```java if (item.getNumber() > 0) { item.setNumber(item.getNumber() - 1); } ``` 一旦某个菜品的数量被设置为`0`,则应当将其完全从购物车内移除而不是简单地保留条目并置其数量为零。这可以通过删除对应的数据行来完成。 #### 总价计算优化 考虑到并发环境下的准确性问题,建议采用`BigDecimal`代替基本数值类型来进行价格累加操作。这样不仅可以提高精度还能确保多线程场景下数据的一致性和安全性[^4]。 ```java // 初始化总价变量 BigDecimal totalAmount = BigDecimal.ZERO; for (CartItem item : cartItems) { // 对每项商品的价格乘以其购买量得到单项小计 BigDecimal subTotal = item.getPrice().multiply(BigDecimal.valueOf(item.getNumber())); // 更新总价 totalAmount = totalAmount.add(subTotal); } orders.setAmount(totalAmount); ``` #### 清空购物车与恢复历史订单 对于“再来一单”的需求,则涉及到两个主要动作:一是清除现有购物车内容;二是依据指定的历史订单重建新的购物清单[^3]。 - **清空购物车**:通过SQL语句批量删除属于特定用户的全部购物车记录。 - **加载旧订单详情**:根据给定的订单ID查询关联的商品列表,并逐个添加至新创建的购物会话中去。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值