springboot+layuimini实现树形表格

树形表格实现增删改查

这里写目录标题

    • 效果图
    • 前端页面代码
    • 前端插件
    • 后端代码
        • controller
        • service
        • serviceImpl 实现类
        • Entity
        • mapper
        • xml mybatis代码
        • 数据表

效果图

你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

前端页面代码

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>部门信息管理</title>
    <link rel="shortcut icon" href="../resources/favicon.ico" th:href="@{/static/favicon.ico}"/>
    <link rel="stylesheet" th:href="@{../layui/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{../css/public.css}" media="all">
    <!--    图标样式文件-->
    <link rel="stylesheet" th:href="@{../lib/font-awesome-4.7.0/css/font-awesome.min.css}" media="all">
    <!--引入自定义的样式文件-->
    <link rel="stylesheet" th:href="@{../css/custom/custom.css}" media="all">
    <style>
        .layui-btn:not(.layui-btn-lg ):not(.layui-btn-sm):not(.layui-btn-xs) {
            height: 34px;
            line-height: 34px;
            padding: 0 8px;
        }
    </style>
</head>
<body>
<div class="layuimini-container">
    <div class="layuimini-main">
        <!-- 搜索表单信息开始-->
        <fieldset class="table-search-fieldset">
            <legend>搜索信息</legend>
            <div style="margin: 10px 10px 10px 10px">
                <form class="layui-form layui-form-pane">
                    <div class="layui-form-item" style="margin-left:5%">
                        <div class="layui-inline">
                            <label class="layui-form-label">部门名称</label>
                            <div class="layui-input-inline">
                                <input type="text" name="name" autocomplete="off" class="layui-input"
                                       lay-affix="clear">
                            </div>
                        </div>
                        <div class="layui-inline">
                            <label class="layui-form-label">部门状态</label>
                            <div class="layui-input-inline">
                                <select lay-search="" name="status">
                                    <option value="">请选择或搜索</option>
                                    <option value="0">正常</option>
                                    <option value="1">停用</option>
                                </select>
                            </div>
                        </div>
                        <div class="layui-inline">
                            <label class="layui-form-label">部门类型</label>
                            <div class="layui-input-inline">
                                <select lay-search="" name="type">
                                    <option value="">请选择或搜索</option>
                                    <option value="1">公司</option>
                                    <option value="2">分公司</option>
                                    <option value="3">部门</option>
                                    <option value="4">小组</option>
                                </select>
                            </div>
                        </div>
                        <div class="layui-inline">
                            <button type="submit" class="layui-btn layui-btn-sm layui-bg-cyan" lay-submit
                                    lay-filter="search-btn"><i class="fa fa-search"></i> 搜 索
                            </button>
                            <button type="reset" class="layui-btn layui-btn-sm layui-bg-orange" lay-submit
                                    lay-on="reset-btn"><i class="fa fa-refresh"></i> 重置
                            </button>
                        </div>
                    </div>
                </form>
            </div>
        </fieldset>
        <!--搜索表单结束-->
        <!-- 表格数据按钮开始-->
        <div style="margin-top: 10px">
            <div class="layui-inline">
                <a class="layui-btn layui-bg-black layui-border-orange layui-btn-sm" lay-on="add-btn"><i
                        class="fa fa-plus"></i> 新增</a>
                <a class="layui-btn  layui-border layui-bg-orange layui-btn-sm" lay-on="edit-btn"><i
                        class="fa fa-pencil-square-o"></i> 修改</a>
                <button class="layui-btn layui-bg-black layui-btn-sm" id="btn-expand"><i class="fa fa-exchange"></i>
                    展开/折叠
                </button>
            </div>
            <!--数据表格数据-->
            <table id="dept-table" class="layui-table" lay-filter="dept-table"></table>
        </div>
        <!-- 表格数据按钮结束-->
        <!-- 添加和修改的弹出层开始 -->
        <div style="display: none;padding: 20px" id="saveOrUpdateDiv">
            <form class="layui-form" lay-filter="dept-form" id="dept-form">
                <div class="layui-form-item">
                    <label class="layui-form-label">上级部门</label>
                    <!-- 父级部门下拉树-->
                    <div class="layui-input-block" id="parent"></div>
                    <!--父级部门存放的id值-->
                    <input type="hidden" id="parentId" name="parentId">
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">部门名称</label>
                    <div class="layui-input-block">
                        <input type="text" id="name" name="name" lay-affix="clear" lay-verify="required"
                               autocomplete="off" placeholder="请输入部门名称" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">部门类型</label>
                    <div class="layui-input-block">
                        <input type="radio" name="type" value="2" title="分公司">
                        <input type="radio" name="type" value="3" title="部门">
                        <input type="radio" name="type" value="4" title="小组">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">部门状态</label>
                    <div class="layui-input-block">
                        <input type="radio" name="status" value="0" title="正常" checked>
                        <input type="radio" name="status" value="1" title="停用">
                    </div>
                </div>
                <br>
                <span class="layui-word-aux" style="font-size: 12px">
                    注意**:<br>
                    上级部门只能时部门类型的上一级,小组不支持再分配小组。
                </span>
            </form>
        </div>
        <!--添加和修改的弹出层结束-->
    </div>
