重构:🔥 重构查询树列表相关 API,并抽取到后端 CRUD 公共组件中

1.基于 Hutool TreeUtil 重构查询树列表相关 API
2.抽取查询树列表 API 到后端 CRUD 公共组件中,大大简化部门管理和菜单管理部分代码
This commit is contained in:
2023-02-27 22:03:27 +08:00
parent 6723903c62
commit d4fd76dcc1
17 changed files with 210 additions and 248 deletions

View File

@@ -16,13 +16,12 @@
package top.charles7c.cnadmin.system.model.vo;
import java.util.List;
import lombok.Data;
import lombok.experimental.Accessors;
import io.swagger.v3.oas.annotations.media.Schema;
import top.charles7c.cnadmin.common.annotation.TreeField;
import top.charles7c.cnadmin.common.base.BaseVO;
import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
@@ -34,6 +33,7 @@ import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
*/
@Data
@Accessors(chain = true)
@TreeField(value = "deptId", nameKey = "deptName", weightKey = "deptSort")
@Schema(description = "部门信息")
public class DeptVO extends BaseVO {
@@ -74,10 +74,4 @@ public class DeptVO extends BaseVO {
*/
@Schema(description = "状态1启用 2禁用")
private DisEnableStatusEnum status;
/**
* 子部门列表
*/
@Schema(description = "子部门列表")
private List<DeptVO> children;
}

View File

@@ -16,13 +16,12 @@
package top.charles7c.cnadmin.system.model.vo;
import java.util.List;
import lombok.Data;
import lombok.experimental.Accessors;
import io.swagger.v3.oas.annotations.media.Schema;
import top.charles7c.cnadmin.common.annotation.TreeField;
import top.charles7c.cnadmin.common.base.BaseVO;
import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
import top.charles7c.cnadmin.common.enums.MenuTypeEnum;
@@ -35,6 +34,7 @@ import top.charles7c.cnadmin.common.enums.MenuTypeEnum;
*/
@Data
@Accessors(chain = true)
@TreeField(value = "menuId", nameKey = "menuName", weightKey = "menuSort")
@Schema(description = "菜单信息")
public class MenuVO extends BaseVO {
@@ -123,10 +123,4 @@ public class MenuVO extends BaseVO {
*/
@Schema(description = "状态1启用 2禁用")
private DisEnableStatusEnum status;
/**
* 子菜单列表
*/
@Schema(description = "子菜单列表")
private List<MenuVO> children;
}

View File

@@ -16,10 +16,6 @@
package top.charles7c.cnadmin.system.service;
import java.util.List;
import cn.hutool.core.lang.tree.Tree;
import top.charles7c.cnadmin.common.base.BaseService;
import top.charles7c.cnadmin.system.model.query.DeptQuery;
import top.charles7c.cnadmin.system.model.request.DeptRequest;
@@ -32,23 +28,4 @@ import top.charles7c.cnadmin.system.model.vo.DeptVO;
* @author Charles7c
* @since 2023/1/22 17:54
*/
public interface DeptService extends BaseService<DeptVO, DeptDetailVO, DeptQuery, DeptRequest> {
/**
* 构建树
*
* @param list
* 原始列表数据
* @return 树列表
*/
List<DeptVO> buildListTree(List<DeptVO> list);
/**
* 构建树
*
* @param list
* 原始列表数据
* @return 树列表
*/
List<Tree<Long>> buildTree(List<DeptVO> list);
}
public interface DeptService extends BaseService<DeptVO, DeptDetailVO, DeptQuery, DeptRequest> {}

View File

@@ -16,10 +16,6 @@
package top.charles7c.cnadmin.system.service;
import java.util.List;
import cn.hutool.core.lang.tree.Tree;
import top.charles7c.cnadmin.common.base.BaseService;
import top.charles7c.cnadmin.system.model.query.MenuQuery;
import top.charles7c.cnadmin.system.model.request.MenuRequest;
@@ -31,23 +27,4 @@ import top.charles7c.cnadmin.system.model.vo.MenuVO;
* @author Charles7c
* @since 2023/2/15 20:30
*/
public interface MenuService extends BaseService<MenuVO, MenuVO, MenuQuery, MenuRequest> {
/**
* 构建树
*
* @param list
* 原始列表数据
* @return 树列表
*/
List<MenuVO> buildListTree(List<MenuVO> list);
/**
* 构建树
*
* @param list
* 原始列表数据
* @return 树列表
*/
List<Tree<Long>> buildTree(List<MenuVO> list);
}
public interface MenuService extends BaseService<MenuVO, MenuVO, MenuQuery, MenuRequest> {}

View File

@@ -16,11 +16,7 @@
package top.charles7c.cnadmin.system.service.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.annotation.Resource;
@@ -29,13 +25,9 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree;
import top.charles7c.cnadmin.common.base.BaseServiceImpl;
import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
import top.charles7c.cnadmin.common.util.ExceptionUtils;
import top.charles7c.cnadmin.common.util.TreeUtils;
import top.charles7c.cnadmin.common.util.validate.CheckUtils;
import top.charles7c.cnadmin.system.mapper.DeptMapper;
import top.charles7c.cnadmin.system.model.entity.DeptDO;
@@ -90,68 +82,6 @@ public class DeptServiceImpl extends BaseServiceImpl<DeptMapper, DeptDO, DeptVO,
super.lambdaUpdate().in(DeptDO::getParentId, ids).remove();
}
@Override
public List<DeptVO> buildListTree(List<DeptVO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 去除重复子部门列表
List<DeptVO> deDuplicationList = deDuplication(list);
return deDuplicationList.stream().map(d -> d.setChildren(this.getChildren(d, list)))
.collect(Collectors.toList());
}
/**
* 数据去重(去除重复子部门列表)
*
* @param list
* 部门列表
* @return 去重后部门列表
*/
private List<DeptVO> deDuplication(List<DeptVO> list) {
List<DeptVO> deDuplicationList = new ArrayList<>();
for (DeptVO outer : list) {
boolean flag = true;
for (DeptVO inner : list) {
// 忽略重复子列表
if (Objects.equals(inner.getDeptId(), outer.getParentId())) {
flag = false;
break;
}
}
if (flag) {
deDuplicationList.add(outer);
}
}
return deDuplicationList;
}
/**
* 获取指定部门的子部门列表
*
* @param deptVO
* 指定部门
* @param list
* 部门列表
* @return 子部门列表
*/
private List<DeptVO> getChildren(DeptVO deptVO, List<DeptVO> list) {
return list.stream().filter(d -> Objects.equals(d.getParentId(), deptVO.getDeptId()))
.map(d -> d.setChildren(this.getChildren(d, list))).collect(Collectors.toList());
}
@Override
public List<Tree<Long>> buildTree(List<DeptVO> list) {
return TreeUtils.build(list, (d, tree) -> {
tree.setId(d.getDeptId());
tree.setName(d.getDeptName());
tree.setParentId(d.getParentId());
tree.setWeight(d.getDeptSort());
});
}
/**
* 检查名称是否存在
*

View File

@@ -16,23 +16,15 @@
package top.charles7c.cnadmin.system.service.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree;
import top.charles7c.cnadmin.common.base.BaseServiceImpl;
import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
import top.charles7c.cnadmin.common.util.TreeUtils;
import top.charles7c.cnadmin.common.util.validate.CheckUtils;
import top.charles7c.cnadmin.system.mapper.MenuMapper;
import top.charles7c.cnadmin.system.model.entity.MenuDO;
@@ -71,6 +63,7 @@ public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuVO,
boolean isExists = this.checkNameExists(menuName, request.getParentId(), request.getMenuId());
CheckUtils.throwIf(() -> isExists, String.format("修改失败,'%s'已存在", menuName));
// 更新信息
super.update(request);
}
@@ -81,68 +74,6 @@ public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuVO,
super.lambdaUpdate().in(MenuDO::getParentId, ids).remove();
}
@Override
public List<MenuVO> buildListTree(List<MenuVO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 去除重复子菜单列表
List<MenuVO> deDuplicationList = deDuplication(list);
return deDuplicationList.stream().map(m -> m.setChildren(this.getChildren(m, list)))
.collect(Collectors.toList());
}
/**
* 数据去重(去除重复子菜单列表)
*
* @param list
* 菜单列表
* @return 去重后菜单列表
*/
private List<MenuVO> deDuplication(List<MenuVO> list) {
List<MenuVO> deDuplicationList = new ArrayList<>();
for (MenuVO outer : list) {
boolean flag = true;
for (MenuVO inner : list) {
// 忽略重复子列表
if (Objects.equals(inner.getMenuId(), outer.getParentId())) {
flag = false;
break;
}
}
if (flag) {
deDuplicationList.add(outer);
}
}
return deDuplicationList;
}
/**
* 获取指定菜单的子菜单列表
*
* @param menuVO
* 指定菜单
* @param list
* 菜单列表
* @return 子菜单列表
*/
private List<MenuVO> getChildren(MenuVO menuVO, List<MenuVO> list) {
return list.stream().filter(m -> Objects.equals(m.getParentId(), menuVO.getMenuId()))
.map(m -> m.setChildren(this.getChildren(m, list))).collect(Collectors.toList());
}
@Override
public List<Tree<Long>> buildTree(List<MenuVO> list) {
return TreeUtils.build(list, (m, tree) -> {
tree.setId(m.getMenuId());
tree.setName(m.getMenuName());
tree.setParentId(m.getParentId());
tree.setWeight(m.getMenuSort());
});
}
/**
* 检查名称是否存在
*