苍穹外卖 添加购物车接口

ShoppingCartController

java 复制代码
// 购物车逻辑

// 用户可以将菜品或者套餐添加到购物车中,于菜品而言,若设置了口味信息,那么必须要选择口味后才可以加入购物车;对套餐来说,就可以直接
// 加入购物车;并且在购物车中可以修改菜品或套餐的数量,还可以一键清空购物车

// 购物车实现
// 购物车是基于数据库表实现的:用户的购物车数据需要保存到数据库中,数据库中要存储商品的信息和用户的信息,来确保购物车对于用户而言的唯一性

// 实现细节:
// 1.购物车是关联用户的,所以说在购物车表中需要记录对应的用户信息
// 2.用户可以选择套餐或者菜品;但是一次添加只存在一种可能性,套餐和菜品只能二选一
// 3.对于同一份菜品,若添加了多份,无需添加多条记录,只需要增加数量即可
@RestController
@RequestMapping("/user/shoppingCart")
@Slf4j
@Api(tags = "用户端购物车接口")
public class ShoppingCartController {

    @Autowired
    private ShoppingCartService shoppingCartService;

    /**
     * 添加购物车
     *
     * @param shoppingCartDTO
     * @return
     */
    @PostMapping("/add")
    @ApiOperation("添加购物车")
    public Result add(@RequestBody ShoppingCartDTO shoppingCartDTO) {
        log.info("添加购物车......");
        shoppingCartService.addShoppingCart(shoppingCartDTO);
        return Result.success();
    }

ShoppingCartService

java 复制代码
/**
     * 添加购物车
     *
     * @param shoppingCartDTO
     */
    void addShoppingCart(ShoppingCartDTO shoppingCartDTO);
java 复制代码
/**
     * 添加购物车
     *
     * @param shoppingCartDTO
     */
    @Override
    public void addShoppingCart(ShoppingCartDTO shoppingCartDTO) {
        // 将ShoppingCartDTO对象封装为对应的ShoppingCart对象
        // ShoppingCartDTO将传递这次添加购物车请求的内容(是套餐还是菜品;如果是菜品还会再传递一个菜品的口味信息)
        ShoppingCart shoppingCart = new ShoppingCart();
        BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);
        // 因为每个用户都有一个自己的购物车,所以说需要给当前购物车设置为当前用户的id
        shoppingCart.setUserId(BaseContext.getCurrentId());
        // 判断当前要添加到购物车中的商品是否已经在购物车中了
        // 这里是根据这次请求添加的内容,查看购物车表中是否已经存在了当前请求添加的内容
        List<ShoppingCart> shoppingCartList = shoppingCartMapper.list(shoppingCart);
        if (shoppingCartList != null && !shoppingCartList.isEmpty()) {
            // 当这个集合不为空时,则说明当前想要添加的菜品或者套餐已经在该用户的购物车中存在,直接数量加1即可
            shoppingCart = shoppingCartList.get(0);
            shoppingCart.setNumber(shoppingCart.getNumber() + 1);
            shoppingCartMapper.updateNumberById(shoppingCart);
        } else {
            // 如果不存在,那么直接在购物车中插入,先插入1个

            // 判断当前添加到购物车中的是菜品还是套餐
            // 因为加入到购物车中的只能是菜品或者套餐,并且一般而言是菜品的概率更大,所以说可以先假定添加的是菜品
            // 然后获取到菜品的id,如果添加的不是菜品,那么菜品id就会是null,就证明是添加的是套餐

            // 先假定添加的是菜品,获取菜品的id
            Long dishId = shoppingCartDTO.getDishId();
            if (dishId != null) {
                // 若菜品id不是null,那么这次添加一定是菜品

                // 根据id查询这个菜品
                Dish dish = dishMapper.getById(dishId);
                shoppingCart.setName(dish.getName());
                shoppingCart.setImage(dish.getImage());
                shoppingCart.setAmount(dish.getPrice());
            } else {
                // 若菜品id是null,那么这次添加一定是套餐
                Setmeal setmeal = setMealMapper.getById(shoppingCartDTO.getSetmealId());
                shoppingCart.setName(setmeal.getName());
                shoppingCart.setImage(setmeal.getImage());
                shoppingCart.setAmount(setmeal.getPrice());
            }

            // 不论是套餐还是菜品,都需要补充以下属性
            // 设置添加的量,每次都只能添加一个
            shoppingCart.setNumber(1);
            // 设置添加时间
            shoppingCart.setCreateTime(LocalDateTime.now());
            shoppingCartMapper.insert(shoppingCart);
        }
    }

    /**
     * 查看购物车内容
     *
     * @return
     */
    @Override
    public List<ShoppingCart> showShoppingCart() {
        // 这个请求只需要根据用户id返回当前用户的购物车,所以说只需要一个根据用户id的简单查询,封装用户id就好
        ShoppingCart shoppingCart = ShoppingCart.builder()
                .userId(BaseContext.getCurrentId())
                .build();
        // 根据用户id查询对应用户的购物车
        return shoppingCartMapper.list(shoppingCart);
    }

ShoppingCartMapper

java 复制代码
 /**
     * 添加购物车数据
     *
     * @param shoppingCart
     */
    // 因为要添加到购物车中的商品都在Service层中被封装完整了的,所以说无需动态SQL,只需要使用@Insert注解即可
    @Insert("insert into shopping_cart (name, user_id, dish_id, setmeal_id, dish_flavor, number, amount, image, create_time) " +
            "values (#{name}, #{userId}, #{dishId}, #{setmealId}, #{dishFlavor}, #{number}, #{amount}, #{image}, #{createTime})")
    void insert(ShoppingCart shoppingCart);
相关推荐
coderSong256828 分钟前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
远方16091 小时前
14-Oracle 23ai Vector Search 向量索引和混合索引-实操
数据库·ai·oracle
Mr_Air_Boy1 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
豆沙沙包?2 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
GUIQU.2 小时前
【Oracle】数据仓库
数据库·oracle
年老体衰按不动键盘2 小时前
快速部署和启动Vue3项目
java·javascript·vue
恰薯条的屑海鸥2 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
数据库·学习·安全·web安全·渗透测试·网络安全学习
咖啡啡不加糖2 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
liuyang-neu2 小时前
java内存模型JMM
java·开发语言
曼汐 .2 小时前
数据库管理与高可用-MySQL高可用
数据库·mysql