3.2 iHRM人力资源 - 组织架构 - 编辑及删除

news2024/11/26 9:35:19

iHRM人力资源 - 组织架构

文章目录

  • iHRM人力资源 - 组织架构
  • 一、编辑功能
    • 1.1 表单弹层并数据回显
    • 1.2 编辑校验
    • 1.3 编辑
  • 二、删除功能

一、编辑功能

编辑功能和新增功能用的组件其实是一个,结构几乎是一样的,其实是复用了组件,我们也省去了很多的开发过程

image-20240324163748425

在如下所示的位置进行编写

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.1 表单弹层并数据回显

首先在index页面的下拉结构不会改变

当点击下拉菜单中的某个选项的时候,就会执行operateDept方法

 <!--下拉菜单组件-->
 <!--@command是下拉菜单的执行方法,当点击下拉菜单中的某一项的时候,就会执行operateDept方法-->
 <!--$event实参表示类型,也就是下面command中的值,表示事件所携带的默认参数,如果不传data.id的话,默认传入的就是$event实参-->
 <el-dropdown @command="operateDept($event,data.id)">
   <!--显示区域内容-->
   <span class="el-dropdown-link">
    操作<i class="el-icon-arrow-down el-icon--right"></i>
</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>

image-20240324164243423

弹层

<!--放置弹层-->
<!--:show-dialog 是我们在add-dept组件中定义的props-->
<!--sync修饰,表示会接受子组件的事件,也就是update:showDialog这个事件,然后会把值赋值给下面的showDialog-->
<!--自定义事件updateDepartment,子组件触发,父组件执行getDepartment方法,刷新组织结构-->
<!--ref可以获取dom的实例对象,也可以获取自定义组件的实例对象-->
<add-dept ref="addDept" @updateDepartment="getDepartment" :current-node-id="currentNodeId"
          :show-dialog.sync="showDialog"
></add-dept>

方法

methods: {
  operateDept($event, id) {
    if ($event === 'add') {
      // 添加子部门
      // 显示弹层组件
      this.showDialog = true
      // 当前点击节点的id
      this.currentNodeId = id
    } else if ($event === 'edit') {
      // 编辑部门的场景
      this.showDialog = true
      // 当前点击节点的id,后面要用他获取数据,获取数据的最终目的就是数据回显
      // 下面的代码存在问题:
      // 我们点击编辑的时候,会提示我们“找不到对应的部门”,然后我们发现下面传到add-dept组件中的id为null
      // 下面这行代码更新了子组件add-dept中的props,然后又直接调用了子组件add-dept中的getDepartmentDetail方法(同步方法)
      // 但是我们的更新props是一个异步的方法,所以存在一种可能,先执行了getDepartmentDetail方法又刷新的props
      this.currentNodeId = id
      // 要在子组件获取数据
      // 父组件调用子组件的方法来获取数据
      // 此时this.$refs.addDept等同于子组件的this
      // this.$refs.addDept.getDepartmentDetail() 在这里调用会和props产生同步异步的问题
      // 有没有办法等到props更新之后再去调用getDepartmentDetail方法呢?
      // this.$nextTick会等到我们数据更新完毕,执行回调函数
      this.$nextTick(() => {
        this.$refs.addDept.getDepartmentDetail()
      })
    }
  }
    ........
}

add-dept组件方法中的方法

methods: {
  // 获取组织的详情
  async getDepartmentDetail() {
    const result = await getDepartmentDetail(this.currentNodeId)
    // 完成数据回显
    this.formDara = result
  }
    ......
}

获取部门详情的api方法

/**
 * 获取部门详情
 */
export function getDepartmentDetail(id) {
  // 不写请求方式的话,默认为get类型
  // 这个地方使用了一个模板字符串
  return request({
    url: `/company/department/${id}`
  })
}

1.2 编辑校验

