整体架构流程
一:完成效果图展示
二: 先看看前端是如何实现的
handleMemberRight(row) {
const levelId = row.levelId; // 获取行的 levelId 属性
// 重置操作
this.reset();
// 获取部门树结构数据并赋值给 deptTreeSelect
const deptTreeSelect = this.getDeptTree(levelId);
// 根据 levelId 获取角色信息并处理响应
getLevel(levelId).then(response => {
this.form = response.data; // 将响应数据赋值给表单
this.openDataScope = true; // 打开数据范围选项
this.$nextTick(() => {
deptTreeSelect.then(res => {
this.$refs.dept.setCheckedKeys(res.checkedKeys); // 设置部门树的选中项
});
});
this.title = "分配数据权限"; // 设置标题
});
},
/**
* 根据角色ID查询部门树结构
* @param {number} levelId - 角色的 levelId
* @returns {Promise} - 包含部门树结构数据的 Promise 对象
*/
getDeptTree(levelId) {
// 调用部门树结构查询函数并处理响应
return deptTreeSelect(levelId).then(response => {
this.deptOptions = response.depts; // 将部门数据赋值给 deptOptions
return response; // 返回响应数据
});
},
// 根据角色ID查询部门树结构
export function deptTreeSelect(levelId) {
return request({
url: '/jskj/level/deptTree/' + levelId,
method: 'get'
})
}
export function getLevel(levelId) {
return request({
url: '/jskj/level/' + levelId,
method: 'get'
})
}
三:后端代码
/**
* 获取对应会员权益树列表
* @param levelId 会员权益等级的ID
* @return 包含树结构和选中项的AjaxResult
*/
@GetMapping(value = "/deptTree/{levelId}")
public AjaxResult deptTree(@PathVariable("levelId") Long levelId)
{
// 创建一个成功的AjaxResult对象
AjaxResult ajax = AjaxResult.success();
// 将选中项的数据加入AjaxResult中
ajax.put("checkedKeys", memberDetailNavService.selectDeptListBylevelId(levelId));
// 将部门树结构的数据加入AjaxResult中
ajax.put("depts", memberDetailNavService.selectDeptTreeList(levelId));
// 返回AjaxResult对象
return ajax;
}
/**
* 查询权益树结构信息
*
* @param
* @return 部门树信息集合
*/
@Override
public List<TreeSelect>
selectDeptTreeList(Long levelId) {
// 查询数据库以获取会员权益树结构的数据
List<MemberDetail> deptTreeList = memberDetailNavMapper.selectDeptTreeList(levelId);
// 构建下拉树结构并返回结果
return buildDeptTreeSelect(deptTreeList);
}
/**
* 构建前端所需要下拉树结构
*
* @param detailList 部门列表
* @return 下拉树结构列表
*/
@Override
public List<TreeSelect> buildDeptTreeSelect(List<MemberDetail> detailList)
{
// 使用构建树结构的方法,将部门列表转换为树结构
List<MemberDetail> deptTrees = buildDeptTree(detailList);
// 将树结构的部门列表转换为下拉树结构,并返回结果
return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
}
/**
* 构建前端所需要树结构
*
* @param depts 部门列表
* @return 树结构列表
*/
@Override
public List<MemberDetail> buildDeptTree(List<MemberDetail> depts)
{
// 创建一个用于存储树结构的列表
List<MemberDetail> returnList = new ArrayList<MemberDetail>();
// 创建一个临时列表,包含所有部门的ID
List<Integer> tempList = depts.stream().map(MemberDetail::getId)
.collect(Collectors.toList());
// 遍历部门列表,查找顶级节点并构建树结构
for (MemberDetail dept : depts)
{
// 如果当前部门不是其他部门的父节点,说明它是一个顶级节点
if (!tempList.contains(dept.getParentId()))
{
// 递归遍历所有子节点,并将它们添加到树结构中
recursionFn(depts, dept);
// 将当前顶级节点添加到树结构列表中
returnList.add(dept);
}
}
// 如果树结构列表为空,则使用原始部门列表
if (returnList.isEmpty())
{
returnList = depts;
}
// 返回构建好的树结构列表
return returnList;
}
/**
* 递归列表
*/
private void recursionFn(List<MemberDetail> list, MemberDetail t)
{
// 得到子节点列表
List<MemberDetail> childList = getChildList(list, t);
// 将子节点列表设置为当前部门的子节点
t.setChildren(childList);
// 遍历子节点,继续递归处理子节点的子节点
for (MemberDetail tChild : childList)
{
// 如果子节点仍然有子节点,继续递归处理
if (hasChild(list, tChild))
{
recursionFn(list, tChild);
}
}
}
/**
* 得到子节点列表
*/
private List<MemberDetail> getChildList(List<MemberDetail> list, MemberDetail t)
{
// 创建一个用于存储子节点的列表
List<MemberDetail> tlist = new ArrayList<MemberDetail>();
// 使用迭代器遍历部门列表
Iterator<MemberDetail> it = list.iterator();
while (it.hasNext())
{
MemberDetail n = (MemberDetail) it.next();
// 检查部门的父节点是否与当前部门的ID匹配
if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getId().longValue())
{
// 如果匹配,将部门添加到子节点列表中
tlist.add(n);
}
}
// 返回子节点列表
return tlist;
}
/**
* 判断是否有子节点
*/
private boolean hasChild(List<MemberDetail> list, MemberDetail t)
{
// 判断当前部门是否有子节点,如果子节点列表的大小大于0,则返回 true,否则返回 false
return getChildList(list, t).size() > 0 ? true : false;
}
<!-- selectDeptTreeList 查询语句 -->
<select id="selectDeptTreeList" parameterType="Long" resultMap="MemberDetailResult">
<!-- 引用名为 selectMemberDetailVo 的查询模板 -->
<include refid="selectMemberDetailVo"/>
</select>
<!-- selectDeptListBylevelId 查询语句 -->
<select id="selectDeptListBylevelId" resultType="Long">
<!-- 查询部门的 right_id 字段 -->
select d.right_id
from jskj_level_right d
left join jsky_level_right_relation rd on d.right_id = rd.right_id
where rd.level_id = #{levelId}
and d.right_id not in (select d.parent_id from jskj_level_right d inner join jsky_level_right_relation rd on d.right_id = rd.right_id
and rd.level_id = #{levelId})
order by d.parent_id
</select>