</div>
<!-- 操作列 -->
<script type="text/html" id="dept-state">
    {{#if(d.type=='1'){}}
    <a class="layui-btn layui-btn-disabled layui-btn-xs"><i class="fa fa-times"></i> 不允许操作</a>
    {{#}else if(d.type=='2'||d.type=='3'){}}
    <a class="layui-btn layui-bg-blue layui-btn-xs" lay-event="add"><i
            class="fa fa-plus"></i> 新增</a>
    <a class="layui-btn layui-bg-orange layui-border layui-btn-xs" lay-event="edit"><i
            class="fa fa-pencil-square-o"></i> 编辑</a>
    <a class="layui-btn layui-bg-red  layui-btn-xs" lay-event="del"><i class="fa fa-trash-o"></i> 删除</a>
    {{#}else{}}
    <a class="layui-btn layui-bg-orange layui-border layui-btn-xs" lay-event="edit"><i
            class="fa fa-pencil-square-o"></i> 编辑</a>
    <a class="layui-btn layui-bg-red  layui-btn-xs" lay-event="del"><i class="fa fa-trash-o"></i> 删除</a>
    {{#}}}

</script>

<script th:src="@{../layui/layui.js}" charset="utf-8"></script>
<!--引用第三方插件(消息通知插件)-->
<script th:src="@{../dist/notify/notify.js}"></script>
<!--引入第三方插件(配置文件,树形下拉组件)-->
<script th:src="@{../dist/xm-select/xm-select.js}" charset="utf-8"></script>
<!--引入第三方jQuery-->
<script th:src="@{../js/jquery-3.7.1.min.js}" charset="utf-8"></script>
<script th:src="@{../js/lay-config.js}" charset="utf-8"></script>
<script th:inline="none">
    layui.use(['table', 'treetable', 'notify', 'form', 'element'], function () {
        var $ = layui.jquery;
        var form = layui.form;
        var table = layui.table;
        var notify = layui.notify;
        var treetable = layui.treetable;
        var util = layui.util;
        var layer = layui.layer;
        var element = layui.element; // 引用元素模块

        /*
        * 点击重置按钮,刷新当前页面
        * */
        util.on('lay-on', {
            "reset-btn": function () {
                //刷新当前页面
                window.location.reload();
            },
            "add-btn": function () {
                //跳转到新增页面
                open_department_add(null)
            },
            "edit-btn": function () {
                var id = 'dept-table';//表格id
                var checkStatus = table.checkStatus(id)//获取选中状态

                //获取选中的数据
                var obj = checkStatus.data[0];
                if (checkStatus.data.length == 0) {
                    notify.info('请选择一条数据进行修改', "vcenter", "shadow", false);
                    return false;
                }
                if (obj.type == 1) {
                    notify.warning('总公司类型,没有权限修改', "vcenter", "shadow", false);
                    return false;
                }
                //打开编辑窗口
                open_department_editor(obj);
            }
        });

        /*
        * 监听搜索操作,根据条件查询
        * */
        form.on('submit(search-btn)', function (data) {
            var result = data.field;
            if (result.name == '' && result.status == '' && result.type == '') {
                notify.info('请选择一项条件进行搜索', "vcenter", "shadow", false);
                return false;
            }
            //根据搜索条件查询
            table.reload('dept-table', {
                url: '/dept/getDeptData',
                page:false,
                method: 'get',
                where: {
                    name: result.name,
                    status: result.status,
                    type: result.type
                },
                cols: [[
                    {type: "radio", width: 50},
                    {field: 'name', minWidth: 200, align: 'center', title: '部门名称'},
                    {
                        field: 'status', width: 180, title: '部门状态', align: 'center', templet: function (d) {
                            if (d.status == 0) {
                                return '<span class="layui-badge layui-bg-green">正常</span>';
                            } else {
                                return '<span class="layui-badge-rim layui-bg-red">停用</span>';
                            }
                        }
                    },
                    {
                        field: 'type', width: 180, align: 'center', templet: function (d) {
                            if (d.type == 1) {
                                return '<span class="layui-badge layui-bg-cyan">公司</span>';
                            }
                            if (d.type == 2) {
                                return '<span class="layui-badge layui-bg-black">分公司</span>';
                            }
                            if (d.type == 3) {
                                return '<span class="layui-badge layui-bg-blue">部门</span>';
                            } else {
                                return '<span class="layui-badge-rim layui-bg-orange">小组</span>';
                            }
                        }, title: '类型'
                    },
                    {field: 'sort', width: 80, align: 'center', title: '排序号'},
                    {title: '操作', align: 'center', minWidth: 200, templet: '#dept-state'}
                ]],
                done: function () {
                    layer.closeAll('loading');
                }
            });
            return false;
        });

        /*
        * 渲染树形表格
        * */
        layer.load(2);
        treetable.render({
            treeColIndex: 1,//树形图标显示在第几列
            treeSpid: 0,//根节点id值
            // treeIdName: 'name',//树形id字段的名称
            treePidName: 'parentId',//树形pid字段的名称
            elem: '#dept-table',
            url: '/dept/getDeptData',
            page: false,
            cols: [[
                {type: "radio", width: 50},
                {field: 'name', minWidth: 200, align: 'center', title: '部门名称'},
                {field: 'parentId', width: 80, align: 'center', title: '排序'},
                {
                    field: 'status', width: 180, align: 'center', title: '部门状态', templet: function (d) {
                        if (d.status == 0) {
                            return '<span class="layui-badge layui-bg-green">正常</span>';
                        } else {
                            return '<span class="layui-badge-rim layui-bg-red">停用</span>';
                        }
                    }
                },
                {
                    field: 'type', width: 180, align: 'center', templet: function (d) {
                        if (d.type == 1) {
                            return '<span class="layui-badge layui-bg-cyan">公司</span>';
                        }
                        if (d.type == 2) {
                            return '<span class="layui-badge layui-bg-black">分公司</span>';
                        }
                        if (d.type == 3) {
                            return '<span class="layui-badge layui-bg-blue">部门</span>';
                        } else {
                            return '<span class="layui-badge-rim layui-bg-orange">小组</span>';
                        }
                    }, title: '类型'
                },
                {field: 'createTime', align: 'center', title: '创建时间'},
                {templet: '#dept-state', minWidth: 200, align: 'center', title: '操作'}
            ]],
            done: function () {
                layer.closeAll('loading');
            }
        });

        /*
        * 展开或折叠树形表格
        * 给id为btn-expand的元素添加点击事件
        * */
        $('#btn-expand').click(function () {
            // 获取当前按钮的状态,存储在变量status中
            var status = $('#btn-expand').data('status');
            // 如果状态为展开
            if (status == 'expand') {
                // 调用treetable插件的expandAll方法,展开id为dept-table的表格
                treetable.expandAll('#dept-table');
                // 将按钮的状态设置为折叠
                $('#btn-expand').data('status', 'fold');
            } else {
                // 如果状态为折叠,调用treetable插件的foldAll方法,折叠id为dept-table的表格
                treetable.foldAll('#dept-table');
                // 将按钮的状态设置为展开
                $('#btn-expand').data('status', 'expand');
            }
        });

        /*
        * 监听工具条
        * 表格中的工具条
        * */
        table.on('tool(dept-table)', function (obj) {
            var data = obj.data;
            var layEvent = obj.event;
            if (layEvent === 'add') {
                open_department_add(data)
            }
            else if (layEvent === 'edit') {
                open_department_editor(data);
            } else if (layEvent === 'del') {
                //删除操作
               layer.confirm('确定删除该部门吗?', function (index) {
                   $.ajax({
                       url: '/dept/deleteDept',
                       type: 'DELETE',
                       data: {
                           id: data.id
                       },
                       success: function (res) {
                           if (res.code ===0) {
                               notify.success(res.msg,"vcenter", "shadow", false);
                               setTimeout(function () {
                                   notify.destroyAll();
                                   layer.closeAll(index);
                                   window.location.reload();
                               }, 500);
                          } else {
                               notify.error(res.msg,"vcenter", "shadow", false);
                          }
                      }
                  })
               })
            }
        });

        /*
        * 表单编辑修改页面上级部门下拉框
        * */
        var parent = xmSelect.render({
            el: '#parent', // 将下拉选择框挂载到id为parent的元素上
            theme: {
                color: '#9792a2', // 设置主题颜色
            },
            model: {
                label: {
                    type: 'block',
                    block: {
                        //最大显示数量, 0:不限制
                        showCount: 0,
                        //是否显示删除图标
                        showIcon: false,
                    }
                }
            },
            filterable: true, // 允许筛选
            clickClose: true, // 点击选项后关闭下拉框
            tips: '请选择上级部门',
            tree: {
                show: true, // 显示树形结构
                strict: false, // 不严格匹配
                expandedKeys: [-1], // 默认展开所有节点
            },
            radio: true,//单选
            on: function (data) {
                //arr:  当前已选中的数据
                var arr = data.arr;
                // console.log(arr);
                if (arr.length > 0) {
                    // 从选中数据中提取value值
                    var value = arr[0].value;
                    console.log(value);
                    // 存储所选数据的值,这里是在前端隐藏了书籍类别输入框,将提出出来的值写入到表单中便于提交到数据库中
                    document.getElementById('parentId').value = value;
                } else {
                    // 存储所选数据的值,这里是在前端隐藏了书籍类别输入框,将提出出来的值写入到表单中便于提交到数据库中
                    document.getElementById('parentId').value = null;
                }
            },
            data: [],// 初始化数据为空数组
        })

        /*
        * 定义方法,发送一个GET请求,从后端获取所有部门信息
        * */
        function getDeptTree(deptId) {
            $.ajax({
                url: '/dept/getDeptTree',
                type: 'GET',
                success: function (data) {
                    var newData = []; // 用于存储处理后的分类数据
                    data.forEach(function (dept) {
                        if (dept.parentId == 0) {// 如果父级ID为0,则添加到根节点下
                            newData.push({
                                name: dept.name,// 分类名称
                                value: dept.id,// 分类ID
                                type: dept.type,// 分类类型
                                parentId: dept.parentId,// 父级ID
                                children: [],// 子分类列表
                                selected: (dept.id === deptId),// 是否选中
                                disabled: dept.status == 1 ? true : false, //这里的禁用只能禁用单条数据而不能禁用子节点
                            });
                        } else {
                            findAndAddChild(newData, dept, deptId); // 递归查找并添加子分类
                        }
                    });
                    parent.update({data: newData}); // 更新下拉选择框的数据
                },
                error: function (error) {
                    console.log('Error fetching data from backend: ' + error); // 如果请求失败,输出错误信息
                }
            });
        }

        /*
        * 递归查找并添加子部门的函数
        * */
        function findAndAddChild(data, dept, deptId) {
            data.forEach(function (parent) {
                if (parent.value == dept.parentId) {// 如果父分类ID匹配,则添加子分类 (加上 && dept.status != 1: 表示禁用状态,禁用父节点及下面子节点)
                    parent.children.push({// 添加子分类
                        name: dept.name,// 子分类名称
                        value: dept.id,// 子分类ID
                        type: dept.type,// 子分类类型
                        children: [],// 子分类列表
                        selected: (dept.id === deptId),// 是否选中
                        disabled: dept.status == 1 ? true : false, //这里的禁用只能禁用单条数据而不能禁用子节点
                    });
                } else {
                    findAndAddChild(parent.children, dept, deptId); // 递归查找并添加子分类
                }
            });
        }

        /*
        * 数据添加方法
        *
        * */
        function open_department_add(data) {
            layer.open({
                type: 1,
                title: '新增部门',
                closeBtn: false,
                shadeClose: true,
                content: $("#saveOrUpdateDiv"),
                area: ['680px', '450px'],
                //样式
                skin: 'class-layer-custom',
                btn: ['<i class="fa fa-check"></i> 新增', '<i class="fa fa-mail-reply-all "></i> 取消'],
                success: function (layero, index) {
                    if (data==null){
                        var deptId =null;
                    }else {
                        //保留parentId的值不清理
                        $("#parentId").val(data.parentId);
                        //获取部门树,传入值为空值
                        var deptId = data.parentId;
                    }
                    //清理表单数据
                    $("#dept-form")[0].reset();
                    //调用方法
                    getDeptTree(deptId)
                },
                yes: function (index) {
                    //这里加一个判断,如果不加会同时弹出两个弹框,因为点击按钮时,会触发两个事件
                    if (validateDepartmentForm() == false) {
                        return false;
                    }
                    //获取表单数据,传递到后端
                    var params = $("#dept-form").serialize();
                    //发布公告
                    notify.loading('正在录入部门信息...', "vcenter", "shadow", false);
                    setTimeout(function () {
                        //关闭loading加载
                        notify.destroyAll();
                        $.ajax({
                            url: '/dept/insertDeptInfo',
                            type: 'GET',
                            data: params,
                            success: function (data) {
                                if (data.code === 0) {
                                    notify.success(data.msg, "vcenter", "shadow", false);
                                } else {
                                    notify.error(data.msg, "vcenter", "shadow", false);
                                }
                            }
                        }).done(function () {
                            setTimeout(function () {
                                notify.destroyAll();
                                layer.closeAll(index);
                                window.location.reload();
                            }, 500);
                        });
                    }, 2000)
                }
                , btn2: function () {
                    layer.close();
                    window.location.reload();
                }
            });
        }

        /*
        * 修改方法
        * 这里封装在对应的位置调用
        * */
        function open_department_editor(data) {
            layer.open({
                type: 1,
                title: '编辑部门',
                closeBtn: false,
                shadeClose: true,
                content: $("#saveOrUpdateDiv"),
                area: ['680px', '450px'],
                skin: 'class-layer-yellow',
                btn: ['<i class="fa fa-check"></i> 保存', '<i class="fa fa-mail-reply-all "></i> 取消'],
                success: function (layero, index) {
                    form.val("dept-form", data);
                    var deptId = data.parentId;
                    // 获取父级分类数据
                    getDeptTree(deptId)
                },
                yes: function (index) {
                    //这里加一个判断,如果不加会同时弹出两个弹框,因为点击按钮时,会触发两个事件
                    if (validateDepartmentForm() == false) {
                        return false;
                    }
                    notify.loading('正在保存部门修改信息...', "vcenter", "shadow", false);
                    setTimeout(function () {
                        notify.destroyAll();
                        $.ajax({
                            url: '/dept/update',
                            type: 'POST',
                            data: {
                                parentId: $("input[id='parentId']").val(),
                                name: $("input[id='name']").val(),
                                type: $("input[name='type']:checked").val(),
                                status: $("input[name='status']:checked").val(),
                                id: data.id,
                            },
                            success: function (data) {
                                if (data.code === 0) {
                                    notify.success(data.msg, "vcenter", "shadow", false);
                                } else if(data.code===1){
                                    notify.warning(data.msg, "vcenter", "shadow", false);
                                } else {
                                    notify.error(data.msg, "vcenter", "shadow", false);
                                }
                            }
                        }).done(function () {
                            setTimeout(function () {
                                notify.destroyAll();
                                layer.closeAll(index);
                                window.location.reload();
                            }, 500);
                        });
                    }, 2000);
                },
                btn2: function () {
                    layer.close();
                    window.location.reload();
                }
            })
        }

        /*
        * 数据验证方法
        * */
        function validateDepartmentForm() {
            //获取树形下拉框选中的数据
            var selectArr = parent.getValue();
            //打印测试
            // console.log(selectArr);
            // 获取表单数据
            var formData = {
                parentId: $("input[id='parentId']").val(),
                name: $("input[id='name']").val(),
                type: $("input[name='type']:checked").val(),
                status: $("input[name='status']:checked").val()
            };
            // 添加父级类型
            parentType = selectArr[0].type;
            // 打印测试
            // console.log("打印默认选择的父级部门类型"+parentType);

            // 判断
            if (!formData.parentId || !formData.name || !formData.type || !formData.status || !parentType) {
                notify.info('请填写完整的部门信息', "vcenter", "shadow", false);
                return false;
            }

            // 根据类型进行逻辑判断
            switch (true) {
                case parentType == '2' && formData.type === '2':
                    notify.warning('分公司类型,不能再添加分公司', "vcenter", "shadow", false);
                    return false;
                case parentType == '3' && (formData.type === '3' || formData.type === '2'):
                    notify.warning('请合理选择上级部门或部门类型', "vcenter", "shadow", false);
                    return false;
                case parentType == '4' && (formData.type === '4' || formData.type === '3' || formData.type === '2'):
                    notify.warning('小组不支持再分组!请重新选择上级部门', "vcenter", "shadow", false);
                    return false;
                default:
                    // 如果所有检查都通过,可以在这里执行后续操作,例如提交表单数据
                    return true;
            }
        }

    });
</script>
</body>
</html>

前端插件

树形下拉菜单xm-select layui扩展插件
树形表格使用的layuimini里面的树形表格组件
消息通知插件 notify(layui插件)
jQuery插件

后端代码

controller
package com.example.erp_project.controller;

import com.example.erp_project.entity.DeptEntity;
import com.example.erp_project.service.DeptService;
import com.example.erp_project.util.ResultUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Lolo don‘t feel
 */
@RestController
@RequestMapping("/dept")
public class DeptController {
    @Autowired
    private DeptService deptService;

    /*
     * 查询部门信息记录,条件参数有:部门名称、部门类型、部门状态
     * @return
     * */
    @GetMapping("/getDeptData")
    public Object getDeptData(DeptEntity dept) {
        //查询部门信息记录
        List<DeptEntity> deptData = deptService.selectAll(dept);
        // 将数据列表封装到PageInfo对象中
        PageInfo pageInfo = new PageInfo(deptData);
        // 创建一个Map用于存放返回的数据
        Map<String, Object> tableData = new HashMap<String, Object>();
        // 这是layui要求返回的json数据格式
        tableData.put("code", 0);
        tableData.put("msg", "");
        // 将全部数据的条数作为count传给前台(一共多少条)
        tableData.put("count", pageInfo.getTotal());
        // 将分页后的数据返回(每页要显示的数据)
        tableData.put("data", pageInfo.getList());
        // 返回tableData
        return tableData;
    }

    /*
     * 部门树形下拉菜单查询
     * */
    @GetMapping("/getDeptTree")
    public List<DeptEntity> getDeptTree() {
        //查询部门信息记录
        List<DeptEntity> deptData = deptService.getAllDeptTree();
        return deptData;
    }

    /*
     * 部门信息添加
     * insertDeptInfo
     * */
    @GetMapping("/insertDeptInfo")
    public ResultUtil insertDeptInfo(DeptEntity dept) {
        try {
            //定义当前时间
            dept.setCreateTime(new Date());
            deptService.deptInformation(dept);
            return ResultUtil.ok(0, "部门新增成功");
        } catch (Exception e) {
            return ResultUtil.error("部门新增失败");
        }
    }

    /*
     * 修改部门信息
     * update
     * */
    @PostMapping("/update")
    public ResultUtil update(DeptEntity dept) {
        try {
           // System.out.println(dept);
            deptService.deptInformation(dept);
            return ResultUtil.ok(0, "部门修改成功");
        } catch (Exception e) {
            return ResultUtil.error("部门修改失败");
        }
    }

    /*
    * 删除部门信息根据id
    * @return
    * */
    @DeleteMapping("/deleteDept")
    public ResultUtil deleteDept(Integer id) {
        try {
            deptService.deleteById(id);
            return ResultUtil.ok(0, "部门删除成功");
        } catch (Exception e) {
            return ResultUtil.error("部门删除失败");
        }
    }
}

service
package com.example.erp_project.service;

import com.example.erp_project.entity.DeptEntity;

import java.util.List;

/**
 * @author Lolo don‘t feel
 */
public interface DeptService {

    /*
    * 查询所有部门
    * @param dept
    * */
    List<DeptEntity> selectAll(DeptEntity dept);

    /*
    * 查询所有数据
    * */
    List<DeptEntity> getAllDeptTree();

    /*
    * 新增和修改部门信息
    * @param dept
    * */
    void deptInformation(DeptEntity dept);

    /*
    * 删除部门信息
    * @param id
    * */
    void deleteById(Integer id);
}

serviceImpl 实现类
package com.example.erp_project.service.Impl;

import com.example.erp_project.entity.DeptEntity;
import com.example.erp_project.mapper.DeptMapper;
import com.example.erp_project.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author Lolo don‘t feel
 */
@Service
public class DeptServiceImpl  implements DeptService {
    @Autowired
    private DeptMapper deptMapper;
    /*
     * 查询所有部门
     * @param dept
     * */
    @Override
    public List<DeptEntity> selectAll(DeptEntity dept) {
        return deptMapper.selectAll(dept);
    }

    /*
    * 查询所有数据
    * */
    @Override
    public List<DeptEntity> getAllDeptTree() {
        return deptMapper.getAllDeptTree();
    }

    /*
    * 部门信息添加和修改
    * @param dept
    * */
    @Override
    public void deptInformation(DeptEntity dept) {
        if (dept.getId() == null){
            deptMapper.insertDeptInfo(dept);
        }
        else {
            deptMapper.updateDeptInfo(dept);
        }
    }

    /*
     * 删除部门信息
     * @param id
     * */
    @Override
    public void deleteById(Integer id) {
        deptMapper.deleteById(id);
    }
}

Entity
package com.example.erp_project.entity;

import lombok.Data;

import java.util.Date;

/**
 * @author Lolo don‘t feel
 */
@Data
public class DeptEntity {
    // 部门id
    private Integer id;
    //部门名称
    private String name;
    //部门类型;1:公司;2:部门,3:小组
    private Integer type;
    //部门状态;1:启用;2:停用
    private Integer status;
    //上级部门id
    private Integer parentId;
    //创建时间
    private Date createTime;

}

mapper
package com.example.erp_project.mapper;

import com.example.erp_project.entity.DeptEntity;

import java.util.List;

/**
 * @author Lolo don‘t feel
 */
public interface DeptMapper {
    /*
    * 查询显示所有部门信息记录带条件查询
    * @param dept
    * */
    List<DeptEntity> selectAll(DeptEntity dept);

    /*
    * 查询所有数据
    * @return
    * */
    List<DeptEntity> getAllDeptTree();

    /*
    * 部门信息添加
    * @param dept
    * */
    void insertDeptInfo(DeptEntity dept);

    /*
    * 部门信息修改
    * @param dept
    * */
    void updateDeptInfo(DeptEntity dept);

    /*
     * 删除部门信息
     * @param id
     * */
    void deleteById(Integer id);
}

xml mybatis代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.erp_project.mapper.DeptMapper">
    <!-- 查询所有数据,带条件查询,根据部门名称,部门类型及部门状态-->
    <select id="selectAll" resultType="com.example.erp_project.entity.DeptEntity">
        select * from tb_dept
        <where>
            <if test="name != null and name != ''">
                and name like "%"#{name}"%"
            </if>
            <if test="type != null">
                and type = #{type}
            </if>
            <if test="status != null">
                and status = #{status}
            </if>
        </where>
    </select>
    <!--查询所有数据-->
    <select id="getAllDeptTree" resultType="com.example.erp_project.entity.DeptEntity">
        select *
        from tb_dept
    </select>
    <!--部门信息数据新增-->
    <insert id="insertDeptInfo">
        insert into tb_dept(name, type, status, parentId, createTime)
        values (#{name}, #{type}, #{status}, #{parentId}, #{createTime})
    </insert>
    <!--数据修改updateDeptInfo-->
    <update id="updateDeptInfo" parameterType="DeptEntity">
        update tb_dept
        <set>
            <if test="parentId != null">
                parentId = #{parentId},
            </if>
            <if test="name != null and name != ''">
                name = #{name},
            </if>
            <if test="type != null">
                type = #{type},
            </if>
            <if test="status != null">
                status = #{status},
            </if>
        </set>
        where id = #{id}
    </update>
    <!--删除功能,根据传入的id值删除数据,递归删除该parentId=id值下的所有子部门-->
    <delete id="deleteById" parameterType="int">
        WITH RECURSIVE cte AS (
            SELECT id, parentId FROM tb_dept WHERE id = #{id}
            UNION ALL
            SELECT d.id, d.parentId FROM tb_dept d INNER JOIN cte ON d.parentId = cte.id
        )
        DELETE FROM tb_dept WHERE id IN (SELECT id FROM cte);
    </delete>




</mapper>
数据表

在这里插入图片描述

所有步骤已结束,如果大家有好的想法可以在评论区讨论哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/618688.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习300问】87、学习率这种超参数在优化时选择随机搜索方法,为什么要在对数尺度范围进行随机搜索?

在超参数优化过程中&#xff0c;对数尺度范围进行随机采样对于某些类型的超参数来说是非常有效的&#xff0c;特别是当超参数的有效值跨越几个数量级时。学习率就是这样一种超参数&#xff0c;它可以从非常小&#xff08;例如&#xff09;到相对大的值&#xff08;例如&#xf…

Vscode----远程服务器改名

问题描述 一开始Autodl服务器机子很多,但是我使用vscode的时候他们的名字都一样,导致每次要打开机子是都需要重新输入ssh和密码 解决方法 修改vscode端服务器的名字即可解决 打开远程设置,选择你的ssh配置文件 将Host改为你想要的名字,保存刷新即可 点击访问博客查看更多…

机器学习作业4——朴素贝叶斯分类器

目录 一、理论 一个例子&#xff1a; 二、代码 对于代码的解释&#xff1a; 1.fit函数&#xff1a; 2.predict函数: 三、实验结果 原因分析&#xff1a; 一、理论 朴素贝叶斯分类器基于贝叶斯定理进行分类&#xff0c;通过后验概率来判断将新数据归为哪一类。通过利用贝…

“知识世界”项目的自动化测试

目录 1.项目介绍 1.1 项目功能介绍 2. 项目测试 2.1 需求分析 2.2 测试计划 2.3 设计测试用例 &#xff08;1&#xff09; 设计 登录 的测试用例 &#xff08;2&#xff09;设计 文章列表页 的测试用例 &#xff08;3&#xff09;设计 详情页 的测试用例 &#xff08…

线下研讨会 技术沙龙|乐鑫芯片与 ESP RainMaker® 为科技初创企业赋能

众多科技初创企业在智能硬件市场迅猛发展的背景下&#xff0c;对不断变化的需求展现出了高度的敏锐性&#xff0c;期望能够快速将其转化为切实的产品方案。然而&#xff0c;面对复杂繁重的软硬件集成任务&#xff0c;这些企业往往容易陷入研发瓶颈、资金短缺以及效率低下等多重…

BGP综合大实验

实验要求 1.AS1中存在两个环回&#xff0c;一个地址是192.168.1.0/24&#xff0c;改地址不能在任何协议中宣告&#xff1b;AS3中存在两个环回&#xff0c;一个地址为192.168.2.0/24&#xff0c;该地址不能在任何协议中宣告&#xff0c;最终要求这两个环回可以ping通&#xff1b…

【超详细】跑通YOLOv8之深度学习环境配置1

环境配置1下载安装内容如下&#xff1a; Anaconda&#xff1a;https://www.anaconda.com/download/success VScode&#xff1a;https://code.visualstudio.com/Download Pycharm&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindows Visual Studio2019&a…

Linunx应急响应

Linux应急流程 1,请提交攻击者的 IP 地址2,请提交攻击者使⽤的操作系统3,请提交攻击者进⼊⽹站后台的密码4,请提交攻击者⾸次攻击成功的时间&#xff0c;格式&#xff1a;DD/MM/YY:hh:mm:ss5,请提交攻击者上传的恶意⽂件名&#xff08;含路径&#xff09;6,请提交攻击者写⼊的恶…

Python vs MATLAB:选择深度学习的首选编程语言

Python vs MATLAB&#xff1a;选择深度学习的首选编程语言 在深度学习领域&#xff0c;编程语言的选择对于初学者的学习路径和未来的职业发展至关重要。目前&#xff0c;Python和MATLAB都是进行科学计算和数据分析的流行工具&#xff0c;但它们在深度学习社区中的应用和受欢迎…

天机学堂—学习辅助功能(含场景问答和作业)

我的课表 需求分析 原型图 管理后台 用户端 流程图 数据设计 接口设计 支付成功报名课程后, 加入到我的课表(MQ)分页查询我的课表查询我正在学习的课程根据id查询指定课程的学习状态删除课表中的某课程 代码实现 数据表设计 添加课程到课表&#xff08;非标准接口&#x…

猫头虎分享已解决Bug || **Babel转换器下载问题** Failed to resolve babel-loader dependency`

猫头虎分享已解决Bug &#x1f42f; || Babel转换器下载问题 &#x1f6ab;Failed to resolve babel-loader dependency 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a…

网络 | 应用层-websocket协议报文格式解析

websocket的官方文档为rfc(request for comments)&#xff0c;是网络协议的规范文档。它包含了许多计算机世界的核心知识 除了这里的websocket&#xff0c;它里边还包含我们熟知的http,tcp等协议的解析。 websocket协议对应的编号是rfc 6455 websocket协议格式解析 由图可知&a…

【RAG论文】RAG中半结构化数据的解析和向量化方法

论文简介 论文题目&#xff1a; 《A Method for Parsing and Vectorization of Semi-structured Data used in Retrieval Augmented Generation》 论文链接&#xff1a; https://arxiv.org/abs/2405.03989 代码: https://github.com/linancn/TianGong-AI-Unstructure/tree/m…

数据结构学习/复习13

一、选择排序 1.直接选择排序 2.堆排序 3.性能测试 二、交换排序 1.冒泡排序 2.快速排序 1.Hore版(递归) 2.随机选关键字Hore版(递归) 3.三数取中Hore版(递归) 3.挖坑法改进Hore版(递归) 4.前后指针法 5.小区间优化 5.性能测试 注意事项1&#xff1a;关键字选取时&#xff0c…

微服务架构与单体架构

微服务架构与与单体架构比较 微服务架构是一种将应用程序作为一组小的、独立服务的系统架构风格&#xff0c;每个服务运行在其自己的进程中&#xff0c;并通常围绕业务能力组织。这些服务通过定义良好且轻量级的机制&#xff08;通常是HTTP REST API&#xff09;进行通信。微服…

常用的简单友好的工单系统(免费)- WGCAT

最近在项目中&#xff0c;有工单系统的需求场景&#xff0c;所以想寻找一款轻量简单的运维工单软件&#xff0c;主要用来记录和处理工作中的一些故障、维护&#xff0c;主要用来记录设备的维护状态&#xff0c;包括服务器、主机、交换机那些 WGCAT&#xff0c;是一款简单轻量的…

上位机图像处理和嵌入式模块部署(树莓派4b的软件源)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多文章都建议替换一下树莓派4b的软件源&#xff0c;不过我自己实际使用下来&#xff0c;官方的软件下载速度其实还可以。这里下载的时候&#xf…

前端Vue架构

1 理解&#xff1a; 创建视图的函数&#xff08;render&#xff09;和数据之间的关联&#xff1b; 当数据发生变化的时候&#xff0c;希望render重新执行&#xff1b; 监听数据的读取和修改&#xff1b; defineProperty&#xff1a;监听范围比较窄&#xff0c;只能通过属性描…

QX---mini51单片机学习---(8)8*8点阵屏

目录 1LED点阵屏简绍 2 8*8点阵屏电路图74 3 74HC595芯片 4实践编程 1LED点阵屏简绍 2 8*8点阵屏电路图74 怎么点亮&#xff0c;正极给高负极给低 不能同时静态显示&#xff0c;跟数码管动态显示一样&#xff0c;反复横跳&#xff0c;利用视觉效果 3 74HC595芯片 …

kilimall非洲电商培训,基础版+进阶版+高阶版 从0-1个人可入驻的平台(12节)

亲爱的朋友们&#xff0c;你们知道吗&#xff1f;有一个神奇的电商平台——kilimall&#xff0c;它可以帮助你实现创业梦想&#xff0c;让你走上财富之路&#xff01; 首先&#xff0c;让我给大家介绍kilimall的基础版。基础版针对的是0经验的小白&#xff0c;提供了详细的教程…