四、若依管理系统——用户数据查询、部门树状图(代码解读)

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


  1. depts.stream():这部分代码将 depts 列表转换成一个流。在Java中,流是一系列数据项的抽象表示,它允许你以声明式方式处理数据集合。

  2. .map(SysDept::getDeptId)map 方法用于将流中的每个元素(在这个例子中是 SysDept 对象)映射成另一种形式(在这个例子中是部门的ID)。SysDept::getDeptId 是一个方法引用,它告诉 map 方法调用 SysDept 对象的 getDeptId 方法来获取其ID。

  3. .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,页面上的部门菜单就显示出来了

  • 26
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学生信息管理系统是一个用来管理学生的基本信息和选课信息的系统。在数据结构中,我们可以使用一些算法和数据结构来设计这个系统。在这个系统中,我们需要考虑以下几个功能: 1. 添加学生信息:当有新的学生加入时,我们需要输入他们的姓名,班级,性别,学号等基本信息,并将其存储在系统中。 2. 删除学生信息:当学生离开学校或者不再使用该系统时,我们需要删除他们的基本信息以及他们在选课系统中的选课信息。 3. 添加课程信息:当有新的课程开设时,我们需要输入课程的名称,教师姓名,上课时间等信息,并将其存储在系统中。 4. 删除课程信息:当课程不再开设或者不再使用该系统时,我们需要删除该课程的所有信息,使得在系统中无法找到该课程的相关信息。 5. 修改学生信息:如果学生的基本信息发生变化,我们需要提供一个功能来修改他们的信息,例如修改班级或者联系方式。 6. 查询学生信息:我们需要提供一个功能来查询学生的基本信息和选课信息,以便管理员或教师能够查看学生的相关信息。 7. 查询课程信息:我们需要提供一个功能来查询课程的基本信息和选修该课程的学生信息,以便管理员或教师能够查看课程的相关信息。 以上是学生信息管理系统中一些常见的功能和操作,我们可以使用合适的数据结构和算法来设计和实现这个系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值