微人事 部门管理 模块 (十五)

news2024/10/1 19:39:35

部门管理的树展示和搜索

数据展示页是个树,我们一次性把数据加载出来也可以通过点一次id加载查询出来出来子部门,我们用一次拿到说有json数据加载出来
数据不多可以用递归,数据很多就用懒加载的方式

由于子部门比较深就不适合,权限组角色之间下展示菜单那样
在这里插入图片描述

在这里插入图片描述

编写后端接口

DepartmentController

@RestController
@RequestMapping("/system/basic/department")
public class DepartmentController {

    @Autowired
    DepartmentService departmentService;

    @GetMapping("/")
    public List<Department>  getAllDepartments(){
        return departmentService.getAllDepartments();
    }
}

DepartmentService

@Service
public class DepartmentService {


    @Autowired
    DepartmentMapper departmentMapper;

    public List<Department> getAllDepartments() {
        //传递-1直接查询最顶级的股东会然后根据mybatis语句进行递归
        return departmentMapper.getAllDepartmentsByParentId(-1);
    }
}

DepartmentMapper

在这里插入图片描述

  <resultMap id="DepartmentWithChildren" type="com.xyg.pojo.Department" extends="BaseResultMap"> <!--当查询的时候会以children属性会调用select把当前id传进去,然后新查询的同会继续调用,形成一个递归-->
    <collection property="children" ofType="com.xyg.pojo.Department" select="com.xyg.mapper.DepartmentMapper.getAllDepartmentsByParentId" column="id" ></collection>
  </resultMap>


  <select id="getAllDepartmentsByParentId" resultMap="DepartmentWithChildren">
     select * from  department where parentid = #{pid}
  </select>

实体类添加一个children字段一对多

在这里插入图片描述

测试
在这里插入图片描述

前端编写

添加elementui 组件
在这里插入图片描述DemMarna.vue

<div  style="width: 500px">
    <el-input
            prefix-icon="el-icon-search"

            placeholder="输入部门名称进行搜索"
            v-model="filterText">         
    </el-input>

    <el-tree
            :data="deps"
            :props="defaultProps"
            default-expand-all
            :filter-node-method="filterNode"     //过滤的方法
            ref="tree">
    </el-tree>
</div>

在这里插入图片描述

 data(){
            return{
                filterText:"",
                deps:[],
                defaultProps: {
                    children: 'children',
                    label: 'name'
                }
            }
        },

在这里插入图片描述

 mounted(){
            this.getDeps()
        },

        methods: {

            getDeps(){
                this.getRequest("/system/basic/department/").then(resp=>{
                    if(resp){
                        this.deps=resp
                    }
                })
            },

数据展示效果
在这里插入图片描述

前端查询过滤

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


            filterNode(value, data) {//过滤的方法,value传过来的最新值,data的Json数组得出每一项,
                if (!value) return true;  //进行比较,如果value不存在的话直接返回true,表示当前的data留着,否则剔除掉
                return data.name.indexOf(value) !== -1;//ata.name是否包含这个值,如果不等于-1就返回值这个值
            }

        watch: { //监控filterText值发生变化
            filterText(val) {
                this.$refs.tree.filter(val);//会触发这个方法
            }
        },

总之就是监听输入框绑定的变量进行监听是否有变化,触发filter方法,
通过方法实现前端查询
在这里插入图片描述

部门树展示添加与删除

使用这个
在这里插入图片描述
粘贴到树组件里
在这里插入图片描述
在这里插入图片描述
用这个方法即可解决 :expand-on-click-node=“false” 是否在点击节点的时候展开或者收缩节点, 默认值为 true,如果为 false,则只有点箭头图标的时候才会展开或者收缩节点。

  <!--  :expand-on-click-node="false" 是否在点击节点的时候展开或者收缩节点, 默认值为 true,如果为 false,则只有点箭头图标的时候才会展开或者收缩节点。-->
    <el-tree

            :data="deps"
            node-key="id"
            :props="defaultProps"
            :expand-on-click-node="false"
            :filter-node-method="filterNode"
            ref="tree">
        <!--slot-scope="{ node, data }   node指当前的元素( :props="defaultProps"),data值得到就是服务端返回的json对象-->
        <span class="custom-tree-node" style="display: flex; justify-content: space-between; width: 100%" slot-scope="{ node, data }">

        <span>{{ data.name }}</span>
        <span>
          <el-button
                  class="depBtn"
                  type="primary"
                  size="mini"
                  @click="() => showAddDep(data)">
            添加部门
          </el-button>
          <el-button
                  class="depBtn"
                  type="danger"
                  size="mini"
                  @click="() => delDeps(node, data)">
            删除部门
          </el-button>
        </span>
      </span>
    </el-tree>
</div>

效果
在这里插入图片描述

后端部门树的添加

如果在董事会上点添加部门就是董事会的子部门,所以要传的参数一个是父部门的id,一个添加的部门名字

在这里插入图片描述
第一步做添加操作把name,和partentid字段加进来,id会自动生成
第二步就要去根据生成的id,查询到他partentid生成组成自己的depPath, 第三步 isParent没有子部门为flash,有了自己的子部门就为true

这个 不难,写service加事务分三步

DepartmentController

 @PostMapping("/")
    public RespBean AddDep(@RequestBody Department department) {
        if(department.getName()!=""){
            Department department1 = departmentService.AddDep(department);
            if (department1 != null) {
                return RespBean.ok("添加成功",department1);
            }
        }
        return RespBean.err("添加失败");
    }

DepartmentService

@Transactional
    public Department AddDep(Department department) {

        //第一步做添加操作把name,和partentid字段加进来,id会自动生成,数据库返回新增的id
        departmentMapper.insertDep(department);

        //第二步就要去根据生成的id,查询到他partentid生成组成自己的depPath,
        //根据id查询出自己的对象
        Department dep = departmentMapper.selectByPrimaryKey(department.getId());
        //获取当前对象父id的对象
        Department parDep = departmentMapper.selectParentDepath(dep.getParentid());

        //获取父id的deppath加自己的id,生成自己Deppath
        String Deppath=parDep.getDeppath()+'.'+department.getId();

        if (Deppath.toString().startsWith("null")){
            throw new RuntimeException("操作错误");
        }
        //设置自己Deppath
        department.setDeppath(Deppath);
        //设自己是可启用
        department.setEnabled(true);
        //设置自己刚添加是没有子部门
        department.setIsparent(false);
        //进行更新操作
        departmentMapper.updateByPrimaryKey(department);
        //如果有新数据进行添加如果有父部门,都把父部门的Isparent 更新为 true
        Department department1 = departmentMapper.selectByPrimaryKey(department.getParentid());
        department1.setIsparent(true);
        departmentMapper.updateByPrimaryKey(department1);

        return departmentMapper.selectByPrimaryKey(department.getId());

    }

DepartmentMapper

mapper就只编写这一个接口,其它都是存在的

int insertDep(Department record);
<!--useGeneratedKeys="true" keyProperty="id"   实现id回调,获取插入数据库的id-->
  <insert id="insertDep" parameterType="com.xyg.pojo.Department" useGeneratedKeys="true" keyProperty="id" >
    insert into department (id, name, parentId,
                            depPath, enabled, isParent)
    values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{parentid,jdbcType=INTEGER},
            #{deppath,jdbcType=VARCHAR}, #{enabled,jdbcType=BIT}, #{isparent,jdbcType=BIT})
  </insert>

前端对接

当点击添加的时候应该弹出输入框

<el-dialog
            title="添加部门"
            :visible.sync="dialogVisible"
            width="30%">
        <div>
            <el-tag size="small">上级部门</el-tag>
            <span >{{this.parDep.name}}</span>
        </div>
        <div  style="margin-top: 8px">
            <el-tag size="small">部门名称</el-tag>
            <el-input  size="mini" v-model="chalDep.name"   placeholder="请输入部门名称" style="width: 200px"></el-input>
        </div>
        <span slot="footer" class="dialog-footer">
    <el-button @click="cannelChal">取 消</el-button>
    <el-button type="primary" @click="chalAdd">确 定</el-button>
  </span>
    </el-dialog>
   

在这里插入图片描述

   showAddDep(data){
                console.log(data)
                this.dialogVisible=true
                this.parDep=data
                this.chalDep.parentid=data.id
            },

在这里插入图片描述

在这里插入图片描述
#接口对接
在这里插入图片描述

在这里插入图片描述


            cannelChal(){
              this.dialogVisible=false;
              this.chalDep.name=""
            },

            chalAdd(){
              this.postRequest("/system/basic/department/",this.chalDep).then(resp=>{
                  if (resp){
                      this.getDeps()
                      this.chalDep.name=""
                      this.dialogVisible=false
                  }
              })
            },

后端部门的删除

DepartmentController

    @DeleteMapping("/{id}")
    public RespBean delDep(@PathVariable Integer id){
        if(departmentService.delDep(id)==1){
            return RespBean.ok("删除成功");
        }
        return RespBean.err("删除失败");
    }

DepartmentService

    public Integer delDep(Integer id) {
        return departmentMapper.delDep(id);
    }

DepartmentMapper

Integer delDep(Integer id) ;
  <delete id="delDep" >
    delete from  department where id=#{id}
  </delete>

前端对接

在这里插入图片描述

 delDeps(node,data){
                this.$confirm('此操作将永久删除, 是否继续?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => {
                    this.deleteRequest("/system/basic/department/"+data.id).then(resp=>{
                        if(resp){
                            this.getDeps()
                        }
                    })

                }).catch(() => {
                    this.$message({
                        type: 'info',
                        message: '已取消删除'
                    });
                });
            },
            getDeps(){
                this.getRequest("/system/basic/department/").then(resp=>{
                    if(resp){
                        this.deps=resp
                    }
                })
            },
            filterNode(value, data) {//过滤的方法,value传过来的最新值,data的Json数组得出每一项,
                if (!value) return true;  //进行比较,如果value不存在的话直接返回true,表示当前的data留着,否则剔除掉
                return data.name.indexOf(value) !== -1;//ata.name是否包含这个值,如果不等于-1就返回值这个值
            }
        },
        watch: { //监控filterText值发生变化
            filterText(val) {
                this.$refs.tree.filter(val);//会触发这个方法
            }
        },