首先说明,修改的表单校验和新增的表单校验是一个样子的,所以说表单校验规则可以复用

  • 表单项必填/表单项长度限制
  • 部门名称和已有部门不重复
  • 部门编码和已有编码不重复

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是目前有下面这个问题,当我们点击“编辑”后,会出现下面的情况,所以我们应该把“编辑”功能和“新增”功能的校验区别开

如果是编辑模式下,我们应该把当前的这条数据排除掉,不要和自己去比

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传那我们怎么区别新增还是编辑场景呢

很好判断,当时新增操作的时候,formData中没有id字段

image-20240326210535432

当时编辑操作的时候,formData中有id字段

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修改编辑的校验

rules: {
  // 部门编码
  code: [{ required: true, message: '部门编码不能为空', trigger: 'blur' },
    { min: 2, max: 10, message: '部门编码的长度2-10个字符' },
    // 自定义业务校验,部门编码不能重复
    {
      trigger: 'blur', validator: async(rule, value, callback) => {
        // value值是输入的编码值
        let result = await getDepartment()
        // 判断此时是编辑模式还是新增模式
        if (this.formDara.id) {
          // 存在id,说明是编辑状态,我们要将自身排除掉
          result = result.filter(item => item.id !== this.formDara.id)
        }
        // result实际是一个数组,然后查看数组中是否存在用户输入的value值
        // 我们可以使用some()方法,如果存在就返回true,不存在就返回false
        if (result.some(item => item.code === value)) {
          // 校验失败时的错误对象
          callback(new Error('部门中已经有该编码'))
        } else {
          // 校验成功时的对象
          callback()
        }
      }
    }],
  // 部门介绍
  introduce: [{ required: true, message: '部门介绍不能为空', trigger: 'blur' },
    { min: 2, max: 10, message: '部门名称的长度1-100个字符' }],
  // 部门负责人id
  managerId:
    [{ required: true, message: '部门负责人id不能为空', trigger: 'blur' }],
  // 部门名称
  name:
    [{ required: true, message: '部门名称不能为空', trigger: 'blur' },
      { min: 2, max: 10, message: '部门名称的长度2-10个字符' },
      {
        trigger: 'blur', validator: async(rule, value, callback) => {
          // value值是输入的编码值
          let result = await getDepartment()
          // 判断此时是编辑模式还是新增模式
          if (this.formDara.id) {
            // 存在id,说明是编辑状态,我们要将自身排除掉
            result = result.filter(item => item.id !== this.formDara.id)
          }
          // result实际是一个数组,然后查看数组中是否存在用户输入的value值
          // 我们可以使用some()方法,如果存在就返回true,不存在就返回false
          if (result.some(item => item.name === value)) {
            // 校验失败时的错误对象
            callback(new Error('部门中已经有该名称'))
          } else {
            // 校验成功时的对象
            callback()
          }
        }
      }]
  // pid: '' // 父级部门的id
}

上面那么多的代码,其实有用的就是下面这个

image-20240326215858928

1.3 编辑

其实“添加”功能的“确认”和“取消”在这里差不多就能复用

因为我们“添加”和“编辑”功能公用的一个组件,所以我们需要区分一下是编辑下的文本框还是增加下的文本框

image-20240326220312926

api接口

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

方法内容

// 点击确定时调用此方法
btnOK() {
  this.$refs.addDept.validate(async isOK => {
    if (isOK) {
      let msg = '新增'
      // 通过formData中是否有id来确认是“编辑”环境还是“增加”环境
      if (this.formDara.id) {
        // 编辑场景
        msg = '编辑'
        await updateDepartment(this.formDara)
      } else {
        // 新增场景
        // ...this.formDara 表示相当于把formDara数据进行了拷贝,考到了一个新对象里面
        // pid: this.currentNodeId表示将formDara中的pid赋值上currentNodeId
        await addDepartment({ ...this.formDara, pid: this.currentNodeId })
      }
      // 校验已经通过
      // 此时可以通知父组件更新,也就是子传父,可以选择触发一个自定义事件(父组件要监听这个事件)
      this.$emit('updateDepartment')
      // 提示消息
      this.$message.success(+`${msg}部门成功`)
      // 关闭
      this.close()
    }
  })
},

