大型互联网电商平台从入门到脱坑

购物车实现

2020-07-11  本文已影响0人  elwyn_you
public class CartInterceptor implements HandlerInterceptor {

//    ThreadLocal 同一线程共享数据
    public static ThreadLocal<UserInfoTo> threadLocal = new ThreadLocal<>();
TEMP_USER_COOKIE_NAME="ebao-user-key";
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
//UserInfoTo()对象 有userId,userKey,isTemp。
//从session获取用户信息
User user=session.getUser();

        if (user!= null) {
            // 用户登录了
            userInfoTo.setUserId(memberRespVo.getId());
        }

        //  判断当前浏览器中的cookie中是否存在临时用户的标识的cookie
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                if (name.equals(CartConstant.TEMP_USER_COOKIE_NAME)) {
            //有临时用户把cookie里的uuid给他,并标识为临时用户
                UserInfoTo.userKey(cookie.getValue());
                    UserInfoTo.isTemp(true); // 设置辨别是否有临时用户的boolean字段
                }
            }
        }

        // 如果没有临时用户,则系统自动分配一个
        if (StringUtils.isEmpty(UserInfoTo.userKey)) {
            String uuid = UUID.randomUUID().toString();
            userInfoTo.userKey(uuid);
        }
        // 把封装的用户信息放到ThreadLocal
        threadLocal.set(userInfoTo);
        return true;
    }

    /**
     * 目标方法执行之后 - 把分配的临时用户添加到cookie
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {

        // TODO cookie过期修改TempUser状态
        UserInfoTo userInfoTo = threadLocal.get();
        if (!userInfoTo.isTempUser()) { // 如果没有临时用户才需要添加cookie
            Cookie cookie = new Cookie(CartConstant.TEMP_USER_COOKIE_NAME, UserInfoTo.userKey());
            cookie.setDomain("ebao.com");
            cookie.setMaxAge(1个月);
            response.addCookie(cookie);
        }

    }
}
购物车Redis数据结构Hash
cart:1{"sku1":{"name":商品1,"price":200}}

  // 判断用户是否登陆了
     
        if (userInfoTo.getUserId() != null) {
            // 登录了,获取登录用户的购物车和临时购物车进行合并
    
            // 1、判断临时购物车是否有数据
          
                // 临时购物车有数据,进行合并
              
                // 合并完成 清除临时购物车数据
                clearCart(tempCartKey);
            }
            // 2、合并后,再获取登录后用户的购物车
            List<CartItem> cartItems = getCartItems(cartKey);
            cart.setItems(cartItems);

        } else {
            // 未登录 获取临时购物车所有购物项
         
        }
上一篇 下一篇

猜你喜欢

热点阅读