欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

EasyUI创建人员树的实例代码

程序员文章站 2022-09-08 13:00:31
最近做了一个树状的下拉列表,在这里记录一下,以后可以直接使用 项目中的树状下拉列表是用来选择人员用的,具体实现展示如下: 先说一说功能,左边的人员数是提供选人的,当...

最近做了一个树状的下拉列表,在这里记录一下,以后可以直接使用

项目中的树状下拉列表是用来选择人员用的,具体实现展示如下:

EasyUI创建人员树的实例代码

先说一说功能,左边的人员数是提供选人的,当点击中间的按钮,选中的人员会直接移到右边,如果要删除已选中的人员,只需要双击右边人的姓名即可,点击确定进行集体的业务逻辑操作,一般就是新增人员到某一个表中。

我们再来看看这个div的具体代码,由于项目中在多个地方都使用到了这个人员树,所以我把这个div抽象出来当作一个公共的jsp页面。如需调用,只需要include这个jsp即可

usertree.jsp:

<%@ page contenttype="text/html;charset=utf-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="sino" tagdir="/web-inf/tags"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<c:set var="ctx" value="${pagecontext.request.contextpath}" />
<!--弹出窗口,人员树必要-->
<link href="${ctx}/static/lib/jquery-easyui/themes/default/easyui.css" rel="external nofollow" rel="external nofollow" 
 type="text/css" rel="stylesheet" />
<script src="${ctx}/static/lib/jquery-easyui/jquery.easyui.min.js"
 type="text/javascript"></script>
<style type="text/css">
 li:hover {
 cursor: pointer;
 }
</style>
<!-- 模态框弹出设置评估人 -->
 <div id="groupuser" class="modal fade" aria-hidden="true"
  data-backdrop="static">
  <div class="modal-dialog">
   <div class="modal-content">
    <input type="hidden" id="modaltasklineid" />
    <div class="modal-header">
     <h4 class="modal-title text-left">请选择评估人</h4>
    </div>
    <div class="modal-body">
     <div >
      <div style=" float: left; width: 300px;font-size:15px; ">
      待选择人
      </div>
      <div style="float: left; font-size:15px; width: 100px; ">
      已选择人
      </div>
     </div>
     <div>
      <div id="tt"
       style="border:1px solid #e4eaf8; float: left; width: 250px; height: 300px; overflow-x: scroll;">
      </div>
      <div align="center" style="float: left; margin-left: 10px; margin-right:10px; height: 150px;margin-top: 150px;">
       <button type="button" class="btn-xs btn-primary" onclick="$add()">>></button>
      </div>
      <div
       style="border:1px solid #e4eaf8;width:250px; height: 300px;overflow-x: scroll;">
       <ul id="names" style="list-style: none;padding-left:5px;">
       </ul>
      </div>
      <p></p>
     </div>
     <div align="center">
        <input class="btn btn-cmcc mr15 " type="button" value="确定" onclick="modelcheckassessors()">
        <input class="btn btn-cmcc mr15" type="button" value="取消" onclick="modalhide()">
      </div>
     <p/>
    </div>
   </div>
  </div>
 </div>
