人力资源智能化管理项目(day04:组织架构)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject

觉得有帮助的同学,可以点心心支持一下哈

树组件应用

<!-- 展示树形结构 -->
      <!-- default-expand-all默认展开所有节点 -->
      <el-tree default-expand-all :data="depts" :props="defaultProps" />

depts: [
        {
          name: '传智教育',
          children: [
            {
              name: '总裁办'
            },
            {
              name: '行政部'
            },
            {
              name: '人事部',
              children: [
                {
                  name: '财务核算部'
                },
                {
                  name: '税务管理部'
                },
                {
                  name: '薪资管理部'
                }
              ]
            }
          ]
        }
      ],
      defaultProps: {
        label: 'name', // 要显示的字段的名字
        children: 'children' // 读取子节点的字段名
      }

树组件自定义结构

        <!-- 节点结构 -->
        <el-row
          style="width: 100%; height: 40px"
          type="flex"
          justify="space-between"
          align="middle"
        >
          <el-col>传智教育</el-col>
          <el-col :span="4"
            ><span class="tree-manager">管理员</span>
            <el-dropdown>
              <!-- 显示区域内容 -->
              <span class="el-dropdown-link">
                操作<i class="el-icon-arrow-down el-icon--right" />
              </span>
              <!-- 下拉菜单内容 -->
              <el-dropdown-menu slot="dropdown">
                <el-dropdown-item>添加子部门</el-dropdown-item>
                <el-dropdown-item>编辑部门</el-dropdown-item>
                <el-dropdown-item>删除</el-dropdown-item>
              </el-dropdown-menu>
            </el-dropdown>
          </el-col>
        </el-row>



 .tree-manager {
  width: 50px;
  display: inline-block;
  margin: 10px;
}

节点作用域插槽

<!-- 节点结构 -->
        <!-- v-slot="{node,data}"只能作用在template -->
        <template v-slot="{ data }">
          <el-row
            style="width: 100%; height: 40px"
            type="flex"
            justify="space-between"
            align="middle"
          >
            <el-col>{{ data.name }}</el-col>
            <el-col :span="4"
              ><span class="tree-manager">{{ data.managerName }}</span>
              <el-dropdown>
                <!-- 显示区域内容 -->
                <span class="el-dropdown-link">
                  操作<i class="el-icon-arrow-down el-icon--right" />
                </span>
                <!-- 下拉菜单内容 -->
                <el-dropdown-menu slot="dropdown">
                  <el-dropdown-item>添加子部门</el-dropdown-item>
                  <el-dropdown-item>编辑部门</el-dropdown-item>
                  <el-dropdown-item>删除</el-dropdown-item>
                </el-dropdown-menu>
              </el-dropdown>
            </el-col>
          </el-row></template
        >


        depts: [
        {
          name: '传智教育',
          managerName: '管理员',
          children: [
            {
              name: '总裁办',
              managerName: '张三'
            },
            {
              name: '行政部',
              managerName: '李四'
            },
            {
              name: '人事部',
              managerName: '王五',
              children: [
                {
                  name: '财务核算部',
                  managerName: '杜威'
                },
                {
                  name: '税务管理部',
                  managerName: '杨旭'
                },
                {
                  name: '薪资管理部',
                  managerName: '李生根'
                }
              ]
            }
          ]
        }
      ],
      defaultProps: {
        label: 'name', // 要显示的字段的名字
        children: 'children' // 读取子节点的字段名
      }

获取组织架构数据

/**
 *
 * 获取组织架构数据
 *
 */
export function getDepartment () {
  return request({
    url: '/company/department',
    method: 'GET'
  })
}


    created () {
    this.getDepartment() // 调用获取数据接口
  },
  methods: {
    async getDepartment () {
      const result = await getDepartment()
      this.depts = result
    }
  }

递归转化树形结构

 通过对返回数据的观察,可以发现子节点的pid是父节点的id,可以通过这个对返回数据进行处理

分析数据的关联关系

封装递归函数根据关系转化层级结构

递归特点:

①一般用来处理未知层级的数据

②递归要有跳出条件

③自身调用自身时参数不能重复

/**
 * 列表型数据转化树形
 */
