您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“EasyUI如何創建人員樹”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“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"> <h5 class="modal-title text-left">請選擇評估人</h5> </div> <div class="modal-body"> <div > <div > 待選擇人 </div> <div > 已選擇人 </div> </div> <div> <div id="tt" > </div> <div align="center" > <button type="button" class="btn-xs btn-primary" onclick="$add()">>></button> </div> <div > <ul id="names" > </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}"> <h3 >${taskName}</h3> <input type="hidden" id="taskId" value="${taskId}"> <div > <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" data-action="" onclick="checkAssessors(this,true);">批量設置評分人</a> <a class="btn-span" 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 ><input type="checkbox" id="selectAll" name="selectAll"/></td> <th >序號</th> <th >協議/合同名稱</th> <th >評估供應商</th> <th >評估人</th> <th >評估模板</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" > <c:if test="${line.userNames !=null}"> <a onclick="checkAssessors(this,false);" > ${line.userNames}</a> <!-- <a onclick="removeAssessors(this,false);" >清空</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如何創建人員樹”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。