TT_购物车功能实现

1 需要实现

1、 实现淘淘商城的购物车功能

2 购物车功能

2.1 功能说明

1、商品加入购物车时,不是必须要求登录。京东不需要登录,淘宝需要登录。各有好处。

2、计算购物车中商品的总价。当商品数量发生变化时需要重新计算。

3、用户可以删除购物车中的商品。

4、用户下单后,删除购物车的功能。

购物车在用户不登陆的情况下也可以使用购物车。需要把购物车的商品信息写入cookie中。所有对购物车的操作都是操作cookie。有效 的降低数据库的压力。

缺点:换一台电脑后购物车的商品不能同步。

实现的工程:taotao-protal中实现购物车功能。只需要调用商品信息的服务,除此之外不需要和其他系统交互。

2.2 功能分析

1、在用户不登陆的清空下也可以使用购物车,那么就需要把购物车信息放入cookie中。

2、可以把商品信息,存放到pojo中,然后序列化成json存入cookie中。

3、取商品信息可以从cookie中把json数据取出来,然后转换成java对象即可。

4、此功能只需要操作cookie不需要数据库的支持,所以只需要在taotao-portal中实现即可。

5、购物车分有四种动作

a) 添加商品

b) 修改商品数量

c) 删除购物车中的商品

d) 展示购物车商品列表

2.3 添加购物车商品

在商品详情页面点击“加入购物车”按钮提交一个请求吧商品id传递给ControllerController接收idController调用Service根据商品id查询商品基本信息。把商品写入cookie中,加入cookie之前先从cookie中把购物车的商品取出来判断当前购物车商品列表中是否有此商品,如果有数量加一,如果没有添加一个商品,数量为1。展示给用户购物车列表。

 


2.3.1 service

功能:接收一个商品id,数量(默认为1),根据商品id查询商品信息。调用taotao-rest的服务。把商品添加到购物车,先把购物车商品列表取出来,判断列表中是否有此商品,如果有就增加数量就可以了。如果没有把此商品添加到商品列表。返回添加成功Taotaoresult


功能:

1、接收controller传递过来的商品id,根据商品id查询商品信息。

2、从cookie中取出购物车信息,转换成商品pojo列表。

3、把商品信息添加到商品列表中。

参数:

1、商品id

2Request

3response

返回值:

TaoTaoResult

