構(gòu)的處理)
文章目錄數(shù)據(jù)庫組裝樹如果某個節(jié)點缺失如何判斷呢?如何遷移?授權(quán)時的樹和查詢時是不一樣的樹結(jié)構(gòu)很常見例如組織結(jié)構(gòu)菜單等所以必須會套路。數(shù)據(jù)庫至少要包含以下幾個主要字段idparent_idlevel # 層級leaf_flag # 是否葉子節(jié)點CREATETABLEsys_tree_node(idbigint(20)NOTNULLAUTO_INCREMENTCOMMENT主鍵ID,parent_idbigint(20)DEFAULT0COMMENT父節(jié)點ID根節(jié)點默認為0,ancestorsvarchar(500)DEFAULTCOMMENT祖級列表例如0,100,200,node_namevarchar(100)NOTNULLCOMMENT節(jié)點名稱,node_codevarchar(100)DEFAULTCOMMENT節(jié)點編碼用于業(yè)務(wù)關(guān)聯(lián)如部門編碼、菜單標識,node_typetinyint(4)DEFAULT1COMMENT節(jié)點類型如1-公司, 2-部門, 3-崗位,levelint(11)DEFAULT1COMMENT層級深度根節(jié)點為1,leaf_flagtinyint(1)DEFAULT0COMMENT是否葉子節(jié)點0-否, 1-是,sort_orderint(11)DEFAULT0COMMENT顯示排序,statustinyint(4)DEFAULT1COMMENT狀態(tài)0-停用, 1-正常,del_flagtinyint(1)DEFAULT0COMMENT刪除標志0-正常, 1-已刪除,create_byvarchar(64)DEFAULTCOMMENT創(chuàng)建者,create_timedatetimeDEFAULTCURRENT_TIMESTAMPCOMMENT創(chuàng)建時間,update_byvarchar(64)DEFAULTCOMMENT更新者,update_timedatetimeDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT更新時間,remarkvarchar(500)DEFAULTNULLCOMMENT備注,PRIMARYKEY(id),KEYidx_parent_id(parent_id),KEYidx_ancestors(ancestors))ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENT通用樹結(jié)構(gòu)表;組裝樹有各種方法例如層推法等等。比較好的是所有節(jié)點放到一個map里然后快速遍歷。代碼publicListTreeNodebuildTree(ListTreeNodeflatList){// 1. 將扁平列表轉(zhuǎn)為 MapKey 為節(jié)點 ID實現(xiàn) O(1) 查找MapLong,TreeNodenodeMapflatList.stream().collect(Collectors.toMap(TreeNode::getId,node-node));ListTreeNoderootsnewArrayList();// 2. 遍歷組裝找到每個節(jié)點的父節(jié)點并掛載上去for(TreeNodenode:flatList){if(node.getParentId()null||node.getParentId()0){// 頂級節(jié)點根節(jié)點直接加入結(jié)果集roots.add(node);}else{// 非根節(jié)點通過 Map 快速找到父節(jié)點并加入其 children 列表TreeNodeparentnodeMap.get(node.getParentId());if(parent!null){parent.getChildren().add(node);}}}returnroots;}這種寫法不僅時間復(fù)雜度僅為 O(n)而且代碼邏輯非常清晰。如果某個節(jié)點缺失如何判斷呢?分不同情況例如某個葉子節(jié)點缺失那確實發(fā)現(xiàn)不了。如果某個上級節(jié)點缺失容易發(fā)現(xiàn)如果node有parentId但是沒在map中也沒在數(shù)據(jù)庫中那可以報錯該節(jié)點找不到上級節(jié)點。如何遷移?例如A公司下有3層100個公司遷移到另外一個中心要做什么?方案很明確1、只需要修改A公司的parentId因為其他子節(jié)點的parentId不變。2、level也需要刷新但是要用優(yōu)雅的方式先計算層級差例如原來A公司level3現(xiàn)在level2那么所有子節(jié)點的level1。A公司及所有子節(jié)點查出來level1后批量入庫即可速度很快。授權(quán)時的樹和查詢時是不一樣的授權(quán)時是整個樹結(jié)構(gòu)(不能只展示已授權(quán)機構(gòu)否則怎么加權(quán)限)通過復(fù)選框?qū)崿F(xiàn)授權(quán)和取消授權(quán)。查詢時可以采用平面結(jié)構(gòu)判斷起來更方便。