国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
簡潔常用權(quán)限系統(tǒng)的設(shè)計與實現(xiàn)(一):構(gòu)造權(quán)限菜單樹的N(N>=4)種方法

 權(quán)限系統(tǒng),Web開發(fā)常見標(biāo)準(zhǔn)子系統(tǒng)之一。結(jié)合自己的一些思考和實踐,從本篇開始權(quán)限系統(tǒng)的設(shè)計與實現(xiàn)之路。

 最近,重構(gòu)了項目的權(quán)限菜單構(gòu)造過程,向前端返回json格式的權(quán)限樹。

 這一篇,只是大致介紹下這個問題,并給出4種方法的整體思路,后續(xù)再分別詳細(xì)介紹這4種方法,再往后介紹完整的權(quán)限系統(tǒng)的設(shè)計與實現(xiàn)。

 權(quán)限表的結(jié)構(gòu)
 acl、parent_acl, 最重要的就是這2個字段,有了這2個字段,就可以構(gòu)造一棵樹了。

 前端需要的json格式:

"data":[{

        "acl":1,

        "children":[{

            "acl":11,

            "children":[{

                "acl":111,

            }]

        } 

方法1
   在數(shù)據(jù)庫再增加1個level字段,最頂層的level就是1,每增加一級level增加1。

   先從數(shù)據(jù)庫按照level升序,獲得所有的權(quán)限節(jié)點。
            List<Map<String, Object>> rootList = new ArrayList<Map<String, Object>>(); 
  
           Map<String, Map<String, Object>> rootMap = new HashMap<String, Map<String, Object>>(); 
  
for (遍歷) {
    

創(chuàng)建節(jié)點,加入到根節(jié)點map中

if (頂級節(jié)點) {

加入到rootList中

} else {

獲得父結(jié)點,把自己放到父結(jié)點的children中

}

}

     遍歷結(jié)束,rootList即為所求。

   這種方法是一個同事的思路,關(guān)鍵就是2點,一是維護(hù)level(增加和修改的時候都需要),2是要按照level升序排序。

方法2:數(shù)據(jù)庫不需要level字段,用遞歸來實現(xiàn)。
    
List<Map<String, Object>> finalRootList = new ArrayList<Map<String, Object>>();

List<Map<String, Object>> rootList = findRootList(privilegeList);

List<Map<String, Object>> notRootList = findNotRootList(privilegeList);
               //先找出根節(jié)點,再為這些根節(jié)點構(gòu)造子結(jié)點 

for (Map<String, Object> root : rootList) {

// 構(gòu)造子結(jié)點

buildChildList(root, notRootList);

finalRootList.add(root);

}

    關(guān)鍵代碼buildChildList是個遞歸函數(shù)。
   buildChildList(){
      從所有的非根節(jié)點中,找到當(dāng)前節(jié)點的第1級子結(jié)點,加入到該節(jié)點的children中。
     buildChildList();
  } 

  好處是,不用維護(hù)level字段,增加和修改權(quán)限的時候,既不用維護(hù)level,也不用維護(hù)parent_acl。 


方法3:完全按照方法1的思路,唯一不同的是,數(shù)據(jù)庫不維護(hù)level字段,而是在查詢數(shù)據(jù)出來之后,手動計算每個節(jié)點的level字段,進(jìn)行排序。后面的步驟,和方法1基本一樣。

    因此,這種方法的唯一難點就是,如何計算一顆N叉樹每一個節(jié)點的深度。

方法4: 計算一顆N叉樹每一個節(jié)點的深度,經(jīng)過實踐,至少有2種方法。

a.按照方法2的遞歸思路,再維護(hù)一個level,向child深入一層,level++,返回level--。及時保存當(dāng)前節(jié)點的level,遞歸結(jié)束,level就都計算完成。

b. 參照網(wǎng)上的一種思路,把“無序的Tree格式的List,轉(zhuǎn)化打印出標(biāo)準(zhǔn)格式Treelist”。
  作者也是按照遞歸思路實現(xiàn)的,在這個代碼的基礎(chǔ)上,再維護(hù)1個level,就可以了。

a和b的思路相似的地方是,都在遞歸過程中維護(hù)1個level,不同的地方是,a的方法只單純地計算level,而b不但計算了level,還把節(jié)點排序了。當(dāng)然,a方法也是可以的。 


方法5:這種方法不可行,問題是,存在著重復(fù)計算的可能。
 所有節(jié)點初始level額外i1.
 找到所有的根節(jié)點。

  遍歷每一個節(jié)點,如果發(fā)現(xiàn)自己有父結(jié)點,就把自己的level和所有父節(jié)點的level+1。
  
問題:無法保證多個子結(jié)點,都有子結(jié)點的時候,他們的父結(jié)點,重復(fù)增加了level,而重復(fù)計算的次數(shù)很難去統(tǒng)計。 


小雷FansUnion-博學(xué)的互聯(lián)網(wǎng)技術(shù)工作者,提供付費的IT咨詢服務(wù)
2014年11月17日

湖北-武漢-循禮門 

原文首發(fā):http://fansunion.cn/article/detail/566.html

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
二叉樹的Python實現(xiàn)
Hibernate多表查詢結(jié)果處理 - 51CTO.COM
hibernate調(diào)用存儲過程及處理返回集合
如何在SAP Cloud for Customer自定義BO中創(chuàng)建訪問控制
【VS調(diào)試】C#讀寫Windows 7注冊表時拋出“不允許所請求的注冊表訪問權(quán)”的解決辦法
【轉(zhuǎn)】并查集路徑壓縮
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服