作為一個(gè)小外包...,記錄一下工作中常用的一些方法(tools),以便后續(xù)使用。
如果有小伙伴看,歡迎指點(diǎn)。但是不要指指點(diǎn)點(diǎn)。。。
這部分代碼本質(zhì)上是一個(gè)樹結(jié)構(gòu)生成工具。本質(zhì)是使用stream。這部分代碼更多是學(xué)習(xí)(我只用了若依的表結(jié)構(gòu),目前代碼需要對hutool有一點(diǎn)了解),運(yùn)用了stream和反射工具(hutool工具中)。
表結(jié)構(gòu)來自于若依管理系統(tǒng)。完整代碼點(diǎn)我,git。
核心代碼
/**
*
* 造樹
*
* @param dataList 數(shù)據(jù)列表
* @param parentFiled 父節(jié)點(diǎn)字段名
* @param orderByField order by字段名
* @param childField 子節(jié)點(diǎn)名
* @return {@link List}<{@link T}>
*/
public static <T> List<T> buildTree(List<T> dataList, String rootField,String parentFiled, Object rootParentVal,
String orderByField, String childField){
// 1、篩選出所有父節(jié)點(diǎn)
List<T> parentNodeList = dataList.stream().filter(
item -> ObjectUtil.equals(ReflectUtil.getFieldValue(item, parentFiled).toString(), String.valueOf(rootParentVal))
).collect(Collectors.toList());
// 2、父節(jié)點(diǎn)列表排序
List<T> sortedList = ListUtil.sortByProperty(parentNodeList, orderByField);
// 3、構(gòu)建樹形結(jié)構(gòu)的邏輯...
getChildTree(sortedList, dataList, rootField, parentFiled, orderByField, childField);
return sortedList;
}
/**
*
* 構(gòu)造樹
* @param sortedList 排序完的List
* @param parentFiled 父節(jié)點(diǎn)
* @param dataList 原數(shù)據(jù) 所有
*/
private static <T> void getChildTree(List<T> sortedList, List<T> dataList, String rootField, String parentFiled, String orderByField, String childField) {
for (T exportOrganization : sortedList) {
List<T> subList = dataList.stream().filter(o -> Objects.nonNull(ReflectUtil.getFieldValue(o, parentFiled)))
.filter(o -> ObjectUtil.equals(StrUtil.toString(ReflectUtil.getFieldValue(o, parentFiled)), StrUtil.toString(ReflectUtil.getFieldValue(exportOrganization, rootField))))
.collect(Collectors.toList());
// 排序
List<T> ts = ListUtil.sortByProperty(subList, orderByField);
ReflectUtil.setFieldValue(exportOrganization, childField, ts);
if (CollectionUtil.isNotEmpty(ts)) {
getChildTree(ts, dataList, rootField, parentFiled, orderByField, childField);
}
}
}
效果

image.png
主要流程
1、獲取當(dāng)前用戶角色信息
2、根據(jù)角色獲取對應(yīng)菜單
3、根據(jù)菜單父子關(guān)系構(gòu)建樹結(jié)構(gòu)