<script type="text/javascript">
 //人员数组(longinname) 本项目是已登录名为主键存入,也可存入userid
 var arr = [];
 //点击确定的处理逻辑方法名称,调用方法的时候需要设置
 var fn = "";
 //展示人员树,右边没有默认值
 function showtree(groupid) {          //查询范围是在groupid这个部门以下的节点部门和人员
  //console.log(groupid);
  $('#tt').tree({
   //一般情况下,除了url外,其他参数非必选
   //url: contextpath + requesturl,//请求的后台路径              //这里需要注意的是后台url不要指定请求方式为get方式,否则会报错。
   url : context_path + "/sysmgr/user/chooseassessortree?groupid="+groupid,
   animate : true, //是否需要动画效果
   checkbox : 'true', //是否需要checkbox 支持复选
   cascadecheck : 'false',//是否级联选中
   onlyleafcheck : 'true', //是否只有leaf节点有checkbox
   lines : true,//是否显示线
   onclick : function(node) {
    //点击
    /* var leaf = $('#tt').tree("isleaf", node.target); //判断是否为leaf
     if(leaf){
     arr.push(node.id);
     } */
    $('#tt').tree("toggle", node.target);//点击父节点和点击父节点前面的+号一样能展开
   },
   onloaderror : function(node, data) {
    alert("查询不到数据,树形加载失败");
    return;
   },
   oncheck : function(node, checked) {
    if (checked) {
     //arr.push(node);
    } else {
     //arr.remove(node);
    }
   }
  /* onbeforeload:function(node,param){
   param.screeningtxt = $("#screeningtxt").val();
  }*/
  });
  $("#groupuser").modal("show");//显示模态框,
 }     
  //接口方法,外面的jsp通过调用这个方法来弹出人员树模态框,且希望只能调用这个方法
 //展示人员数,右边有默认值
 //参数havadefault表示是否有默认值,注意,批量设置不能够有默认值 布尔值:true,false
 //参数loginnamedisplaynamestr是longinname和displayname的组合字符串,例如有三个人:"zhangsan-张三,lisi-李四,wangwu-王五",如果没有默认值,就设置为null     
  //参数method表示方法名称,即你点击确定之后返回的人员的处理方法名称,注意这个方法规定参数只能有一个,那就是人员登陆名的一个字符串,多个人用";"隔开  
  //参数groupid表示传入到后台的一个参数。在本项目中,由于需要根据条件查询出不同公司/部门下的人员,所以传入了部门id,若没有,可以为null
 function showtreedefault(loginnamedisplaynamestr, method, havadefault,groupid) {
  arr = [];//需要设置为全局变量
  fn = method;
  if (!havadefault) {
   showtree(groupid);
   return;
  }
  if (loginnamedisplaynamestr!=null) {
   //alert(loginnamedisplaynamestr);
   //加载默认值到树的右边边框
   var result = loginnamedisplaynamestr.split(",");
   for (var i = 0; i < result.length; i++) {
    var user = result[i].split("-");
    var loginname = user[0];
    var displayname = user[1];
    var ul = document.getelementbyid("names");
    var li = document.createelement("li");
    li.setattribute("value", loginname);
    li.setattribute("ondblclick", "$remove(this)");
    li.innerhtml = displayname;
    ul.appendchild(li);
    arr.push(loginname);
   }
  }
  showtree(groupid);
 }
 function modelcheckassessors() {
  if (arr.length != 0) {              //将登录名数组以";"隔开组成一个字符串
   var loginnamestr = arr.join(";");
   returnval(loginnamestr);
  } else {
   returnval(null);
  }
 }
 function returnval(retarr) {
  //调用处理逻辑方法
  window[fn](retarr);
  //关闭模态框
  modalhide();
 }
 function modalhide() {
  //清空右边li的数据
  $('ul li').remove();
  $("#groupuser").modal("hide");
 }
 function $add() {
  var nodes = $('#tt').tree('getchecked');
  if (nodes.length != 0) {
   for (var i = 0; i < nodes.length; i++) {
    var loginname = nodes[i].id;
    var username = nodes[i].text;
    addeleinmainbox(loginname, username);
    $('#tt').tree('uncheck', nodes[i].target);//去掉选中的
   }
  }
 };
 function addeleinmainbox(loginname, username) {
  //1.判断当前div中是否已经存在该loginname,如果有重复的则不添加
  if (arr.exists(loginname)) {
   //alert("已经存在"+loginname+",不再添加");
   return;
  }
  //2.添加该评估人到li中
  var ul = document.getelementbyid("names");
  var li = document.createelement("li");
  li.setattribute("value", loginname);
  li.setattribute("ondblclick", "$remove(this)");
  li.innerhtml = username;
  ul.appendchild(li);
  arr.push(loginname);
 }
 function $remove(obj) {
  var loginname = obj.getattribute("value");
  obj.parentnode.removechild(obj);
  arr.remove(loginname);
 }
 array.prototype.remove = function(val) {
  var index = this.indexof(val);
  if (index > -1) {
   this.splice(index, 1);
  }
 };
 array.prototype.exists = function(v) {
  var b = false;
  for (var i = 0; i < this.length; i++) {
   if (this[i] == v) {
    b = true;
    break;
   }
  }
  return b;
 };
