假装有需求

关于 jeecg 提供的部门树,相信很多小伙伴都已经用过了,今天假装有那么一个需求 "部门树弹窗选择默认展开下级部门",带着这个需求再次去探索一下吧。

一、改造之前的部门选择树流程

1.1 t:departSelect标签

代码片段:

<t:departSelect selectedNamesInputId="orgNames" selectedIdsInputId="orgIds"></t:departSelect>

关于 selectedNamesInputIdselectedIdsInputId 属性:

  • selectedNamesInputId:用于显示勾选后的部门名称
  • selectedIdsInputId:用于记录勾选后的部门id

使用 "t:departSelect" 标签其实帮我们创建了两个 inputorgNamesorgIds,就是上方指定的两个属性名称,效果如下:

<input class="inuptxt" readonly="true" type="text" id="orgNames" name="orgNames" style="width: 150px" onclick="openDepartmentSelect()">
<input class="inuptxt" id="orgIds" name="orgIds" type="hidden" value=",">

通过生成的这两个 input,我们发现重点落在了 openDepartmentSelect() 这个方法,下面来看一下这个方法。

1.2 openDepartmentSelect()方法

方法代码:

function openDepartmentSelect() {    
    $.dialog.setting.zIndex = 9999;     
    $.dialog({
        content: 'url:departController.do?departSelect', 
        zIndex: 2100, 
        title: '组织机构列表', 
        lock: true, 
        width: '400px', 
        height: '350px', 
        opacity: 0.4, 
        button: [       
        {name: '确定', callback: callbackDepartmentSelect, focus: true},       
        {name: '取消', callback: function (){}}   ]
    }).zindex();
}

知识点: jeecg 中所有的表单弹出采用的技术都是 lhgdialog ,技术链接:http://www.lhgdialog.com/

通过上方的请求链接,我们找到最终的跳转界面(departSelect.jsp):

1.3 departSelect.jsp界面

<html>
<head>
<title>组织机构集合</title>
···
<script type="text/javascript">
    ...
    /**加载展开方法**/
    function zTreeOnExpand(event, treeId, treeNode){
         var treeNodeId = treeNode.id;
         $.post(
            'departController.do?getDepartInfo',
            {parentid:treeNodeId,orgIds:$("#orgIds").val()},
            function(data){
                var d = $.parseJSON(data);
                if (d.success) {
                    var dbDate = eval(d.msg);
                    var tree = $.fn.zTree.getZTreeObj("departSelect");                     if (!treeNode.zAsync){
                        tree.addNodes(treeNode, dbDate);
                        treeNode.zAsync = true;
                    } else{
                        tree.reAsyncChildNodes(treeNode, "refresh");
                    }
                    /**tree.addNodes(treeNode, dbDate);**/
                }
            }
        );
    }     /**首次进入加载level为1的**/
    $(function(){
        $.post(
            'departController.do?getDepartInfo',
            {orgIds:$("#orgIds").val()},
            function(data){
                var d = $.parseJSON(data);
                if (d.success) {
                    var dbDate = eval(d.msg);
                    $.fn.zTree.init($("#departSelect"), setting, dbDate);
                }
            }
        );
    });
</script>
</head>
<body style="overflow-y: auto" scroll="no">
<input id="orgIds" name="orgIds" type="hidden" value="${orgIds}">
<ul id="departSelect" class="ztree" style="margin-top: 30px;"></ul>
</body>
</html>

知识点: jeecg 中所采用的树列表是 ztree ,技术链接:http://www.treejs.cn/

关于上方这两个方法的解读:
界面加载,首先请求数据,获取数据后初始化 ztree,每次部件被点击都会触发 zTreeOnExpand 方法,附带父部门 id 获取子部门数据。

通过该界面我们找到了最先请求数据的方法:getDepartInfo 方法,那么这个方法其实我们通过上方的注释已经了解到 首次进入加载level为1的,意味着只加载了父部门的数据,通过具体后台代码验证:

