EasyUI创建人员树的实例代码
程序员文章站
2022-09-08 13:00:31
最近做了一个树状的下拉列表,在这里记录一下,以后可以直接使用
项目中的树状下拉列表是用来选择人员用的,具体实现展示如下:
先说一说功能,左边的人员数是提供选人的,当...
最近做了一个树状的下拉列表,在这里记录一下,以后可以直接使用
项目中的树状下拉列表是用来选择人员用的,具体实现展示如下:
先说一说功能,左边的人员数是提供选人的,当点击中间的按钮,选中的人员会直接移到右边,如果要删除已选中的人员,只需要双击右边人的姓名即可,点击确定进行集体的业务逻辑操作,一般就是新增人员到某一个表中。
我们再来看看这个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创建人员树的实例代码,希望对大家有所帮助
上一篇: Vue.js移动端左滑删除组件的实现代码
下一篇: Vue仿手机qq的实例代码(demo)