1、用户数据查询
Controller-->service-->serviceImpl-->mapper-->数据库
进入 List<SysUser> list = userService.selectUserList(user) ,mapper层和数据库进行交互,查找所需数据。
@DataScope:给表设置别名sys_dept d , sys_user u
把返回的rspData给前端
把rows和total赋给这两个变量,Vue就会自动加载这些东西,那么我们就能在前端界面看到效果了。
再次强调一下,我们在看代码的时候,首先从前端找到他的入口,然后一步一步跟到后台从Controller-->service-->serviceImpl-->mapper-->数据库,整个流程跟进一遍,最终把结果封装一下,返回给前端,前端再加载。
2、部门树状图
大致流程:前端发请求,后端把数据取出来,想办法把数据弄成一个树,再返回、加载就可以了。
依旧是先从前端找入口
赋值给deptOptions后,前端就会展示所需的树状图了(why?-->继续跟进deptOptions,有v-for
继续追treeselect()
前端发路径为‘/system/dept/treeselect’的get请求,就到后台了。
(1)根据前端路径找到后台代码,先直接查询 depts(部门列表
treesselect()里的参数“SysDept dept” 是参数列表啊
/**
* 部门表 sys_dept
*
* @author ruoyi
*/
public class SysDept extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 部门ID */
private Long deptId;
……
}
(2)组装成树状结构(在文章二中有提到,但未详细了解代码,此处将详细学习
buildDeptTreeSelect():将查询到的记录组装成一个树状图
/**
* 构建前端所需要树结构
*
* @param depts 部门列表
* @return 树结构列表
*/
@Override
public List<SysDept> buildDeptTree(List<SysDept> depts)
{
// 创建一个空的SysDept列表,用于存储最终的树结构
List<SysDept> returnList = new ArrayList<SysDept>();
// 使用Java 8的流,从depts中提取所有部门的ID,并存储在tempList中
List<Long> tempList = depts.stream().map(SysDept::getDeptId).collect(Collectors.toList());
// 遍历depts列表中的每个部门
for (SysDept dept : depts)
{
// 检查tempList是否不包含当前部门的父ID
// 如果不包含,说明当前部门是顶级部门
if (!tempList.contains(dept.getParentId()))
{
// 对于每个顶级部门,递归地遍历其所有子部门
recursionFn(depts, dept);
// 将顶级部门添加到返回列表中
returnList.add(dept);
}
}
// 如果returnList为空,说明没有顶级部门,直接返回原始的depts列表
if (returnList.isEmpty())
{
returnList = depts;
}
// 返回构建好的树形结构列表
return returnList;
}
// 上述橙色字体代码理解
List<Long> tempList = depts.stream() // 1
.map(SysDept::getDeptId) // 2
.collect(Collectors.toList()); // 3
depts.stream()
:这部分代码将depts
列表转换成一个流。在Java中,流是一系列数据项的抽象表示,它允许你以声明式方式处理数据集合。
.map(SysDept::getDeptId)
:map
方法用于将流中的每个元素(在这个例子中是SysDept
对象)映射成另一种形式(在这个例子中是部门的ID)。SysDept::getDeptId
是一个方法引用,它告诉map
方法调用SysDept
对象的getDeptId
方法来获取其ID。
.collect(Collectors.toList())
:最后,collect
方法将流中的元素收集到一个新的列表中。Collectors.toList()
是一个收集器(Collector),它指示collect
方法将流中的元素收集到一个列表中
recursionFn(depts,dept)
1、先找到顶级节点,找到它的子节点
2、遍历顶级节点的子节点,再找到它的子节点
/**
* 递归列表
*
* @param list 分类表
* @param t 子节点
*/
private void recursionFn(List<SysMenu> list, SysMenu t)
{
// 得到子节点列表
List<SysMenu> childList = getChildList(list, t);
// 为当前节点设置子节点列表
t.setChildren(childList);
// 遍历每个子节点
for (SysMenu tChild : childList)
{
// 检查当前子节点是否还有子节点
if (hasChild(list, tChild))
{
// 如果有,递归调用recursionFn方法
recursionFn(list, tChild);
}
}
}
/**
* 得到子节点列表
*/
private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t)
{
// 创建一个空的SysMenu列表,用于存储找到的子节点
List<SysMenu> tlist = new ArrayList<SysMenu>();
// 使用迭代器遍历传入的list
Iterator<SysMenu> it = list.iterator();
while (it.hasNext())
{
// 获取当前迭代到的SysMenu对象
SysMenu n = (SysMenu) it.next();
// 检查当前SysMenu对象的父ID是否与传入对象t的菜单ID相同
if (n.getParentId().longValue() == t.getMenuId().longValue())
{
// 如果相同,说明n是t的子节点,将其加入到tlist中
tlist.add(n);
}
}
// 返回包含所有找到的子节点的列表
return tlist;
}
stream流
我们这里的stream()作用是把我们当前集合deptTrees的泛型,由SysDept改成TreeSelect,因为SysDept里的东西前端不一定都要,我们为了把多余的东西去掉,就要做一个类型转换。(属性名不同的通过注解来对应。
拿到了数据,返回给前端
直接把data赋给deptOptions,页面上的部门菜单就显示出来了