改造一下jeecg中的部门树

改造一下jeecg中的部门树

假装有需求

关于 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'
        zIndex2100
        title'组织机构列表'
        locktrue
        width'400px'
        height'350px'
        opacity0.4
        button: [       
        {name'确定'callback: callbackDepartmentSelect, focustrue},       
        {name'取消'callbackfunction (){}}   ]
    }).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], truetruetrue);
            }
        }
    );
});

效果图:

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

三、试一试

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

最后

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


posted @ 2019-03-13 22:47 niceyoo 阅读(...) 评论(...) 编辑 收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html 知识

一 html是什么&#xff1f; ,1、超文本标记语言&#xff08;Hypertext Markup Language, HTML&#xff09;是一种用于创建网页的标记语言。 2、本质上是浏览器可识别的规则&#xff0c;我们按照规则写网页&#xff0c;浏览器根据规则渲染我们的网页。对于不同的浏览器&#xff…

工作245:vue的注意规范之v-if 与 v-for 一起使用

当 v-if 与 v-for 一起使用时&#xff0c;v-for 具有比 v-if 更高的优先级&#xff0c;这意味着 v-if 将分别重复运行于每个 v-for 循环中 所以&#xff0c;不推荐v-if和v-for同时使用 使用推荐方式&#xff1a; 或者&#xff1a;放在计算属性遍历 当它们处于同一节点&#x…

Android kotlin实现底部导航栏

1、实现效果&#xff0c;可点击或者滑动切换fragment 点击 滑动 实现方法&#xff1a; 1、创建三个fragment.kt 2、创建fragmentAdapter class MyFragmentAdapter(fragmentManage…

jeecg富文本编辑器增加字体(仿宋)

jeecg富文本编辑器增加字体(仿宋) jeecg富文本编辑器增加字体(仿宋) 温馨提示&#xff1a;jeecg 提供了 uedit 富文本的实现&#xff0c;如下针对的是 uedit 增加仿宋字体示例。 主要修改三个文件&#xff1a;plug-in\ueditor\ueditor.config.js、plug-in\ueditor\lang\en\en.…

Android kotlin使用RecyclerView实例

1、创建entity类 class InternentBarEntity {var bname: String? nullvar barea: String? nullvar badddata: String? nullvar bimage: String? nullvar bid: String? null } 2、创建adapter类 /***作者&#xff1a;created by meixi*邮箱&#xff1a;15913707499…

DNS记录类型

在之前的文章中&#xff0c;我们了解了什么是DNS以及DNS如何工作&#xff0c;现在让我们来看看 DNS 记录有哪些种类&#xff0c;以及它们有什么作用。 要理解不同的 DNS 记录&#xff0c;首先必须了解区域文件是什么? 我们来解释一下各部分分别表示什么&#xff1a; A 和 AAAA…

Android 频道管理,可拖动item排列,删除,添加

样式效果 1、创建自定义GridView /*** 作者&#xff1a;created by meixi* 邮箱&#xff1a;15913707499163.com* 日期&#xff1a;2019/5/31 13*/public class DragGridView extends GridView {/** 点击时候的X位置 */public int downX;/** 点击时候的Y位置 */public int dow…

2019王小的Java学习之路

文章背景 身边有个非常要好的朋友王某某&#xff0c;因为是发小的关系&#xff0c;之后文章统称为王小。 大专毕业后 顺利 的被安排进了某某工厂工作&#xff0c;工作一段时间后&#xff0c;尽管工作比较轻松&#xff0c;却无法忍受终日的流水线生活&#xff0c;经过我的介绍&…

JVM入门到放弃之基本概念

1. 基本概念 jvm 是可运行Java代码的假想计算机&#xff0c;包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 jvm 是运行在操作系统之上的&#xff0c;屏蔽了与具体操作系统平台相关的信息&#xff0c;使得Java程序只需生成在 jvm 上运行的字节码…

java线程并发库之--线程同步工具Exchanger的使用

Exchanger可以在两个线程之间交换数据&#xff0c;只能是2个线程&#xff0c;他不支持更多的线程之间互换数据。今天我们就通过实例来学习一下Exchanger的用法。 Exchanger的简单实例 Exchanger是在两个任务之间交换对象的栅栏&#xff0c;当这些任务进入栅栏时&#xff0c;它们…

了解JVM运行时的内存分配

前言 上文中&#xff0c;在介绍运行时数据区域中的 JAVA 堆时&#xff0c;提到了 JVM 中的堆&#xff0c;一般分为三大部分&#xff1a;新生代、老年代、永久代&#xff0c;本文将进一步了解运行时的内存分配情况。 正文 1.新生代主要用来存放新生(new)的对象。一般占据堆的 …

C#:继承过程中的静态成员

在知乎上看到一个关于“泛基“的实现&#xff0c;感觉挺有意思&#xff0c;想试试效果&#xff0c;代码如下&#xff1a; public abstract class MyBase<T> where T : MyBase<T>{public static string DataForThisType { get; set; }public static T Instance { ge…

Android 分享功能大全

实现效果&#xff1a; 实现步骤&#xff1a; 1、配置SDK 2、 配置平台SDK demo云盘链接&#xff1a;https://pan.baidu.com/s/1DRr85PKtVpuexfyCc2jwsg 在线交流密码&#xff1a;QQ1085220040 demo链接&#xff1a;https://download.csdn.net/download/meixi_android/112506…

fiddler手机端抓包配置

首先&#xff0c;你得安装fiddler&#xff0c;这是前提条件&#xff0c;手机抓包有必须条件&#xff1a; 需要保持电脑和手机在同一个局域网中 &#xff08;这一点&#xff0c;我一般会在电脑上启动一个wifi&#xff0c;然后手机连接即可&#xff09; 下面说一下如何配置&#…