一、前言
备注:这个大佬写得很全面,也有演示地址,不过是直接读取本地的json文本,我写这文章就是补充下后端动态的给前端传值,本人小白,第一次写,主要是为了做下笔记,有需要的朋友将就的看下。
先看下效果图:
备注:我是用springboot写的,所以后面的所有静态文件都是放在/static/下
二、前端部分
2.1 导入需要的包
下载地址:https://pan.baidu.com/s/16Of8jSOFSE4hzyWjouQwog
<link rel="stylesheet" href="/static/lib/layui/css/layui.css">
<link rel="stylesheet" href="/static/lib/layui/css/common.css"/>
<script type="text/javascript" src="/static/lib/layui/layui.js"></script>
备注:包地址根据自己情况修改,layui文件夹须整个复制
2.2 css修改图标
<style>
/** 箭头未展开 */
#table1 + .treeTable .treeTable-icon .layui-icon-triangle-d:before {
content: "\e602";
}
/** 箭头展开 */
#table1 + .treeTable .treeTable-icon.open .layui-icon-triangle-d:before {
content: "\e61a";
}
/** 文件图标 */
#table1 + .treeTable .treeTable-icon .layui-icon-file:before {
content: "";
}
/** 文件夹未展开(默认有图标我改为空了) */
#table1 + .treeTable .treeTable-icon .layui-icon-layer:before {
content: "";
}
/** 文件夹展开(默认有图标我改为空了) */
#table1 + .treeTable .treeTable-icon.open .layui-icon-layer:before {
content: "";
}
</style>
2.3 引入表格
<table id="table1" class="layui-table" lay-filter="table1"></table>
<!-- 工具条(编辑和删除按钮) -->
<script type="text/html" id="oper-col">
<button class="layui-btn layui-btn layui-btn-xs" lay-event="edit" ><i class="layui-icon"></i>编辑</button>
<button class="layui-btn-danger layui-btn layui-btn-xs" lay-event="del" ><i class="layui-icon"></i>删除</button>
</script>
备注:复制需要的地方即可
2.4 将下载的module文件夹复制到你的项目中,然后在js中用模块加载的方式使用
<script>
layui.config({
base: '/static/module/' /* 修改为你module文件夹地址*/
}).extend({
treetable: 'treetable-lay/treetable'
}).use(['table', 'treetable'], function () {
var $ = layui.jquery;
var table = layui.table;
var treetable = layui.treetable;
// 渲染表格
var renderTable = function () {
layer.load(2);
treetable.render({
size: 'lg', //尺寸
treeColIndex: 0, //设置下拉箭头在第几列
treeSpid: "0", //最上级的父级id
treeIdName: 'deptId', //id字段的名称(自己的id)
treePidName: 'parentId', //pid字段的名称(父亲的id)
treeDefaultClose: true, //是否默认折叠
treeLinkage: false, //父级展开时是否自动展开所有子级
elem: '#table1', //表格的id
url: '/getData', //数据请求地址,返回json格式数据(映射路径)
page: false,
cols: [ //列数和列名可根据需要更改
[
{field: 'name', width:"40%",align:'left' , title: '名称'}, //filed:json数据的key
{field: 'parName', align:'center', title: '上级部门'},
{field: 'orderNum',align:'center' , title: '排序'},
{toolbar: '#oper-col',align:'center', title: '操作'} //toolbar:工具条的id
]
],
done: function () {
layer.closeAll('loading');
}
});
};
renderTable();
//监听工具条
table.on('tool(table1)', function(obj){ //注:tool是工具条事件名,table1是table表格的属性 lay-filter="对应的值"
var data = obj.data; //获得当前行数据
var layEvent = obj.event; //获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)
var tr = obj.tr; //获得当前行 tr 的DOM对象
if(layEvent === 'del'){ //删除
layer.confirm('真的删除行么', function(index){
obj.del(); //删除对应行(tr)的DOM结构,并更新缓存
layer.close(index);
//向服务端发送删除指令
});
} else if(layEvent === 'edit'){ //编辑
//do something
}
});
});
</script>
备注:具体参数使用可参考https://www.layui.com/doc/modules/table.html#async
三、后端部分
3.1 数据表
字段名 | 描述 |
dept_id | 部门id |
parent_id | 上级部门id(父亲id) |
name | 部门名 |
order_num | 排序 |
备注:dept_id 、parent_id 类型必须为varchar
3.2 创建对应的部门实体类SysDept(对应属性名和get、set方法,这里就不展示了)
3.3 controller层设置映射路径,并返回json格式数据
@RestController
public class SysDeptController {
@Resource
SysDeptService sysDeptService;
//映射路径
@RequestMapping(value = "/getData")
public Map<String, Object> Test(){
Map<String, Object> map = new HashMap<>();
//查询所有部门表所有记录
List<SysDept> sysDeptList=sysDeptService.selectAll();
map.put("data", sysDeptList);
return map;
}
}
备注:
- springboot用@RestController就行,SSM需要将@RestController改为@Controller,并在方法名上加 @ResponseBody
2.sql语句、dao层和service层就不写了,就是简单的查询所有记录和调用,没有其他的逻辑处理
3.4 返回数据格式:
{
"data": [
{
"deptId": "1",
"parentId": "0",
"name": "人人开源集团",
"orderNum": 0
},
{
"deptId": "5",
"parentId": "1",
"name": "上海分公司",
"orderNum": 0
},
{
"deptId": "12",
"parentId": "5",
"name": "市场部",
"orderNum": 0
},
{
"deptId": "16",
"parentId": "6",
"name": "技术部",
"orderNum": 0
},
{
"deptId": "6",
"parentId": "1",
"name": "北京分公司",
"orderNum": 1
},
{
"deptId": "13",
"parentId": "5",
"name": "销售部",
"orderNum": 1
},
{
"deptId": "14",
"parentId": "6",
"name": "财务部",
"orderNum": 1
}
]
}