export function transListToTreeData (list, rootValue) {
  const arr = []
  list.forEach(item => {
    if (item.pid === rootValue) {
      // 找到了匹配的节点
      arr.push(item)
      // 当前节点的id和当前节点的子节点的pid是相等的
      const children = transListToTreeData(list, item.id)
      item.children = children // 将子节点赋值给当前节点
    }
  })
  return arr
}

添加子部门

新建弹层组件

 <el-dropdown @command="operateDept">
    <!-- 显示区域内容 -->
           <span class="el-dropdown-link">
            操作<i class="el-icon-arrow-down el-icon--right" />
            </span>
     <!-- 下拉菜单内容 -->
            <el-dropdown-menu slot="dropdown">
             <el-dropdown-item command="add">添加子部门</el-dropdown-item>
             <el-dropdown-item command="edit">编辑部门</el-dropdown-item>
             <el-dropdown-item command="del">删除</el-dropdown-item>
            </el-dropdown-menu>
</el-dropdown>



<!-- 放置弹层内容 -->
    <!-- sync表示会接收子组件的事件 update:showDialog,值=>属性-->
    <add-dept :show-dialog.sync="showDialog" />
  
  // 操作部门的方法
    operateDept (type) {
      if (type === 'add') {
        // 添加子部门
        this.showDialog = true
      }
    }

封装弹层组件

<template>
  <el-dialog title="新增部门" :visible="showDialog" @close="close">
    <!-- 放置弹层内容 -->
  </el-dialog>
</template>

<script>
export default {
  props: {
    showDialog: {
      type: Boolean,
      default: false
    }
  },
  methods: {
    close () {
      // 修改父组件的值,子传父
      // .sync会自动监听update:showDialog事件
      this.$emit('update:showDialog', false)
    }
  }
}
</script>

<style></style>

表单结构

<el-form label-width="120px">
      <el-form-item label="部门名字">
        <el-input placeholder="2-10个字符" style="width: 80%" size="mini" />
      </el-form-item>
      <el-form-item label="部门编码">
        <el-input placeholder="2-10个字符" style="width: 80%" size="mini" />
      </el-form-item>
      <el-form-item label="部门负责人">
         <el-select
          v-model="formData.managerId"
          placeholder="请选择负责人"
          style="width: 80%"
          size="mini"
        >
      </el-form-item>
      <el-form-item label="部门介绍">
        <el-input
          placeholder="1-100个字符"
          type="textarea"
          :row="4"
          style="width: 80%"
          size="mini"
        />
      </el-form-item>
      <el-form-item>
        <el-row type="flex" justify="center">
          <el-col :span="12">
            <el-button type="primary" size="mini">确定</el-button>
            <el-button size="mini">取消</el-button>
          </el-col>
        </el-row>
      </el-form-item>
    </el-form>

表单校验

      formData: {
        code: '', // 部门编码
        introduce: '', // 部门介绍
        managerId: '', // 部门负责人名字
        name: '', // 部门名称
        pid: '' // 部门父级部门id
      },
      rules: {
        name: [
          { required: true, message: '部门名称不能为空', trigger: 'blur' },
          {
            min: 2,
            max: 10,
            message: '部门名称的长度为2-10个字符',
            trigger: 'blur'
          }
        ], // 部门名称
        code: [
          { required: true, message: '部门编码不能为空', trigger: 'blur' },
          {
            min: 2,
            max: 10,
            message: '部门编码的长度为2-10个字符',
            trigger: 'blur'
          }
        ], // 部门编码
        introduce: [
          { required: true, message: '部门负责人不能为空', trigger: 'blur' },
          {
            min: 1,
            max: 10,
            message: '部门介绍的长度为1-100个字符',
            trigger: 'blur'
          }
        ], // 部门介绍
        managerId: [
          { required: true, message: '部门介绍不能为空', trigger: 'blur' }
        ] // 部门负责人名字
      }

业务校验

自定义规则

          {
            trigger: 'blur',
            // 自定义校验模式
            validator: async (rule, value, callback) => {
              // value就是输入的编码
              const result = await getDepartment()
              // result数组中是否存在value值
              if (result.some(item => item.name === value)) {
                callback(new Error('部门中已经有该名称了'))
              } else {
                callback()
              }
            }
          }