</script>

下面再来看看java后台是如何来查找这个树的,附上后台代码

//选择评估人-树形结构
 @requestmapping(value = "chooseassessortree")//这里不要指定请求方式
 public void chooseassessortree(httpservletrequest req,httpservletresponse res){
   //每次点击节点的时候会传入一个节点id值<br data-filtered="filtered">      string id = req.getparameter("id");
   //第一次加载树时选择的区域
   string groupid = req.getparameter("groupid");
   list<map<string,object>> list=userservice.queryjsassessor(id,groupid);
   buildjson.printtoclient(req, res, arraybuilder(list));
 }
 //获得树值
 private jsonarray arraybuilder(list<map<string,object>> list) {
  jsonarray arr = new jsonarray();
  if (list != null && list.size() > 0) {
   for (int i=0;i<list.size();i++) {
    jsonobject obj = new jsonobject();
    map map=list.get(i);
    string userimg=map.get("userimg").tostring();
    if (userimg.equals("1")) {//表示到了叶子节点,选择出人
     obj.put("id", map.get("loginname"));
     obj.put("text", map.get("displayname"));
     obj.put("state", "open");
     //obj.put("iconcls", "icon-user2-gj");
    }else{
     obj.put("id", map.get("groupid"));
     obj.put("text", map.get("groupname"));
     obj.put("state", "closed");
    }
    arr.add(obj);
   }
  }
  return arr;
 }

dao查询方法

/**查询树结构的人员以及部门数据
  * @param parentgroupid
  * @param groupid 第一次加载树查询的 区域 例如是成都分公司,则查询出成都分公司下面的部门以及人员
  * @return
  */
 list<map<string, object>> queryjsassessor(@param("parentgroupid") string parentgroupid, @param("groupid")string groupid);  

对应的xml

<select id="queryjsassessor" resulttype="map" parametertype="string">
  select
    e.loginname,
    e.displayname,
    e.groupid,
    e.groupcode,
    e.groupname,
    e.disorder,
    e.userimg
    from
    (select s.loginname,s.displayname,s.groupid,s.groupcode,s.groupname,s.disorder,s.userimg from
     (select '0' loginname,
       '0' displayname,
      fg.id groupid,
      fg.code groupcode,
      fg.name groupname,
      fg.display_order disorder,
      isnull((select count(id) from fnd_group where parent_id=fg.id),0) groupleaf,
      (select count(1) from fnd_user_group fug, fnd_user fu where fug.user_id = fu.id and fug.group_id = fg.id) userleaf,
      0 userimg
     from fnd_group fg
     where fg.enable_flag = 'y'
     <if test="parentgroupid != null and '' != parentgroupid">
      and fg.parent_id = #{parentgroupid}
     </if>
      <if test="parentgroupid == null or '' == parentgroupid">
       <if test="groupid!=null and '' !=groupid">
        and fg.parent_id = #{groupid}
       </if>
       <if test="groupid==null or ''==groupid">
       and fg.group_level = 0
       </if>
      </if>
      )s where s.groupleaf>0 or s.userleaf>0
   union all 
     select fu.login_name loginname,
       fu.display_name displayname,
       fg.id groupid,
      fg.code groupcode,
      fg.name groupname,
      fg.display_order disorder,
      1 userimg
    from fnd_user fu 
    left join fnd_user_group fug on fu.id=fug.user_id
    left join fnd_group fg on fug.group_id=fg.id
     where fu.enable_flag = 'y'
      and fug.primary_flag='y'
     and fg.name!=''
     and fu.login_name!=''
     and fu.display_name!=''
     and fu.mobile!=''
     <if test="parentgroupid != null and '' != parentgroupid">
      and fug.group_id = #{parentgroupid}
     </if>
     <if test="parentgroupid == null or '' == parentgroupid">
       <if test="groupid!=null and '' !=groupid">
        and fug.group_id = #{groupid}
       </if>
       <if test="groupid==null or ''==groupid">
       and fg.group_level = 0
       </if>
      </if>
      )e
   order by userimg, cast(disorder as int)
 </select>

