商品详情页面展示——淘淘商城(二十二)

原创 2018年04月15日 12:18:27

商品信息服务发布

需求

  • 提供三个接口,分别提供商品基本信息、商品描述、商品参数,并设置缓存时间为1天。
  • 在taotao-rest中开发。
  • 商品基本信息:
    • 请求url:/item/base/{itemId}
    • 请求参数:url中的商品id
    • 响应信息:TaoTaoResult,包含商品基本信息。
  • 商品描述:
    • 请求url:/item/desc/{itemId}
    • 请求参数:url中的商品id
    • 响应信息:TaoTaoResult,包含商品描述。
  • 商品基本信息:
    • 请求url:/item/param/{itemId}
    • 请求参数:url中的商品id
    • 响应信息:TaoTaoResult,包含商品参数。

Service层

  • 在redis.properties中设置redis相关参数。
    • 商品基本信息在redis中缓存的key格式为:REDIS_ITEM_KEY:商品id:ITEM_BASE_KEY。
    • 这种以 : 分隔的key能够有层次的表示redis中的数据,并且弥补hash类型不能设置国企时间的缺陷。
      9.rediskey.png
    • 商品描述和参数的key格式类似。
#商品的key
REDIS_ITEM_KEY=item
#商品基础信息的key
ITEM_BASE_KEY=base
#商品描述的key
ITEM_DESC_KEY=desc
#商品参数的key
ITEM_PARAM_KEY=param

#商品过期时间
REDIS_ITEM_EXPIRE=86400
  • 创建ItemService和对应实现类,根据id获取商品基本信息、描述、参数,并使用TaoTaoResult包装。
    • 注意缓存的读取和写入,以及过期时间的设置。
@Service
public class ItemServiceImpl implements ItemService {

    @Autowired
    private TbItemMapper itemMapper;
    @Autowired
    private TbItemDescMapper itemDescMapper;
    @Autowired
    private TbItemParamItemMapper itemParamItemMapper;
    @Autowired
    private RedisDao redisDao;

    @Value("${REDIS_ITEM_KEY}")
    private String REDIS_ITEM_KEY;
    @Value("${ITEM_BASE_KEY}")
    private String ITEM_BASE_KEY;
    @Value("${ITEM_DESC_KEY}")
    private String ITEM_DESC_KEY;
    @Value("${ITEM_PARAM_KEY}")
    private String ITEM_PARAM_KEY;


    @Value("${REDIS_ITEM_EXPIRE}")
    private Integer REDIS_ITEM_EXPIRE;