再写一个计算属性,当我们点击“编辑”的时候,弹层会显示“编辑部门”,同理我们点击“新增”时,弹层会显示“新增部门”

<!--:visible用来控制显示和隐藏,由于我们是一个组件,所以我们需要外部传入一个参数来控制显示还是隐藏-->
<!--@close用于监视关闭弹层(点击右上角×号的时候,就会执行此函数)-->
<el-dialog :title="showTitle" :visible="showDialog" @close="close">
computed: {
  showTitle() {
    return this.formData.id ? '编辑部门' : '新增部门'
  }
}

但是现在还有一个问题,当我们点击“编辑”后,关闭,再点击“新增”,我们发现弹层左上角显示“编辑部门”,而不是“新增部门”,原因就是this.$refs.addDept.resetFields()重置表单时有问题,并没有把id给清空

image-20240326222640127

其实我们可以手动置空

close() {
  // 重置表单
  this.formData =
    {
      code: '', // 部门编码
      introduce: '', // 部门介绍
      managerId: '', // 部门负责人id
      name: '', // 部门名称,
      pid: '' // 父级部门的id
    }
  // resetFields重置表单有一个局限性,只能重置在模板中绑定的数据(假如说没有绑定某个字段,那这个字段肯定不能重置)
  this.$refs.addDept.resetFields()
  // 修改父组件的值,子传给父亲
  // this.$emit可以触发一个自定义事件(父组件需要接收这个时间),然后把false这个值传出去
  // this.$emit('',false) 但是我们先不用这个方法
  // 这里我们使用了 sync修饰,表示会接受子组件的事件,也就是update:showDialog这个事件,然后会把值赋值给showDialog
  this.$emit('update:showDialog', false)
},

二、删除功能

流程图

image-20240326223105126

async getDepartment() {
  // 下面这个方法是import导入的api请求方法
  const result = await getDepartment()
  // 但是我们获取到的数据是列表的形式,没有层级结构,我们要使用递归的方式完成树形结构
  this.depts = transListToTreeData(result, 0)
},
operateDept($event, id) {
  if ($event === 'add') {
    // 添加子部门
    // 显示弹层组件
    this.showDialog = true
    // 当前点击节点的id
    this.currentNodeId = id
  } else if ($event === 'edit') {
    // 编辑部门的场景
    this.showDialog = true
    // 当前点击节点的id,后面要用他获取数据,获取数据的最终目的就是数据回显
    // 下面的代码存在问题:
    // 我们点击编辑的时候,会提示我们“找不到对应的部门”,然后我们发现下面传到add-dept组件中的id为null
    // 下面这行代码更新了子组件add-dept中的props,然后又直接调用了子组件add-dept中的getDepartmentDetail方法(同步方法)
    // 但是我们的更新props是一个异步的方法,所以存在一种可能,先执行了getDepartmentDetail方法又刷新的props
    this.currentNodeId = id
    // 要在子组件获取数据
    // 父组件调用子组件的方法来获取数据
    // 此时this.$refs.addDept等同于子组件的this
    // this.$refs.addDept.getDepartmentDetail() 在这里调用会和props产生同步异步的问题
    // 有没有办法等到props更新之后再去调用getDepartmentDetail方法呢?
    // this.$nextTick会等到我们数据更新完毕,执行回调函数
    this.$nextTick(() => {
      this.$refs.addDept.getDepartmentDetail()
    })
  } else if ($event === 'del') {
    // 删除部门
    // 假如用户点击了“取消”,我们这里是不需要管的
    this.$confirm('您确定要删除该部门吗?').then(async() => {
      // 进入到这里,说明用户点击了确认按钮
      await delDepartment(id)
      // 提示消息
      this.$message.success('删除部门成功')
      // 重新拉取数据
      getDepartment()
    })
  }
}

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

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

