苍穹外卖 添加购物车接口

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);
相关推荐
Asthenia04125 分钟前
理解词法分析与LEX:编译器的守门人
后端
uhakadotcom6 分钟前
视频直播与视频点播:基础知识与应用场景
后端·面试·架构
Asthenia04121 小时前
Spring扩展点与工具类获取容器Bean-基于ApplicationContextAware实现非IOC容器中调用IOC的Bean
后端
bobz9651 小时前
ovs patch port 对比 veth pair
后端
Asthenia04122 小时前
Java受检异常与非受检异常分析
后端
uhakadotcom2 小时前
快速开始使用 n8n
后端·面试·github
JavaGuide2 小时前
公司来的新人用字符串存储日期,被组长怒怼了...
后端·mysql
bobz9652 小时前
qemu 网络使用基础
后端
Asthenia04123 小时前
面试攻略:如何应对 Spring 启动流程的层层追问
后端
Asthenia04123 小时前
Spring 启动流程:比喻表达
后端