18.03.28,web学习第八十六天,商城day12,购物车实现

86商城day12

购物车

1. Maven项目创建总结

1Maven项目接口一般依赖pojo

2)实现类依赖接口

2. 购物车分析

1)不登陆也可以买,购物车信息写入cookie

   不占用服务器端的资源

   用户体验好

   代码实现简单

缺点:

   Cookie容量有限制,4K

   把购物车信息保存在cookie中,更换设备购物车信息不能同步

3. 实现购物车

1)坑

 18.03.28,web学习第八十六天,商城day12,购物车实现_第1张图片

取图片

 

还有一个是否转码的问题

2) 实现展示购物车

 18.03.28,web学习第八十六天,商城day12,购物车实现_第2张图片

 18.03.28,web学习第八十六天,商城day12,购物车实现_第3张图片

再次点击查看购物车时:

 18.03.28,web学习第八十六天,商城day12,购物车实现_第4张图片

3)在购物车列表页面动态更新购买商品金额

18.03.28,web学习第八十六天,商城day12,购物车实现_第5张图片

4)删除购物车商品

 18.03.28,web学习第八十六天,商城day12,购物车实现_第6张图片

 

4. 使用springMVC406错误只有俩可能:

   没加javax.servlet的包,

请求路径后缀是.html的无法得到返回的json,需要更改请求路径

5. 有两份教案
6. 判断用户是否登录-拦截器

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 handlerthrows Exception {

// 执行handler方法之前执行此方法

// 1、实现一个HandlerInterceptor接口。

// 2、在执行handler方法之前做业务处理

// 3、从cookie中取token。使用CookieUtils工具类实现。

String token = CookieUtils.getCookieValue(requestCOOKIE_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中。需要调用购物车服务,使用redishash来保存数据。

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 userIdlong itemIdint num) {

// a)判断购物车中是否有此商品

Boolean flag = jedisClient.hexists(CART_REDIS_KEY + ":" + userIditemId + "");

// b)如果有,数量相加

if (flag) {

//从hash中取商品数据

String json = jedisClient.hget(CART_REDIS_KEY + ":" + userIditemId + "");

//转换成java对象

TbItem tbItem = JsonUtils.jsonToPojo(json, TbItem.class);

//数量相加

tbItem.setNum(tbItem.getNum() + num);

//写入hash

jedisClient.hset(CART_REDIS_KEY + ":" + userIditemId + "", 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 + ":" + userIditemId + "", 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中取购物车列表


你可能感兴趣的:(18.03.28,web学习第八十六天,商城day12,购物车实现)