负责人数据

label表示下拉菜单所显示的数据,v-model的值为当前被选中的el-option的 value 属性值

/**
 *
 * 获取部门负责人数据
 */
export function getManagerList () {
  return request({
    url: '/sys/user/simple',
    method: 'GET'
  })
}


managerList: [],
  created () {
    this.getManagerList()
  },
  methods: {
    async getManagerList () {
      this.managerList = await getManagerList()
    }
  }


<!-- 下拉选项 循环负责人数据 label表示显示的字段 value表示存储的字段-->
          <el-option
            v-for="item in managerList"
            :key="item.id"
            :label="item.username"
            :value="item.id"
          />

记录部门Id

<!-- $event 实参 表示类型 -->
              <el-dropdown @command="operateDept($event, data.id)">

    // 操作部门的方法
    operateDept (type, id) {
      if (type === 'add') {
        // 添加子部门
        this.showDialog = true
        this.currentNodeId = id
      }
    }


 <!-- 放置弹层内容 -->
    <!-- sync表示会接收子组件的事件 update:showDialog,值=>属性-->
    <add-dept :current-node-id="currentNodeId" :show-dialog.sync="showDialog" />

   //组件接收id 
   currentNodeId: {
      type: Number,
      default: null
    }
   

确认取消

/**
 *
 * 新增组织
 */
export function addDepartment (data) {
  return request({
    url: '/company/department',
    method: 'POST',
    data
  })
}

    btnOk () {
      this.$refs.addDept.validate(async isOk => {
        if (isOk) {
          await addDepartment({
            ...this.formData,
            pid: this.currentNodeId
          })
          // 通知父组件更新
          this.$emit('updateDepartment')
          // 提示信息
          this.$message.success('新增部门成功')
          this.close()
        }
      })
    },    close () {
      // 修改父组件的值,子传父
      // .sync会自动监听update:showDialog事件
      this.$refs.addDept.resetFields() // 重置表单
      this.$emit('update:showDialog', false)
    }


    <!-- 放置弹层内容 -->
    <!-- sync表示会接收子组件的事件 update:showDialog,值=>属性-->
    <add-dept
      :current-node-id="currentNodeId"
      :show-dialog.sync="showDialog"
      @updateDepartment="getDepartment"
    />

编辑部门

弹出层获取数据

/**
 *
 * 获取部门详情
 */
export function getDepartmentDetail (id) {
  return request({
    url: `/company/department/${id}`,
    method: 'GET'
  })
}

    <!-- ref 可以获取dom实例对象 ref 也可以获取自定义组件的实例对象 -->
    <add-dept
      ref="addDept"
      :current-node-id="currentNodeId"
      :show-dialog.sync="showDialog"
      @updateDepartment="getDepartment"
    />
if (type === 'edit') {
        // 编辑部门
        this.showDialog = true
        this.currentNodeId = id // 记录id 要用它获取数据
        // 更新props是异步动作,直接调用子组件的方法是同步方法
        // 所以这里要使用$this.$nextTick方法等数据都处理完,在执行方法
        // 要在子组件获取数据
        // 父组件调用子组件的方法来获取数据
        this.$nextTick(() => {
          this.$refs.addDept.getDepartmentDetail() // this.$refs.addDept
        })
      }


// 获取组织的详情
    async getDepartmentDetail () {
      this.formData = await getDepartmentDetail(this.currentNodeId)
    }

编辑表单校验

let result = await getDepartment()
              // 判断是否是编辑模式
              if (this.formData.id) {
                // 编辑场景
                result = result.filter(item => item.id !== this.formData.id)
              }

确认取消

标题不是表单所以不能绑定v-model事件,使用计算属性进行更新

/**
 *
 * 更新部门
 */