最后再附上一个使用实例的 jsp

<%--
 created by intellij idea.
 user: zht
 date: 2017/7/18
 time: 20:36
 to change this template use file | settings | file templates.
--%>
<%@ page contenttype="text/html;charset=utf-8" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="sino" tagdir="/web-inf/tags" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<c:set var="ctx" value="${pagecontext.request.contextpath}"/>
<!doctype html>
<html>
<head>
 <title>专项评估 > 任务分发</title>
 <script src="${ctx}/static/scm/js/commondialog.js" type="text/javascript"></script>
 <link href="${ctx}/static/sinoprof/core/css/menu-dropdown.css" rel="external nofollow" type="text/css" rel="stylesheet"/>
 <script src="${ctx}/static/sinoprof/core/js/namespace.js" type="text/javascript"></script>
 <script src="${ctx}/static/sinoprof/core/js/lookupdialogremember.js" type="text/javascript"></script>
 <script src="${ctx}/static/scm/js/taskeditexceldata.js" type="text/javascript"></script>
 <script src="${ctx}/static/scm/js/bootstrap-filestyle.js" type="text/javascript"></script>
 <link href="${ctx}/static/lib/jquery-easyui/themes/default/easyui.css" rel="external nofollow" rel="external nofollow"  type="text/css" rel="stylesheet" />
 <script src="${ctx}/static/lib/jquery-easyui/jquery.easyui.min.js" type="text/javascript"></script>
 <sino:sinoflow ctx="${ctx}" sfactinfo="${sfactinfo}"/>
 <style type="text/css">
  .table tbody td:nth-child(1n) {
   text-align: center;
   vertical-align: middle;
  }
  .mr15 {
   margin-right: 15px;
  }
 </style>
</head>
<body>
<form:form id="appform" name="specialtask" class="form-horizontal" role="form"
   action="${ctx}/scm/special/distribute/submit" method="post">
 <input type="hidden" id="launch_code" />
 <input type="hidden" id="appl_column4">
 <input type="hidden" id="loginids" name="loginids" >
 <input type="hidden" id="launch_code_bypass" value="c1">
 <input type="hidden" id="groups" name="groups" value="${flowgroups}">
 <input type="hidden" id="sf_actid" value="${sf_actid}">
 <input type="hidden" id="nextloginname" value="${nextloginname}">
 <div class="control-group">
  <input type="hidden" name="taskid" value="${taskid}">
  <input type="hidden" name="taskname" value="${taskname}">
  <h2 style="text-align:center">${taskname}</h2>
  <input type="hidden" id="taskid" value="${taskid}">
  <div style="height: 70px">
   <div class="pull-right mr15">
    <button type="button" class="btn-cmcc" onclick="dosubmit();">任务分发</button>
   </div>
   <div class="pull-right mr15">
    <button id="cancelbtn" type="button" class="btn-cmcc" onclick="window.location.href='${ctx}/flow/workbench/pendingtray'">关闭</button>
   </div>
  </div>
  <div class="group-header col-xs-12">
   <span class="title">本次评估信息</span>
   <div class="dropdown opts table-opts" data-table="3">
    <a class="btn-span" style="color:white" data-action="" onclick="checkassessors(this,true);">批量设置评分人</a>
    <a class="btn-span" style="color:white" data-action="" onclick="removeassessors(this,true);">批量清空评分人</a>
   </div>
  </div>
  <div class="form-group" >
   <div class="col-md-12">
    <table class="col-md-12 table table-striped table-bordered table-hover">
     <thead>
     <tr>
      <td style="width:3%"><input type="checkbox" id="selectall" name="selectall"/></td>
      <th style="width:4%">序号</th>
      <th style="width:35%">协议/合同名称</th>
      <th style="width:23%">评估供应商</th>
      <th style="width:20%">评估人</th>
      <th style="width:15%">评估模板</th>
     </tr>
     </thead>
     <tbody>
     <c:foreach items="${specialtasklinelist}" var="line" varstatus="status">
      <tr>
       <td><input type="checkbox" name="chkitem" value="${line.tasklinesetid}"></td>
       <th>${status.index+1}
        <input type="hidden" name="tasklineid" value="${line.tasklineid}">
        <input type="hidden" name="tasklinesetid" value="${line.tasklinesetid}">
        <input type="hidden" name="objecttype" value="${line.objecttype}">
       </th>
       <td>${line.contractname}</td>
       <td>${line.vendorname}</td>
       <td class="assessorstd" name="assessorstd" style="text-align:left; color:#e69500">
        <c:if test="${line.usernames !=null}">
         <a onclick="checkassessors(this,false);"style="color:#e69500" > ${line.usernames}</a>
         <!-- <a onclick="removeassessors(this,false);" style="">清空</a> -->
         <input type="hidden" name="usernames" value="${line.usernames}" />
         <input type="hidden" class="loginnames" name="loginnames" value="${line.loginnames}" />
         <input type="hidden" name="loginnamedisplaynamestr" value="${line.loginnamedisplaynamestr}" />
         <input type="hidden" name="flowgroups" value="${line.flowgroups}" />
        </c:if>
        <c:if test="${line.usernames ==null}">
         <a onclick='checkassessors(this,false);' style='color: red'>设置评估人</a>
        </c:if>
       </td>
       <td> <a href="##" rel="external nofollow" onclick="showindicatorsdetail(this)">${line.templetname}</a></td>
      </tr>
     </c:foreach>
     </tbody>
    </table>
   </div>
  </div>
 </div>
</form:form>
 <jsp:include page="/web-inf/views/workflow/workbench/usertree.jsp" />
