03【若依框架解讀】Tree樹形結構的控制(選單,部門)
背景
若依管理框架中包含了不少選單樹和許可權樹的控制,主要實現的方式是遞迴,比較容易閱讀和理解。構建屬性結構本身是開發中非常常見的場景。掌握後非常容易在工作中使用。
屬性結構控制
- 後端返回列表,前端控制
- 後端直接返回
處理方法
1. 根據角色獲取部門
介面:/roleDeptTreeselect/{roleId}
查詢角色具有的部門許可權
deptCheckStrictly模式下只查詢子選單
<select id="selectDeptListByRoleId" resultType="Integer">
select d.dept_id
from sys_dept d
left join sys_role_dept rd on d.dept_id = rd.dept_id
where rd.role_id = #{roleId}
<if test="deptCheckStrictly">
and d.dept_id not in (select d.parent_id from sys_dept d inner join sys_role_dept rd on d.dept_id = rd.dept_id and rd.role_id = #{roleId})
</if>
order by d.parent_id, d.order_num
</select>
2. 獲取部門下拉樹
介面:/system/dept/treeselect
step1 : 獲取部門列表
List<SysDept> depts = deptService.selectDeptList(dept);
step2: 構建樹形結構(重點)
deptService.buildDeptTreeSelect(depts)
生成樹形結構
- 獲取傳入部門列表中的頂級部門
- 遍歷頂級部門獲取每個部門的子部門列表
- 獲取子部門列表
- 遞迴遍歷子部門列表,獲取每個子部門的子部門列表
- 退出條件:當前部門沒有子部門
/**
* 構建前端所需要樹結構
*
* @param depts 部門列表
* @return 樹結構列表
*/
@Override
public List<SysDept> buildDeptTree(List<SysDept> depts)
{
List<SysDept> returnList = new ArrayList<SysDept>();
//儲存所有的dept_id
List<Long> tempList = new ArrayList<Long>();
for (SysDept dept : depts)
{
tempList.add(dept.getDeptId());
}
for (Iterator<SysDept> iterator = depts.iterator(); iterator.hasNext();)
{
SysDept dept = (SysDept) iterator.next();
// 如果是頂級節點, 遍歷該父節點的所有子節點
<!--// 如果一個部門的父節點不在templist中,說明這個部門在當前資料集中是頂級部門,否則說明該部門是子部門-->
<!--注:不是所有的樹都是從root部門,也可能是某個葉子節點遍歷的樹形結構-->
if (!tempList.contains(dept.getParentId()))
{
recursionFn(depts, dept);
returnList.add(dept);
}
}
if (returnList.isEmpty())
{
returnList = depts;
}
return returnList;
}
遞迴獲取子部門列表樹形結構
- 獲取子部門列表
- 遞迴遍歷子部門列表,獲取每個子部門的子部門列表
- 退出條件:當前部門沒有子部門
/**
* 遞迴列表
*/
private void recursionFn(List<SysDept> list, SysDept t)
{
// 得到子節點列表
List<SysDept> childList = getChildList(list, t);
t.setChildren(childList);
for (SysDept tChild : childList)
{
if (hasChild(list, tChild))
{
recursionFn(list, tChild);
}
}
}
獲取子部門
- 入參:部門列表+部門
- 輸出:查詢部門的所有子部門列表
/**
* 得到子節點列表
*/
private List<SysDept> getChildList(List<SysDept> list, SysDept t)
{
List<SysDept> tlist = new ArrayList<SysDept>();
Iterator<SysDept> it = list.iterator();
while (it.hasNext())
{
SysDept n = (SysDept) it.next();
if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue())
{
tlist.add(n);
}
}
return tlist;
}
每個函式只做一件簡單的事情
/**
* 判斷是否有子節點
*/
private boolean hasChild(List<SysDept> list, SysDept t)
{
return getChildList(list, t).size() > 0 ? true : false;
}
最終統一格式
/**
* 構建前端所需要下拉樹結構
*
* @param depts 部門列表
* @return 下拉樹結構列表
*/
@Override
public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts)
{
List<SysDept> deptTrees = buildDeptTree(depts);
return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
}
相關文章
- LayUI—tree樹形結構的使用UI
- php tree類的使用(樹形結構)PHP
- 28款jQuery Tree 樹形結構外掛jQuery
- 帶有樹形結構的部門層級關系表
- 樹形結構的選單表設計與查詢
- Vue遞迴元件實現樹形結構選單Vue遞迴元件
- 一個簡單的樹形結構
- MySql樹形結構(多級選單)查詢設計方案MySql
- 樹形結構
- 前端樹形Tree資料結構使用-🤸🏻♂️各種姿勢總結前端資料結構
- 『資料結構』樹(Tree)資料結構
- jQuery多級樹形選單詳解jQuery
- layui.tree樹形結構節點判定條件的刪除操作UI
- 如何在 Laravel 中去構建部門樹形結構 APILaravelAPI
- ztree樹形選單demo
- layui樹形結構UI
- java樹形結構Java
- js資料結構--樹(tree)JS資料結構
- 如何快速、且易懂編寫Java遞迴生成樹形選單結構Java遞迴
- oracle樹形選單查詢Oracle
- 樹形結構處理
- Vue+element中Tree樹形控制元件資料失效~Vue控制元件
- Go快速入門 03 | 控制結構:if、for、switch 邏輯語句Go
- 七、基本資料結構(樹形結構)資料結構
- 01【若依框架】 登入許可權框架
- B樹索引的內部結構索引
- Antd:Tree樹形控制元件資料解析(JSON轉換)控制元件JSON
- markdown樹形結構生成工具
- [Swing]樹形結構的實現
- 若依dockerDocker
- 若依框架匯入阿里OSS報錯問題解決方案框架阿里
- 資料結構中樹形結構簡介資料結構
- POJ 2486 Apple Tree(樹形dp)APP
- 8 個最好的 jQuery 樹形 Tree 外掛jQuery
- Linux 下樹形結構的檢視Linux
- 樹形結構的儲存與查詢
- Oracle 樹形結構查詢的特殊用法Oracle
- 【Java基礎】03選擇結構Java