分類管理模塊

功能: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     }
View Code

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     }
View Code

 

掌握: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     }
View Code
相關文章
相關標籤/搜索