@RequestMapping(params = "getDepartInfo")
@ResponseBody
public AjaxJson getDepartInfo(HttpServletRequest request, HttpServletResponse response){     AjaxJson j = new AjaxJson();     String orgIds = request.getParameter("orgIds");     String[] ids = new String[]{}; 
    if(StringUtils.isNotBlank(orgIds)){
        orgIds = orgIds.substring(0, orgIds.length()-1);
        ids = orgIds.split("\\,");
    }     List<TSDepart> tSDeparts = new ArrayList<TSDepart>();     StringBuffer hql = new StringBuffer(" from TSDepart t where 1=1 ");
    tSDeparts = this.systemService.findHql(hql.toString());     List<Map<String,Object>> dateList = new ArrayList<Map<String,Object>>();
    if(tSDeparts.size()>0){
        Map<String,Object> map = null;
        String sql = null;
         Object[] params = null;
        for(TSDepart depart:tSDeparts){
            map = new HashMap<String,Object>();
            map.put("id", depart.getId());
            map.put("name", depart.getDepartname());             map.put("code",depart.getOrgCode());             if(ids.length>0){
                for(String id:ids){
                    if(id.equals(depart.getId())){
                        map.put("checked", true);
                    }
                }
            }             if(depart.getTSPDepart() != null){
                map.put("pId", depart.getTSPDepart().getId());
            }else{
                map.put("pId", "1");
            }             if(ids.length>0){
                for(String id:ids){
                    if(id.equals(depart.getId())){
                        map.put("checked", true);
                    }
                }
            }             dateList.add(map);
        }
    }
    net.sf.json.JSONArray jsonArray = net.sf.json.JSONArray.fromObject(dateList);
    j.setMsg(jsonArray.toString());
    return j;
}

果不其然,只加载了 orgType = 1 的结节。

至此,我们已经清楚地了解到具体改造步骤在于数据,接下来要开始改造了。

二、改造需求中的部门树

2.1 后台getDepartInfo方法

删除掉了 parentid 的判断条件

if(StringUtils.isNotBlank(parentid)){    
    TSDepart dePart = this.systemService.getEntity(TSDepart.class, parentid);
    hql.append(" and TSPDepart = ?");
    tSDeparts = this.systemService.findHql(hql.toString(), dePart);
} else {
    hql.append(" and t.orgType = ?");
    tSDeparts = this.systemService.findHql(hql.toString(), "1");
}

2.2 departSelect.jsp

$(function(){
    $.post(
        'departController.do?getDepartInfo',
        {orgIds:$("#orgIds").val()},
        function(data){
            var d = $.parseJSON(data);
            if (d.success) {
                var dbDate = eval(d.msg);
                $.fn.zTree.init($("#departSelect"), setting, dbDate);                 /**1、全部展开**/
                /**$.fn.zTree.init($("#departSelect"), setting, dbDate).expandAll(true);**/                 var treeObj = $.fn.zTree.getZTreeObj("departSelect");
                var nodes = treeObj.getNodes();                 /**设置节点展开**/
                for (var i= 0; i < nodes.length; i++) {
                    /**2、第二种方式实现全部展开**/
                    /**treeObj.expandNode(nodes[i], true, true, true);**/
                }                 /**3、只展开第一个节点**/
                treeObj.expandNode(nodes[0], true, true, true);
            }
        }
    );
});

效果图:

上方代码,提供了1、2、3,其中1、2都是事先全部展开节点,3表示展开指定的节点,具体用法请参考:http://www.treejs.cn/v3/api.php

三、试一试

既然我们了解到了ztee的使用,那么我们不防再完善一下这个部门选择,增加一个模糊搜索的功能,具体实现效果如下。

最后

文章作者:niceyoo
文章地址:https://www.cnblogs.com/niceyoo/p/10527254.html
如果觉得文章对你有所帮助,右下方点个推荐~

18年专科毕业后,期间一度迷茫,最近我创建了一个公众号用来记录自己的成长。


