概述
在开发电商项目时,我们需要实现一个最基本的功能:点击商品的图片,打开商品详情页面。其中,商品页面分为三大部分:
a) 商品基本信息
b) 延迟加载商品详情。延迟一秒加载使用ajax
c) 商品的规格参数。按需加载,当用户点击商品规格参数tab页,加载ajax。
1.功能分析
1、Taotao-portal接收页面请求,接收到商品id。
2、调用taotao-rest提供的商品详情的服务,把商品id作为参数传递给服务。接收到商品详细详细。
3、渲染结果,展示商品详细页面
4、为了提高响应速度,商品详情页的内容需要分步骤加载。
第一步:先展示商品基本信息,例如商品的名称、图片、价格。
第二步:展示商品的描述,此时商品页面已经展示完毕,需要ajax请求商品描述。展示的时机是页面加载完毕后一秒钟。
第三步:展示商品规格。当用户点击商品规格选项卡时展示。使用ajax请求商品规格。
5、在搜索页面点击商品的图片或者商品名称请求商品详情页面。
商品详情页请求的url:/item/{itemId}.html
商品描述请求的url:/item/desc/{itemId}.html
商品规格请求的url:/item/param/{itemId}.html
2.处理流程
3.taotao-rest服务发布
需要在taotao-rest工程中发布服务
1、取商品基本信息的服务
2、取商品描述的服务
3、取商品规格的服务
由于商品详情也是客户经常访问的,需要把商品信息添加到缓存中。Redis是内存数据库也属于稀缺资源,所以不应该永久占用,所以要设置过期时间。过期时间为一天。需要缓存同步。
3.1添加缓存逻辑
Redis的hash类型中的key是不能设置过期时间。如果还需要对key进行分类可以使用折中的方案。
Key的命名方式:XXXX:xxxx:~~~~
这样存放在redis中,当我们用可视化客户端时就会以文件夹形式存储
因此,在配置文件resource.properties添加url
#商品基本信息url
ITEM_INFO_URL=/item/info/
#商品描述url
ITEM_DESC_URL=/item/desc/
#商品规格参数url
ITEM_PARAM_URL=/item/param/
3.2Dao层
因为都是单表查询所以使用逆向工程生成的mapper文件即可。
tb_item
tb_item_desc
tb_item_param_item
3.3Service层
@Service
public class ItemServiceImpl implements ItemService {
@Autowired
private TbItemMapper itemMapper;
@Autowired
private TbItemDescMapper itemDescMapper;
@Autowired
private TbItemParamItemMapper itemParamItemMapper;
@Value("${REDIS_ITEM_KEY}")
private String REDIS_ITEM_KEY;
@Value("${REDIS_ITEM_EXPIRE}")
private Integer REDIS_ITEM_EXPIRE;
@Autowired
private JedisClientSingle jedisClientSingle;
@Override
public TaotaoResult getItemBaseInfo(long itemId) {
//添加缓存逻辑
try {
//从缓存中取商品信息,商品id对应的信息
String json = jedisClientSingle.get(REDIS_ITEM_KEY+":"+itemId+":base");
if(!StringUtils.isBlank(json)) {
//把json转换成java对象
TbItem item = JsonUtils.jsonToPojo(json, TbItem.class);
return TaotaoResult.ok(item);
}
} catch (Exception e) {
e.printStackTrace();
}
//根据商品id查询商品信息
TbItem item = itemMapper.selectByPrimaryKey(itemId);
//把商品信息写入缓存
try {
jedisClientSingle.set(REDIS_ITEM_KEY+":"+itemId+":base", JsonUtils.objectToJson(item));
//设置key的有效期
jedisClientSingle.expire(REDIS_ITEM_KEY+":"+itemId+":base", REDIS_ITEM_EXPIRE);
} catch (Exception e) {
e.printStackTrace();
}
return TaotaoResult.ok(item);
}
@Override
public TaotaoResult getItemDesc(long itemId) {
//添加缓存
try {
//添加缓存逻辑
//从缓存中取商品信息,商品id对应的信息
String json = jedisClientSingle.get(REDIS_ITEM_KEY + ":" + itemId + ":desc");