<%-- <%@ include file="../../../../static/scm/usertree.jsp"%> --%>
<script type="text/javascript">
 $(function () {
  //全选、取消全选的事件
  $("#selectall").click(function () {
   $("input[name='chkitem']").prop("checked", this.checked);
  });
 });
 function assessorsvalidate(){
  var flag=true;
  $(".assessorstd").each(function(){
   var validatemedium=$(this).find("input[name='loginnames']").val();
   if(!validatemedium){
    flag=false;
    msgalert("评估人未设置");
    return false;
   }
  });
  return flag;
 }
 function do_validate_save() {//流程“暂存”前由流程引擎自动调用,如果该函数返回false,流程引擎中止“暂存”操作
  if ($("#appform").valid()&&assessorsvalidate()) {
   return true;
  }else{
   return false;
  }
 }
 //提交数据
 function dosubmit() {
  var companyid = $("#companyid").val();
  if(companyid =="00"){
   $("#launch_code").val("b");
  }else {
   $("#launch_code").val("a");
  }
  if (do_validate_save()){
   var assessors=new array();
   $('.loginnames').each(function(index){
    var arrayeach=($(this).val()).split(",");
    for(var i=0;i<arrayeach.length;i++){
     if(assessors.indexof(arrayeach[i])<0){
      assessors.push(arrayeach[i]);
     }
    }
   });
   assessors=assessors.join(";");
   if($("#nextloginname").val()){
    $("#loginids").val($("#nextloginname").val());
   }else {
    $("#loginids").val(assessors);
   }
   if(checkappraiser()){
    do_div_complete_start();
   }else {
    msgalert("存在指标评估人为空");
   }
  }
 }
 function checkappraiser(){
  var flag = true;
  var taskid = $("#taskid").val();
  $.ajax({
   url:"${ctx}/scm/special/distribute/checkappraiser",
   type:"post",
   datatype:"json",
   async:false,
   data:{"taskid":taskid},
   success:function(result){
    if(result>0){
     flag = false;
    }
   }
  });
  return flag;
 }
 //选择评估人
 function checkassessors(obj,flag) {
  if(flag&& $("input[name='chkitem']:checked").length == 0){
   msgalert("请选择要设置的行。");
   return;
  }
  arr = [];//需要设置为全局变量
  var method="dealmethod";
  if(!flag){
    var tasklinesetid = $(obj).parents("tr").find("input[name='tasklinesetid']").val();
    //这里的modaltaskid为模态框里面的id值,表示需要修改的行,该列表示可以传递的参数
    $("#modaltasklineid").val(tasklinesetid);
    //获取评估人信息loginname和displaynamestr(默认值)
    var loginnamedisplaynamestr = $(obj).parents("tr").find("input[name='loginnamedisplaynamestr']").val();
    showtreedefault(loginnamedisplaynamestr,method,true);
  }
  //批量设置评估人
  else{
    var check = $("input[name='chkitem']:checked");
    var tasklineidstr="";
    check.each(function (index) {
     if(index==0){
      tasklineidstr=$(this).val();
     }else{
      tasklineidstr+=","+$(this).val();
     }
   }); 
   $("#modaltasklineid").val(tasklineidstr);
   showtreedefault(null,method,false);
  }
 }
 //判断是否是批量设置评估人,如果是批量,循环处理(本方法也是模态框处理方法)
 function dealmethod(loginnames){
   if(loginnames==null){
    alert("评估人不能为空,设置失败!");
    return ;
   }
   var tasklinesetidstr = $("#modaltasklineid").val();
   $.commondialog.showprogress('${ctx}', '正在设置评估人,请稍候...');
   saveappraiser(tasklinesetidstr,loginnames);
 }
 function saveappraiser(tasklinesetidstr,loginnames) {
  $.ajax({
   url:"${ctx}/scm/special/distribute/saveappraiser",
   type:"post",
   datatype:"json",
   async:false,
   data:{"tasklinesetidstr":tasklinesetidstr,"loginnames":loginnames},
   success:function(result){
    window.location.reload();
   }
  });
 }
 function removeassessors(obj,flag) {
  if(flag&& $("input[name='chkitem']:checked").length == 0){
   msgalert("请选择要设置的行。");
   return;
  }
  msgconfirm("是否确认清空?",
    function () {
     $.commondialog.showprogress('${ctx}', '正在删除,请稍候...');
     $("#nextloginname").val("");
     if(flag){
      $("input[name='chkitem']:checked").each(function () {
       removepeople($(this).parents("tr").find("td input[name ='loginnames']"));
      });
     }else {
      removepeople(obj);
     }
     window.location.reload();
//     $.commondialog.hiddenprogress();
    }
  );
 }
 function removepeople(obj) {
  var tasklinesetid = $(obj).parents("tr").find("th input[name=tasklinesetid]").val();
  $.ajax({
   url:"${ctx}/scm/special/distribute/delappraiser",
   type:"post",
   datatype:"json",
   async:false,
   data:{"tasklinesetid":tasklinesetid},
   success:function(result){
//    if(result =='y'){
//     $(obj).parent("td") .html("<a onclick='checkassessors(this,false);' style='color: red'>设置评估人</a>");
//    }
   }
  });
 }
 function showindicatorsdetail(obj) {
  var loginnames = $(obj).parents("tr").find("td input[name=loginnames]").val();
  var tasklineid = $(obj).parents("tr").find("th input[name=tasklineid]").val();
  var objecttype = $(obj).parents("tr").find("th input[name=objecttype]").val();
  var sf_actid = $("#sf_actid").val();
  if(loginnames){
   window.location.href= "${ctx}/scm/special/distribute/indicatorsedit?tasklineid="+tasklineid+"&objecttype="+objecttype+"&sf_actid="+sf_actid;
  }else {
   msgalert("请先设置评估人!");
  }
 }
</script>
</body>
</html>

总结

以上所述是小编给大家介绍的easyui创建人员树的实例代码,希望对大家有所帮助