商城:商城业务-购物车

环境搭建

新建product-cart

template下放入 两个关于购物车的html页面以及代码中静态文件的路径

Nginx下方静态文件

修改 host文件 Nginx的配置文件 网关路由

需求描述

- 用户可以在登录状态下将商品添加到购物车【用户购物车/在线购物车】
- 放入数据库
- mongodb
- 放入 redis(采用)
登录以后,会将临时购物车的数据全部合并过来,并清空临时购物车;
- 用户可以在未登录状态下将商品添加到购物车【游客购物车/离线购物车/临时购物车】
- 放入 localstorage(客户端存储,后台不存)
- cookie
- WebSQL
- 放入 redis(采用)
浏览器即使关闭,下次进入,临时购物车数据都在
- 用户可以使用购物车一起结算下单
- 给购物车添加商品
- 用户可以查询自己的购物车
- 用户可以在购物车中修改购买商品的数量。
- 用户可以在购物车中删除商品。
- 选中不选中商品
- 在购物车中展示商品优惠信息
- 提示购物车商品价格变化

购物车数据存入Redis中:

购物车结构是一个双层 Map:Map<String,Map<String,String>>
- 第一层 Map,Key 是用户 id
- 第二层 Map,Key 是购物车中商品 id,值是购物项数据

ThreadLocal用户身份鉴别

创建一个拦截器:com.tinstu.gulimall.cart.interceptor.CartInterceptor

拦截器的配置类:com.tinstu.gulimall.cart.config.MallWebConfig

 

* 浏览器有一个cookie:user-key 标识用户身份 一个月后过期
* 每次访问都会带上这个 user-key
* 如果没有临时用户 还要帮忙创建一个

拦截器;

方法执行之前,判断有没有登录,有没有临时key,如果没有临时key和用户key,就生成一个临时key

方法执行之后,放入cookie,让浏览器保存用户key

 

期间将数据保存在ThreadLocal中,.get() 拿

 ThreadLocal意为线程本地变量,用于解决多线程并发时访问共享变量的问题。

 

RedirectAttriBute

// 重定向数据, 会自动将数据添加到url后面

* 添加商品信息到购物车
*  RedirectAttributes.addFlashAttribute():将数据放在session中,可以在页面中取出,但是只能取一次
*  RedirectAttributes.addAttribute():将数据拼接在url后面,?skuId=xxx

获取合并购物车

判断是否登录,如果登录,拿到用户与临时的key

判断临时key有没有值,有就遍历,并添加到用户的key,最后清楚临时key

 

如果没有登录就拿到临时key,获取临时key中的数据

 

具体方法:com.tinstu.gulimall.cart.service.Impl.CartServiceImpl 中的 getCart

选中购物项

改变购物项的数量

删除购物项

三者差不多

从Redis中获取数据,修改后再重新保存到Redis中

删除购物项是直接按照skuId作为建执行删除方法

以改变购物项的数量为例,具体实现方法:

    public void changeItemCount(Long skuId, Integer num) {
        CartItem cartItem = getCartItem(skuId);
        cartItem.setCount(num);
        String s = JSON.toJSONString(cartItem);
        BoundHashOperations<String, Object, Object> cartOps = getCartOps();
        cartOps.put(skuId.toString(),s);
    }

删除购物项的代码

    @Override
    public void deleteItem(Long skuId) {
        BoundHashOperations<String, Object, Object> cartOps = getCartOps();
        cartOps.delete(skuId.toString());
    }

 

 

 

 

 

阅读剩余
THE END