这些功能是我在项目中自己总结出来的...直接上demo,代码很简单可以看看就懂了
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <% String path = request.getContextPath(); String CONTEXT_PATH = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>树形测试</title> <link rel="stylesheet" type="text/css" href="<%=CONTEXT_PATH %>jquery-easyui/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="<%=CONTEXT_PATH %>jquery-easyui/themes/icon.css"> <script type="text/javascript" src="<%=CONTEXT_PATH %>jquery-easyui/jquery-1.8.0.min.js"></script> <script type="text/javascript" src="<%=CONTEXT_PATH %>jquery-easyui/jquery.easyui.min.js"></script> <script type="text/javascript"> var contextPath ="<%=CONTEXT_PATH%>"; var limit =""; var n_tree; var canDrop=true,canEdit=false; $(function(){ createDataGrid(); createTree(); createNewTree(); }); function createDataGrid(){ $("#dg").datagrid({ tilte: 'Rank Show', width: 700, height: 500, nowrap: false, striped: true, border: true, collapsible:false,//是否可折叠的 fit: true,//自动大小 singleSelect:false, pagination:true, url:'<%=CONTEXT_PATH%>domain/CommonAction.action', frozenColumns:[[ {field:'ck',checkbox:true} ]], toolbar: [{ text: '添加专有词', iconCls: 'icon-add', handler: function() { append(); } },"-",{ text: '删除', iconCls: 'icon-remove', handler: function(){ removeit(); } } ], columns:[[ {field:'num',title:'排名编号',width:80}, {field:'term',title:'词语',width:100,formatter:formatTerm}, {field:'count',title:'词频',width:100}, {field:'field',title:'所属',width:100} ]] }); var p = $('#dg').datagrid('getPager'); $(p).pagination({ pageSize: 10,//每页显示的记录条数,默认为10 pageList: [10,15,20,25,30],//可以设置每页记录条数的列表 beforePageText: '第',//页数文本框前显示的汉字 afterPageText: '页 共 {pages} 页', displayMsg: '当前显示 {from} - {to} 条记录 共 {total} 条记录', }); } function createTree(){ $("#tt").tree({ url:'<%=CONTEXT_PATH %>domain/ShowTreeAction.action', onClick:function(){nodeClick();} }); } function createNewTree(){ n_tree = $("#n_tt").tree({ url:contextPath+"domain/DepartmentShowAction.action?action=getNode", dnd:true, animate: true, onDrop: function(targetNode, source, point){ var targetId = $('#n_tt').tree('getNode', targetNode).id; // alert(targetId+"::"+source.id+"::"+point); if(source.text !="其他类" && source.text != "未分类"){ $.ajax({ url: contextPath+'domain/DepartmentShowAction.action?action=updateNode', type: 'post', dataType: 'json', data: { id: source.id, targetId: targetId, point: point } }); }else{ alert("其他类与未分类不可编辑"); reload(); } }, onClick: function(node){ if(canEdit){ $(this).tree('beginEdit',node.target); } }, onAfterEdit:function(node){ if(node.text !=""){ $.ajax({ url: contextPath+'domain/DepartmentShowAction.action?action=updateNodeText', type: 'post', dataType: 'json', data: { id: node.id, text: node.text } }); }else{ alert("编辑文本不能为空!"); } } }); } function reload(){ //$('#tt').tree('reload'); } function changeCkeckBox(){ var dropCheck = document.getElementById("isDrop").checked; var editCheck = document.getElementById("idEdit").checked; canDrop =dropCheck; canEdit = editCheck; $("#n_tt").tree({ dnd: canDrop }); } function addNode(){ var node = $('#n_tt').tree('getSelected'); if (node){ $.ajax({ type: "POST", url: contextPath+"domain/DepartmentShowAction.action?action=addNode", data: "pid="+node.id, success: function(msg){ nodes=[{ "id":msg.id, "text": msg.text }]; $('#tt').tree('append', { parent:node.target, data:nodes }); } }); }else{ alert("请先选择要添加的节点!"); } } function deleteNode(){ var node = $('#n_tt').tree('getSelected'); if (node){ $.ajax({ type: "POST", url: contextPath+"domain/DepartmentShowAction.action?action=deleteNode", data: "id="+node.id, success: function(msg){ for(var index in msg){ if(index == "success" && msg[index] ==true ) $("#tt").tree("remove",node.target); } } }); }else{ alert("请选择要删除的节点"); } } function onSearch(){ var url =contextPath+"domain/CommonAction.action?action=rank"; limit = document.getElementById("input_kw").value; url = getUrl(url,limit); $('#dg').datagrid({ url: url }); } function nodeClick(){ var node = $('#tt').tree('getSelected'); if (node){ var id = node.id; var url = contextPath+"domain/CommonAction.action?action=rank&path="+id; $('#dg').datagrid({ url: url }); } } function append(){ var valueArr = new Array(); var rows = $('#dg').datagrid('getSelections'); for(var i=0; i<rows.length; i++){ var row = rows[i]; valueArr.push(row.term); } addhotChange(valueArr); } function removeit(){ var valueArr = new Array(); var rows = $('#dg').datagrid('getSelections'); for(var i=0; i<rows.length; i++){ var row = rows[i]; valueArr.push(row.term); } addstopChange(valueArr); reloadDataGrid(); } function addstopChange(valueArr){ var valueStr =""; for(var value in valueArr) valueStr += valueArr[value] +","; $.ajax({ type: "GET", url: "<%=CONTEXT_PATH%>domain/WordAction.action", dataType: "json", data :"action=addstopWord&"+"data="+valueStr, success: function(data, textStatus){ var stopDom = document.getElementById("stop"); for(var index in data){ for(var obj in data[index]){ var option = new Option(data[index][obj],obj); option.selected = true; stopDom.appendChild(option); } } } }); } function addhotChange(valueArr){ var valueStr =""; for(var value in valueArr) valueStr += valueArr[value] +","; $.ajax({ type: "GET", url: "<%=CONTEXT_PATH%>domain/WordAction.action", dataType: "json", data :"action=addSpecialtyWord&"+"data="+valueStr, success: function(data, textStatus){ var hotDom = document.getElementById("hot"); for(var index in data){ for(var obj in data[index]){ var option = new Option(data[index][obj],obj); option.selected = true; hotDom.appendChild(option); } } } }); } function reloadDataGrid(){ var grid = $('#dg'); var options = grid.datagrid('getPager').data("pagination").options; var curr = options.pageNumber; //var total = options.total; var pageSize = options.pageSize; var url =contextPath+"domain/CommonAction.action?action=rank"; url = getUrl(url,limit); $('#dg').datagrid({ url: url, queryParams :{ page: curr, rows : pageSize } }); } function getUrl(url,limit){ var nodeId=""; var node = $('#tt').tree('getSelected'); if (node) nodeId = node.id; //limit = document.getElementById("input_kw").value; if(nodeId != undefined && nodeId != "") url = url+"&path="+nodeId; if(limit != undefined && limit != "") url = url +"&limit="+ limit; return url; } function formatTerm(val,row){ return '<a href="javascript:void(0);" onclick="searchText(this.text)">'+val+'</a>'; } function searchText(text){ var url =contextPath+"domain/CommonAction.action?action=searchInit"; url=getUrl(url,text); window.location.href=url; } </script> </head> <body> <!-- <div> <input type="text" name="input_kw" id="input_kw" > <input type="button" value="搜索" onclick="onSearch();"> </div> --> <div class="easyui-accordion" style="width:250px;height:300px;"> <div title="新生成类型" style="padding:10px;"> <input type="checkbox" id="isDrop" checked="checked" onchange="changeCkeckBox()">可拖动 <input type="checkbox" id="idEdit" onchange="changeCkeckBox()">可编辑<br /> <input type="button" id="addNode" onclick="addNode()" value="添加节点"> <input type="button" id="deleteNode" onclick="deleteNode()" value="删除节点"> <ul id="n_tt"></ul> </div> <div title="原本类型" style="padding:10px;"> <ul id="tt" class="easyui-tree"></ul> </div> </div> <div style="border: solid 1px; width: 700px; height:300px; float: left; "> <table id="dg" class="easyui-datagrid" ></table> </div> <br /> <hr /> <div style=" width: 100%;" > <div style="float: right;"> 停用词库:<br /> <select id="stop" multiple="multiple" style="width: 200px;" size="10" > <s:iterator value="stopList" var="stop"> <option value='<s:property value="stop_id" />'><s:property value="stop_term" /> </option> </s:iterator> </select> </div> <div style="float: right; margin-left: 200px; "> 热词词库:<br /> <select id="hot" multiple="multiple" size="10" style="width: 200px;" > <s:iterator value="useList" var="use"> <option value='<s:property value="use_id" />'><s:property value="use_term" /> </option> </s:iterator> </select> </div> </div> <!-- <input type="button" value="获取分页数据" onclick="getPagerInfo();"> --> </body> </html>
后台对应代码:
package com.talkweb.search.web; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import com.alibaba.fastjson.JSON; import com.opensymphony.xwork2.ActionSupport; import com.talkweb.domain.service.DirLevelRelationService; import com.talkweb.domain.service.WorkformService; import com.talkweb.jfts.bean.DirLevelRelation; import com.talkweb.jfts.bean.TreeBuild; @Controller("departmentShowAction") public class DepartmentShowAction extends ActionSupport { /** * */ private static final long serialVersionUID = 1L; @Autowired private WorkformService workformService; @Autowired private DirLevelRelationService dirLevelRelationService; @Override public String execute() throws Exception { HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); String action = request.getParameter("action"); String forward = null; if(action == null || action.isEmpty()) action ="init"; if("init".equalsIgnoreCase(action))forward = init(request,response); else if("getNode".equalsIgnoreCase(action)) forward = getNode(request,response); else if("updateNode".equalsIgnoreCase(action))forward = updateNode(request,response); else if("addNode".equalsIgnoreCase(action))forward = addNode(request,response); else if("updateNodeText".equalsIgnoreCase(action))forward = updateNodeText(request,response); else if("deleteNode".equalsIgnoreCase(action))forward = deleteNode(request,response); return forward; } private String deleteNode(HttpServletRequest request, HttpServletResponse response) { String id = request.getParameter("id"); PrintWriter pw = null; try { dirLevelRelationService.deleteInfoById(id); response.setContentType("text/json; charset=UTF-8"); pw= response.getWriter(); pw.write("{\"success\":true}"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return ERROR; } return null; } private String updateNodeText(HttpServletRequest request, HttpServletResponse response) { String id = request.getParameter("id"); String text = request.getParameter("text"); try { TreeBuild tb = dirLevelRelationService.selectInfoById(id); tb.setPath(tb.getPath().replace(tb.getText(), text)); tb.setText(text); dirLevelRelationService.updateInfo(tb); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return ERROR; } return null; } private String addNode(HttpServletRequest request, HttpServletResponse response) { String baseText ="新建节点"; String pid = request.getParameter("pid"); try { TreeBuild tb = dirLevelRelationService.selectInfoById(pid); String text=""; TreeBuild news_dir = new TreeBuild(); for(Integer i=0 ;i< Integer.MAX_VALUE;i++){ text= baseText+i; Integer count = dirLevelRelationService.selectHasText(text); if(count == null || count == 0){ news_dir.setPid(pid); news_dir.setText(text); news_dir.setPath(tb.getPath()+text+">"); dirLevelRelationService.insertTreeLevelInfo(news_dir); break; } } response.setContentType("text/json; charset=UTF-8"); String jsonStr = JSON.toJSONString(news_dir); response.getWriter().write(jsonStr); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return ERROR; } return null; } private String updateNode(HttpServletRequest request, HttpServletResponse response) { String id = request.getParameter("id"); String targetId = request.getParameter("targetId"); String point = request.getParameter("point"); treeNodeOpera(id, targetId, point); return null; } private void treeNodeOpera(String id,String targetId,String point){ TreeBuild idTb = dirLevelRelationService.selectInfoById(id); TreeBuild targetIdTb = dirLevelRelationService.selectInfoById(targetId); if(idTb == null || targetIdTb == null) return; if("append".equals(point)) appendNode(idTb, targetIdTb); else if("top".equals(point)) topNode(idTb, targetIdTb); else if("bottom".equals(point))bottomNode(idTb, targetIdTb); } private void appendNode(TreeBuild idTb,TreeBuild targetIdTb){ idTb.setPid(targetIdTb.getId()); idTb.setPath(targetIdTb.getPath()+idTb.getText()+">"); dirLevelRelationService.updateInfo(idTb); //获取其是否还有叶子节点..有,则需要修改叶子节点下的路径 // List<TreeBuild> tbList = dirLevelRelationService.selectChildsMyPid(idTb.getId()); // for(TreeBuild tb : tbList){ // appendNode(tb, idTb); // } } private void topNode(TreeBuild idTb,TreeBuild targetIdTb){ idTb.setPid(targetIdTb.getPid()); idTb.setPath(idTb.getPath().replace(targetIdTb.getPath(), "")); dirLevelRelationService.updateInfo(idTb); // List<TreeBuild> tbList = dirLevelRelationService.selectChildsMyPid(idTb.getId()); // for(TreeBuild tb : tbList){ // topNode(tb, idTb); // } } private void bottomNode(TreeBuild idTb,TreeBuild targetIdTb){ idTb.setPid(targetIdTb.getId()); idTb.setPath(targetIdTb.getPath()+idTb.getText()+">"); dirLevelRelationService.updateInfo(idTb); // List<TreeBuild> tbList = dirLevelRelationService.selectChildsMyPid(idTb.getId()); // for(TreeBuild tb : tbList){ // bottomNode(tb, idTb); // } } private String getNode(HttpServletRequest request, HttpServletResponse response) { String path = request.getParameter("id"); String forwar = null; if(path == null || path.isEmpty()) forwar = initDepartInfo(request, response); else forwar = getChildNode(request, response); return forwar; } private String initDepartInfo(HttpServletRequest request, HttpServletResponse response){ //假设登录进来的为网络部门 String depart ="网络部门"; request.getSession().setAttribute("depart",depart); depart +=">" ; try { initTree(depart); TreeBuild tb = getNodeInfo(depart); findNodeisLeaf(tb); String jsonStr = JSON.toJSONString(tb); response.setContentType("text/json; charset=UTF-8"); response.setCharacterEncoding("UTF-8"); response.getWriter().write("["+jsonStr+"]"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return ERROR; } return null; } private String getChildNode(HttpServletRequest request, HttpServletResponse response){ String id = request.getParameter("id"); try { List<TreeBuild> tbList = dirLevelRelationService.selectChildsMyPid(id); for(TreeBuild tb : tbList) findNodeisLeaf(tb); String jsonStr = JSON.toJSONString(tbList); response.setContentType("text/json; charset=UTF-8"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(jsonStr); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return ERROR; } return null; } private String init(HttpServletRequest request, HttpServletResponse response) { //初始化后台数据参数 return SUCCESS; } private void initTree(String depart){ //部门作为根目录 if_exists(depart , "-1"); //默认的两个子节点 未分类 String[] default_leafNodes = {depart+"未分类"+">",depart+"其他类"+">"}; for(String default_leafNode : default_leafNodes){ TreeBuild tb= dirLevelRelationService.selectTreeByPath(depart); if_exists(default_leafNode, tb.getId()); } } private void if_exists(String path,String pid){ TreeBuild tb = dirLevelRelationService.selectTreeByPath(path); if(tb == null){ DirLevelRelation news_dir = new DirLevelRelation(); news_dir.setPid(pid); news_dir.setVal(getVal(path)); news_dir.setPath(path); dirLevelRelationService.insertDirLevelInfo(news_dir); } } private static String getVal(String path){ String[] childs = path.split(">"); return childs[childs.length-1]; } private TreeBuild getNodeInfo(String path){ TreeBuild tb = dirLevelRelationService.selectTreeByPath(path); return tb; } private void findNodeisLeaf(TreeBuild tb){ Integer size = dirLevelRelationService.findCountByPath(tb.getId()); if(size != null && size > 0) tb.setState("closed"); } }
显示效果:
一部分数据格式: