摘要:經(jīng)過(guò)分析和思考,我決定不采用遞歸的方式來(lái)編寫(xiě)樹(shù)形數(shù)據(jù)的處理,最終選用來(lái)維護(hù)樹(shù)節(jié)點(diǎn)之間的關(guān)系。以權(quán)限樹(shù)為例,做一個(gè)樹(shù)形數(shù)據(jù)工具類(lèi)的設(shè)計(jì)。
1.簡(jiǎn)介
? 在一些管理系統(tǒng)中一般都會(huì)用到,會(huì)用到一些樹(shù)形數(shù)據(jù),例如部門(mén)組織以及權(quán)限等數(shù)據(jù),都得生成樹(shù)形數(shù)據(jù),需要寫(xiě)一些樹(shù)形數(shù)據(jù)生成工具,一般使用遞歸的方式,性能低下還可能會(huì)導(dǎo)致爆棧。經(jīng)過(guò)分析和思考,我決定不采用遞歸的方式來(lái)編寫(xiě)樹(shù)形數(shù)據(jù)的處理,最終選用hasMap來(lái)維護(hù)樹(shù)節(jié)點(diǎn)之間的關(guān)系。以權(quán)限樹(shù)為例,做一個(gè)樹(shù)形數(shù)據(jù)工具類(lèi)的設(shè)計(jì)。
2.數(shù)據(jù)庫(kù)表設(shè)計(jì)SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for permission -- ---------------------------- DROP TABLE IF EXISTS `permission`; CREATE TABLE `permission` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT "權(quán)限id", `name` varchar(32) NOT NULL COMMENT "權(quán)限名稱(chēng)", `url` varchar(64) DEFAULT NULL COMMENT "資源url", `type` int(11) NOT NULL COMMENT "權(quán)限類(lèi)型,1:模塊,2:菜單,3:url資源", `parent_id` int(11) NOT NULL DEFAULT "0" COMMENT "上級(jí)資源id", `icon` varchar(64) DEFAULT NULL COMMENT "菜單圖標(biāo)", `sort` int(11) DEFAULT NULL COMMENT "排序", `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "創(chuàng)建時(shí)間", `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "更新時(shí)間", `operator` varchar(32) DEFAULT NULL COMMENT "操作者", `level` int(11) NOT NULL DEFAULT "0", `code` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;3.java Bean設(shè)計(jì)
java bean的設(shè)計(jì)依據(jù)數(shù)據(jù)庫(kù)的表來(lái)進(jìn)行設(shè)計(jì),構(gòu)造方法以及get、set方式使用lombok注解。
package com.lk.permission.common.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; import lombok.experimental.Accessors; import java.util.ArrayList; import java.util.Date; import java.util.List; //@SuppressWarnings("serail") @ToString @NoArgsConstructor @AllArgsConstructor @Data @Accessors(chain = true) public class Permission { /** 權(quán)限ID */ private Integer id; /** 權(quán)限名稱(chēng) */ private String name; /** 權(quán)限編碼 */ private String code; /** 菜單圖標(biāo) */ private String icon; /** 資源類(lèi)型 */ private Integer type; /** 資源地址 */ private String url; /** 層級(jí) */ private Integer level; /** 上層ID */ private Integer parentId; /** 排序 */ private Integer sort; /** 創(chuàng)建時(shí)間 */ private Date createTime; /** 更新時(shí)間 */ private Date updateTime; /** 操作人員 */ private String operator; /** 下級(jí)權(quán)限 */ private List4. 樹(shù)形工具類(lèi)設(shè)計(jì)subPermissions = new ArrayList<>(); }
我只提供一個(gè)實(shí)現(xiàn)思路,具體可根據(jù)自己業(yè)務(wù)實(shí)現(xiàn),通過(guò)hasMap方式,一個(gè)是性能有了較大的提升,另一個(gè)不用擔(dān)心爆棧的風(fēng)險(xiǎn)。下面維護(hù)關(guān)系已經(jīng)給出,可進(jìn)行適當(dāng)?shù)母脑靵?lái)實(shí)現(xiàn)自己具體業(yè)務(wù)需求。
package com.lk.permission.system.service.impl; import com.lk.permission.common.pojo.Permission; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class TreeService { private Map5.實(shí)現(xiàn)的一些測(cè)試效果map; private List permissions; /** * 初始化多叉樹(shù) * @param permissions */ TreeService(List permissions){ this.permissions = permissions; this.map = new HashMap<>(); for (Permission permission : permissions){ this.map.put(permission.getId(),permission); } createTree(); } /** * 創(chuàng)建多叉樹(shù) */ private void createTree(){ for (Permission permission : this.permissions){ if (this.map.containsKey(permission.getParentId())){ this.map.get(permission.getParentId()).getSubPermissions().add(permission); System.out.println(permission.toString()); } } } /** * 根據(jù)層級(jí)獲取多叉樹(shù) * @param level * @return */ List getPermissionsByLevel(Integer level){ return this.permissions.parallelStream().filter(permission -> permission.getLevel() == level).collect(Collectors.toList()); } /** * 根據(jù)樹(shù)的id獲取多叉樹(shù) * @param id * @return */ Permission getPermissionById(Integer id){ return this.map.get(id); } /** * 向多叉樹(shù)添加子節(jié)點(diǎn) * @param permission */ public void addChild(Permission permission){ if (this.map.containsKey(permission.getParentId())){ ((Permission)this.map.get(permission.getParentId())).getSubPermissions().add(permission); } this.map.put(permission.getId(),permission); } }
權(quán)限選擇
樹(shù)形表格
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/75682.html
摘要:二項(xiàng)目中用到的幾個(gè)經(jīng)典的遞歸求的和分析假設(shè)遞歸函數(shù)已經(jīng)寫(xiě)好為,即,就是求的和。遞歸函數(shù)實(shí)現(xiàn)每天凌晨定時(shí)啟動(dòng)定時(shí)器執(zhí)行代碼分析假設(shè)遞歸函數(shù)已經(jīng)寫(xiě)好了。 一、遞歸的概念 在程序中函數(shù)直接或者間接調(diào)用自身的一種方法,就叫做遞歸。它通常把一個(gè)大型復(fù)雜的問(wèn)題轉(zhuǎn)化為一個(gè)與原問(wèn)題相似的規(guī)模較小的問(wèn)題來(lái)求解,遞歸策略只需少量的程序就可描述出解題過(guò)程中所需要的多次重復(fù)計(jì)算,大大減少了程序的代碼了。 二、...
摘要:今天就來(lái)跟大家分享一下工作中用到的幾款插件。是一款功能強(qiáng)大的網(wǎng)頁(yè)調(diào)試與發(fā)送網(wǎng)頁(yè)請(qǐng)求的插件。俗稱(chēng)油猴子,是一款功能非常強(qiáng)大的插件,他包含方便的腳本管理腳本概覽設(shè)置多樣性腳本自動(dòng)更新安全兼容性同步編輯器語(yǔ)法檢查快速開(kāi)發(fā)卸載等功能。 ‘工欲善其事,必先利其器’。優(yōu)秀的開(kāi)發(fā)者不僅體現(xiàn)在其在技術(shù)方面的精通,還體現(xiàn)在其對(duì)各種開(kāi)發(fā)工具的充分了解與使用,這會(huì)讓其開(kāi)發(fā)效率事半功倍。作為一個(gè)前端開(kāi)發(fā)者,平...
摘要:今天就來(lái)跟大家分享一下工作中用到的幾款插件。是一款功能強(qiáng)大的網(wǎng)頁(yè)調(diào)試與發(fā)送網(wǎng)頁(yè)請(qǐng)求的插件。俗稱(chēng)油猴子,是一款功能非常強(qiáng)大的插件,他包含方便的腳本管理腳本概覽設(shè)置多樣性腳本自動(dòng)更新安全兼容性同步編輯器語(yǔ)法檢查快速開(kāi)發(fā)卸載等功能。 ‘工欲善其事,必先利其器’。優(yōu)秀的開(kāi)發(fā)者不僅體現(xiàn)在其在技術(shù)方面的精通,還體現(xiàn)在其對(duì)各種開(kāi)發(fā)工具的充分了解與使用,這會(huì)讓其開(kāi)發(fā)效率事半功倍。作為一個(gè)前端開(kāi)發(fā)者,平...
摘要:今天就來(lái)跟大家分享一下工作中用到的幾款插件。是一款功能強(qiáng)大的網(wǎng)頁(yè)調(diào)試與發(fā)送網(wǎng)頁(yè)請(qǐng)求的插件。俗稱(chēng)油猴子,是一款功能非常強(qiáng)大的插件,他包含方便的腳本管理腳本概覽設(shè)置多樣性腳本自動(dòng)更新安全兼容性同步編輯器語(yǔ)法檢查快速開(kāi)發(fā)卸載等功能。 ‘工欲善其事,必先利其器’。優(yōu)秀的開(kāi)發(fā)者不僅體現(xiàn)在其在技術(shù)方面的精通,還體現(xiàn)在其對(duì)各種開(kāi)發(fā)工具的充分了解與使用,這會(huì)讓其開(kāi)發(fā)效率事半功倍。作為一個(gè)前端開(kāi)發(fā)者,平...
閱讀 1842·2021-09-23 11:21
閱讀 2530·2021-09-07 10:13
閱讀 974·2021-09-02 10:19
閱讀 1200·2019-08-30 15:44
閱讀 1808·2019-08-30 13:18
閱讀 1983·2019-08-30 11:15
閱讀 1265·2019-08-29 17:17
閱讀 2087·2019-08-29 15:31