购物车:
一, 将未登录的购物车存在redis 中!
实现思路:
1.设定一个UUID保存在cookie 中
private String getUUID(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
boolean isMatch=false;
if(cookies!=null && cookies.length>0){
for (Cookie cookie : cookies) {
if ("user-Key".equals(cookie.getName())){
String value = cookie.getValue();
userKey=value;
isMatch=true;
}
}
}
// 没有userKey 则创建一个uuId
if (!isMatch){
userKey = UUID.randomUUID().toString().replace("-","");
}
return userKey;
}
2.编写接口
void addToCart(String skuId, Integer skuNum,String userKey);
3.实现类
@Override
public void addToCart(String skuId, Integer skuNum,String userKey) {
Jedis jedis = redisUtil.getJedis();
String userCartKey = CartConst.USER_KEY_PREFIX+userKey+CartConst.USER_CART_KEY_SUFFIX;
// 获取缓存中的所有数据
Map<String, String> map = jedis.hgetAll(userCartKey);
boolean isMath = false;
for (String sId : map.keySet()) {
// 判断两个商品Id 是否相同
if (sId.equals(skuId)){
String cartInfoJson = map.get(sId);
CartInfo cartInfo = JSON.parseObject(cartInfoJson, CartInfo.class);
// 数量相加
cartInfo.setSkuNum(cartInfo.getSkuNum()+skuNum);
// 将结果放回map
map.put(sId,JSON.toJSONString(cartInfo));
isMath=true;
}
}
if (!isMath){
// 根据skuId 获取cartInfo
SkuInfo skuInfo = manageService.getSkuInfo(skuId);
CartInfo cartInfo = new CartInfo();
cartInfo.setSkuId(skuId);
cartInfo.setCartPrice(skuInfo.getPrice());
cartInfo.setSkuPrice(skuInfo.getPrice());
cartInfo.setSkuName(skuInfo.getSkuName());
cartInfo.setImgUrl(skuInfo.getSkuDefaultImg());
cartInfo.setUserId(null);
cartInfo.setSkuNum(skuNum);
map.put(cartInfo.getSkuId(),JSON.toJSONString(cartInfo));
}
// 将map 放入缓存
jedis.hmset(userCartKey,map);
jedis.close();
}
4.控制器
@RequestMapping("addToCart")
@LoginRequire(autoRedirect = false)
public String addToCart(HttpServletRequest request, HttpServletResponse response){
// 获取skuId,skuNum
String skuId = request.getParameter("skuId");
String skuNum = request.getParameter("skuNum");
// 获取userId
String userId = (String) request.getAttribute("userId");
if (userId!=null){
// 登录 mysql - redis 直接将操作数据库的删掉即可!
cartService.addToCart(skuId,userId,Integer.parseInt(skuNum));
}else {
// 未登录
userKey = getUUID(request);
Cookie cookie = new Cookie("user-Key", userKey);
// 添加cookie
response.addCookie(cookie);
cartService.addToCart(skuId,Integer.parseInt(skuNum), this.userKey);
}
SkuInfo skuInfo = manageService.getSkuInfo(skuId);
request.setAttribute("skuNum",skuNum);
request.setAttribute("skuInfo",skuInfo);
return "success";
}
二,查询购物车商品
控制器
@RequestMapping("cartList")
@LoginRequire(autoRedirect = false)
public String cartList(HttpServletRequest request,HttpServletResponse response){
// 获取userId
String userId = (String) request.getAttribute("userId");
userKey = getUUID(request);
// 声明集合
List<CartInfo> cartInfoList = null;
if (userId!=null){
// 合并购物车:
// List<CartInfo> cartListCK = cartCookieHandler.getCartList(request);
List<CartInfo> cartListCK = cartService.getRedisCartList(userKey);
if (cartListCK!=null && cartListCK.size()>0){
// 调用合并方法
cartInfoList = cartService.mergeToCartList(cartListCK,userId);
// 清空未登录数据
// cartCookieHandler.deleteCartCookie(request,response);
cartService.deleteCartRedis(userKey);
}else {
// 获取登录的购物车数据
cartInfoList = cartService.getCartList(userId);
}
}else {
// 获取未登录
// cartInfoList = cartCookieHandler.getCartList(request);
// userKey = getUUID(request);
cartInfoList = cartService.getRedisCartList(userKey);
}
request.setAttribute("cartInfoList",cartInfoList);
return "cartList";
}
接口实现类
List<CartInfo> getRedisCartList(String userKey);
void deleteCartRedis(String userKey);
@Override
public List<CartInfo> getRedisCartList(String userKey) {
List<CartInfo> cartInfoList = new ArrayList<>();
Jedis jedis = redisUtil.getJedis();
String userCartKey = CartConst.USER_KEY_PREFIX+userKey+CartConst.USER_CART_KEY_SUFFIX;
List<String> stringList = jedis.hvals(userCartKey);
for (String cartJson : stringList) {
cartInfoList.add(JSON.parseObject(cartJson,CartInfo.class));
}
return cartInfoList;
}
@Override
public void deleteCartRedis(String userKey) {
Jedis jedis = redisUtil.getJedis();
String userCartKey = CartConst.USER_KEY_PREFIX+userKey+CartConst.USER_CART_KEY_SUFFIX;
jedis.del(userCartKey);
jedis.close();
}