改造一下jeecg中的部门树的更多相关文章

  1. 如何将数据库中存的树转化为树形列表(以easyui的tree为例)

    很多时候,我们会把一棵树存放到数据库中,当前台需要展示一个树形列表时,将这棵树读取出来并显示,这个过程是怎么实现的呢? 这篇文章是以构造一棵easyui前台框架的一个树形列表为例,后台框架是sprin ...

  2. jqxtree异步加载部门树

    整体思路 A.要想实现异步加载第一次加载的是一级部门 B.加载一级部门,如果有子部门,部门前面带+号,没有子部门,部门前面没有+号(+号也就是点击可以展开) C.在sql中实现如果有子部门默认都加载一 ...

  3. lintcode :前序遍历和中序遍历树构造二叉树

    解题 前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \ 1 3 注意 你可以假设树中不存 ...

  4. WPF中的逻辑树和可视化树

    WPF中的逻辑树是指XAML元素级别的嵌套关系,逻辑树中的节点对应着XAML中的元素. 为了方便地自定义控件模板,WPF在逻辑树的基础上进一步细化,形成了一个“可视化树(Visual Tree)”,树 ...

  5. LintCode-73.前序遍历和中序遍历树构造二叉树

    前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 注意事项 你可以假设树中不存在相同数值的节点 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树:    ...

  6. SQL 由人员汇总到部门树递归合计总数函数

    1.由人员计算出总数,在部门树(tree)按结构汇总(主父绑定) CREATE function [dbo].[GetEmpDepNum] ( @ID int ) RETURNS @Tree Tabl ...

  7. 利用树的先序和后序遍历打印 os 中的目录树

    [0]README 0.1)本代码均为原创,旨在将树的遍历应用一下下以加深印象而已:(回答了学习树的遍历到底有什么用的问题?)你对比下linux 中的文件树 和我的打印结果就明理了: 0.2)我们采用 ...

  8. JEECG中修改时间相关自定义定时器

    JEECG中使用,如下: @InitBinder public void initBinder(ServletRequestDataBinder binder) { binder.registerCu ...

  9. jeecg中dictSelect取值方式

    jeecg中的dictSelect本质是生成了很多input标签和div标签组成的,input存储的对应的就是字典中的code,div存储的就是字典中的name, 下面是取出code和那么的实例: 例 ...

随机推荐

  1. Postman 安装及使用入门教程(我主要使用接口测试)

    1.Postman 安装及使用入门教程(我主要使用接口测试)Postman的English官网:https://www.getpostman.com/chrome插件整理的Postman中文使用教程( ...

  2. Swift 统计项目中所有按钮的点击次数

    class Swizzle: NSObject { override class func load() { UIButton.xxx_swizzleSendAction() } } extensio ...

  3. CoopyIII开发文档之控制LED灯开关

    作者:那年:QQ:843681152 一. CooplyIII环境的搭建 工欲善其事必先利器,如何搭建CooplyIII的开发环境是一切coolpyIII开发的前提.CoolpyIII作者内cool超 ...

  4. Selenium的webdriver的常用方法,鼠标事件

    就来认识 WebDriver 中最常用的几个方法: get():跳转到的地址clear(): 清除文本. send_keys (value): 模拟按键输入. click(): 单击元素. 示例: f ...

  5. web服务-2、四种方法实现并发服务器-多线程,多进程,协程,(单进程-单线程-非堵塞)

    知识点:1.使用多线程,多进程,协程完成web并发服务器 2.单进程-单线程-非堵塞也可以实现并发服务器 1.多进程和协程的代码在下面注释掉的部分,我把三种写在一起了 import socket im ...

  6. Hibernate 对象关系映射文件

    简介: POJO 类和关系型数据库之间的映射可以用一个 XML 文档来定义 通过 POJO 类的数据库映射文件,Hibernate 可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据 ...

  7. MBA 拓展训练总结

    1. 拓展训练,大家绑腿跑 沟通时间极短, 规则制定不完善, 对方'王者队'沟通很好, 女队练习的同时, 男队边观看边练习, 效率很高, 由于之前王者输的比较多, 总结很多, 所以执行力也占优了, 我 ...

  8. __x__(34)0908第五天__ 定位 position

    position 定位 指将原始摆放到页面的任意位置. 继承性:no 默认值:static        没有定位,原始出现在正常的文档流中 可选值: static :    默认值,元素没有开启定位 ...

  9. Bypass 360主机卫士SQL注入防御(附tamper脚本)

    0x01 前言 在测试过程中,经常会遇到一些主机防护软件,对这方面做了一些尝试,可成功bypass了GET和POST的注入防御,分享一下姿势. 0x02 环境搭建 Windows Server 200 ...

  10. 变量类型-Set

    教程:    集合是一个无序不重复元素的序列,它的特点是:有的可变,有的不可变,元素无序不可重复! 一:集合的创建 (1)使用花括号 set={value1, values2}             ...