功能:html
1.增長分類前端
2.修改分類名字算法
3.獲取當前子分類session
4.獲取當前分類的全部子分類(遞歸獲取)數據結構
controller層實現:app
1 @RequestMapping(value = "get_category_and_deep_children_category.do", method = RequestMethod.POST) 2 @ResponseBody 3 public ServerResponse getCategoryAndDeepChildrenCategory(HttpServletRequest request, @RequestParam(value = "categoryId", defaultValue = "0") Integer categoryId) { 4 // User user = (User) session.getAttribute(Const.CURRENT_USER); 5 6 String loginToken = CookieUtil.readLoginToken(request); 7 if(StringUtils.isEmpty(loginToken)) { 8 return ServerResponse.createByErrorMessage("用戶未登陸,沒法獲取當前用戶的信息"); 9 } 10 String userJsonStr = RedisShardedPoolUtil.get(loginToken); 11 User user = JsonUtil.string2Obj(userJsonStr, User.class); 12 13 if(user == null) { 14 return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "用戶未登陸,請登陸"); 15 } 16 if(iUserService.checkAdminRole(user).isSuccess()) { 17 //查詢當前結點的id和遞歸子結點的id 18 return iCategoryService.selectCategoryAndChildrenById(categoryId); 19 } 20 else { 21 return ServerResponse.createByErrorMessage("無權限操做,須要管理員權限"); 22 } 23 //所有經過攔截器驗證是否登陸以及權限 24 //return iCategoryService.selectCategoryAndChildrenById(categoryId); 25 }
service層實現:ide
根據傳入的分類id,遞歸查詢其全部的子分類,根據每一層查詢出來的全部子分類節點,再對這些節點進行深刻的遞歸調用,至關於DFS,對於每次查出來的子分類節點,將其加入set集合中,將set集合返回便可。在對外開放的public方法中,將set集合轉爲list返回給前端進行顯示。函數
1 public ServerResponse<List<Integer>> selectCategoryAndChildrenById(Integer categoryId) { 2 Set<Category> categorySet = Sets.newHashSet(); 3 //調用遞歸函數,將set初始化放入參數中 4 findChildrenCategory(categorySet, categoryId); 5 //建立返回list 6 List<Integer> categoryIdList = Lists.newArrayList(); 7 //若是id不爲空,說明有返回結點,則將遞歸查到的全部id都加入到list中而後返回 8 if(categoryId != null) { 9 for(Category categoryItem : categorySet) { 10 categoryIdList.add(categoryItem.getId()); 11 } 12 } 13 return ServerResponse.createBySuccess(categoryIdList); 14 } 15 //遞歸算法,算出子結點 16 //set集合不容許重複值 17 private Set<Category> findChildrenCategory(Set<Category> categorySet, Integer categoryId) { 18 //根據id查category對象 19 Category category = categoryMapper.selectByPrimaryKey(categoryId); 20 if(category != null) { 21 //將查找出來的category對象加入set集合中 22 categorySet.add(category); 23 } 24 //查找子結點,遞歸算法必定要有一個退出的條件 25 List<Category> categoryList = categoryMapper.selectCategoryChildrenByParentId(categoryId); 26 for(Category categoryItem : categoryList) { 27 //遞歸調用 28 findChildrenCategory(categorySet, categoryItem.getId()); 29 } 30 //將set集合返回 31 return categorySet; 32 }
掌握:this
1.如何設計及封裝無限層級的樹狀數據結構spa
設置parent_id字段,實現每個分類節點都有父節點,也就實現了樹狀結構。
2.遞歸算法的設計思想
3.如何處理複雜對象的排重
使用set進行排重,須要重寫加入set集合的對象的hashCode()和equals()方法。
4.重寫hashCode和equals的注意思想
須要同時重寫hashCode()和equals()方法。
1 //重寫equals和hashCode方法來進行排重,而且保證二者的判斷因子是同樣的,例如這裏都利用id判斷 2 //equals和hashCode關係:若是兩個對象相同,即用equlas比較返回true,則他們的hashCode值必定要相同 3 //若是兩個對象的hashCode相同,他們並不必定相同,即hashCode相同,用equlas比較也可能返回false,爲何? 4 //由於hashCode只是取了id的hashCode做爲一個因子,而咱們的equals中能夠把其餘屬性放入綜合斷定是否相同 5 @Override 6 public boolean equals(Object o) { 7 if (this == o) return true; 8 if (o == null || getClass() != o.getClass()) return false; 9 10 Category category = (Category) o; 11 12 return !(id != null ? !id.equals(category.id) : category.id != null); 13 14 } 15 16 @Override 17 public int hashCode() { 18 return id != null ? id.hashCode() : 0; 19 }