美文网首页
Java+layui 下拉框树形数据展示

Java+layui 下拉框树形数据展示

作者: Rain_z | 来源:发表于2019-12-19 17:11 被阅读0次

    这两天做一个小东西,记录下自己使用layui遇到的问题和解决方案,先看最终的效果


    选择后
    下拉选择

    前端代码:
    引入文件,换成自己的目录就可以了

    <link rel="stylesheet" href="../../lib/layui/css/layui.css">
    <script type="text/javascript" src="../../lib/layui/layui.js" charset="utf-8"></script>
    

    页面

    <div class="layui-form-item">
                    <label  class="layui-form-label">
                        <span class="x-red">*</span>部&emsp;门
                    </label>
                    <div class="layui-input-inline">
                        <input type="text" id="tree" name="dept_id" lay-filter="tree" class="layui-input" required="" lay-verify="required">
                    </div>
                </div>
    

    js部分:
    下载treeSelect.js

    layui.config({
        base: '../../js/' //treeSelect.js文件所在位置
    }).extend({
        treeSelect: 'treeSelect/treeSelect'  // /所在文件夹/文件名称
    }).use(['treeSelect','form'], function () {
        var treeSelect= layui.treeSelect;
        treeSelect.render({
            elem: '#tree',// 选择器
            data: '/xxx/', //请求url
            type:'post',
            placeholder: '请选择部门',// 占位符
            search: true,// 是否开启搜索功能:true/false,默认false
            click: function(d){// 点击回调
                console.log(d);
            },
            // 加载完成后的回调函数
            success: function (d) {
                console.log(d);
                //回显数据
                var editUserInfo = JSON.parse(sessionStorage.getItem("editUserInfo"));
                if (editUserInfo){
                    console.log(editUserInfo);
                    console.log(editUserInfo.dept_id);
                    treeSelect.checkNode('tree', editUserInfo.dept_id);
                }
                window.sessionStorage.removeItem("editUserInfo");
            }
        });
    

    这样前端的代码基本完毕了,这里说下遇到的两个问题:

    1. 如果部门根节点只有一个的话,根节点不显示图标,我这里的解决方案是添加样式强行添加图标
    span.button.root_open:before{content:"\e625";color: black;}
    span.button.root_close:before{content:"\e623";color: black; }
    span.button.center_close:before
    span.button.center_open:before
    
    1. 后台返回参数统一封装,所以参数格式类似这种{code,msg,datas:[] },而datas才是我们需要渲染的参数,这里是改的treeSelect.js里的代码,只需要添加一行就可以了
    init: function () {
            $.ajax({
              url: data,
              type: type,
              headers: headers,
              dataType: 'json',
              success: function (d) {
                  d = d.outParam.deptTree; //修改的是这里,将返回参数取出重新赋值就可以了
                DATA = d;
                a.hideElem().input().toggleSelect().loadCss().preventEvent();
                $.fn.zTree.init($('#' + TREE_SELECT_BODY_ID), a.setting(), d);
                TREE_OBJ = $.fn.zTree.getZTreeObj(TREE_SELECT_BODY_ID);
                if (search) {
                  a.searchParam();
                }
                a.configStyle();
                if (success) {
                  var obj = {
                    treeId: TREE_SELECT_ID,
                    data: d
                  };
                  success(obj);
                }
              }
            });
            return a;
          }
    

    后台部分:
    新建部门对象,这里也设置属性open,控制节点的展开和关闭,不过treeSelect回显数据时,如果选中的是子部门,父级部门会自动展开.

    public class Department {
        private String id;
        private String code;
        private String name;
        private String pId;
        private Date createTime;
        private Date updateTime;
        private String idPath;
        private String state;
        private List<Department> children;
    

    使用递归查询所有部门信息

    //查询部门树形数据
        private List<Department> getDeptTree(){
            List<Department> deptList = deptMapper.queryAllDept();
            List<Department> deptTree = new ArrayList<>();
            for (Department department : deptList){
                if (StringUtils.isBlank(department.getpId())){
                    deptTree.add(findChildren(department,deptList));
                }
            }
            return deptTree;
        }
    
        //递归查询子部门
        private Department findChildren(Department department, List<Department> deptList) {
            for (Department item : deptList){
                if (department.getId().equals(item.getpId())){
                    if (department.getChildren() == null){
                        department.setChildren(new ArrayList<Department>());
                    }
                    department.getChildren().add(findChildren(item,deptList));
                }
            }
            return department;
        }
    

    相关文章

      网友评论

          本文标题:Java+layui 下拉框树形数据展示

          本文链接:https://www.haomeiwen.com/subject/xatvnctx.html