存储形式:
购物车存储形式——Cookie
无需登录、无需查库、保存在浏览器端g
优点:
性能好、访问快、没有和数据库交互
缺点
1、换电脑购物车数据会丢失
2、电脑被其他人登录,隐私安全
购物车存储形式——Session
用户登录后,购物车数据放入用户会话
优点:
初期用户量少,访问快
缺点:
1、session基于内容,用户量庞大影响服务器性能
2、只能存在于当前会话,不适用集群与分布式系统
购物车存储形式——数据库
用户登录后,购物车数据存入数据库
优点:
数据持久化,可在任何地点任何时间访问
缺点:
频繁读写数据库,造成数据库压力
购物车存储形式——Redis
用户登录后,购物车数据存入redis缓存
优点:
1、数据持久化,可在任何地点任何时间访问
2、频繁读写基于缓存,不会造成数据库压力
3、适用于集群与分布式系统,可扩展性强
项目选型:
未登录采用Cookie
登录采用Cookie+Redis
//TODO ⛔有关Redis的操作会在之后搭建集器环境时完善
购物车前端流程
购物车页面渲染
购物车页面数据可以直接从Cookie中获取并渲染吗?
不行,因为用户在添加购物车后,可能不是立刻结算,那么商品的数据(价格)可能会发生变化,所以我们在打开购物车页面时,应该进行数据的重新获取,更新一些信息(价格、名称、规格等)
编写SQL
根据商品规格的id查询对应商品的有关信息
SELECTt_items.id AS itemId,t_items.item_name AS itemName,t_items_img.url AS itemImgUrl,t_items_spec.id AS specId,t_items_spec.`name` AS specName,t_items_spec.price_discount AS priceDiscount,t_items_spec.price_normal AS priceNormalFROMitems_spec t_items_specLEFT JOINitems t_itemsONt_items.id = t_items_spec.item_idLEFT JOINitems_img t_items_imgONt_items_img.item_id = t_items.idWHEREt_items_img.is_main = 1ANDt_items_spec.id IN('1','3','5')
创建VO
package com.shiers.pojo.vo;/*** Demo class** @author shierS* @date 2021/6/1*/public class ShopcartVO {private String itemId;private String itemImgUrl;private String itemName;private String specId;private String specName;private String priceDiscount;private String priceNormal;//get\set...}
编写mapper
<select id="queryItemsBySpecIds" parameterType="List" resultType="com.shiers.pojo.vo.ShopcartVO">SELECTt_items.id AS itemId,t_items.item_name AS itemName,t_items_img.url AS itemImgUrl,t_items_spec.id AS specId,t_items_spec.`name` AS specName,t_items_spec.price_discount AS priceDiscount,t_items_spec.price_normal AS priceNormalFROMitems_spec t_items_specLEFT JOINitems t_itemsONt_items.id = t_items_spec.item_idLEFT JOINitems_img t_items_imgONt_items_img.item_id = t_items.idWHEREt_items_img.is_main = 1ANDt_items_spec.id IN<foreach collection="paramsList" index="index" item="specId" open="(" separator="," close=")">#{specId}</foreach></select>
编写service
@Transactional(propagation = Propagation.SUPPORTS)@Overridepublic List<ShopcartVO> queryItemsBySpecIds(String specIds) {//对前端传入的规格id就行分隔String ids[] = specIds.split(",");List<String> specIdsList = new ArrayList<>();//将数组中的元素全部添加到集合中Collections.addAll(specIdsList,ids);return itemsMapperCustom.queryItemsBySpecIds(specIdsList);}
编写Controller
// 用于用户长时间未登录网站,刷新购物车中的数据(主要是价格),类似京东淘宝@ApiOperation(value = "根据商品规格ids查询最新的商品数据", notes = "根据商品规格ids查询最新的商品数据", httpMethod = "GET")@GetMapping("/refresh")public MyJSONResult refresh(@ApiParam(name = "itemSpecIds", value = "拼接的规格ids", required = true,example = "1001,1003,1005")@RequestParam String itemSpecIds) {if(StringUtils.isBlank(itemSpecIds)){return MyJSONResult.ok();}List<ShopcartVO> list = itemService.queryItemsBySpecIds(itemSpecIds);return MyJSONResult.ok(list);}