解决树组件添加和删除收缩问题

element-ui中的el-tree在添加或者删除子节点后,也就是每次数据刷新后树就会收上去,但是如果我们还需要在当前节点下进行后续操作,而且有很多层节点的情况下,就很麻烦了,对用户体验感非常差,那么怎么解决呢?

解决办法:定义一个数组,然后点击树节点时,保存下来,存进数据内,刷新后树之前展开的节点就能还是展开的状态。
在这里插入图片描述
在这里插入图片描述

 handleNodeClick(data) {
                this.defaultExpandKeys.push(data.id) ;//记录当前点击节点,并赋值给默认展开的节点的 key 的数组
            },

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

# 59. python的类与对象-更新

[目录] 文章目录 59. python的类与对象-更新1.面向对象编程2.什么是类3.什么是对象4.如何描述对象5.对象的属性和方法6.Python中的类7.type()函数查看数据类型8.类在Python中的应用9.总结 【正文】 59. python的类与对象-更新 1.面向对象编程 本节内容特别抽象&#xff0c;初…

Web3和去中心化:互联网的下一个演化阶段

文章目录 Web3和去中心化的定义Web3&#xff1a;去中心化&#xff1a; 为什么Web3和去中心化如此重要&#xff1f;数据隐私和安全&#xff1a;去中心化的创新&#xff1a;去除中间商&#xff1a; Web3和去中心化的应用领域去中心化金融&#xff08;DeFi&#xff09;&#xff1a…

wustojc2003求整数均值

#include <stdio.h> int main() {int a,b,c,d;double A;scanf("%d%d%d%d",&a,&b,&c,&d);A(double)((abcd)/4.0);//强转成doubleprintf("Sum %d\n",abcd);printf("Average %.2lf",A);return 0;}

C++笔记之基类指针动态地指向某一个子类情况列举

C笔记之基类指针动态地指向某一个子类情况列举 code review! 文章目录 C笔记之基类指针动态地指向某一个子类情况列举1.基本的多态示例2.基类中的成员函数可以设置为纯虚函数3.将基本示例修改为使用智能指针并在堆上实例化子类4.父类指针指向基类后&#xff0c;可以去调用只有…

【JUC系列-01】深入理解JMM内存模型的底层实现原理

一&#xff0c;深入理解JMM内存模型 1&#xff0c;什么是可见性 在谈jmm的内存模型之前&#xff0c;先了解一下并发并发编程的三大特性&#xff0c;分别是&#xff1a;可见性&#xff0c;原子性&#xff0c;有序性。可见性指的就是当一个线程修改某个变量的值之后&#xff0c…

shell脚本之sed

sed sed 即 Stream EDitor&#xff0c;和 vi 不同&#xff0c;sed是行编辑器 基本用法 sed [选项] 自身脚本用法 [支持输入标准输入管道] 常用选项&#xff1a;-n 不输出模式空间内容到屏幕&#xff0c;即不自动打印-e 多点编辑-f FILE 从指定文件中读取编辑脚本-r, -E 使用…

【TypeScript】内置对象

JavaScript 中很多内置对象&#xff0c;可以直接在 TypeScript 中当做定义好了的类型。 ECMAScript 的内置对象 Boolean、Number、String、RegExp、Date、Error、XMLHttpRequest 等 let num: Number new Number(1) let date: Date new Date() let reg: RegExp new RegExp(…

WTF Langchain极简入门: 03. 数据连接

加载文档 langchain提供多种文档加载器&#xff0c;支持多种格式、来源的文件。可以从本地存储系统加载文件&#xff0c;也可以从网上加载远端文件。想了解LangChain所支持的所有文档加载器&#xff0c;请参考Document Loaders。 在本系列课程中&#xff0c;我们将使用最基本…

Docker 搭建 LNMP + Wordpress(详细步骤)

