人力资源智能化管理项目(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://www.mzph.cn/news/676162.shtml

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

相关文章

CTFshow web(命令执行 41-44)

web41 <?php /* # -*- coding: utf-8 -*- # Author: 羽 # Date: 2020-09-05 20:31:22 # Last Modified by: h1xa # Last Modified time: 2020-09-05 22:40:07 # email: 1341963450qq.com # link: https://ctf.show */ if(isset($_POST[c])){ $c $_POST[c]; if(!p…

Intellij Idea的数据库工具 DataGrip

DataGrip DataGrip&#xff1a; IDEA自带&#xff0c;非常好用。智能提示很强大&#xff0c;快捷键跟IDEA自身一致。 如果下载不了 DataGrip&#xff0c;也可以直接用 IDEA 自带的。 常用的快捷键 alt8&#xff1a; 打开数据库Service ctrlshiftF10&#xff1a;打开常用的数…

【C++】类的6个默认成员函数

目录 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 5. 运算符重载 5.1运算符重载 5.2赋值运算符重载 5.3前置和后置重载 5.4日期类的实现 6. const成员函数 7. 取地址及const取地址操作符重载 1. 类的6个默认成员函数 对于一个空类&#xff0c;编…

JSDoc 真能取代 TypeScript?

这几个月&#xff0c;想必大家都听到过一个新闻&#xff1a; Svelte 弃用 TypeScript&#xff0c;改用 JSDoc 了。 TypeScript 我们知道&#xff0c;是用来给 JS 加上类型的&#xff0c;可以实现类型提示和编译时的类型检查。 那 JSDoc 能够完成一样的功能么&#xff1f;Svel…

图像处理常用算法—6个算子 !!

目录 前言 1、Sobel 算子 2、Isotropic Sobel 算子 3、Roberts 算子 4、Prewitt 算子 5、Laplacian算子 6、Canny算子 前言 同图像灰度不同&#xff0c;边界处一般会有明显的边缘&#xff0c;利用此特征可以分割图像。 需要说明的是&#xff1a;边缘和物体间的边界并不…

Android应用图标微技巧,8.0系统中应用图标的适配

大家好,2018年的第一篇文章到的稍微有点迟,也是因为在上一个Glide系列结束之后一直还没想到什么好的新题材。 现在已经进入了2018年,Android 8.0系统也逐渐开始普及起来了。三星今年推出的最新旗舰机Galaxy S9已经搭载了Android 8.0系统,紧接着小米、华为、OV等国产手机厂…

一句话总结Docker与K8S的关系

一句话总结&#xff1a;Docker只是容器的一种&#xff0c;它面向的是单体&#xff0c;K8S可以管理多种容器&#xff0c;它面向的是集群&#xff0c;Docker可以作为一种容器方案被K8S管理。下文继续具体介绍。 1、容器的核心概念 介绍这几个核心概念&#xff1a;OCI、CR、Runc、…

C语言指针运算

指针运算 指针加法意味着地址向上移动若干个目标指针减法意味着地址向下移动若干个目标示例&#xff1a; int a 100; int *p &a; // 指针 p 指向整型变量 aint *k1 p 2; // 向上移动 2 个目标&#xff08;2个int型数据&#xff09; int *k2 p - 3; // 向下移动 3 个…

PWM输入输出

PWM&#xff08;Pulse Width Modulation&#xff09;即脉冲宽度调制&#xff0c;在具有惯性的系统中&#xff0c;可以通过对一系列脉冲的宽度进行制&#xff0c;来等效地获得所需要的模拟参量&#xff0c;常应用于电机控速、开关电源等领域。 PWM参数 PWM 中有三个重要参数&…

寒假作业-day7

1>现有文件test.c\test1.c\main.c , 请编写Makefile. 代码&#xff1a; CCgcc EXEstr OBJS$(patsubst %.c,%.o,$(wildcard *.c)) CFLAGS-c -oall:$(EXE)$(EXE):$(OBJS)$(CC) $^ -o $%.o:%.c$(CC) $(CFLAGS) $ $^head.o:head.hclean:rm $(OBJS) $(EXE) 2>C编程实现&…

封装sku组件

1. 准备模板渲染规格数据 使用Vite快速创建一个Vue项目&#xff0c;在项目中添加请求插件axios&#xff0c;然后新增一个SKU组件&#xff0c;在根组件中把它渲染出来&#xff0c;下面是规格内容的基础模板 <script setup> import { onMounted, ref } from vue import axi…

NOVATEK显示技术系列之CEDSCHPI Training差异简介

CEDS的数据封包格式&#xff1a;首先CEDS数据封包包括三个部分&#xff1a; Training Pattern即Phase1Control Data 即 Phase2RGB Data 即Phase3 Power on Timing&#xff1a; 工作原理&#xff1a; Power ON时&#xff0c;TCON会发Training Pattern&#xff0c;当COF接受Tr…

江科大STM32 终

目录 SPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件外设读写W25Q64 BKP备份寄存器、PER电源控制器、RTC实时时钟11.0 Unix时间戳代码示例&#xff1a;读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR电源控制12.1 PWR简介代码示例&#xff1a;修改主频12.3 串…

分享90个行业PPT,总有一款适合您

分享90个行业PPT&#xff0c;总有一款适合您 90个行业PPT下载链接&#xff1a;https://pan.baidu.com/s/1bHvhk_42-IFAjNdjPPtMZw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

题目描述 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 题目示例 输入&#xff1a;inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出&a…

B2078 含 k 个 3 的数(洛谷)

题目描述 输入两个正整数 m 和 k&#xff0c;其中 1<m≤&#xff0c;1<k≤15 &#xff0c;判断 m 是否恰好含有 k 个 3&#xff0c;如果满足条件&#xff0c;则输出 YES&#xff0c;否则&#xff0c;输出 NO。 输入格式 输入一行&#xff0c;为两个整数 m,k&#xff0…

揭开Markdown的秘籍:标题|文字样式|列表

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;Markdown指南、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️Markdown 标题二. ⛳️Markdown 文字样式2.1 &#x1f514;斜体2.2 &…

python智慧养老系统—养老信息服务平台vue

本论文中实现的智慧养老系统-养老信息服务平台将以管理员和用户的日常信息维护工作为主&#xff0c;主要涵盖了系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;养老资讯管理&#xff0c;养生有道管理&#xff0c;养老机构管理&#xff0c;系统管理等功能&#x…

海外云手机——平台引流的重要媒介

随着互联网的飞速发展&#xff0c;跨境电商、短视频引流以及游戏行业等领域正经历着迅猛的更新换代。在这个信息爆炸的时代&#xff0c;流量成为至关重要的资源&#xff0c;而其中引流环节更是关乎业务成功的关键。海外云手机崭露头角&#xff0c;成为这一传播过程中的重要媒介…

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

一、序言 gnome-builder构建器是gnome程序开发的集成环境&#xff0c;支持主力语言C, C, Vala, jscript, python等&#xff0c;界面以最新的 gtk 4.12 为主力&#xff0c;将其下版本的gtk直接压入了depreciated&#xff0c;但gtk4.12与普遍使用的gtk3有很大区别&#xff0c;原…