export function updateDepartment (data) {
  return request({
    url: `/company/department/${data.id}`,
    method: 'PUT',
    data
  })
}


  <el-dialog :title="showTitle" :visible="showDialog" @close="close">

    // 标题不是表单所以不能绑定v-model事件,使用计算属性进行更新
  computed: {
    showTitle () {
      return this.formData.id ? '编辑部门' : '新增部门'
    }
  }

  
   close () {
      // 修改父组件的值,子传父
      // .sync会自动监听update:showDialog事件
      // resetFields只能重置在模板中绑定的数据
      this.formData = {
        code: '', // 部门编managerList
        introduce: '', // 部门介绍
        managerId: '', // 部门负责人名字
        name: '', // 部门名称
        pid: '' // 部门父级部门id
      }
      this.$refs.addDept.resetFields() // 重置表单
      this.$emit('update:showDialog', false)
    }


      btnOk () {
      this.$refs.addDept.validate(async isOk => {
        if (isOk) {
          let msg = '新增'
          // 通过formData中id判断属于什么场景
          if (this.formData.id) {
            // 编辑场景
            await updateDepartment(this.formData)
            msg = '更新'
          } else {
            // 新增场景
            await addDepartment({
              ...this.formData,
              pid: this.currentNodeId
            })
          }
          // 通知父组件更新
          this.$emit('updateDepartment')
          // 提示信息
          this.$message.success(`${msg}新增部门成功`)
          this.close()
        }
      })
    },

删除部门

/**
 *
 * 删除部门
 */
export function delDepartment (id) {
  return request({
    url: `/company/department/${id}`,
    method: 'DELETE'
  })
}


        // 删除部门
        this.$confirm('您确定要删除该部门吗').then(async () => {
          await delDepartment(id)
          // 提示消息
          this.$message.success('删除部门成功')
          this.getDepartment()
        })

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

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

相关文章

医学护理答案怎么查找? #笔记#学习方法#微信

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式&#xff0c;可以快速查找问题解析&#xff0c;加深对题目答案的理解。 1.滴墨书摘 这款软件相当于一个在线“摘抄本”&#xff0c;我们可以利用它来记录一些阅读时遇到的好句子或者是段落&#xff0c;或许下次…

Linux操作系统基础(五):Linux的目录结构

文章目录 Linux的目录结构 一、Linux目录与Windows目录区别 二、常见目录介绍&#xff08;记住重点&#xff09; Linux的目录结构 一、Linux目录与Windows目录区别 Linux的目录结构是一个树型结构 Windows 系统 可以拥有多个盘符, 如 C盘、D盘、E盘 Linux 没有盘符 这个概…

【DDD】学习笔记-领域模型与函数范式

函数范式 REA 的 Ken Scambler 认为函数范式的主要特征为&#xff1a;模块化&#xff08;Modularity&#xff09;、抽象化&#xff08;Abstraction&#xff09;和可组合&#xff08;Composability&#xff09;&#xff0c;这三个特征可以帮助我们编写简单的程序。 通常&#…

JavaScript综合练习4

JavaScript 综合练习 4 1. 案例演示 2. 代码实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title&…

ES实战-book笔记1

#索引一个文档,-XPUT手动创建索引, curl -XPUT localhost:9200/get-together/_doc/1?pretty -H Content-Type: application/json -d {"name": "Elasticsearch Denver","organizer": "Lee" } #返回结果 {"_index" : "g…

【GO语言卵细胞级别教程】03.条件与循环语句

注意&#xff1a;以下演示所用的项目&#xff0c;在第一章节已经介绍了&#xff0c;这里不做赘述 目录&#xff1a; 【GO语言卵细胞级别教程】03.条件与循环语句1.条件语句1.1 if语句1.1.1 单层if语句1.1.2 if-else语句1.1.3 if-else-if 语句1.1.4 if 嵌套 1.2 switch 语句1.1…

[office] 怎么在Excel2003菜单栏自定义一个选项卡 #其他#微信#知识分享

怎么在Excel2003菜单栏自定义一个选项卡 怎么在Excel2003菜单栏自定义一个选项卡 ①启动Excel2003&#xff0c;单击菜单栏--工具--自定义。 ②在自定义界面&#xff0c;我们单击命令标签&#xff0c;在类别中选择新菜单&#xff0c;鼠标左键按住新菜单&#xff0c;拖放到菜单栏…

【Linux笔记】动静态库的封装和加载

