购物车
购物车数据的储存
购物车设计是每个电商项目中必不可缺的一环,不管登录与否,购物车都可以使用.那么购物车的数据我们存在哪里呢?
登录时,购物车的数据理所应当的存在redis数据库中,可是未登录时呢?
在这里我们给出了三个方案
1、当用户在未登录的情况下,将此购物车存入Cookie中, 在用户登陆的情况下,将购物车数据存入redis 。如果用户登陆时,Cookie中存在购物车数据,需要将Redis的购物车合并到redis中存储.
缺点:Cookie最大存放:4K;
2、当用户在未登录的情况下,将此购物车存入LocalStorage中, 在用户登陆的情况下,将购物车数据存入redis 。如果用户登陆时,LocalStorage中存在购物车数据,需要将Redis的购物车合并到redis中存储.
缺点:当用户清空浏览器缓存时,LocalStorage数据就没有了;
3、不管用户是否登录,都保存在Redis中;(1)当用户未登录的情况下,获取SessionID,以SessionID作为Redis的Key保存;(2)如果用户登录了,根据用户名来保存到Redis;(3)如果用户登录时,把SessionID中的Redis数据和用户名获取的Redis数据合并;
很明显第三种解决方案是最好的,在这里我们就按照第三种解决方案来设计未登录时的购物车
购物车实体类的设计
作为购物车页面,按照一般电商网站的设计,不同的卖家应该分为不同的区域,也就是说要按照商家的sellerId来分块展示购物车数据.在这里我们已sellerId来区分购物车数据,购物车实体类分为三个属性
private String sellerId;//商家ID
private String sellerName;//商家名称
private List<TbOrderItem> orderItemList;//购物车明细
实现展示购物车数据方法:findCartList:
在商品详情页面的添加购物车追加点击事件,点击则触发添加购物车的方法,登录与否只是存入redis中的key是sessionId还是userId的区别而已
无论是否登录都要先判断cookie中是否有保存的sessionId,以此来判断未登录时是否购物车有数据,如果有在判断是否登录,如果登录则需要合并购物车
根据之前的设计,当用户未登录时我们以sessionId作为key保存购物车数据到redis数据库中,而为了避免sessionId关闭浏览器后丢失,我们采用把sessionId存入cookie中这个方法来保存sessionId.当用户登录后,应该把未登录时的购物车对象集合添加到登录时的购物车集合中,具体逻辑需要遍历未登录时的购物车集合把每个购物车对象依次判断是否在登录的购物车集合中已存在相同的sellerId,如果存在,在判断商品是否相同,如果商品相同,仅仅叠加数量,如果商品不同,则在orderItemList追加一个orderItem对象,如果sellerId都不同,则添加一个新的Cart对象
controller层代码
@RestController
@RequestMapping("/cart")
public class CartController {
@Reference
private CartService cartService;
@Autowired
private HttpSession session;
@Autowired
private HttpServletRequest request;
@Autowired
private HttpServletResponse response;
@RequestMapping("/findCartList")
public List<Cart> findCartList(){
String userId = SecurityContextHolder.getContext().getAuthentication().getName();
String sessionId = getSessionId();
List<Cart> cartList_sessionId = cartService.findCartList