苍穹外卖 添加购物车接口

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);
相关推荐
gwf21632 分钟前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
码智社33 分钟前
Java实现RSA密钥生成、加密解密、加签验签
java
MemoleCard35 分钟前
深度解析Java当中的锁机制
后端
AAA@峥36 分钟前
CentOS7 源码编译安装 MySQL5.7|SQL 基础操作 + 备份恢复完整实战
运维·数据库·sql·centos
xixingzhe238 分钟前
spring ai简单使用skills
数据库·人工智能·spring
wear工程师42 分钟前
ThreadLocal 在线程池里为什么会串数据:别只会答内存泄漏
java·后端
Iruoyaoxh42 分钟前
栈和队列~
java·开发语言
审小匠OpenCPAi1 小时前
银行流水核查怎么自动化?单边匹配、双向勾稽与图聚类异常检测的工程对比
java·前端·人工智能·python·审计
码上上班1 小时前
docker课程
java·docker·容器
腻害兔1 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:CRM 客户关系模块深度解析——从线索到回款,一套完整的 B2B 销售闭环是怎么搭的?
java·前端·javascript·vue.js·产品经理·ai编程