分析需求
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中方法做的,就能開展我們的需求了
願景