存储形式:

购物车存储形式——Cookie

无需登录、无需查库、保存在浏览器端g
优点:
性能好、访问快、没有和数据库交互
缺点
1、换电脑购物车数据会丢失
2、电脑被其他人登录,隐私安全

购物车存储形式——Session

用户登录后,购物车数据放入用户会话
优点:
初期用户量少,访问快
缺点:
1、session基于内容,用户量庞大影响服务器性能
2、只能存在于当前会话,不适用集群与分布式系统

购物车存储形式——数据库

用户登录后,购物车数据存入数据库
优点:
数据持久化,可在任何地点任何时间访问
缺点:
频繁读写数据库,造成数据库压力

购物车存储形式——Redis

用户登录后,购物车数据存入redis缓存
优点:
1、数据持久化,可在任何地点任何时间访问
2、频繁读写基于缓存,不会造成数据库压力
3、适用于集群与分布式系统,可扩展性强

项目选型:

未登录采用Cookie
登录采用Cookie+Redis

//TODO 有关Redis的操作会在之后搭建集器环境时完善

购物车前端流程

购物车.png

购物车页面渲染

购物车页面数据可以直接从Cookie中获取并渲染吗?
不行,因为用户在添加购物车后,可能不是立刻结算,那么商品的数据(价格)可能会发生变化,所以我们在打开购物车页面时,应该进行数据的重新获取,更新一些信息(价格、名称、规格等)

编写SQL

根据商品规格的id查询对应商品的有关信息

  1. SELECT
  2. t_items.id AS itemId,
  3. t_items.item_name AS itemName,
  4. t_items_img.url AS itemImgUrl,
  5. t_items_spec.id AS specId,
  6. t_items_spec.`name` AS specName,
  7. t_items_spec.price_discount AS priceDiscount,
  8. t_items_spec.price_normal AS priceNormal
  9. FROM
  10. items_spec t_items_spec
  11. LEFT JOIN
  12. items t_items
  13. ON
  14. t_items.id = t_items_spec.item_id
  15. LEFT JOIN
  16. items_img t_items_img
  17. ON
  18. t_items_img.item_id = t_items.id
  19. WHERE
  20. t_items_img.is_main = 1
  21. AND
  22. t_items_spec.id IN
  23. ('1','3','5')

image.png

创建VO

  1. package com.shiers.pojo.vo;
  2. /**
  3. * Demo class
  4. *
  5. * @author shierS
  6. * @date 2021/6/1
  7. */
  8. public class ShopcartVO {
  9. private String itemId;
  10. private String itemImgUrl;
  11. private String itemName;
  12. private String specId;
  13. private String specName;
  14. private String priceDiscount;
  15. private String priceNormal;
  16. //get\set...
  17. }

编写mapper

  1. <select id="queryItemsBySpecIds" parameterType="List" resultType="com.shiers.pojo.vo.ShopcartVO">
  2. SELECT
  3. t_items.id AS itemId,
  4. t_items.item_name AS itemName,
  5. t_items_img.url AS itemImgUrl,
  6. t_items_spec.id AS specId,
  7. t_items_spec.`name` AS specName,
  8. t_items_spec.price_discount AS priceDiscount,
  9. t_items_spec.price_normal AS priceNormal
  10. FROM
  11. items_spec t_items_spec
  12. LEFT JOIN
  13. items t_items
  14. ON
  15. t_items.id = t_items_spec.item_id
  16. LEFT JOIN
  17. items_img t_items_img
  18. ON
  19. t_items_img.item_id = t_items.id
  20. WHERE
  21. t_items_img.is_main = 1
  22. AND
  23. t_items_spec.id IN
  24. <foreach collection="paramsList" index="index" item="specId" open="(" separator="," close=")">
  25. #{specId}
  26. </foreach>
  27. </select>

编写service

  1. @Transactional(propagation = Propagation.SUPPORTS)
  2. @Override
  3. public List<ShopcartVO> queryItemsBySpecIds(String specIds) {
  4. //对前端传入的规格id就行分隔
  5. String ids[] = specIds.split(",");
  6. List<String> specIdsList = new ArrayList<>();
  7. //将数组中的元素全部添加到集合中
  8. Collections.addAll(specIdsList,ids);
  9. return itemsMapperCustom.queryItemsBySpecIds(specIdsList);
  10. }

编写Controller

  1. // 用于用户长时间未登录网站,刷新购物车中的数据(主要是价格),类似京东淘宝
  2. @ApiOperation(value = "根据商品规格ids查询最新的商品数据", notes = "根据商品规格ids查询最新的商品数据", httpMethod = "GET")
  3. @GetMapping("/refresh")
  4. public MyJSONResult refresh(
  5. @ApiParam(name = "itemSpecIds", value = "拼接的规格ids", required = true,example = "1001,1003,1005")
  6. @RequestParam String itemSpecIds) {
  7. if(StringUtils.isBlank(itemSpecIds)){
  8. return MyJSONResult.ok();
  9. }
  10. List<ShopcartVO> list = itemService.queryItemsBySpecIds(itemSpecIds);
  11. return MyJSONResult.ok(list);
  12. }