【项目学习】谷粒商城学习记录8 - 购物车

发布时间 2023-12-19 21:43:17作者: A_sc

【项目学习】谷粒商城学习记录8 - 购物车

本节起将不对一些重复细节进行详细说明


一、环境搭建 & 准备工作

1.1. 创建新模块

  • 注意java版本信息后面在pom.xml文件里修改

  • 导入公共模块依赖
  • 写配置信息
  • 启动类加上注册发现和Feign功能
  • 修改网关
    - id: gulimall_cart_route
      uri: lb://gulimall-cart
      predicates:
      	- Host=cart.gulimall.cn
    

1.2. 静态页面搭建

  • 设置域名
  • 将注册页面和登录页面放在服务资源目录下
  • 登录、注册页面动静分离,将静态资源移到nginx下
  • 修改页面内的路径
  • 测试:

1.3. 数据存储结构:

1.4. 完善页面细节,实现页面跳转

二、ThreadLocal 用户身份鉴别

  • 创建service.CartService和impl.CartServiceImpl

  • 创建拦截器interceptor.CartInterceptor

  • 实现拦截器在业务执行前的功能:

    public class CartInterceptor implements HandlerInterceptor {
      public static ThreadLocal<UserInfoTo> threadLocal = new ThreadLocal<>();
    
      /**
       * 目标方法执行之前
       * @param request
       * @param response
       * @param handler
       * @return
       * @throws Exception
       */
      @Override
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
          UserInfoTo userInfoTo = new UserInfoTo();
    
          HttpSession session = request.getSession();
          MemberRespVo member = (MemberRespVo) session.getAttribute(AuthServerConstant.LOGIN_USER);
          if(member != null) {
              //用户登录了
              userInfoTo.setUserId(member.getId());
          }
    
          Cookie[] cookies = request.getCookies();
          if(cookies != null && cookies.length > 0) {
              for (Cookie cookie : cookies) {
                  //user-key
                  String name = cookie.getName();
                  if(name.equals(CartConstant.TEMP_USER_COOKIE_NAME)) {
                      userInfoTo.setUserKey(cookie.getValue());
                      userInfoTo.setTempUser(true);
                  }
              }
          }
    
          //如果没有临时用户一定分配一个临时用户
          if(StringUtils.isEmpty(userInfoTo.getUserKey())) {
              String uuid = UUID.randomUUID().toString();
              userInfoTo.setUserKey(uuid);
          }
          //目标方法执行之前
          threadLocal.set(userInfoTo);
          return true;
      }
    }
    
  • ThreadLocal能够在整个线程内共享数据

  • 测试:

  • 实现拦截器在业务处理后的功能

    /**
     * 业务执行之后,分配临时用户,让浏览器保存
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        UserInfoTo userInfoTo = threadLocal.get();
        if(!userInfoTo.isTempUser()) {
            Cookie cookie = new Cookie(CartConstant.TEMP_USER_COOKIE_NAME, userInfoTo.getUserKey());
            cookie.setDomain("gulimall.com");
            cookie.setMaxAge(CartConstant.TEMP_USER_COOKIE_TIMEOUT);
            response.addCookie(cookie);
        }
    }
    
  • 测试: