查看: 277|回复: 0

[Java学习] java商城项目实战之购物车功能实现

发表于 2018-5-6 09:00:00

本文实例为大家分享了java实现购物车功能的具体代码,供大家参考,具体内容如下

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传递给Controller,Controller接收id,Controller调用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

2、Request

3、response

返回值:

TaoTaoResult

  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 == null) return 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

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

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

2.4 展示购物车商品

2.4.1 Service

  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

  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

  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

  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

  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

  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、提交订单后购物车商品需要清空。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持程序员之家。



回复

使用道具 举报