[java]  view plain  copy
  1. @Service  
  2. public class CartServiceImpl implements CartService {  
  3. //服务url  
  4. @Value("${REST_BASE_URL}")  
  5. private String REST_BASE_URL;  
  6. //商品服务url  
  7. @Value("${ITEMS_ITEM_URL}")  
  8. private String ITEMS_ITEM_URL;  
  9. //COOKIE中购物车商品对应的key  
  10. @Value("${CART_ITEMS_LIST_KEY}")  
  11. private String CART_ITEMS_LIST_KEY;  
  12. //购物车cookie生存期  
  13. @Value("${CART_ITEMS_EXPIRE_TIME}")  
  14. private Integer CART_ITEMS_EXPIRE_TIME;  
  15. /** 
  16.  * 添加购物车商品 
  17.  * <p>Title: addItem</p> 
  18.  * <p>Description: </p> 
  19.  * @param itemId 
  20.  * @param request 
  21.  * @param response 
  22.  * @return 
  23.  * @see com.taotao.portal.service.CartService#addItem(java.lang.Long, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 
  24.  */  
  25. @Override  
  26. public TaotaoResult addItem(Long itemId, HttpServletRequest request, HttpServletResponse response) {  
  27. //根据商品id查询商品信息  
  28. Item item = getItemById(itemId);  
  29. if (item == nullreturn TaotaoResult.build(400"未查询到该商品信息");  
  30. //取cookie中购物车商品列表  
  31. List<Item> cartItems = getItemListFromCookie(request);  
  32. //判断该商品是否存在于购物车中  
  33. boolean itemExists = false;  
  34. for (Item i : cartItems) {  
  35. if (i.getId().longValue() == itemId.longValue()) {  
  36. //购物车中有此商品  
  37. i.setNum(i.getNum() + 1);  
  38. itemExists = true;  
  39. break;  
  40. }  
  41. }  
  42. //如果商品不存在于购物车则向购物车商品列表中添加一个商品  
  43. if (! itemExists) {  
  44. //设置数量为1  
  45. item.setNum(1);  
  46. //把商品添加到购物车  
  47. cartItems.add(item);  
  48. }  
  49. //把购物车信息写入cookie中  
  50. CookieUtils.setCookie(request, response, CART_ITEMS_LIST_KEY, JsonUtils.objectToJson(cartItems), CART_ITEMS_EXPIRE_TIME, true);  
  51. return TaotaoResult.ok(cartItems);  
  52. }  
  53. private Item getItemById(Long itemId) {  
  54. //根据商品id查询商品信息  
  55. String resultStr = HttpClientUtil.doGet(REST_BASE_URL + ITEMS_ITEM_URL + itemId);  
  56. //转换成taotaoResult  
  57. TaotaoResult result = TaotaoResult.formatToPojo(resultStr, Item.class);  
  58. //取商品信息  
  59. Item item  = null;  
  60. if (result.getStatus() == 200) {  
  61. item = (Item) result.getData();  
  62. }  
  63. return item;  
  64. }  
  65. private List<Item> getItemListFromCookie(HttpServletRequest request) {  
  66. //取cookie中购物车商品列表  
  67. String cartItemsStr = CookieUtils.getCookieValue(request, CART_ITEMS_LIST_KEY, true);  
  68. //如果不为空那么就转换成java对象  
  69. List<Item> cartItems = null;  
  70. if (!StringUtils.isBlank(cartItemsStr)) {  
  71. cartItems = JsonUtils.jsonToList(cartItemsStr, Item.class);  
  72. else {  
  73. cartItems = new ArrayList<>();  
  74. }  
  75. return cartItems;  
  76. }  
  77. }  

2.3.2 商品pojo 

商品pojo需要使用taotao-portal中的Item。此pojo在反序列化时会抛异常。需要做如下修改:

 

2.3.3 Controller

[java]  view plain  copy
  1. @Controller  
  2. @RequestMapping("/cart")  
  3. public class CartController {  
  4.    
  5. @Autowired  
  6. private CartService cartService;  
  7. @RequestMapping("/add/{itemId}")  
  8. public String addItem(@PathVariable Long itemId,  
  9. HttpServletRequest request, HttpServletResponse response, Model model) {  
  10. //添加商品信息  
  11. TaotaoResult result = cartService.addItem(itemId, request, response);  
  12. //错误信息  
  13. if (result.getStatus() != 200) {  
  14. model.addAttribute("message", result.getMsg());  
  15. return "error/exception";  
  16. }  
  17. //把购物车中的商品传递给页面  
  18. model.addAttribute("cartList", result.getData());  
  19. return "cart";  
  20. }  
  21. }  


用户点击 “我的购物车”展示购物车信息

2.4 展示购物车商品

2.4.1 Service

[java]  view plain  copy
  1. /** 
  2.  * 取购物车列表 
  3.  * <p> 
  4.  * Title: getCartItemsList 
  5.  * </p> 
  6.  * <p> 
  7.  * Description: 
  8.  * </p> 
  9.  * 
  10.  * @return 
  11.  * @see com.taotao.portal.service.CartService#getCartItemsList() 
  12.  */  
  13. @Override  
  14. public List<Item> getCartItemsList(HttpServletRequest request) {  
  15. // 从cookie中取商品列表  
  16. List<Item> itemsList = getItemListFromCookie(request);  
  17. return itemsList;  
  18. }  


2.4.2  Controller  


[java]  view plain  copy
  1. @RequestMapping("/cart")  
  2. public String showCart(HttpServletRequest request, Model mode) {  
  3. //取购物车信息  
  4. List<Item> list = cartService.getCartItemsList(request);  
  5. mode.addAttribute("cartList", list);  
  6. return "cart";  
  7. }  

  

2.5 修改商品数量

当点击购物车商品的+”、“-”号时增加或减少商品数量。减少商品数量时,如果数量为“1”则不继续减少。

2.5.1 Service

[java]  view plain  copy
  1. /** 
  2.  * 修改指定商品的数量 
  3.  * <p>Title: changeItemNum</p> 
  4.  * <p>Description: </p> 
  5.  * @param itemId 
  6.  * @param num 
  7.  * @param request 
  8.  * @param response 
  9.  * @return 
  10.  * @see com.taotao.portal.service.CartService#changeItemNum(long, int, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 
  11.  */  
  12. @Override  
  13. public TaotaoResult changeItemNum(long itemId, int num, HttpServletRequest request, HttpServletResponse response) {  
  14. //从cookie中取商品列表  
  15. List<Item> list = getItemListFromCookie(request);  
  16. //从商品列表中找到要修改数量的商品  
  17. for (Item item : list) {  
  18. if (item.getId() == itemId) {  
  19. //找到商品,修改数量  
  20. item.setNum(num);  
  21. break;  
  22. }  
  23. }  
  24. //把商品信息写入cookie  
  25. CookieUtils.setCookie(request, response, CART_ITEMS_LIST_KEY, JsonUtils.objectToJson(list), CART_ITEMS_EXPIRE_TIME, true);  
  26. return TaotaoResult.ok();  
  27. }  


2.5.2  Controller  

[java]  view plain  copy
  1. @RequestMapping("/update/num/{itemId}/{num}")  
  2. @ResponseBody  
  3. public TaotaoResult updateNumById(@PathVariable Long itemId, @PathVariable Integer num,  
  4. HttpServletRequest request, HttpServletResponse response) {  
  5. TaotaoResult result = cartService.changeItemNum(itemId, num, request, response);  
  6. return result;  
  7. }  

2.6 删除购物车商品

2.6.1 Service

[java]  view plain  copy
  1. /** 
  2.  * 删除购物车中的商品 
  3.  * <p> 
  4.  * Title: deleteItem 
  5.  * </p> 
  6.  * <p> 
  7.  * Description: 
  8.  * </p> 
  9.  * 
  10.  * @param itemId 
  11.  * @param request 
  12.  * @param response 
  13.  * @return 
  14.  * @see com.taotao.portal.service.CartService#deleteItem(java.lang.Long, 
  15.  *      javax.servlet.http.HttpServletRequest, 
  16.  *      javax.servlet.http.HttpServletResponse) 
  17.  */  
  18. @Override  
  19. public List<Item> deleteItem(Long itemId, HttpServletRequest request, HttpServletResponse response) {  
  20. List<Item> itemsList = getCartItemsList(request);  
  21. // 找到购物车中的商品,并删除之  
  22. for (Item item : itemsList) {  
  23. if (item.getId().longValue() == itemId.longValue()) {  
  24. itemsList.remove(item);  
  25. break;  
  26. }  
  27. }  
  28. // 更新cookie中的购物车数据  
  29. CookieUtils.setCookie(request, response, CART_ITEMS_LIST_KEY, JsonUtils.objectToJson(itemsList), CART_ITEMS_EXPIRE_TIME, true);  
  30. return itemsList;  
  31. }  


2.6.2  Controller  

[java]  view plain  copy
  1. @RequestMapping("/delete/{itemId}")  
  2. public String deleteItemById(@PathVariable Long itemId,  
  3. HttpServletRequest request, HttpServletResponse response,  
  4. Model model) {  
  5. List<Item> list = cartService.deleteItem(itemId, request, response);  
  6. model.addAttribute("cartList", list);  
  7. return "cart";  
  8. }  

购物车存在的问题

1、更换设备购物车商品不能同步

a) 不能把购物车商品保存到数据库

b) 要求用户登录才能同步信息

c) 可以把购物车信息保存到redis中,key就是用户,value就是购物车列表

d) 购物车商品合并的问题。

2、提交订单后购物车商品需要清空。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值