苍穹外卖 添加购物车接口

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);
相关推荐
西红柿计算机毕设3 分钟前
基于安卓Android的健康饮食系统APP(源码+文档+部署+讲解)
大数据·数据库·vue.js·spring boot·python·android-studio
很楠不爱7 分钟前
Qt——信号和槽
服务器·数据库·qt
BLOB_1010018 分钟前
【折腾一上午】Java POI 导出 Excel 自适应列宽行高
java·excel
布值倒区什么name18 分钟前
日常记录,使用springboot,vue2,easyexcel使实现字段的匹配导入
java·spring boot·后端
single59422 分钟前
【综合算法学习】(第十篇)
java·数据结构·c++·vscode·学习·算法·leetcode
wclass-zhengge24 分钟前
SpringBoot篇(自动装配原理)
java·spring boot·后端
程序小增28 分钟前
springboot+iotdb的应用
spring boot·后端·iotdb
engchina30 分钟前
Oracle SQL Developer 同时打开多个table的设置
数据库·sql·oracle
Withered@31 分钟前
Spring Boot面试题
spring boot·后端·spring
哎呦没32 分钟前
中小企业设备管理效率提升:Spring Boot系统设计
java·spring boot·后端