1)Maven项目接口一般依赖pojo 2)实现类依赖接口 |
1)不登陆也可以买,购物车信息写入cookie 不占用服务器端的资源 用户体验好 代码实现简单 缺点: Cookie容量有限制,4K 把购物车信息保存在cookie中,更换设备购物车信息不能同步 |
1)坑 取图片 还有一个是否转码的问题 2) 实现展示购物车 再次点击查看购物车时: 3)在购物车列表页面动态更新购买商品金额 4)删除购物车商品 |
没加javax.servlet的包,
请求路径后缀是.html的无法得到返回的json,需要更改请求路径
1)登录拦截器 /** * 判断用户是否登录的拦截器 * Title: LoginInterceptor * Description: * Company: www.itcast.cn * @version 1.0 */ public class LoginInterceptor implements HandlerInterceptor { @Value("${COOKIE_TOKEN_KEY}") private String COOKIE_TOKEN_KEY; @Autowired private UserService userService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 执行handler方法之前执行此方法 // 1、实现一个HandlerInterceptor接口。 // 2、在执行handler方法之前做业务处理 // 3、从cookie中取token。使用CookieUtils工具类实现。 String token = CookieUtils.getCookieValue(request, COOKIE_TOKEN_KEY); // 4、没有取到token,用户未登录。放行 if (StringUtils.isBlank(token)) { return true; } // 5、取到token,调用sso系统的服务,根据token查询用户信息。 E3Result e3Result = userService.getUserByToken(token); // 6、没有返回用户信息。登录已经过期,未登录,放行。 if (e3Result.getStatus() != 200) { return true; } // 7、返回用户信息。用户是登录状态。可以把用户对象保存到request中,在Controller中可以通过判断request中是否包含用户对象,确定是否为登录状态。 TbUser user = (TbUser) e3Result.getData(); request.setAttribute("user", user); //返回true放行 //返回false拦截 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 执行handler方法之后,并且是返回ModelAndView对象之前 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 返回ModelAndView之后。可以捕获异常。 } } 2)拦截器的配置 3)登录状态下添加购物车 登录状态下添加购物车,直接把数据保存到redis中。需要调用购物车服务,使用redis的hash来保存数据。 Key:用户id Field:商品id Value:商品对象转换成json
参数: 1、用户id 2、商品id 3、商品数量
业务逻辑: 1、根据商品id查询商品信息 2、把商品信息保存到redis a) 判断购物车中是否有此商品 b) 如果有,数量相加 c) 如果没有,根据商品id查询商品信息。 d) 把商品信息添加到购物车 3、返回值。E3Result @Service public class CartServiceImpl implements CartService { @Value("${CART_REDIS_KEY}") private String CART_REDIS_KEY;
@Autowired private TbItemMapper itemMapper; @Autowired private JedisClient jedisClient; @Override public E3Result addCart(long userId, long itemId, int num) { // a)判断购物车中是否有此商品 Boolean flag = jedisClient.hexists(CART_REDIS_KEY + ":" + userId, itemId + ""); // b)如果有,数量相加 if (flag) { //从hash中取商品数据 String json = jedisClient.hget(CART_REDIS_KEY + ":" + userId, itemId + ""); //转换成java对象 TbItem tbItem = JsonUtils.jsonToPojo(json, TbItem.class); //数量相加 tbItem.setNum(tbItem.getNum() + num); //写入hash jedisClient.hset(CART_REDIS_KEY + ":" + userId, itemId + "", JsonUtils.objectToJson(tbItem)); //返回添加成功 return E3Result.ok(); } // c)如果没有,根据商品id查询商品信息。 TbItem tbItem = itemMapper.selectByPrimaryKey(itemId); //设置商品数量 tbItem.setNum(num); String image = tbItem.getImage(); //取一张图片 if (StringUtils.isNotBlank(image)) { tbItem.setImage(image.split(",")[0]); } // d)把商品信息添加到购物车 jedisClient.hset(CART_REDIS_KEY + ":" + userId, itemId + "", JsonUtils.objectToJson(tbItem)); return E3Result.ok(); } } |
7. 登录状态下显示购物车列表
1、未登录状态下购物车列表是从cookie中取。 2、登录状态下购物车应该是从服务端取。 3、如果cookie中有购物车数据,应该吧cookie中的购物车和服务端合并,合并后删除cookie中的购物车数据。 4、合并购物车时,如果商品存在,数量相加,如果不存在,添加一个新的商品。 5、从服务端取购物车列表展示 1.1Service层 1、合并购物车 参数:用户id List 返回值:E3Result 业务逻辑: 1)遍历商品列表 2)如果服务端有相同商品,数量相加 3)如果没有相同商品,添加一个新的商品
2、取购物车列表 参数:用户id 返回值:List 业务逻辑: 1)从hash中取所有商品数据 2)返回 Ctroller层 1、判断用户是否登录。 2、如果已经登录,判断cookie中是否有购物车信息 3、如果有合并购物车,并删除cookie中的购物车。 4、如果是登录状态,应从服务端取购物车列表。 如果是未登录状态,从cookie中取购物车列表 |