人力资源智能化管理项目(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-rowstyle="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-rowstyle="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-selectv-model="formData.managerId"placeholder="请选择负责人"style="width: 80%"size="mini"></el-form-item><el-form-item label="部门介绍"><el-inputplaceholder="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-optionv-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 = truethis.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-deptref="addDept":current-node-id="currentNodeId":show-dialog.sync="showDialog"@updateDepartment="getDepartment"/>
if (type === 'edit') {// 编辑部门this.showDialog = truethis.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: '', // 部门编managerListintroduce: '', // 部门介绍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()})

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

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

相关文章

黄金交易策略(EA):三个仓位的设计是确保可以不停息做单

完整EA&#xff1a;Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客

c++ 类的第二章,对象的创建和使用

新年快乐&#xff01;&#xff01;&#xff01;&#xff01; 定义了类&#xff0c;相当于定义了一个数据类型。使用方法和int double是一样的,可以定义变量&#xff0c;数组&#xff0c;指针&#xff0c;而定以后的变量&#xff0c;我们把它叫做这个类的对象。 定义如下&#…

猫头虎分享已解决Bug || 未定义的变量(Undefined Variable):ReferenceError: x is not defined

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

AI创作2024科幻大片《沙丘2》高清宣传片

AI创作2024科幻大片《沙丘2》高清宣传片 "Beyond the vast deserts of Dune, a new threat looms." "The war for control of the universe has just begun." "In the shadows of the great sand dunes, danger waits." "The power of t…

排序算法---快速排序

原创不易&#xff0c;转载请注明出处。欢迎点赞收藏~ 快速排序是一种常用的排序算法&#xff0c;采用分治的策略来进行排序。它的基本思想是选取一个元素作为基准&#xff08;通常是数组中的第一个元素&#xff09;&#xff0c;然后将数组分割成两部分&#xff0c;其中一部分的…

MySQL篇之索引

一、定义 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff08;B树&#xff09;&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0…

Linux 命令基础

Shell概述 Linux操作系统的Shell作为操作系统的外壳&#xff0c;为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。 Shell是用户和Linux内核之间的接口程序&#xff0c;如果把硬件想象成一个球体的中心&#xff0c;内核围绕在硬件的外层管理着…

【Java八股面试系列】并发编程-并发关键字,线程池

目录 并发关键字 Synchronized synchronized最主要的三种使用方式&#xff1a; 具体使用&#xff1a;双重校验锁单例模式 synchronized 底层实现原理&#xff1f; synchronized锁的优化 偏向锁 轻量级锁 重量级锁 Mark Word 与 Monitor 之间的关系 总结 偏向锁、轻量…

数字IC实践项目(9)— Tang Nano 20K: I2C OLED Driver

Tang Nano 20K: I2C OLED Driver 写在前面的话硬件模块RTL电路和相关资源报告SSD1306 OLED 驱动芯片SSD1306 I2C协议接口OLED 驱动模块RTL综合实现 总结 写在前面的话 之前在逛淘宝的时候偶然发现了Tang Nano 20K&#xff0c;十分感慨国产FPGA替代方案的进步之快&#xff1b;被…

算法------(11)并查集

例题&#xff1a; &#xff08;1&#xff09;Acwing 836.合并集合 并查集就是把每一个集合看成一棵树&#xff0c;记录每个节点的父节点。合并集合就是把一棵树变成另一棵树的子树&#xff0c;即把一棵树的父节点变为另一棵树的父节点的儿子。查询是否在同一集合就是看他们的根…

【 buuctf snake 】

需要用到 Serpent 加密&#xff0c;蛇也不一定是 snake&#xff0c;serpent 也是蛇的意思。 binwalk -e /Users/xxx/Downloads/snake/snake.jpgbinwalk 提取 key 中有 base64 编码&#xff0c;解密 图源自BUUCTF:snake_buuctf snake-CSDN博客 结果是 anaconda&#xff0c;还有…

GC调优工具

1、jstat 2、VisualVM GC tool插件 插件下载地址&#xff1a;https://blog.csdn.net/jushisi/article/details/109655175 3、Prometheus和Grafana监控

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月9日,星期五

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年2月9日 星期五 农历腊月三十 除夕 1、 三部门&#xff1a;各地不得挤占、挪用、截留、滞留优抚对象补助经费。 2、 校外培训《条例》出炉&#xff1a;明确在职教师、教研人员不得从事校外培训活动。 3、 2024年“全面降…

(十六)springboot实战——spring securtity的认证流程源码解析

前言 本节内容是关于spring security安全框架认证流程的源码分析&#xff0c;spring security的认证流程主要是在UsernamePasswordAuthenticationFilter过滤器中实现的。我们会通过源码层级的分析&#xff0c;了解清楚spring security的底层是如何实现用户的认证的。 正文 1…

放飞梦想,扬帆起航——1888粉丝福利总结

目录 1.祝福 2.准备 3.抽奖 4.制作 5.添加 6.成果 7.感谢 8.福利 9.祝福 1.祝福 马上就是除夕了&#xff0c;在这里提前预祝大家春节快乐&#xff0c;小芒果在这里给大家拜年了&#xff01; 2.准备 其实很早之前我就在幻想着哪一天我的粉丝量能突破1888&#xff0c;…

University Program VWF仿真步骤__全加器

本教程将以全加器为例&#xff0c;选择DE2-115开发板的Cyclone IV EP4CE115F29C7 FPGA&#xff0c;使用Quartus Lite v18.1&#xff0c;循序渐进的介绍如何创建Quartus工程&#xff0c;并使用Quartus Prime软件的University Program VWF工具创建波形文件&#xff0c;对全加器的…

MPLS VPN功能组件(4)

数据转发过程 VPN数据的转发 顶层公网标签 由LDP分配&#xff0c;指示LSR如何将标签报文从始发的源PE通过LSP标签交换到达目的PE 内层私网标签(VPN标签) 由MP-BGP分配&#xff0c;在将每一条客户路由变为VPNv4路由前缀时会自动为每一条VPNv4前缀关联一个标签 内层私网标签用于…

Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(三)

八、ui窗体创建要点 .h文件定义(popwindowf.h)&#xff0c; TEST_TYPE_WINDOW宏是要创建的窗口样式。 #pragma once #include <gtk/gtk.h> G_BEGIN_DECLS #define TEST_TYPE_WINDOW (test_window_get_type()) G_DECLARE_FINAL_TYPE (TestWindow, test_window, TEST, WI…

ChatGPT高效提问—prompt常见用法(续篇六)

ChatGPT高效提问—prompt常见用法&#xff08;续篇六&#xff09; 1.1 控制输出 ​ 控制输出是一种先进的自然语言处理技术&#xff0c;其能够在AI模型生成文本的过程中实现更高级别的控制。通过提供特定的输入&#xff0c;如模板、特定词语或约束性条件&#xff0c;从而精准…

rem基础+媒体查询+Less基础

一&#xff0c;rem基础 二&#xff0c;媒体查询 2.1什么是媒体查询 2.2语法规范 2.3媒体查询rem实现元素动态大小的变化 2.4 引入资源&#xff08;理解&#xff09; 三&#xff0c;Less基础 1 维护css的弊端 2 Less介绍 3 Less变量 变量命名规范 4 Less嵌套 5 Less…