一、静态库的封装 我们在学习C语言阶段其实就已经知道一个可执行程序的形成过程分为预处理、编译、汇编、链接这四个阶段&#xff0c;而且也知道我们程序中使用的各种库其实是在链接的阶段加载的。 可我们那时候并不知道库是怎么被加载的&#xff0c;或者库是怎么形成的&…

高防服务器出租的优势及特点

高防服务器出租是指租用具备高防御能力的服务器&#xff0c;用于应对网络攻击、保护网站和数据安全。那么为什么会选择高防服务器出租&#xff0c;小编为您整理发布高防服务器出租的优势及特点。 高防服务器通常具备以下特点&#xff1a; 1. 高性能硬件配置&#xff1a;高防服务…

前端工程化面试题 | 01.精选前端工程化高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【软考】系统集成项目管理工程师(十五)文档和配置管理【2分】

一、 文档管理 二、配置管理 1、配置项 基线类型基线包括管理原则基线配置项所有设计文档和源程序向开发人员开放读取的权限非基线配置项项目的各类计划额报告向PM、CCB及相关人员开放所有配置项的操作权限应由CMO&#xff08;配置管理员&#xff09;严格管理 2、基线 3、配置…

[office] excel求乘积的公式和方法 #媒体#笔记#经验分享

excel求乘积的公式和方法 本文首先给出两个常规的excel求乘积的链接&#xff0c;然后再例举了一个文字和数字在同一单元格里面的excel求乘积的公式写法。 excel求乘积的方法分为两种&#xff0c;第一种是直接用四则运算的*来求乘积&#xff0c;另外一种就是使用PRODUCT乘积函数…

攻防世界 CTF Web方向 引导模式-难度1 —— 11-20题 wp精讲

PHP2 题目描述: 暂无 根据dirsearch的结果&#xff0c;只有index.php存在&#xff0c;里面也什么都没有 index.phps存在源码泄露&#xff0c;访问index.phps 由获取的代码可知&#xff0c;需要url解码(urldecode )后验证id为admin则通过 网页工具不能直接对字母进行url编码 …

LeetCode Python - 6.Z字形变换

文章目录 题目答案运行结果 题目 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R 之后&#xff0c;你的输…

部署monggodb单节点分片集群

分片技术,可以满足MongoDB数据量大量增长的需求。当MongoDB存储海量的数据时&#xff0c;一台机器可能不足以存储数据&#xff0c;也可能不足以提供可接受的读写吞吐量。这时&#xff0c;我们就可以通过在多台机器上分割数据&#xff0c;使得数据库系统能存储和处理更多的数据。…

用Python动态展示排序算法

文章目录 选择冒泡插入排序归并排序希尔排序 经常看到这种算法可视化的图片&#xff0c;但往往做不到和画图的人心灵相通&#xff0c;所以想自己画一下&#xff0c;本文主要实现归并排序和希尔排序&#xff0c;如果想实现其他算法可参考这篇 C语言实现各种排序算法[选择&#x…

v-if 和v-show 的区别

第074个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

Ps:直接从图层生成文件(图像资源)

通过Ps菜单&#xff1a;文件/导出/将图层导出到文件 Layers to Files命令&#xff0c;我们可以快速地将当前文档中的每个图层导出为同一类型、相同大小和选项的独立文件。 Photoshop 还提供了一个功能&#xff0c;可以基于文档中的图层或图层组的名称&#xff0c;自动生成指定大…

无人机飞控算法原理基础研究,多旋翼无人机的飞行控制算法理论详解,无人机飞控软件架构设计

多旋翼无人机的飞行控制算法主要涉及到自动控制器、捷联式惯性导航系统、卡尔曼滤波算法和飞行控制PID算法等部分。 自动控制器是无人机飞行控制的核心部分&#xff0c;它负责接收来自无人机传感器和其他系统的信息&#xff0c;并根据预设的算法和逻辑&#xff0c;对无人机的姿…

材料非线性Matlab有限元编程:切线刚度法

导读:本文主要围绕材料非线性问题的有限元Matlab编程求解进行介绍,重点围绕牛顿-拉普森法(切线刚度法)、初应力法、初应变法等三种非线性迭代方法的算法原理展开讲解,最后利用Matlab对材料非线性问题有限元迭代求解算法进行实现,展示了实现求解的核心代码。这些内容都将收…