JAVA_树状表格分页(layUI、treeTable.js)

article/2025/9/18 2:20:34

效果图展示(PS:本人很懒,刚开始想在网上随意找一个就用,后来发现好像PHP的不少,JAVA的树状表格大多数跟我开始写的一样没有分页,导致数据量过大后加载过于缓慢被客户吐糟,最后没找到合适的就自己写了一个简单的demo,不嫌弃的话可以自己再改改样式)

准备:layUItreeTable.js

代码展示:

<input id="total" type="hidden" value="${total }"><table class="layui-table layui-form" id="tree-table" lay-size="sm"></table><div id="pageDemo"></div><script type="text/javascript">$(function(){$.ajax({url :'tSDepartController.do?getDataNew',data : {'curr' : 1,'limit' : 10},type : 'post',dataType : 'json',success : function(data){test(data);}})            })function test(data){layui.config({base: 'plug-in/test/',})layui.use(['laypage', 'treeTable', 'layer', 'code', 'form'],function(){var o = layui.$,form = layui.form,laypage = layui.laypage,layer = layui.layer,treeTable = layui.treeTable;var	re = treeTable.render({elem: '#tree-table',data: data,icon_key: 'departname',is_checkbox: true,end: function(e){form.render();},cols: [{key: 'departname',title: '机构名称',width: '1500px',align: 'left',},{key: 'description',title: '机构描述',width: '1000px',align: 'center',},{key: 'parentdepartid',title: '父ID',width: '100px',align: 'left',},{key: 'orgCode',title: '机构编码',width: '100px',align: 'center',},{key: 'orgType',title: '机构类型',width: '100px',align: 'center',},{key: 'mobile',title: '电话',width: '300px',align: 'center',},{key: 'fax',title: '传真',width: '300px',align: 'center',},{key: 'address',title: '地址',width: '1000px',align: 'left',},{title: '标记',width: '100px',align: 'center',template: function(item){return '<input type="checkbox" name="close" lay-skin="switch" lay-text="ON|OFF">';}}]});// 监听checkbox选择treeTable.on('tree(box)',function(data){layer.msg(JSON.stringify(data));})});}layui.use(['laypage', 'layer'],function(){var laypage = layui.laypage,layer = layui.layer;var total = $('#total').val();//分页laypage.render({elem: 'pageDemo',count: total,limit: 10,skin: '#1E9FFF',layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'],jump: function(obj, first){if(!first){$.ajax({url :'tSDepartController.do?getDataNew',data : {'curr' : obj.curr,'limit' : obj.limit},type : 'post',dataType : 'json',success : function(data){test(data);}});}}});})</script>
@RequestMapping(params = "list")
public ModelAndView list(HttpServletRequest request) {int total = 0;// 一级机构总数// 获取一级机构总数String sql_total = "select count(1) total from t_s_depart where org_type = '1'";List<Map<String, Object>> list_total =  systemService.findForJdbc(sql_total);if(!ListUtils.isNullOrEmpty(list_total)){for (Map<String, Object> map : list_total) {total = Integer.parseInt(map.get("total")==null?"0":map.get("total").toString());}}request.setAttribute("total", total);return new ModelAndView("com/szerp/department/tSDepartListNew");}@RequestMapping(params = "getDataNew")
@ResponseBody
public List<TSDepartEntity> getDataNew(HttpServletRequest request, HttpServletResponse response) throws IOException{int page = request.getParameter("curr")==null?1:Integer.parseInt(request.getParameter("curr").toString());int limit = request.getParameter("limit")==null?1:Integer.parseInt(request.getParameter("limit").toString());// 分页数据String sql_data = "select id,departname,description,parentdepartid,org_code,org_type,mobile,fax,address,depart_order from (select rownum num,d.* from t_s_depart d where d.org_type = '1') where num > "+((page-1)*limit)+" and num <= "+(page*limit);List<Map<String, Object>> list_data = systemService.findForJdbc(sql_data);List<TSDepartEntity> listDepart = new ArrayList<TSDepartEntity>();String ids = "";if(!ListUtils.isNullOrEmpty(list_data)){for (Map<String, Object> map : list_data) {ids = ids + "'" + (map.get("ID")==null?"":map.get("ID").toString()) + "',";TSDepartEntity tSDepart = new TSDepartEntity();tSDepart.setId(map.get("ID")==null?"":map.get("ID").toString());tSDepart.setDepartname(map.get("DEPARTNAME")==null?"":map.get("DEPARTNAME").toString());tSDepart.setDescription(map.get("DESCRIPTION")==null?"":map.get("DESCRIPTION").toString());tSDepart.setParentdepartid(map.get("PARENTDEPARTID")==null?"":map.get("PARENTDEPARTID").toString());tSDepart.setOrgCode(map.get("ORG_CODE")==null?"":map.get("ORG_CODE").toString());tSDepart.setOrgType(map.get("ORG_TYPE")==null?"":map.get("ORG_TYPE").toString());tSDepart.setMobile(map.get("MOBILE")==null?"":map.get("MOBILE").toString());tSDepart.setFax(map.get("FAX")==null?"":map.get("FAX").toString());tSDepart.setAddress(map.get("ADDRESS")==null?"":map.get("ADDRESS").toString());tSDepart.setDepartOrder(map.get("DEPART_ORDER")==null?"":map.get("DEPART_ORDER").toString());listDepart.add(tSDepart);}}ids = "("+ids.substring(0, ids.length()-1)+")";String sql = "select id,departname,description,parentdepartid,org_code,org_type,mobile,fax,address,depart_order from t_s_depart where parentdepartid in"+ids;List<Map<String, Object>> list_data2 = systemService.findForJdbc(sql);if(!ListUtils.isNullOrEmpty(list_data2)){return getNext(listDepart, list_data2, ids);}return listDepart;}public List<TSDepartEntity> getNext(List<TSDepartEntity> listDepart, List<Map<String, Object>> list_data2, String ids){String ids_ = "";for (Map<String, Object> map : list_data2) {ids_ = ids_ + "'" + (map.get("ID")==null?"":map.get("ID").toString()) + "',";TSDepartEntity tSDepart = new TSDepartEntity();tSDepart.setId(map.get("ID")==null?"":map.get("ID").toString());tSDepart.setDepartname(map.get("DEPARTNAME")==null?"":map.get("DEPARTNAME").toString());tSDepart.setDescription(map.get("DESCRIPTION")==null?"":map.get("DESCRIPTION").toString());tSDepart.setParentdepartid(map.get("PARENTDEPARTID")==null?"":map.get("PARENTDEPARTID").toString());tSDepart.setOrgCode(map.get("ORG_CODE")==null?"":map.get("ORG_CODE").toString());tSDepart.setOrgType(map.get("ORG_TYPE")==null?"":map.get("ORG_TYPE").toString());tSDepart.setMobile(map.get("MOBILE")==null?"":map.get("MOBILE").toString());tSDepart.setFax(map.get("FAX")==null?"":map.get("FAX").toString());tSDepart.setAddress(map.get("ADDRESS")==null?"":map.get("ADDRESS").toString());tSDepart.setDepartOrder(map.get("DEPART_ORDER")==null?"":map.get("DEPART_ORDER").toString());listDepart.add(tSDepart);}ids_ = "("+ids_.substring(0, ids_.length()-1)+")";String sql = "select id,departname,description,parentdepartid,org_code,org_type,mobile,fax,address,depart_order from t_s_depart where parentdepartid in"+ids_;List<Map<String, Object>> list = systemService.findForJdbc(sql);if(!ListUtils.isNullOrEmpty(list)){getNext(listDepart, list, ids_);}   return listDepart;}

treeTable.js代码如下:

layui.define(['jquery'], function(exports) {var MOD_NAME = 'treeTable',o = layui.jquery,tree = function() {};tree.prototype.config = function() {return {top_value: 0,primary_key: 'id',parent_key: 'parentdepartid',hide_class: 'layui-hide',icon: {open: 'layui-icon layui-icon-triangle-d',close: 'layui-icon layui-icon-triangle-r',left: 16,},cols: [],checked: {},is_click_icon: false,is_checkbox: false,is_cache: true,};}tree.prototype.template = function(e) {var t = this,level = [],tbody = '',is_table = o('table' + e.elem).length || !(e.is_click_icon = true),checkbox = e.is_checkbox ? '<div class="layui-unselect layui-form-checkbox cbx" lay-skin="primary"><i class="layui-icon layui-icon-ok"></i></div>' : '',checked = checkbox ? checkbox.replace('cbx', 'cbx layui-form-checked') : '',thead = checkbox && '<th style="width:28px;">' + (o.inArray(e.top_value, e.checked.data) > -1 ? checked : checkbox) + '</th>';o.each(t.data(e, e.data), function(idx, item) {var tr = '',is_checked = false,hide_class = (item[e.parent_key] == e.top_value) || (item[e.parent_key] == t.cache(e, item[e.parent_key])) ? '' : e.hide_class;// 设置每行数据层级item.level = level[item[e.primary_key]] = item[e.parent_key] != e.top_value ? (level[item[e.parent_key]] + 1) : 0;// 设置是否为最后一级item.is_end = !e.childs[item[e.primary_key]];o.each(e.cols, function(index, obj) {var style = '';obj.width && (style += 'width:' + obj.width + ';'), obj.align && (style += 'text-align:' + obj.align + ';'), style && (style = 'style="' + style + '"');// 标记设置行checkbox选中if(e.is_checkbox && e.checked && o.inArray(item[e.checked.key], e.checked.data) > -1) {is_checked = true;}// 第一次遍历头部的时候拼接表格头部idx || (thead += '<th ' + style + '>' + obj.title + '</th>');// 指定列加入开启、关闭小图标var icon = (obj.key == e.icon_key && !item.is_end) ? '<i class="' + (t.cache(e, item[e.primary_key]) ? e.icon.open : e.icon.close) + '"></i>' : '<span></span>';// 指定列小图标按照层级向后位移var left = (obj.key == e.icon_key ? level[item[e.primary_key]] * e.icon.left + 'px' : '');icon = icon.replace('>', ' style="margin-left:' + left + ';">');// 拼接行tr += '<td ' + style + (left ? 'data-down' : '') + '>' + icon + (is_table ? '' : (is_checked ? checked : checkbox)) + (obj.template ? obj.template(item) : item[obj.key]) + '</td>';});var box = is_table ? o(is_checked ? checked : checkbox).wrap('<td style="width:28px;">').parent().prop('outerHTML') : '';tbody += '<tr class="' + hide_class + '" data-id="' + item[e.primary_key] + '" data-parentdepartid="' + item[e.parent_key] + '">' + box + tr + '</tr>';});// 处理表树和树的赋值模板var table = is_table ? '<thead><tr data-id="' + e.top_value + '">' + thead + '</tr></thead><tbody>' + tbody + '</tbody>' : tbody.replace(/<tr/g, '<ul').replace(/tr>/g, 'ul>').replace(/<td/g, '<li').replace(/td>/g, 'li>');// 确认点击图标或点击列触发展开关闭var click_btn = e.is_click_icon ? '[data-down] i:not(.layui-icon-ok)' : '[data-down]';// 模板渲染并处理点击展开收起等功能o(e.elem).html(table).off('click', click_btn).on('click', click_btn, function() {var tr = o(this).parents('[data-id]'),td = tr.find('[data-down]'),id = tr.data('id'),parentdepartid = tr.data('parentdepartid'),is_open = (td.find('i:not(.layui-icon-ok)').attr('class') == e.icon.close);if(is_open) {// 展开子级(子级出现、更改图标)td.find('i:not(.layui-icon-ok)').attr('class', e.icon.open);td.parents(e.elem).find('[data-parentdepartid=' + id + ']').removeClass(e.hide_class);t.cache(e, id, true);} else {// 关闭子级(更改图标、隐藏所有子孙级)td.find('i:not(.layui-icon-ok)').attr('class', e.icon.close);t.childs_hide(e, id);}// 设置监听展开关闭layui.event.call(this, MOD_NAME, 'tree(flex)', {elem: this,item: e.childs[parentdepartid][id],table: e.elem,is_open: is_open,})}).off('click', '.cbx').on('click', '.cbx', function() {var is_checked = o(this).toggleClass('layui-form-checked').hasClass('layui-form-checked'),tr = o(this).parents('[data-id]'),id = tr.data('id'),parentdepartid = tr.data('parentdepartid');t.childs_checkbox(e, id, is_checked);t.parents_checkbox(e, parentdepartid);// 设置监听checkbox选择layui.event.call(this, MOD_NAME, 'tree(box)', {elem: this,item: parentdepartid === undefined ? {} : e.childs[parentdepartid][id],table: e.elem,is_checked: is_checked,})}).off('click', '[lay-filter]').on('click', '[lay-filter]', function() {var tr = o(this).parents('[data-id]'),id = tr.data('id'),parentdepartid = tr.data('parentdepartid'),filter = o(this).attr("lay-filter");return layui.event.call(this, MOD_NAME, 'tree(' + filter + ')', {elem: this,item: e.childs[parentdepartid][id],})});e.end && e.end(e);};// 同级全部选中父级选中/同级全部取消取消父级tree.prototype.parents_checkbox = function(e, parentdepartid) {var po = o(e.elem).find('[data-parentdepartid=' + parentdepartid + ']'),co = o(e.elem).find('[data-id=' + parentdepartid + ']'),len = o(e.elem).find('[data-parentdepartid=' + parentdepartid + '] .cbx.layui-form-checked').length;if(po.length == len || len == 0) {var parentdepartid = co.data('parentdepartid');len ? co.find('.cbx').addClass('layui-form-checked') : co.find('.cbx').removeClass('layui-form-checked');parentdepartid === undefined || this.parents_checkbox(e, parentdepartid);}};// 子级反选tree.prototype.childs_checkbox = function(e, id, is_checked) {var t = this;o(e.elem).find('[data-parentdepartid=' + id + ']').each(function() {var checkbox = o(this).find('.cbx');is_checked ? checkbox.addClass('layui-form-checked') : checkbox.removeClass('layui-form-checked');t.childs_checkbox(e, o(this).data('id'), is_checked);})};// 点击收起循环隐藏子级元素tree.prototype.childs_hide = function(e, id) {var t = this;t.cache(e, id, false);o(e.elem).find('[data-parentdepartid=' + id + ']:not(.' + e.hide_class + ')').each(function() {var td = o(this).find('[data-down]'),i = td.find('i:not(.layui-icon-ok)');// 关闭更换小图标i.length && i.attr('class', e.icon.close);// 隐藏子级td.parents(e.elem).find('[data-parentdepartid=' + id + ']').addClass(e.hide_class);t.childs_hide(e, o(this).data('id'))});};// 重新组合数据,父子级关系跟随tree.prototype.data = function(e) {var lists = [],childs = [];o.each(e.data, function(idx, item) {lists[item[e.primary_key]] = item;if(!childs[item[e.parent_key]]) {childs[item[e.parent_key]] = [];}childs[item[e.parent_key]][item[e.primary_key]] = item;});e.childs = childs;return this.tree_data(e, lists, e.top_value, []);};tree.prototype.tree_data = function(e, lists, parentdepartid, data) {var t = this;if(lists[parentdepartid]) {data.push(lists[parentdepartid]);delete lists[parentdepartid]}o.each(e.data, function(index, item) {if(item[e.parent_key] == parentdepartid) {data.concat(t.tree_data(e, lists, item[e.primary_key], data))}});return data;};tree.prototype.render = function(e) {var t = this;e = o.extend(t.config(), e);if(e.url) {o.get(e.url, function(res) {e.data = res;t.template(e);})} else {t.template(e);}return e;};// 获取已选值集合tree.prototype.checked = function(e) {var ids = [];o(e.elem).find('.cbx.layui-form-checked').each(function() {var id = o(this).parents('[data-id]').data('id');ids.push(id);})return ids;};// 全部展开tree.prototype.openAll = function(e) {var t = this;o.each(e.data, function(idx, item) {item[e.primary_key] && t.cache(e, item[e.primary_key], true);})t.render(e);}// 全部关闭tree.prototype.closeAll = function(e) {localStorage.setItem(e.elem.substr(1), '');this.render(e);}tree.prototype.on = function(events, callback) {return layui.onevent.call(this, MOD_NAME, events, callback)};// 存储折叠状态tree.prototype.cache = function(e, val, option) {if(!e.is_cache) {return false;}var t = this,name = e.elem.substr(1),val = val.toString(),cache = localStorage.getItem(name) ? localStorage.getItem(name).split(',') : [],index = o.inArray(val, cache);if(option === undefined) {return index == -1 ? false : val}if(option && index == -1) {cache.push(val)}if(!option && index > -1) {cache.splice(index, 1)}localStorage.setItem(name, cache.join(','));};var tree = new tree();exports(MOD_NAME, tree)
});

更改父级ID字段时,别忘记treeTable.js中也要一同更改哦(以上展示代码为初版demo,若需使用建议优化,还有不要跟我一样不是正式发行版代码就不写备注

 


http://chatgpt.dhexx.cn/article/9EF7kEMc.shtml

相关文章

关于layui表格分页问题

分页时注意 limitName必须与后端接收时的字段名相同 后端接收时需要注意page>0时需要page-1

vue 实现简单表格分页功能

使用框架实现表格展示和跳转功能&#xff0c;一直不懂原理。所以自己写一个简单的&#xff0c;加深理解。 布局分为2块&#xff0c;上面是表格展示数据&#xff0c;下面是点击按钮跳转。 效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en&q…

element 表格分页选中

需求&#xff1a; 分页表格实现分页选中&#xff0c;编辑时可以进行回显。 实现&#xff1a; 刚开始拿到需求后本来是自己写代码实现分页选中&#xff0c;后来查了文档&#xff0c;发现可以根据element-table中的提供的属性实现&#xff1b;如下图方式实现&#xff1b; //el…

前端表格分页功能

前端表格分页功能 我的设想难点实现效果展示&代码 我的设想 1.一次性将所有数据请求到&#xff0c;然后分成很多部分给前端来显示 &#xff08;优点&#xff1a;一次性请求完成&#xff0c;无需再请求&#xff0c;缺点&#xff1a;可能用户并不需要用到全部的数据段&…

表格 + 分页 +表格上编辑

分装分页表格 分页表格的封装代码截图实现的功能分页咋弄的dataPacket是啥看下图表格编辑咋搞的我其实啥都不想写。。图片贴上就完了↑↑↑你这个东西咋用呀效果展示一下吧---好的 分页表格的封装 想要使用表格&#xff0c;可以&#xff01; 有各种各样的插件。。。 想要使用分…

js分页、表格

js分页代码&#xff1a; //js分页 //el:分页容器 count:总记录数 pageStep:每页显示多少个 pageNum:第几页 fnGo:分页跳转函数 var jsPage function(el, count, pageStep, pageNum, fnGo) {this.getLink function(fnGo, index, pageNum, text) {var s <a href"#p i…

使用element-ui实现表格分页

前言 由于项目需要&#xff0c;我使用到了element-ui&#xff0c;当需要使用到表格分页功能的时候&#xff0c;就遇到了一些问题&#xff0c;但通过努力还是解决了&#xff0c;接下来就让我讲一下我对于element-ui中的分页功能的了解&#xff08;因为这次讲的是表格的分页&…

排序算法---快速排序、堆排序、冒泡排序

排序算法 1 快速排序代码实现stdlib库快排 2 堆排序堆排序的基本思想如何构造一个大顶堆排序 3 冒泡排序 1 快速排序 文章原地址&#xff1a;https://blog.csdn.net/morewindows/article/details/6684558 快速排序的平均时间复杂度是0(NlogN)&#xff0c;它采用了一种分治的策…

ARM C语言调用汇编函数 实现冒泡排序

使用冒泡排序将指定数组排序后输出排序函数使用汇编语言编写&#xff0c;C语言调用汇编语言在控制台显示排序前后的结果 一、问题分析二、代码编写2.1 C语言代码2.2 汇编代码 三、ADS调试3.1 运行ADS软件&#xff0c;进入调试界面3.2 汇编函数调试3.3 执行结果 一、问题分析 本…

汇编入门程序,冒泡排序

写了半天发现资料不多&#xff0c;放上来造福一下人类&#xff0c;主要题库的题也好多题解太少 一 用汇编语言编写程序&#xff0c;要求实现以下功能&#xff1a; 程序执行后&#xff0c;屏幕显示提示信息&#xff1a;“Please Enter The Password:”&#xff0c;等待输入用…

汇编语言实现冒泡排序

文章目录 题目简述思路代码总结 题目简述 给定10个数&#xff0c;使用汇编语言&#xff0c;实现10个数的冒泡排序&#xff0c;使之成为升序 思路 本题中&#xff0c;我们需要使用条件转移指令&#xff0c;比较指令&#xff08;CMP&#xff09;&#xff0c;交换指令&#xff…

微机原理实现冒泡排序

微机原理实现冒泡排序 废话不说先放题目 实验目的 1&#xff09; 学会从键盘中读取输入&#xff0c;并将其ASCII码进行转化。 2&#xff09; 利用所学的冒泡排序对数组进行输出 3&#xff09;学会使用中断程序进行字符的输出。 实验所用仪器及使用方法 Windows emu8086仿…

MIPS实现冒泡排序

程序目标 从键盘输入10个无符号字数并从大到小进行排序&#xff0c;排序结果在屏幕上显示出来。 准备工作 编程的入门级知识&#xff1a;循环、冒泡排序、内存和堆栈的概念MIPS语法&#xff1a;程序基本结构汇编语言&#xff1a;不同寄存器作用、数据存储、系统调用编辑器&a…

c语言数组实现冒泡排序

数组实现冒泡排序 什么是冒泡拍排序用数组实现总结 什么是冒泡拍排序 首先&#xff0c;需要了解一下什么是冒泡排序&#xff0c;定义&#xff1a;冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个…

汇编实现排序——冒泡排序

冒泡排序算法的运作如下&#xff1a;&#xff08;从后往前&#xff09; 1.比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。 2.对每一对相邻元素作同样的工作&#xff0c;从开始第一对到结尾的最后一对。在这一点&#xff0c;最后的元素应该会是最大的数。…

冒泡排序与qsort排序

先来比较两者的优缺点&#xff1a; 冒泡排序qsort排序优简单&#xff0c;稳定效率高&#xff0c;适用性广劣适用性差&#xff0c;速度慢较为复杂 一、冒泡排序&#xff1a; 底层思路&#xff1a; 如此循环9轮得到 知道了思路就可以写代码了 #include<stdio.h> void bubbl…

易语言冒泡排序

冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成。这个算…

实现冒泡排序函数

#1 冒泡排序思想 假设我们现在又是个乱序的数字&#xff0c;10 2 3 4 1 6 8 5 9 7&#xff0c;要对这十个数字进行升序排序&#xff08;越往右数字越大&#xff09;&#xff0c;我们可以这样子做&#xff1a; 取出最左边的数字&#xff08;10&#xff09;&#xff0c;然后依次…

用汇编实现冒泡排序

对应的C语言代码如下&#xff1a; int number[6]{12,3,2,5,6,7}; for(int i0;i<6;i) {for(int j0;j<6;j) {if(a[i]<a[j]) {int tempa[i];a[i]a[j];a[j]temp;}} } 汇编代码&#xff08;从大到小排列&#xff09;&#xff1a; DATA SEGMENTBUF DB 12,3,2,5,6,7 …

c语言冒泡排序while循环,冒泡排序算法,C语言冒泡排序算法详解

冒泡排序是最简单的排序方法&#xff0c;理解起来容易。虽然它的计算步骤比较多&#xff0c;不是最快的&#xff0c;但它是最基本的&#xff0c;初学者一定要掌握。 冒泡排序的原理是&#xff1a;从左到右&#xff0c;相邻元素进行比较。每次比较一轮&#xff0c;就会找到序列中…