bootstrap - selectree树形结构下拉框

1、首先导入Bootstrap js、样式

<script src="/static/common/ztree/js/jquery.ztree.all.js" type="text/javascript" charset="utf-8"></script>
<script src="/static/exp/treeselect/selectree.js"></script>

在这里插入图片描述

2、引入的 selectree.js (这是固定代码,哪里有变动我会详细说明)

(function ($) {
    "use strict";
    //default selecttree
    var defaultOptions = {
        width: 'auto',
        height: '300px',
        isSimpleNode: true, //是否启用简单的节点属性(id,ame),次配置是form表单传递到后台的参数值,数据通过json传递
        pIcon: '',
        cIcon: '',
        debug: false,
        data: [{
            id: '111111',
            name: "父节点1",
            children: [
                {id: '22222', name: "子节点1"},
                {id: '33333', name: "子节点2"}
            ]
        }]
    }
    //define some global dom
    var SelectTree = function (element, options) {
        this.options = options;
        this.$element = $(element);
        this.$containner = $('<div></div>');
        this.$ztree = $('<ul   id="ztree" class="ztree"></ul>');
        this.$pInput = $('<input id="nodes" type="hidden"/>'); // 这里为隐藏域数据 id='nodes',选中的数都存储在这。
    }
    //prototype method
    SelectTree.prototype = {
        constructor: SelectTree,
        init: function () {
            var that = this,
                st = this.$element;
            // style
            that.$containner.css({'display': 'inline-block', 'position': 'relative'});
            that.$ztree.css({
                'position': 'absolute',
                'z-index': 10000,
                'border-radius': '3px',
                'border': '1px #ccc solid',
                'overflow': 'auto',
                'background': '#fff',
                'margin-top': '30px'
            });
            that.$ztree.css({'width': this.options.width || that.defaultOptions.width});
            that.$ztree.css({'height': this.options.height || taht.defaultOptions.height});
            // dom
            if (that.$element.data('pname')) {
                that.$pInput.attr('name', that.$element.data('pname'));
            }
            if (that.$element.attr('name')) {
                that.$element.removeAttr('name');
            }
            that.$ztree.attr('id', 'selectTree-ztree');
            that.$ztree.css('display', 'none');
            that.$element.attr('readonly', 'readonly');
            st.wrap(that.$containner);
            st.after(that.$pInput);
            st.after(that.$ztree);

            //listener
            that.$element.bind('click', function (e) {
                that.$ztree.toggle();
            });

            //ztree 
            //listener
            this.options.ztree.setting.callback = {
                onCheck: function (event, treeId, treeNode) {
                    return that._onSelectTreeCheck(event, treeId, treeNode);
                }
            }
            $.fn.zTree.init(that.$ztree, this.options.ztree.setting, this.options.ztree.data);
			
            // this 这个东西啊你理解成 它是当前选中的数据 赋给 selectttt ,aaaa 这是一个function 往下看
            aaaa.selectttt(this);
        },
        _onSelectTreeCheck: function (event, treeId, treeNode) {
            var that = this;
            //获得所有选中节点
            var pValue = '',
                text = '';
            var treeObj = $.fn.zTree.getZTreeObj(that.$ztree.attr('id'));
            console.log(treeObj)
            if (treeObj) {
                var nodes = treeObj.getCheckedNodes(true);
                if (this.options.debug) {
                    console.log("选中的节点:");
                    console.log(nodes);
                }
                for (var i = 0; i < nodes.length; i++) {
                    if (nodes[i].isParent) {
                        text = text + nodes[i].name + ':';
                    } else {
                        text = text + nodes[i].name + ',';
                    }
                }
                if (this.options.isSimpleNode) {
                    nodes = common._transformToSimpleNodes(nodes);
                }
                if (this.options.debug) {
                    console.log("提交到表单的数据结构:");
                    console.log(JSON.stringify(nodes));
                }
                // nodes数据 从这赋给隐藏域input(id='nodes')
                that.$pInput.val(JSON.stringify(nodes));
                text = text ? text.substr(0, text.length - 1) : '';
                that.$element.val(text);
                that.$element.attr('title', text);
            }
        }
    }
    var common = {
        //这里组织默认参数,用户传过来的参数,ztree的一些固定参数
        _getSelectTreeOptions: function (options) {
            options = options ? options : {};
            return {
                width: options.width || defaultOptions.width,
                height: options.height || defaultOptions.height,
                isSimpleNode: options.isSimpleNode || defaultOptions.isSimpleNode,
                pIcon: options.pIcon || defaultOptions.pIcon,
                cIcon: options.cIcon || defaultOptions.cIcon,
                debug: options.debug || defaultOptions.debug,
                ztree: {
                    data: options.data || defaultOptions.data,
                    setting: {
                        check: {
                            enable: true,
                            chkStyle: "checkbox",
                            chkboxType: {"Y": "ps", "N": "ps"}
                        }
                    }
                }
            }
        },
        //转换ztree为简单的节点,只包含id,name
        _transformToSimpleNodes: function (nodes) {
            var newNodes = [];
            if (nodes instanceof Array) {
                for (var i = 0; i < nodes.length; i++) {
                    var pNode = nodes[i].getParentNode();
                    var node = {};
                    node.pId = pNode ? pNode.id : null;
                    node.id = nodes[i].id;
                    node.name = nodes[i].name;
                    newNodes.push(node);
                }
            }
            return newNodes;
        }
    }
    $.fn.selectTree = function (options) {
        var data = new SelectTree(this, common._getSelectTreeOptions(options));
        return data.init();
    }
    $.fn.selectTree.Constructor = SelectTree;

    // 为什么这有一个aaaa?他的作用是用来回显你当前选中的数据,回显展示在input输入框内 ,这个是需求问题,如果不需要回显,可以忽略这段代码
    var aaaa ={
        selectttt:function (e) {
            debugger
            var that = e;
            //获得所有选中节点
            var pValue = '',
                text = '';
            var treeObj = $.fn.zTree.getZTreeObj(that.$ztree.attr('id'));
            console.log(treeObj)
            if (treeObj) {
                var nodes = treeObj.getCheckedNodes(true);
                if (that.options.debug) {
                    console.log("选中的节点:");
                    console.log(nodes);
                }
                for (var i = 0; i < nodes.length; i++) {
                    if (nodes[i].isParent) {
                        text = text + nodes[i].name + ':';
                    } else {
                        text = text + nodes[i].name + ',';
                    }
                }
                if (that.options.isSimpleNode) {
                    nodes = common._transformToSimpleNodes(nodes);
                }
                if (that.options.debug) {
                    console.log("提交到表单的数据结构:");
                    console.log(JSON.stringify(nodes));
                }
                that.$pInput.val(JSON.stringify(nodes));
                text = text ? text.substr(0, text.length - 1) : '';
                that.$element.val(text);
                that.$element.attr('title', text);
            }
        }
    }
})(jQuery)

3、HTML 页面中接收数据

// 通过id = selectree, 赋值数据到div中
<script type="text/javascript">
    $(function() {
        var nodes = [{
            id: '111111',
            name: "父节点1",
            children: [
                { id: '22222', name: "子节点1" },
                { id: '33333', name: "子节点2" }
            ]
        }];
        $("#selectree").selectTree({
            isSimpleNode: true,
            debug: true,
            data: JSON.parse('${data}') // 后台查询的数据 返回为data
        }); 
    });
</script>

// input框在页面上展示数据
<div class="col-md-3">
    <div class="input-group">
        <span class="input-group-addon" id="zh_box">部门</span>
        <input type="text"  autocomplete="off"
        class="input-sm form-control"  id="selectree"/>
    </div>
</div>

// 从Selectree.js nodes 中获取选中的数据,传到后台作为查询条件使用
var nos =  $('#nodes').val(); // 通过nodes 拿到
    if(nos!="") {
        var nodesJson = eval('(' + $('#nodes').val() + ')');// 转换成字符串
        var deptIds = '';
        if (nodesJson != null && nodesJson.length > 0) { // 进行遍历存储到deptIdS中 返回到后台
            for (var i = 0; i < nodesJson.length; i++) {
                deptIds += nodesJson[i].id + ',';
            }
        }
        if (nodesJson != null && nodesJson.length > 0) {
            url += "&dement=" + deptIds // 传到后台 dement 作为查询条件
        }
    }

4、前台说完了,咱们主要来看后台代码的实现,如何返回json数据,是通过什么方式 继续往下看

后台代码

 1、Controller
        // 我这个是通过权限控制的:dept当前登录人有哪些部门,dement默认所有部门
        List<SysDepartment> dment = iSysDepartmentService.findDepartmentTreeList(dept, dement);
        // dment 查询出所部门数据
        modelAndView.addObject("data", JSON.toJSONString(dment));//部门下拉框,返回页面data
2、service
    	List<SysDepartment> findDepartmentTreeList(DepartmentAllPo<SysDepartmentVo> dept, String dement);
