购物车最常见的实现方式就是使用redis缓存来实现,他可以持久化防止重启丢失,而如果数据库存储会造成性能比较慢
实现方式使用redis中的hash结构实现,仔细研究会发现购物车是一个双重map结构 Map<String,Map<String,String>>
第一层Map,Key是用户id
第二层Map,Key是购物车中商品id,值是购物车数据
实现代码
注意里面的逻辑
首先你需要传一个视频id和购买数量,比如你买一个商品,是不是这个商品编号及购买数量
其次就要获取这个购物车,因为这个通用就把他封装成一个方法
其他的逻辑看代码介绍
@RestController
@RequestMapping("api/v1/cart")
public class CartController {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private VideoDao videoDao;
@GetMapping("add")
public JsonData addCart(int videoId,int buyNum){
//获取购物车
BoundHashOperations<String, Object, Object> myCart = getMyCartOps();
Object cacheObj = myCart.get(videoId+"");
String result = "";
//判断购物车是否为空
if (cacheObj != null) {
result = (String) cacheObj;
}
if (cacheObj == null) {
//不存在则新建一个购物项
CartItemVO cartItem = new CartItemVO();
//从数据库查询详情,我们这边直接随机写个
VideoDO videoDO = videoDao.findDetailById(videoId);
videoDO.setId(videoId);
//将购物项加入到购物车里面
cartItem.setPrice(videoDO.getPrice());
cartItem.setBuyNum(buyNum);
cartItem.setProductId(videoId);
cartItem.setProductImg(videoDO.getImg());
cartItem.setProductTitle(videoDO.getTitle());
myCart.put(videoId+"", JsonUtil.objectToJson(cartItem));
} else {
//存在则新增数量
CartItemVO cartItem = JsonUtil.jsonToPojo(result, CartItemVO.class);
cartItem.setBuyNum(cartItem.getBuyNum() + buyNum);
myCart.put(videoId+"", JsonUtil.objectToJson(cartItem));
}
return JsonData.buildSuccess();
}
/**
* 查看我的购物车
* @return
*/
@GetMapping("mycart")
public JsonData findMyCart(){
BoundHashOperations<String,Object,Object> myCart=getMyCartOps();
List<Object> itemList=myCart.values();
List<CartItemVO> cartItemVOList = new ArrayList<>();
//遍历购物车商品详情,并存放到cartItemVOList当中
for (Object item : itemList){
CartItemVO cartItemVO = JsonUtil.jsonToPojo((String)item,CartItemVO.class);
cartItemVOList.add(cartItemVO);
}
//封装成cartvo
CartVO cartVO = new CartVO();
cartVO.setCartItems(cartItemVOList);
return JsonData.buildSuccess(cartVO);
}
/**
* 清空我的购物车
*/
@GetMapping("/clean")
public JsonData clear() {
String cartKey = getCartKey();
redisTemplate.delete(cartKey);
return JsonData.buildSuccess();
}
/**
* 抽取我的购物车通用方法,使用hash结构
*/
private BoundHashOperations<String, Object, Object> getMyCartOps() {
String cartKey = getCartKey();
return redisTemplate.boundHashOps(cartKey);
}
/**
* 获取购物车的key
*/
private String getCartKey() {
//从拦截器获取用户 ,这里写死即可,每个用户不一样
int userId = 88;
String cartKey = String.format("product:cart:%s", userId);
return cartKey;
}
}