    @Override
    public TaotaoResult getItemBaseInfo(long itemId) {
        //该商品redis中商品基本信息对应的key
        String key = REDIS_ITEM_KEY + ":" + itemId + ":" + ITEM_BASE_KEY;

        //缓存中读取
        try {
            String json = redisDao.get(key);
            if (!StringUtils.isBlank(json)) {
                TbItem item = JsonUtils.jsonToPojo(json, TbItem.class);
                return TaotaoResult.ok(item);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        //查询基本信息
        TbItem item = itemMapper.selectByPrimaryKey(itemId);

        //写入缓存
        try {
            redisDao.set(key, JsonUtils.objectToJson(item));
            redisDao.expire(key, REDIS_ITEM_EXPIRE);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return TaotaoResult.ok(item);
    }

    @Override
    public TaotaoResult getItemDesc(long itemId) {
        //该商品redis中商品描述对应的key
        String key = REDIS_ITEM_KEY + ":" + itemId + ":" + ITEM_DESC_KEY;

        //读取缓存
        try {
            String json = redisDao.get(key);
            if (!StringUtils.isBlank(json)) {
                TbItemDesc itemDesc = JsonUtils.jsonToPojo(json, TbItemDesc.class);
                return TaotaoResult.ok(itemDesc);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        //查询基本信息
        TbItemDesc itemDesc = itemDescMapper.selectByPrimaryKey(itemId);

        //写入缓存
        try {
            redisDao.set(key, JsonUtils.objectToJson(itemDesc));
            redisDao.expire(key, REDIS_ITEM_EXPIRE);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return TaotaoResult.ok(itemDesc);
    }

    @Override
    public TaotaoResult getItemParam(long itemId) {
        //该商品redis中商品参数对应的key
        String key = REDIS_ITEM_KEY + ":" + itemId + ":" + ITEM_PARAM_KEY;

        //读取缓存
        try {
            String json = redisDao.get(key);
            if (!StringUtils.isBlank(json)) {
                TbItemParamItem itemParamItem = JsonUtils.jsonToPojo(json, TbItemParamItem.class);
                return TaotaoResult.ok(itemParamItem);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        //查询基本信息
        TbItemParamItem itemParamItem = null;

        TbItemParamItemExample example = new TbItemParamItemExample();
        Criteria criteria = example.createCriteria();
        criteria.andItemIdEqualTo(itemId);
        List<TbItemParamItem> list = itemParamItemMapper.selectByExampleWithBLOBs(example);
        if (list != null && list.size() > 0) {
            itemParamItem = list.get(0);
        }

        //写入缓存
        try {
            redisDao.set(key, JsonUtils.objectToJson(itemParamItem));
            redisDao.expire(key, REDIS_ITEM_EXPIRE);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return TaotaoResult.ok(itemParamItem);
    }

}

Controller层

  • 创建ItemController,提供根据id访问基本信息、描述、参数的接口,返回包含它们的json。
@Controller
@RequestMapping("/item")
public class ItemController {

    @Autowired
    private ItemService itemService;

    @RequestMapping("/base/{itemId}")
    @ResponseBody
    public TaotaoResult getItemBaseInfo(@PathVariable Long itemId) {
        TaotaoResult result = itemService.getItemBaseInfo(itemId);
        return result;
    }

    @RequestMapping("/desc/{itemId}")
    @ResponseBody
    public TaotaoResult getItemDesc(@PathVariable Long itemId) {
        TaotaoResult result = itemService.getItemDesc(itemId);
        return result;
    }

    @RequestMapping("/param/{itemId}")
    @ResponseBody
    public TaotaoResult getItemParam(@PathVariable Long itemId) {
        TaotaoResult result = itemService.getItemParam(itemId);
        return result;
    }

}

调用服务展示商品信息

需求

分析

  • 搜索商品之后,点击链接,可展示商品详情页面,初始时包含商品基本信息。
    9.searchresult.png
  • item.jsp中,基本信息直接由jsp加载。
    9.base.png
  • 商品描述和参数由ajax加载。
    • 商品参数通过绑定点击事件,按需加载。
    • 商品描述是用定时器,延时1s加载。
      9.paramdesc.png
      9.paramdescadd.png

总结

  • 在taotao-portal中开发。
  • 商品基本信息:
    • 请求url:/item/{itemId}
    • 请求参数:商品id
    • 响应参数:商品详情页视图item.jsp,包含商品基本信息。
  • 商品描述:
    • 请求url:/item/desc/{itemId}
    • 请求参数:商品id
    • 响应参数:商品描述字符串。
  • 商品基本信息:
    • 请求url:/item/param/{itemId}
    • 请求参数:商品id
    • 响应参数:商品参数字符串(包含html片段)。

Service层

  • rest.properties中配置服务层需要调用的url。
#商品基本信息url
ITEM_BASE_URL=/item/base/
#商品描述url
ITEM_DESC_URL=/item/desc/
#商品参数url
ITEM_PARAM_URL=/item/param/
  • 创建ItemService和对应实现类,根据商品id,调用rest服务,组织数据返回商品信息、描述、参数。
@Service
public class ItemServiceImpl implements ItemService {

    @Value("${REST_BASE_URL}")
    private String REST_BASE_URL;
    @Value("${ITEM_BASE_URL}")
    private String ITEM_BASE_URL;
    @Value("${ITEM_DESC_URL}")
    private String ITEM_DESC_URL;
    @Value("${ITEM_PARAM_URL}")
    private String ITEM_PARAM_URL;

    @Override
    public Item getItemBase(long itemId) {
        try {
            String json = HttpClientUtil.doGet(REST_BASE_URL + ITEM_BASE_URL + itemId);
            if (!StringUtils.isBlank(json)) {
                TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, TbItem.class);
                if (taotaoResult.getStatus() == 200) {
                    TbItem tbItem = (TbItem) taotaoResult.getData();

                    Item item = new Item();
                    item.setImage(tbItem.getImage());
                    item.setId(String.valueOf(tbItem.getId()));
                    item.setPrice(tbItem.getPrice());
                    item.setSellPoint(tbItem.getSellPoint());
                    item.setTitle(tbItem.getTitle());

                    return item;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;

    }

    @Override
    public String getItemDesc(Long itemId) {
        try {
            String json = HttpClientUtil.doGet(REST_BASE_URL + ITEM_DESC_URL + itemId);
            if (!StringUtils.isBlank(json)) {
                TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, TbItemDesc.class);
                if (taotaoResult.getStatus() == 200) {
                    TbItemDesc itemDesc = (TbItemDesc) taotaoResult.getData();
                    String desc = itemDesc.getItemDesc();
                    return desc;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;

    }

    @Override
    public String getItemParam(Long itemId) {
        try {
            String json = HttpClientUtil.doGet(REST_BASE_URL + ITEM_PARAM_URL + itemId);
            if (!StringUtils.isBlank(json)) {
                TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, TbItemParamItem.class);
                if (taotaoResult.getStatus() == 200) {
                    TbItemParamItem itemParamItem = (TbItemParamItem) taotaoResult.getData();
                    String paramData = itemParamItem.getParamData();

                    //生成html
                    List<Map> jsonList = JsonUtils.jsonToList(paramData, Map.class);
                    StringBuffer sb = new StringBuffer();
                    sb.append(
                            "<table cellpadding=\"0\" cellspacing=\"1\" width=\"100%\" border=\"0\" class=\"Ptable\">\n");
                    sb.append("    <tbody>\n");
                    for (Map m1 : jsonList) {
                        sb.append("        <tr>\n");
                        sb.append("            <th class=\"tdTitle\" colspan=\"2\">" + m1.get("group") + "</th>\n");
                        sb.append("        </tr>\n");
                        List<Map> list2 = (List<Map>) m1.get("params");
                        for (Map m2 : list2) {
                            sb.append("        <tr>\n");
                            sb.append("            <td class=\"tdTitle\">" + m2.get("k") + "</td>\n");
                            sb.append("            <td>" + m2.get("v") + "</td>\n");
                            sb.append("        </tr>\n");
                        }
                    }
                    sb.append("    </tbody>\n");
                    sb.append("</table>");
                    //返回html片段
                    return sb.toString();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return "";

    }
}

Controller层

  • 创建ItemController,在item视图中赋予商品基本信息的对象,并提供描述和参数的查询接口。
@Controller
@RequestMapping("/item")
public class ItemController {

    @Autowired
    private ItemService itemService;

    @RequestMapping("/{itemId}")
    public String showItem(@PathVariable Long itemId, Model model) {
        Item item = itemService.getItemBase(itemId);
        model.addAttribute("item", item);
        return "item";
    }

    @RequestMapping(value = "/desc/{itemId}", produces = MediaType.TEXT_HTML_VALUE + ";charset=utf-8")
    @ResponseBody
    public String getItemDesc(@PathVariable Long itemId) {
        String string = itemService.getItemDesc(itemId);
        return string;
    }

    @RequestMapping(value = "/param/{itemId}", produces = MediaType.TEXT_HTML_VALUE + ";charset=utf-8")
    @ResponseBody
    public String getItemParam(@PathVariable Long itemId) {
        String string = itemService.getItemParam(itemId);
        return string;
    }
}

运行工程

  • 启动portal,rest,search,solr,nginx,从搜索结果点击商品链接。
  • 商品基本信息。
    9.itembase.png
  • 商品描述。
    9.itemdesc.png
  • 商品参数。
    9.param.png
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40369829/article/details/79948164

淘淘商城系列——实现商品详情页面展示

我相信大家通过上文的学习已经搭建好了商品详情页面展示工程,本文我将带领大家一起实现商品详情页面展示。 首先我们来看一下商品详情页面代码,可以看到商品一般属性在TbItem实体类中都是存在的,只是图片...
  • yerenyuan_pku
  • yerenyuan_pku
  • 2017-06-11 01:35:02
  • 2565

学习淘淘商城第六十四课(实现商品详情页面展示)

上节课我们一起学习了搭建商品详情工程,这节课我们一起实现商品详情展示。         首先来看一下商品详情页面代码,可以看到商品一般属性在tbItem实体类中都是存在的,只是图片需要特殊处理,因为...
  • u012453843
  • u012453843
  • 2017-05-14 17:38:15
  • 1080

淘淘商城系列——商品详情页面静态化方案分析

我们要做到网页静态化,那么就需要有一套方案来操作。 首先我们来考虑一下输出文件的名称(即静态网页的名称),要知道每个商品的详情页面都是不一样的,因此我们最好把商品的ID加”.html”作为静态网页的...
  • yerenyuan_pku
  • yerenyuan_pku
  • 2017-06-11 21:36:06
  • 2090

淘淘商城系列——搭建商品详情页面展示工程

从淘淘商城的系统架构上来说,其实商品详情展示与搜索系统都是独立的表现层工程。我们以京东为例,当我们搜索到某商品后,点击那个商品链接,进入商品详情页面时,可以在浏览器地址栏看到”item.jd.com”...
  • yerenyuan_pku
  • yerenyuan_pku
  • 2017-06-10 23:29:51
  • 1492

淘淘商城系列——查询商品详情添加缓存分析

通过上文的学习,我相信大家一定实现了商品详情页面展示,接下来我们将学习如何在商品详情页面展示时添加缓存。 因为查询商品详情涉及到查询数据库,当网站访问量很大时,查询商品详情都去查询数据库的话,数据库...
  • yerenyuan_pku
  • yerenyuan_pku
  • 2017-06-11 11:26:29
  • 1570

学习淘淘商城第九十七课(商品详情页面对加入购物车进行改造)

我们访问淘淘商城首页(前提是启动了所有的服务及工程,虽然有个别工程用不上,不过也没关系),在搜索框中输入要搜索的商品,我以前添加过"金立M2017"这款手机,我就搜索它。          搜索到...
  • u012453843
  • u012453843
  • 2017-06-11 22:27:29
  • 1113

淘淘商城系列——商品详情页面对加入购物车进行改造

在上文中,我就讲过,关于购物车模块,京东和淘宝并不一样,京东允许用户在没有登录的情况下就添加商品进购物车,而且加到购物车里面的商品可以一直保存着。这其实是把购物车信息写入到了Cookie中,如果清空了...
  • yerenyuan_pku
  • yerenyuan_pku
  • 2017-06-16 01:25:13
  • 2773

淘淘商城系列——展示购物车商品列表

通过上文的学习,想必大家都已经实现了添加购物车的功能,本文我们将一起实现展示购物车商品列表的功能。 我们访问淘淘商城首页(前提是启动了所有的服务及工程,虽然有个别工程用不上,不过也没关系),点击“去...
  • yerenyuan_pku
  • yerenyuan_pku
  • 2017-06-16 18:27:50
  • 2369

学习淘淘商城第七十四课(学习nginx配置及举例使用端口、域名来区分不同的虚拟主机)

上节课我们一起学习了nginx的安装,这节课我们简单学习下nginx的配置文件。          nginx的配置文件所在的位置如下图所示。          我们使用vi nginx.conf...
  • u012453843
  • u012453843
  • 2017-05-21 12:25:32
  • 775

框架 day81 涛涛商城项目-实现首页搜索功能,商品详情,描述,规格展示

淘淘商城第九天                                      讲师:入云龙 今天的内容: 1、在taotao-portal工程中调用taotao-search工程发...
  • opopopwqwqwq
  • opopopwqwqwq
  • 2017-01-01 00:51:57
  • 1935
收藏助手
不良信息举报
您举报文章:商品详情页面展示——淘淘商城(二十二)
举报原因:
原因补充:

(最多只允许输入30个字)