3、serviceImpl
	   // 当前部门全查询 ,递归查询
        @Override
        public List<SysDepartment> findDepartmentTreeList(DepartmentAllPo<SysDepartmentVo> dept, String dement) {
            List<SysDepartment> firstDepart = null;
            if(dept != null){
            // 遍历一级菜单
                List<SysDepartment> deptList = sysDepartmentMapper.selectList(new QueryWrapper<SysDepartment>().lambda().in(SysDepartment::getId,dept.getDepts()).eq(SysDepartment::getIsDelete,0));
                for (SysDepartment d:deptList) {// 遍历判断当前默认全部选中,或者选中进行查询
                    if(StringUtils.isBlank(dement) || StringUtils.indexOf(dement,d.getId())>-1){
                        d.setChecked(true); // 选中状态
                    }
                }
        // 查询一级数据
        firstDepart = deptList.stream().filter(o -> StringUtils.equals(o.getParentId(),"0")).sorted(Comparator.comparing(SysDepartment::getDepartmentLevel)).collect(Collectors.toList());
                for (SysDepartment o : firstDepart) {
                    fullChild(o,deptList);// 子级数据存储到fullChild
                }
            }
            return firstDepart;
        }
        
	// 递归查询树形结构
    private void fullChild(SysDepartment o, List<SysDepartment> deptList) {
        // 查询上级部门与它父级部门的ID是否相同
        List<SysDepartment> clist = deptList.stream().filter(d->StringUtils.equals(d.getParentId(),o.getId())).collect(Collectors.toList());
        if(clist.isEmpty()){// 如果为空不执行任何操作

        }else{// 遍历多级树形结构
            o.setChirldList(clist);
            for (SysDepartment c:clist) {
                fullChild(c,deptList);
            }
        }
    }

5、树形结构 以及 结构数据格式

在这里插入图片描述


在这里插入图片描述

6、json数据格式

[{"pId":null,"id":"b18163ce656911e99d9200163e2e7cd0","name":"润兴科技"},{"pId":"b18163ce656911e99d9200163e2e7cd0","id":"163869757257f5050285a3330f53e514","name":"市场运营部"},{"pId":"b18163ce656911e99d9200163e2e7cd0","id":"2d9f849249bd859b6e0281a54504e7cb","name":"人力行政部"},{"pId":"b18163ce656911e99d9200163e2e7cd0","id":"9fa5921e170654f932865e1adfa497f7","name":"总经理办公室"},{"pId":"b18163ce656911e99d9200163e2e7cd0","id":"bdf8691f38e5e1a84b50c2ad002b828c","name":"研发部"},{"pId":"bdf8691f38e5e1a84b50c2ad002b828c","id":"5eab5513531e6c25a2f1a83a14bd6dfb","name":"市局研发"},{"pId":"bdf8691f38e5e1a84b50c2ad002b828c","id":"793122a044131109b71decb2ab95321c","name":"研发中心"},{"pId":"bdf8691f38e5e1a84b50c2ad002b828c","id":"fbf41954c2fbc5b2dbf0e6021b35b6ac","name":"测试部"},{"pId":"b18163ce656911e99d9200163e2e7cd0","id":"d395473b953d37a88b43fb79840e80d4","name":"物联网事业部"},{"pId":"b18163ce656911e99d9200163e2e7cd0","id":"f1ec10683d539eaae6a626d8eeb634c2","name":"政府事业部"},{"pId":"b18163ce656911e99d9200163e2e7cd0","id":"f9a6b6bccb77db27e9c4af26c520704c","name":"经营财务部"}]

原文地址:https://blog.csdn.net/chang0704/article/details/99676914

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