目录 一、项目模拟 1. 项目环境 2. 服务器环境 3.任务需求 二、Linux 系统基础镜像 三、Nginx 1. 建立工作目录 2. 编写 Dockerfile 脚本 3. 准备 nginx.conf 配置文件 4. 生成镜像 5. 创建自定义网络 6. 启动镜像容器 7. 验证 nginx 四、Mysql 1.…

快速学习GO语言总结

备注&#xff1a;本博客将自己初步学习GO的总结进行分享&#xff0c;希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力&#xff0c;如有错误请留言指正&#xff0c;谢谢&#xff01; 一、初步了解Go语言 &#xff08;一&#xff09;Go语言诞生的主要问题和目标…

shell脚本——expect脚本免交互

目录 一.Here Document 1.1.定义 1.2.多行重定向 二.expect实现免交互 2.1.基础免交互改密码 2.2.expect定义 2.3.expect基本命令 2.4.expect实现免交互ssh主机 一.Here Document 1.1.定义 使用I/O重定向的方式将命令列表提供给交互式程序&#xff0c;是标准输 入的一…

uniapp开发小程序,上传图片和视频功能

1.需求&#xff1a; 可以上传图片和视频&#xff0c;并且都可以删除&#xff0c;图片可以预览。 2.效果图 3.代码&#xff1a; <template><!-- 上传start --><view style"display: flex; flex-wrap: wrap;"><view class"update-file&quo…

FPGA解析串口指令控制spi flash完成连续写、读、擦除数据

前言 最近在收拾抽屉时找到一个某宝的spi flash模块&#xff0c;如下图所示&#xff0c;我就想用能不能串口来读写flash&#xff0c;大致过程就是&#xff0c;串口向fpga发送一条指令&#xff0c;fpga解析出指令控制flah&#xff0c;这个指令协议目前就是&#xff1a; 55 AA …

达梦数据库表空间创建和管理

概述 本文将介绍在达梦数据库如何创建和管理表空间。 1.创建表空间 1.1表空间个数限制 理论上最多允许有65535个表空间&#xff0c;但用户允许创建的表空间 ID 取值范围为0~32767&#xff0c; 超过 32767 的只允许系统使用&#xff0c;ID 由系统自动分配&#xff0c;ID不能…

周易卦爻解读笔记——小过

第六十二卦小过 雷山小过 震上艮下 小过卦为母卦&#xff0c;象征小有过越。 小过卦是中孚卦的错卦&#xff0c;序卦传【有信者必行之&#xff0c;故受之以小过】 小过&#xff1a;亨&#xff0c;利贞&#xff0c;可小事&#xff0c;不可大事。飞鸟遗之音&#xff0c;不宜上宜…

NEO-6M GPS模块 +无线透传模块组成短距离数据空中传输

NEO-6M GPS模块 无线透传模块组成短距离数据空中传输 &#x1f4cc;相关篇《GY-NEO6MV2 GPS模块测试》 &#x1f33f;NEO-6M GPS模块 &#x1f33f;透传模块采用的是GC2400-TC017 ✨数据的一收一发&#xff0c;需要配合一个USB转TTL工具&#xff0c;在电脑端通过串口调试助…

7-5 螺旋方阵

分数 20 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 所谓“螺旋方阵”&#xff0c;是指对任意给定的N&#xff0c;将1到NN的数字从左上角第1个格子开始&#xff0c;按顺时针螺旋方向顺序填入NN的方阵里。本题要求构造这样的螺旋方阵。 输入格式&#xff1a; 输入在…

第3步---MySQL的DDL和DML操作

第3步---MySQL的DDL和DML操作 1.DDL操作 Data Defination Language 数据定义语言。创建数据库和表的不涉及到数据的操作。 1.1DDL基本操作 1.1.1数据库相关操作 ddl&#xff1a;创建数据库&#xff0c;创建和修改表 对数据库常见的操作&#xff1a; 操作数据库 -- 展示数据…

Unity 之 Input类

文章目录 总述具体介绍 总述 Input 类是 Unity 中用于处理用户输入的重要工具&#xff0c;它允许您获取来自键盘、鼠标、触摸屏和控制器等设备的输入数据。通过 Input 类&#xff0c;您可以轻松地检测按键、鼠标点击、鼠标移动、触摸、控制器按钮等用户输入事件。以下是关于 I…

拥塞控制(TCP限制窗口大小的机制)

拥塞控制机制可以使滑动窗口在保证可靠性的前提下&#xff0c;提高传输效率 关于滑动窗口的属性以及部分机制推荐看TCP中窗口和滑动窗口的含义以及流量控制 拥塞控制出现的原因 看了上面推荐的博客我们已经知道了&#xff0c;由于接收方接收数据的能力有限&#xff0c;所以要通…