相关文章

中国新质生产力水平(原始+测算+结果)-企业和各省数据集

新质生产力是一个至少涵盖科技、绿色和数字三大方面的集成体&#xff0c;对其评价测度需要依托多属性综合评价方法。文章构建了包含3个一级指标、6个二级指标和18个三级指标的综合体系&#xff0c;采用改进的熵权-TOPSIS方法对指标进行赋权&#xff0c;从而得到全国新质生产力发…

Github 2024-04-12 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6TypeScript项目2Cuda项目1C++项目1C项目1HTML项目1Jupyter Notebook项目1JavaScript项目1Python - 100天从新手到大师 创建周期:22…

AV1:帧内预测(二)

在上一篇文章中介绍了AV1帧内预测的各个工具&#xff0c;本文进一步介绍其中的相关细节。 参考像素准备 帧内预测是利用当前帧已重建的像素预测当前块&#xff0c;和HEVC一样&#xff0c;AV1的帧内预测参考像素来自当前块上方和左侧的重建像素。 对于尺寸为wxh的块&#xff0…

Vue 阶段练习:记事本

将 Vue快速入门 和 Vue 指令的学习成果应用到实际场景中&#xff08;如该练习 记事本&#xff09;&#xff0c;我们能够解决实际问题并提升对 Vue 的技能掌握。 目录 功能展示 需求分析 我的代码 案例代码 知识点总结 功能展示 需求分析 列表渲染删除功能添加功能底部统计…

正在海外乘风破浪的扫地机器人,手握怎样的发展利器?

“懒人经济”能造就多大的市场&#xff0c;可以从扫地机器人行业的发展窥见。 据国际数据分析机构捷孚凯报告&#xff0c;截至2022年底&#xff0c;我国扫地机器人已占据50%以上的海外市场份额。其中&#xff0c;科沃斯、石头科技等头部企业成为出海的“主力军”。 以石头科技…

网工内推 | 等保测评工程师,朝九晚六,周末双休,有相关认证优先

01 江苏国保测评中心 招聘岗位&#xff1a;等保测评工程师 职责描述&#xff1a; 1.测评类项目的物理安全测评、主机安全测评、数据安全测评、应用安全测评、风险评估、差距分析等并编制相关报告; 2.协助业务部门完成网络安全等级保护测评、信息安全咨询、信息安全风险评估等项…

4.配置USART串口实现printf打印

通过TTL转USB实现电脑和单片机连通,是我们调试必不可少的工具 查看原理图,使用USART1,它们的TX和RX分别在PA9和PA10 新建Usart.c存放串口模块的初始化 这段代码是复制了正点原子的工程,添加到前面 #if SYSTEM_SUPPORT_OS #include "includes.h" //ucos 使用 …

rhce.定时任务和延迟任务项目

一 . 在系统中设定延迟任务要求如下&#xff1a; 在系统中建立 easylee 用户&#xff0c;设定其密码为 easylee 延迟任务由 root 用户建立 要求在 5 小时后备份系统中的用户信息文件到/backup中 确保延迟任务是使用非交互模式建立 确保系统中只有 root 用户和easylee用户可以…

GitHub提交PR

本教程只做开源代码库Github工程提交pr的教程&#xff0c;不做其他的深入的讲解 Github和Gitlab的操作类似&#xff0c;只不过Github叫PR&#xff0c;GitLab叫MR&#xff0c;基本上做法是一致的 以开源项目QuickChat为例 https://github.com/Binx98/QuickChat https://github…

ShardingSphere:强大的分布式数据库中间件【图文】

ShardingSphere的诞生 ShardingSphere的结构 Sharding-JDBC :它提供了一个轻量级的 Java 框架&#xff0c;在 Java 的 JDBC 层提供额外的服务。使用客户端直连数据库&#xff0c;以 jar 包形式提供服务&#xff0c;无需额外部署和依赖&#xff0c;可理解为增强版的 JDBC 驱动&…

