

对于菜品来说有两种情况,第一种情况如果这个菜品它没有设置口味数据,它会展示一个加号我们点击这个加号就可以把这个菜品添加到购物车里面去,第二种情况如果这个菜品我们设置了口味数据,那它就会展示选择规格的按钮,我们需要点击这个按钮,在弹出来的窗口里面选择相应的口味,然后再去点击加入购物车按钮,这样就可以把这个菜品添加到购物车里面去。如果菜品已经加入了购物车,我们在购物车里面点击加号,快速来添加一个相同的商品到购物车当中,对于同一个商品来说没有必要展示成两行,那么我们点击这个加号后直接把商品的数量加一就可以了。


要将商品添加到购物车,具体添加的是哪个商品呢?这就需要前端给我们传过来,我们这个商品就是菜品和套餐,所以说它需要把菜品id或者套餐id传过来,对于菜品来说可能还有口味数据,所以请求参数有三个分别是套餐id、菜品id、口味。这三个参数都不是必填的,对于某一次添加购物车来说,要么我们添加的是菜品,要么我们添加的是套餐,不可能同时一次添加的又是菜品又是套餐。对于某一次添加购物车这个业务来说,菜品id和套餐id必须提交一个过来,这里我们使用JSON格式数据,通过请求体给我们提交过来。


购物车的作用就是来用暂时存放我们所选商品的一个地方,我们设计了一张购物车表用来体现具体购物车的作用。选的是那些商品,这就需要有商品的id字段,我们的商品分成了两种,一个是菜品,一个是套餐,为了更清晰我们设计了两个字段,一个菜品id,一个是套餐id。对于菜品这种情况,有可能有口味数据,所以我们设计了一个口味字段,每个商品买几个,这就要设计一个商品的数量字段。不同的用户需要有自己的购物车,我们需要设计一个用户id来标识当前购物车是哪个用户的。
name、image、amount这三个字段比较特殊,这三个字段其实并不是必须的,因为我们可以通过dish_id或者setmeal_id就可以查出我们相应的这个商品的名称、图片路径、商品的单价,这个时候这三个字段成为冗余字段。冗余字段指的是反复出现的重复的字段,比如在菜品表当中已经有了菜品的名称、图片路径、菜品的价格,在我们这个购物车表当中它又出现 了一遍,所以说它们就是冗余字段。我们设计这些冗余字段就可以提高我们的查询速度,我们在购物车里面要展示商品的名称、图片、价格,如果没有这些冗余字段,我们在查询数据的时候,除了要查询购物车表还需要联合去查询菜品表或者是套餐表,相当于两张表的连接查询,有了冗余字段之后就变成了单表查询,直接查询购物车表就可以了,所以它的查询速度会快很多。
注意:冗余字段不能大量使用,而且这些冗余字段相对来说应该是比较稳定不能经常变化的,比如说我们这里的商品名称、图片、价格比较稳定并不是经常变化。



如果是相同的商品只需要把它的数量加一,比如说原先这个商品就已经在购物车里,那现在直接把这条数据它的number字段加一就可以了,这样我们实际上执行的是一个update数据库操作。如果商品不在购物车里面,我们就需要执行一个insert操作插入一条数据。
总结:当我们添加购物车的时候首先来判断一下我们当前添加到购物车的商品,它是否在购物车当中已经存在。如果已经存在,我们只需要执行一个update修改操作,把商品的数量加一就可以了。如果不存在,这个时候我们就需要执行insert操作来插入一条数据。不同的用户需要有自己的购物车,这就需要购物车表的user_id字段去体现,也就是说我们在查询购物车当中的商品的时候,我们需要把用户id作为条件去查询。
1.判断当前加入到购物车中的商品是否已经存在了。
根据用户id和套餐id去查询当前套餐是否在购物车当中存在。
select * from shopping_cart where user_id = ? and setmeal_id = ?
根据用户id和菜品id去查询当前套餐是否在购物车当中存在。
如果菜品有口味数据也需要把口味作为查询条件传进去,因为对于同一个菜品来说,它如果口味不一样,在购物车里面,它其实也是不同的两条数据。
select * from shopping_cart where user_id = ? and dish_id = ? and dish_flavor = ?
这两条SQL语句我们使用动态SQL,也就是说我们只要写一条SQL,然后通过mybatis的这个动态SQL动态去拼这个条件就可以了。
2.如果已经存在了,只需要将数量加一。
对于相同的商品我们去修改它的数量就可以了,不会说重新再去插入一条数据。按照当前条件去查询的话,只有两种结果,一种是查不到,另一种是查到之后只有一条数据。
3.如果不存在,需要插入一条购物车数据。
如果提交过来的是套餐,则需要去套餐表里面查套餐的名称、价格、图片路径,如果提交过来的是菜品,则需要到菜品表里面去查菜品的名称、价格、图片路径。所以我们在插入数据前需要去判断提交过来的是菜品还是套餐,这样才能知道具体去查菜品表还是套餐表。

java
/**
* 添加购物车
* @param shoppingCartDTO
*/
public void addShoppingCart(ShoppingCartDTO shoppingCartDTO) {
//判断当前加入到购物车中的商品是否已经存在了
ShoppingCart shoppingCart = new ShoppingCart();
BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);
Long userId = BaseContext.getCurrentId();
shoppingCart.setUserId(userId);
List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);
//如果已经存在了,只需要将数量加一
if(list != null && list.size()> 0){
ShoppingCart cart = list.get(0);
cart.setNumber(cart.getNumber()+1);//update shopping_cart set number = ? where id = ?
shoppingCartMapper.updateNumberById(cart);
}else {
//如果不存在,需要插入一条购物车数据
//判断本次添加到购物车的是菜品还是套餐
Long dishId = shoppingCartDTO.getDishId();
if(dishId != null){
//本次添加到购物车的是菜品
Dish dish = dishMapper.getById(dishId);
shoppingCart.setName(dish.getName());
shoppingCart.setImage(dish.getImage());
shoppingCart.setAmount(dish.getPrice());
}else {
//本次添加购物车的是套餐
Long setmealId = shoppingCartDTO.getSetmealId();
Setmeal setmeal = setmealMapper.getById(setmealId);
shoppingCart.setName(setmeal.getName());
shoppingCart.setImage(setmeal.getImage());
shoppingCart.setAmount(setmeal.getPrice());
}
shoppingCart.setNumber(1);
shoppingCart.setCreateTime(LocalDateTime.now());
shoppingCartMapper.insert(shoppingCart);
}



java
/**
* 插入购物车数据
* @param shoppingCart
*/
@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);
·测试










