分析需求
1.通过spring data solr提供的分组查询完成商品分类列表的查询
2.将品牌数据和规格数据进行缓存(后台操作),从缓存数据中读取数据显示在面板上
3.查询面板的条件构建与撤消操作是前端来负责做这件事(angularJS处理)
4.spring data solr的过滤功能
实现过程
下面的分析主要体现在其后台的数据怎么获取,怎么实现的具体实现的细节来实现的,而且是重点的讲解的是其思想,像前端的展示和solrTemplate的具体的api的调用,就不在详解,后台程序员就做点本职工作嘛,嘿嘿
数据流和数据建模分析
正如建哥语重心肠的讲到一般高手都是玩数据流的,哈哈,咱也不是高手,那怎么就从数据流入手,明白咱们前台需要展示什么数据,咱们后台写实现就完了,经过分析就是一个map集合,里面对应了不同添加的key和value信息,比如品牌信息,规格信息之类的
商品分类的实现
这里主要是通过solr里面的solrTemplate的分组方法实现其相关的分组信息,这里菜鸡就不多讲了,直接贴出代码,具体实现是相关api的调用,我反正自己手写不出来,哈哈
//根据指定搜索关键字,获取对应分类 分组查询(商品分类列表)
private List searchCategoryList(Map searchMap){
List listReturn=new ArrayList();
//1、创建查询器对象
SimpleQuery query = new SimpleQuery();
//2、创建查询条件对象
Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
query.addCriteria(criteria);
//3、设置分组字段 分组配置项对象
GroupOptions groupOptions = new GroupOptions().addGroupByField("item_category");
//关联到查询器对象
query.setGroupOptions(groupOptions);
//4、发出查询 分组查询其相关的信息
GroupPage<TbItem> groupPage = solrTemplate.queryForGroupPage(query, TbItem.class);
//5、获取分组入口 分组结果对象
GroupResult<TbItem> groupResult = groupPage.getGroupResult("item_category");
//6、针对分组字段item_category分组封装,获取对应对象
Page<GroupEntry<TbItem>> groupEntries = groupResult.getGroupEntries();
//7、获取分组封装
List<GroupEntry<TbItem>> list = groupEntries.getContent();
//8、遍历封装集合 显然是将分组的结果添加到返回值中
for (GroupEntry<TbItem> entry : list) {
listReturn.add(entry.getGroupValue());
}
return listReturn;
}
商品品牌和规格的实现
问题引出:
我们搜索出了商品分类信息,然后给我们反馈出了商品的品牌和商品的规格,这是为什么呢?这三者有什么关系呢?我们怎么实现这种特效呢?我们要查询出来呢?
个人分析
1.首先这是一个比较重要的搜索条件,客户点击的次数比较频繁,我们不妨将其写在redis中,这样就能加快用户的访问效率
2.我们要分析数据表,怎么来实现的过程,我们只有分析了数据表之间的关系才能得到结论,我们自然而然找到了item_cat表,这里面有个字段name是商品分类的信息,其对应的有一个外键type_id,恰好是tpye_template的主键,这样我们就能对应这里面的信息,这样就能够达到我们点击商品信息,下面的商品品牌和规格的实现
3.我们不妨使用redis中的Key Value 的形式来实现其相对应的信息
判断其相关的redis中存储的数据
3.1.根据商品分类名称(key)来查询模板表(商品ID)(value) 第一组key value
3.2.根据模板ID(key)缓存模板表的品牌列表(value) 第二组key value
3.3.根据模板ID(key)来缓存模板表的规格列表(value) 第三组key value
我们这样写就可以实现了其商品的品牌和规格在redis中的缓存
/**
* 根据父类的id来查询商品信息
* @param parentId 父类的id
* @return 返回对应的集合的数据
*/
public List<TbItemCat> findByParentId(Long parentId) {
TbItemCatExample example = new TbItemCatExample();
TbItemCatExample.Criteria criteria = example.createCriteria();
criteria.andParentIdEqualTo(parentId);
//每次执行查询的时候,一次性读取缓存进行存储 (因为每次增删改都要执行此方法)
//将模板Id放入缓存中去执行 (商品名称作为key,商品ID作为value)
List<TbItemCat> list = findAll();
System.out.println(list.get(0).getName()+"****");
for(TbItemCat itemCat:list){
//显示是商品的hash表做数据存储的,可以根据key获取其value值
redisTemplate.boundHashOps("itemCat").put(itemCat.getName(), itemCat.getTypeId());
}
System.out.println("更新缓存:商品分类表");
return itemCatMapper.selectByExample(example);
}
/**
* 将数据存入缓存
*/
private void saveToRedis(){
//获取模板数据
List<TbTypeTemplate> typeTemplateList = findAll();
System.out.println("!!!!!!!!!!"+typeTemplateList);
//循环模板
for(TbTypeTemplate typeTemplate :typeTemplateList){
//存储品牌列表
List<Map> brandList = JSON.parseArray(typeTemplate.getBrandIds(), Map.class);
redisTemplate.boundHashOps("brandList").put(typeTemplate.getId(), brandList);
//存储规格列表
List<Map> specList = findSpecList(typeTemplate.getId());//根据模板ID查询规格列表、包括规格选项
redisTemplate.boundHashOps("specList").put(typeTemplate.getId(), specList);
}
}
4.到此为止我们所需要的前台的展示的数据就除了分页的就全部得到,后面就是api中方法做的,就能开展我们的需求了
愿景