商城:商城业务-购物车
环境搭建
新建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());
}