苍穹外卖 添加购物车接口

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);
相关推荐
魔道不误砍柴功2 分钟前
实际开发中的协变与逆变案例:数据处理流水线
java·开发语言
无敌岩雀5 分钟前
MySQL中的索引
数据库·mysql
Rverdoser22 分钟前
RabbitMQ的基本概念和入门
开发语言·后端·ruby
dj244294570725 分钟前
JAVA中的Lamda表达式
java·开发语言
a_安徒生27 分钟前
linux安装TDengine
linux·数据库·tdengine
攻心的子乐28 分钟前
shell脚本启动springboot项目
spring boot
程序员学习随笔30 分钟前
PostgreSQL技术内幕19:逻辑备份工具pg_dump、pg_dumpall
数据库·postgresql
工业3D_大熊39 分钟前
3D可视化引擎HOOPS Luminate场景图详解:形状的创建、销毁与管理
java·c++·3d·docker·c#·制造·数据可视化
szc176742 分钟前
docker 相关命令
java·docker·jenkins
程序媛-徐师姐1 小时前
Java 基于SpringBoot+vue框架的老年医疗保健网站
java·vue.js·spring boot·老年医疗保健·老年 医疗保健