一、购物车的cookie技术,有四条分支的操作,如下图:
二、 标题cookie和session的区别(Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。):
Cookie:给客户端们颁发一个通行证,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。
Session:就是通过检查服务器上的“客户明细表”来确认客户身份,Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
三、这里要商品的详细页面,要跳转到购物车,需要改一下bug,修改为quantity,因为我的web前端定义接收参数为quantity!!!
四、web前端代码如下:
实现cookie基本步骤:
1、接收前端传递过来的skuId和添加数量
2、去sku服务层查询sku基本信息
3、创建订单对象,把sku基本信息set过去
4、判断用户是否登录
5、总体业务逻辑:
if(未登陆)
创建列表
先获取购物车cookie
If(cookie==null)
直接add进列表
else
把cookie的json字符串转为java的列表
遍历cookie的列表和用户点击的商品是否相同
If(相同)
更新购物车的商品数量
else
直接add进列表
cookie的覆盖操作(列表转json存入cookie)
else(登录)
查询skuId是否被该用户memberId添加
if为空
该用户未添加这skuid商品
else
该用户已添加过该skuid商品,需要更新添加该商品的数量
同步缓存
@Controller
public class CartController {
@Reference
SkuService skuService;
@Reference
CartService cartService;
@RequestMapping("addToCart")
public String addToCart(String skuId, int quantity, HttpServletRequest request, HttpServletResponse response){
//调用商品服务查询商品信息
PmsSkuInfo skuInfo = skuService.getSkuById(skuId, "");
//将商品信息封装成购物车信息
OmsCartItem omsCartItem = new OmsCartItem();
omsCartItem.setCreateDate(new Date()); //订单创建日期
omsCartItem.setProductSkuId(skuId); //sku的id
omsCartItem.setQuantity(quantity); //sku添加的数目
//需要调用sku服务查询
omsCartItem.setProductName(skuInfo.getSkuName());//sku的名称
omsCartItem.setProductPic(skuInfo.getSkuDefaultImg()); //sku主图
omsCartItem.setProductId(skuInfo.getProductId());//spu的id
omsCartItem.setProductCategoryId(skuInfo.getCatalog3Id());//三级分类id
omsCartItem.setPrice(skuInfo.getPrice());//sku商品价格
//判断用户是否登录
String memberId = "";
//用户没有登录(memberId为空)
if(StringUtils.isBlank(memberId)) {
List<OmsCartItem> omsCartItemList = new ArrayList<>(); //创建购物车列表
//先获取购物车的cookie
String cartListCookie = CookieUtil.getCookieValue(request, "cartListCookie", true);
if(StringUtils.isBlank(cartListCookie)){ //如果cookie为空
omsCartItemList.add(omsCartItem); //把购物车对象add进去
}else{ //如果cookie不为空
omsCartItemList = JSON.parseArray(cartListCookie, OmsCartItem.class); //把获取的cookie的json字符串列表,以购物车映射对象转换为java的列表
boolean exit = judge_cart_exit(omsCartItem,omsCartItemList); //用户添加的商品在cookie中存在,则为true
if(exit==false){ //为false,用户添加的商品在cookie中不存在,直接把商品add进列表,保存到cookie即可!
omsCartItemList.add(omsCartItem);
}
}
//覆盖cookie
CookieUtil.setCookie(request,response,"cartListCookie", JSON.toJSONString(omsCartItemList),60*60*72,true);
}else{
//用户已经登陆,从db查询购物车数据
OmsCartItem omsCartItemFromDb = cartService.ifCartExistByUser(memberId,skuId);
//不需要查询该用户的购物车集合,只需要查询skuId是否被该用户memberId添加即可!
//如果为空,则未添加
if(omsCartItemFromDb == null){
//当前memberId用户没有添加过当前skuId的商品
omsCartItem.setMemberId(memberId);
cartService.addCart(omsCartItem);
}else {
//当前memberId用户添加过当前skuId的商品
omsCartItemFromDb.setQuantity(omsCartItem.getQuantity());
cartService.updateCart(omsCartItemFromDb);
}
//同步缓存
cartService.flushCartCache(memberId);
}
return "redirect:/success.html"; //redirect重定向的意思,返回一个路径的页面
}
private boolean judge_cart_exit(OmsCartItem omsCartItem, List<OmsCartItem> omsCartItemList) {
boolean a = false;
for (OmsCartItem Item : omsCartItemList) { //遍历浏览器原本存储的cookie的商品列表
String productSkuId = Item.getProductSkuId();
if(productSkuId.equals(omsCartItem.getProductSkuId())){ //如果原本存储的cookie的商品,和用户点击的商品的id相同
Item.setQuantity(omsCartItem.getQuantity()+Item.getQuantity()); //更新商品的商品数量(用户添加的数量+原本cookie存储数量)
a = true; //用户添加的商品在cookie中存在,则为true
}
}
return a;
}
}