layUI树形菜单(组织架构)+Ajax+后台递归写法-详细步骤

一、介绍

本章采用的是:spring5+springMvc5+myBatisPlus3.0架构,查询方法为MP自带的方法

首先看下效果图是否为您所需,若不是无需浪费时间往下看

layUI树形菜单(组织架构)+Ajax+后台递归写法-详细步骤_第1张图片

二、建立数据库表

此表设计为多种关系合成的一张表
layUI树形菜单(组织架构)+Ajax+后台递归写法-详细步骤_第2张图片

三、编写实体类pojo

DepartmentAndPosition.java

此处导包省略...

/**
 * @Author : Administrator
 * @Date : 2020/8/1 17:11
 * @Description :部门和职位联合类
 */
@TableName("departmentandposition")
public class DepartmentAndPosition {
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    private String name;
    private Integer pid;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getPid() {
        return pid;
    }

    public void setPid(Integer pid) {
        this.pid = pid;
    }
}

四、编写Mapper接口

DepartmentAndPositionMapper

此处导包省略...

@Mapper
public interface DepartmentAndPositionMapper extends BaseMapper {


}

五、编写菜单类

Menus.java

此处导包省略...

/**
 * @Author : Administrator
 * @Date : 2020/8/1 17:50
 * @Description :多级菜单类
 */
public class Menus {
    private String title;
    private List children;


    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public List getChildren() {
        return children;
    }

    public void setChildren(List children) {
        this.children = children;
    }
}

六、编写service层

定义IDepartmentAndPositionService 接口

此处导包省略...

/**
 * @Author : Administrator
 * @Date : 2020/7/24 15:02
 * @Description :service层接口
 */
public interface IDepartmentAndPositionService extends IService {
    /**
     * 笨方法查询子级
     *
     * @return
     */
    List queryBase();

    /**
     * 递归查询子级
     *
     * @return
     */
    List getParent();
}

编写service实现类

导包省略...

/**
 * @Author : Administrator
 * @Date : 2020/7/21 21:29
 * @Description :
 */
@Service
@Transactional
public class DepartmentAndPositionService extends ServiceImpl implements IDepartmentAndPositionService {
    @Autowired
    private DepartmentAndPositionMapper departmentAndPositionMapper;

    /**
     * 先找到第一层菜单
     * 拿到第一层的id查询子级
     *
     * @param
     * @return
     */
    @Override
    public List getParent() {
        //先查询所有
        List departments = departmentAndPositionMapper.selectList(null);
        System.out.println(departments.size());
        List menusList = new ArrayList<>();
        for (DepartmentAndPosition d : departments) {
            //如果相等为第一级
            if (0 == d.getPid()) {
                System.out.println(d.getId() + "," + d.getName() + "," + d.getPid());
                Menus menus = new Menus();
                menus.setTitle(d.getName());//第一级名字
                //Children为集合,调用下面递归方法
                menus.setChildren(getDepartmentList(d.getId()));
                menusList.add(menus);
            }
        }
        return menusList;
    }

    /**
     * @param pid   首次所传为最大父级的id,值为 1
     * @param  所有部门信息集合
     * @return
     */
    public List getDepartmentList(int pid) {
      
		List menusList = new ArrayList<>();
        QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("pid", pid);
        List list = departmentAndPositionMapper.selectList(queryWrapper);
        for (DepartmentAndPosition d : list) {
            Menus menus = new Menus();
            menus.setTitle(d.getName());
            //递归
            menus.setChildren(getDepartmentList(d.getId()));
            menusList.add(menus);
        }
        return menusList;
    }
}

七、编写Controller层

此处导包省略...

/**
 * @Author : Administrator
 * @Date : 2020/7/21 21:39
 * @Description :关于员工的控制器
 */
@Controller
public class EmpController {
    @Resource
    private IDepartmentAndPositionService departmentAndPositionService;

    @RequestMapping("/queryMenu")
    @ResponseBody
    public List quertMenu() {
        return departmentAndPositionService.getParent();
    }
    }

八、前端HTML

效果图

layUI树形菜单(组织架构)+Ajax+后台递归写法-详细步骤_第3张图片
第二种方式:改变service层实现类的方法,其他不变

@Override
    public List getParent() {//被controller所调用
        //先查询所有
        List departments = departmentAndPositionMapper.selectList(null);
        System.out.println(departments.size());
        List menusList = new ArrayList<>();
        for (DepartmentAndPosition d : departments) {
            //如果相等为第一级
            if (0 == d.getPid()) {
                System.out.println(d.getId() + "," + d.getName() + "," + d.getPid());
                Menus menus = new Menus();
                menus.setTitle(d.getName());//第一级名字
                menus.setChildren(getDepartmentList(d.getId(),departments));
                menusList.add(menus);
            }
        }
        return menusList;
    }

   /**
     *
     * @param pid 所传为最大父级的id,值为 1
     * @param departments 所有部门信息集合
     * @return
     */
public List getDepartmentList(int pid,List departments) {
        List menusList = new ArrayList<>();
        for (DepartmentAndPosition d : departments) {
            //如果所有pid等于父级id
            if (d.getPid() == pid) {
                System.out.println(d.getId() + "," + d.getName() + "," + d.getPid());
                Menus menus = new Menus();
                menus.setTitle(d.getName());//首次第一级名字
                menus.setChildren(getDepartmentList(d.getId(), departments));
                menusList.add(menus);
            }
        }
        return menusList;
        }

总结:第一种方式会频繁查询数据库,有多少条数据就会走多少条查询语句,效率较低。
第二种方式是直接拿到父级id与departments集合里的下级pid进行比较,相等就直接set
还望高手多多指点!

你可能感兴趣的:(layUI,java,spring,后端)