225 基于matlab的天牛须优化算法及其对BP神经网络的优化

基于matlab的天牛须优化算法及其对BP神经网络的优化&#xff0c;优化后的阀值权值赋予网络预测。最后输出BP和BAS-BP训练和预测结果。程序已调通&#xff0c;可直接运行。 225 天牛须优化算法 BP神经网络 - 小红书 (xiaohongshu.com)

如何降低漏测, 避免上线后出bug,6年测试心得分享

一、漏测原因总结 &#xff08;1&#xff09;需求评审质量低&#xff0c;需求设计简单、只是简单描述功能&#xff0c;功能逻辑较少   &#xff08;2&#xff09;需求变更频繁   &#xff08;3&#xff09;缺少需求分解&#xff08;sql 文档、用例设计&#xff09;   &…

2024.4.16

三个按键的中断 do_irq.c #include "mykey.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {//获取中断号unsigned int irqno (GICC->IAR&0x3ff);switch (irqno){case 99://中断处理逻辑printf("KEY1_INTC\n&q…

【免费领取源码】可直接复用的医院管理系统!

今天给大家分享一套基于SpringbootVue的医院管理系统源码&#xff0c;在实际项目中可以直接复用。(免费提供&#xff0c;文中自取) 系统运行图&#xff08;设计报告和接口文档&#xff09; 1、后台管理页面 2、排班管理页面 3、设计报告包含接口文档 源码免费领取方式 后台私信…

第一届AI Agent智能体现场开发大赛报名开启!8月上旬火热开赛~

由联想拯救者、AIGC开放社区、英特尔携手主办的“AI生成未来第二届拯救者杯OPENAIGC开发者大赛”已经正式启动&#xff0c;“2024 AI Agent极限挑战赛”作为特设专项赛道&#xff0c;也将同步于8月上旬开赛&#xff0c;参赛者将在更加紧张刺激的现场比赛中展现其技术与创造力。…

Redis-缓存击穿-逻辑过期

Redis-缓存击穿-逻辑过期实现 缓存击穿&#xff1a;也称热点key问题&#xff0c;大量访问一个key&#xff0c;而这个key恰巧到期了&#xff0c;导致大量的请求访问数据库。增大数据库的负担。为了解决这个问题可以采用互斥锁或逻辑过期的方式解决。本章采用逻辑过期的方式解决…

【Entity Framework】你知道如何处理无键实体吗

【Entity Framework】你知道如何处理无键实体吗 文章目录 【Entity Framework】你知道如何处理无键实体吗一、概述二、定义无键实体类型数据注释 三、无键实体类型特征四、无键实体使用场景五、无键实体使用场景六、无键使用示例6.1 定义一个简单的Blog和Post模型&#xff1a;6…

【Git】初识 Git

文章目录 1. 提出问题2. 如何解决&#xff1f;版本控制器3. 注意事项 1. 提出问题 不知道你工作或学习时&#xff0c;有没有遇到这样的情况&#xff1a;我们在编写各种文档时&#xff0c;为了防止文档丢失、更改失误、失误后能恢复到原来的版本&#xff0c;不得不复制出一个副…

TensorFlow实战 PDF书籍分享

今天又来给大家推荐一本大模型方面的书籍<TensorFlow实战>。《TensorFlow实战》希望用简单易懂的语言带领大家探索TensorFlow&#xff08;基于1.0版本API&#xff09;。 本书讲述了TensorFlow的基础原理&#xff0c;TF和其他框架的异同。并用具体的代码完整地实现了各种…

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例-汇总

github求⭐ 可通过github 地址和npm 地址查看全部内容,范例Ⅰ、Ⅱ、Ⅲ、Ⅳ免VIP查阅 vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅰ)配置项文档 vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅱ)搜索及数据获取…