前端工程师一般用的是Bootstrap的框架而不是样式,样式一般自己重新定义class类即可,主要样式要随具体情况而定包括位置任何带有class.btn的元素都会继承圆角灰色按钮的默认外观。但是Bootstrap提供了一些选项来定义按钮的样式。<buttontype="button"class="btn">基本
起步导入:<linkrel="stylesheet"href="bootstrap-3.3.7-dist/css/bootstrap.css"><scriptsrc="js/jquery-3.3.1.js"></script><scriptsrc="bootstrap-3.3.7-dist/js/bootstrap.js"></script>屏幕
(1)modal声明一个模态框(2)modal-dialog定义模态框尺寸(3)modal-lg定义大尺寸模态框(4)modal-sm定义小尺寸模态框(5)modal-header(6)modal-body(7)modal-footer<!doctypehtml><html><head><metacharset="utf-8"><title>模态框<itle><linkrel=&quo
图片在Bootstrap版本3中,通过为图片添加 .img-responsive 类可以让图片支持响应式布局。其实质是为图片设置了 max-width:100%;、 height:auto; 和 display:block; 属性,从而让图片在其父元素中更好的缩放。如果需要让使用了 .img-responsive 类的图片水平居
<inputtype="text"class="form-controldatepicker"style="padding:0.375rem0.75rem;"placeholder="开始时间"readonly="true" id="start_time"name="start_time"> $(".datepicke
目录bootstrap-treeview使用小记零、写在前面的话一、功能说明二、特性简述三、实战3.1依赖环境3.2数据源格式3.3Options选项3.4Methods方法3.5Events事件N-2、番外N-1、本文demoN、参考资料bootstrap-treeview使用小记零、写在前面的话p.s.bootst
  一、应用http://www.bootcss.com/进入bootstrap4或bootstrap3中文网,想要快速地将Bootstrap应用到你的项目中,有以下两种办法: 1、bootstrap可以在线引用,方法如下:A、CSS将引入Bootstrap样式表的 <link> 标签复制并粘贴到 <head> 中,并放在所有其他样式表之前。<!
第87节:Java中的Bootstrap基础与SQL入门前言复习什么是JQ?:writelessdomore写更少的代码,做更多的事找出所有兄弟:$("div").siblings()基本过滤器:选择器:过滤器$("div:first"):first:找到第一个元素:last:找到最后一个元素:even:找出偶数索引:odd:找出奇叔索引
1.bootstrap表单(1)form声明一个表单域(2)form-inline内联表单域(3)form-horizontal水平排列表单域(4)form-group表单组、包括表单文字和表单控件(5)form-control文本输入框、下拉列表控件样式(6)checkboxcheck-inline多选框样式(7)radioradio-inline单选框样式(8)input-group表单控件组
<!DOCTYPEhtml><htmllang="en"><head><metacharset="utf-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>首页<itle><
嗯。。。以前做ssh。应该是stratusspringhibernate。 然后现在来了一个新的需求。 要用java,bootstrap,oracle,springboot,jquery,mybatis。 开始,我也挺心虚的,但是后来一看,,,其实本没有必要这么虚。。。毕竟。。。这些东西,写的有问题。。。问题在于没有逻辑。 bootstrap,j
表格基本实例为任意 <table> 标签添加 .table 类可以为其赋予基本的样式—少量的内补(padding)和水平方向的分隔线。这种方式看起来很多余!?但是我们觉得,表格元素使用的很广泛,如果我们为其赋予默认样式可能会影响例如日历和日期选择之类的插件,所以我们选择将此样式独立出来。
1、问题背景   一般情况下,查询列表有查询条件、查询按钮和重置按钮,输入查询条件,点击查询按钮查询列表等数据;点击重置按钮会将查询条件恢复到原始状态 2、实现源码 <!DOCTYPEhtml><html> <head> <metacharset="UTF-8"> <title>Bootstrap-查询按钮和重置按钮<
Bootstrap简介什么是Bootstrap?Bootstrap官网框架:库liblibraryjQuery作为一个框架来讲,提供一套比较便捷的操作DOM的方式把大家都需要的功能预先写好到一些文件这就是一个框架Bootstrap让我们的Web开发更简单,更快捷;注意是Bootstrap不是BootStrap!这是一个词,不是
1.bootstrap图片img-responsive声明响应式图片2.bootstrap字体图标通过字体代替图标,font文件夹需要和css文件夹在同一目录3.bootst导航条(1)navbar声明导航条(2)navbar-default声明默认的导航条样式(3)navbar-inverse声明反白的导航条样式(4)navbar-static-top去掉导航条的圆角(5)n
1.路径导航<!doctypehtml><html><head><metacharset="utf-8"><title>路径导航<itle><linkrel="stylesheet"type="text/css"href="css/bootstrap.min.css"><scripttype="text/ja
问题描述:最近在学习BootStrap,过程中遇到引用glyphicon图标无法显示的问题,经过在百度后该问题已解决。1、首先看一下图标显示失败的页面:2、经过参考大佬们的经验,我找到了解决办法。首先我的BootStrap的css样式表是经过下载之后直接拷贝了其中一个文件到编译器中使用的,没有把所有
BootStrap布局一、BootStrap布局CSS组件主要包括栅格系统、列表组、进度条、icon图标、导航栏等组件。JavaScript插件主要有动画效果、窗体模式、下拉菜单、选项卡等二、网格系统Bootstrap内置了一套响应式、移动优先的流式栅格系统,随着屏幕设备或可视窗口(viewport)尺寸的
1引入所需要的文件2用法
想让bootstrap的table列内容超出部分省略号,要在table上加table-layout:fixed和word-break:break-all,然后在头部thead的th加上宽度百分比,最后在列里加个标签如span,在这个span加上单行超出部分省略号的css:display:inline-block,overflow:hidden,white-space:nowrap,text-overflow:e