购物车实现

作者: elwyn_you | 来源:发表于2020-07-11 00:23 被阅读0次
    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 {
                // 未登录 获取临时购物车所有购物项
             
            }
    

    相关文章

      网友评论

        本文标题:购物车实现

        本文链接:https://www.haomeiwen.com/subject/meovcktx.html