vue2人力资源项目4路由和部门新增

news2024/11/16 16:48:58

组织架构路由

import layout from '@/layout'
export default {
  path: '/department',
  component: layout, // 一级路由
  children: [{
    path: '', // 二级路由地址为空 表示/department 显示一级路由+二级路由
    component: () => import('@/views/department'),
    name: '', // 可以用来跳转,也可以用来标记路由
    meta: {
      // 路由元信息,存储数据的
      icon: 'tree', // 存菜单图标
      title: '组织'// 存菜单标题
    }
  }]
}

创建好后,在router/index里引入

分析左侧菜单怎么生成的

logo大小调整

树形组件应用

<el-tree :data="depts" :props="defaultProps" default-expand-all />

<template>
  <div class="container">
    <div class="app-container">
      <!--展示树形结构-->
      <!--default-expand-all默认展开-->
      <el-tree :data="depts" :props="defaultProps" default-expand-all />
    </div>
  </div>
</template>
<script>
export default {
  name: 'Department',
  data() {
    return {
      depts: [{ name: '充值教育', children: [{ name: '总裁办' }, { name: '行政部' }, { name: '人事部' }] }], // 数据属性
      defaultProps: {
        label: 'name', // 要显示的字段的名称
        children: 'children'// 读取子节点的字段名
      }
    }
  }
}
</script>

增加样式

<style scoped>
.app-container{
  padding: 30px 140px;
  font-size: 14px;
}
</style>

用插槽显示节点数据

   <div class="app-container">
      <!-- 展示树形结构 -->
      <el-tree :expand-on-click-node="false" default-expand-all :data="depts" :props="defaultProps">
        <!-- 节点结构 -->
        <!-- 作用域插槽 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>
              <!-- $event 实参 表示类型 -->
              <el-dropdown @command="operateDept($event, data.id)">
                <!-- 显示区域内容 -->
                <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>
            </el-col>
          </el-row>
        </template>
      </el-tree>
    </div>

封装接口获取数据

1.api下新建department.js用来专门管理组织架构的接口

import request from '@/utils/request'
// 导出获取组织信息的函数
export function getDepartment() {
  return request({
    url: '/company/department'
  })
}

2.调用方法

methods: {
    async  getDepartment() {
      const result = await getDepartment()
      this.depts = result
    }
  }

递归转化树形结构

index.js

/**
 * 列表型转换为树型
 */
export function transListToTreeData(list, rootValue) {
  const arr = []
  list.forEach(item => {
    if (item.pid === rootValue) {
      arr.push()
      const children = transListToTreeData(list, item.id)
      list.children = children
    }
  })

  return arr
}

添加子部门弹框

封装的弹框

<template>
  <el-dialog title="新增" :visible="showDialog" @close="close" />
</template>
<script>
export default {
  props: {
    // 接收外部过来的showDialog,是一个promise
    showDialog: {
      type: Boolean,
      default: false
    }
  }, method: {
    close() {
      // 修改父组件的值,子传父
      this.$emit('update:showDialog', false)
    }
  }
}
</script>

表单结构

  <el-dialog title="新增" :visible="showDialog" @close="close">
    <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 placeholder="选择负责人" style="width:80%" size="mini" />
      </el-form-item><el-form-item label="部门介绍">
        <el-input placeholder="2-10个字符" type="textarea" size="mini" :rows="4" style="width:80%" />
      </el-form-item>
      <el-from-item>
        <el-row type="flex" justify="center">
          <el-col :span="12">
            <el-button type="primary" size="mini">确定</el-button>
            <el-button type="primary" size="mini">取消</el-button></el-col>
        </el-row>
      </el-from-item>
    </el-form>
  </el-dialog>

基础校验

  rules: {
        code: [{ required: true, message: '不能空' }, { min: 2, max: 10, message: '长度2-10' }],
        introduce: [{ required: true, message: '不能空' }, { min: 1, max: 100, message: '长度1-100' }],
        managerId: [{ required: true, message: '不能空' }, { min: 2, max: 10, message: '长度2-10' }],
        name: [{ required: true, message: '不能空' }, { min: 2, max: 10, message: '长度2-10' }]
      //  pid: []  pid不需要校验
      }

部门名称不重复的自定义校验

name: [{ required: true, message: '不能空', trigger: 'blur' }, { min: 2, max: 10, message: '长度2-10', trigger: 'blur' }, { trigger: 'blur', validtaor: async(rules, value, callback) => {
          // value就是输入的编码
          const result = await getDepartment()
          if (result.some(item => item.name === value)) {
            callback(new Error('已经有了'))
          } else {
            callback()
          }
        } }]

总结

获取负责人数据

 <el-select v-model="formData.managerId" placeholder="选择负责人" style="width:80%" size="mini">
          <!--下拉选项 循环 显示负责人数据 label表示显示的字段 value表示存储字段-->
          <el-option v-for="item in manageList" :key="item.id" :value="item.id" :label="item.username" />
        </el-select>
  created() {
    // 一开始就调用,以获取信息
    // 在methods里封装方法以调用接口
    // 在这里调用封装好的方法
    this.getManageList()
  },
 methods: {
    close() {
      // 修改父组件的值,子传父
      this.$emit('update:showDialog', false)
    },
    // 有await必须有async
    async  getManageList() {
      // 调用封装好的接口,用await接收返回的数据
      const result = await getManageList()
      // 把获取的数据赋值给data里设定的变量
      this.manageList = result
    }

  }

先声明变量,在created中调用方法,方法中调用API。好处:以后想调用方法可以直接调用

label是显示值,value是存储值

export function getManageList() {
  return request({
    url: '/sys/user/simple'

  })
}

记录当前部门的id,传给组件

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

 <!--:current-node-id="currentNodeId" 前面是属性名(自己取的),后面是变量名(data里定义好的)-->
    <add-dept :current-node-id="currentNodeId" :show-dialog.sync="showDialog" @updateDepartment="getDepartment" />
  </div>

 operateDept(type, id) {
      // type是上面绑定的command的值,不同选线绑定了不同的值
      if (type === 'add') {
        this.showDialog = true// 显示弹层
        this.currentNodeId = id// 记录当前节点定义的id,传给弹层
      }

组件接收

 props: {
    // 接收外部过来的showDialog,是一个promise
    showDialog: {
      type: Boolean,
      default: false
    },
    currentNodeId: {
      type: Number,
      default: null
    }
  },

数据提交,确认与取消

子组件

btnOk() {
      this.$refs.addDept.validate(async(isOk) => {
        if (isOk) {
          // formData里的前四个都有值,最后一个没有,所以把currentNodeId 的值赋给pid
          // 调用接口一定要记得加await和async
          await addDepartment({ ...this.formData, pid: this.currentNodeId })
          // 完成await之后,通知父组件更新
          this.$emit('updateDepartment')
          // 提示消息
          this.$message.success('新增部门成功')
          // 提示消息
          // 调用close方法,重置和关闭表单
          this.close()
        }
      })
    }

 

methods: {
    close() {
      // 重置表单
      this.$refs.addDept.resetFields()
      // 修改父组件的值,子传父
      this.$emit('update:showDialog', false)
    },

父组件

 

 <!--:current-node-id="currentNodeId" 前面是属性名(自己取的),后面是变量名(data里定义好的)-->
    <!--@updateDepartment="getDepartment"监听子组件的updateDepartment事件,这个事件一触发,就调用getDepartment方法,重新获取数据-->
    <add-dept :current-node-id="currentNodeId" :show-dialog.sync="showDialog" @updateDepartment="getDepartment" />
  </div>

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

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

相关文章

C#技巧之同步与异步

区别 首先&#xff0c;同步就是程序从上往下顺序执行&#xff0c;要执行完当前流程&#xff0c;才能往下个流程去。 而异步&#xff0c;则是启动当前流程以后&#xff0c;不需要等待流程完成&#xff0c;立刻就去执行下一个流程。 同步示例 创建一个窗体&#xff0c;往窗体里…

ES数据存储与查询基本原理

Elasticsearch&#xff08;ES&#xff09;简介 Elasticsearch&#xff08;ES&#xff09;是一个分布式、可扩展、近实时的搜索和分析引擎&#xff0c;它基于Lucene&#xff0c;设计用于云计算中&#xff0c;处理大规模文档检索和数据分析任务&#xff0c;常用于实现内部搜索引…

二维泊松方程(Neumann+Direchliet边界条件)有限元Matlab编程求解|程序源码+说明文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

详解面向对象-类和对象

1.面向对象与面向过程的区别 ①面向过程 &#xff1a;关注点是在实现功能的步骤上面&#xff0c;就是分析出解决问题所需要的步骤&#xff0c;让后函数把这些步骤一步一步实现&#xff0c;使用的时候一个一个依次调用就可以。对于简单的流程是适合面向过程的方式进行的&#x…

模型全参数训练和LoRA微调所需显存的分析

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

TypeScript 基础学习笔记:泛型 <T> vs 断言 as

TypeScript 基础学习笔记&#xff1a;泛型 <T> vs 断言 as &#x1f525; 引言 &#x1f44b; TypeScript (TS) 以其静态类型的魔力&#xff0c;让我们的代码更加健壮、易读且易于维护。今天&#xff0c;我们将深入探讨两个核心概念——泛型&#xff08;Generics&#x…

使用socket+Python实现ping

import os import socket import struct import select import time# 计算校验和&#xff0c;用于确保数据的完整性 def checksum(source_string):sum 0count 0max_count len(source_string)# 处理成对的字节while count < max_count - 1:val source_string[count 1] *…

结构体介绍(2)

结构体介绍&#xff08;2&#xff09; 前言一、结构体的内存对齐之深入理解为什么存在内存对齐&#xff1f;修改默认对齐数 二、结构体传参2.1&#xff1a;该怎么传参呢&#xff1f; 三、结构体实现位段3.1什么是位段位段的内存分配位段的跨平台问题 总结 前言 根据之前讲了结…

金融行业AI大模型百项应用案例综述【大模型系列】

逐浪金融大模型的玩家&#xff0c;除了BAT、华为等高科技巨头&#xff0c;试图以技术优势充当产业链的“卖铲人”&#xff0c;更多的还是金融和类金融企业&#xff0c;包括银行、保险、互金、券商等&#xff0c;既不想被喧宾夺主&#xff0c;又不想肥水外流&#xff0c;都在押注…

基于Springboot的校园竞赛管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园竞赛管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

VS2019下使用MFC完成科技项目管理系统

背景&#xff1a; &#xff08;一&#xff09;实验目的 通过该实验&#xff0c;使学生掌握windows程序设计的基本方法。了解科技项目组织管理的主要内容和管理方面的基本常识&#xff0c;熟练应用数据库知识&#xff0c;通过处理过程对计算机软件系统工作原理的进一步理解&am…

新型直膨式光伏光热热泵/动力热管复合循环系统

太阳能光伏光热热泵&#xff08;即PVT热泵&#xff09;技术是建筑领域内实现碳中和的有效技术手段&#xff0c;该技术具有优越的热电冷联产能力。然而&#xff0c;现有的PVT热泵在良好的室外工况下能耗较高。为了解决这一问题&#xff0c;本文提出了一种新型的DX-PVT热泵/动力热…

解决网络ping不通问题

网络ping不通可能有多种原因&#xff0c;以下是一些常见的解决方法&#xff1a; 1. 检查IP地址和域名&#xff1a;确保你使用的是正确的IP地址或者域名来ping目标设备。如果IP地址或者域名错误&#xff0c;ping请求将无法到达目标设备。 2. 检查网络连接&#xff1a;首先确保…

【电源专题】拿人体的循环系统与板级电源做个比较

一般人可能会觉得电源大概是电子设备里面比较容易搞定的门类。因为,只要线路没有接错,指示灯(如果有)能亮,电源都能工作。从这个方面说,好像是很容易。但是通过多年的经验和经历的坑,发现电源其实是一个很麻烦的东西,稍微有一点不完美就会有大问题出现。 如果将人体也当…

cloudreve手动添加文件

cloudreve导入本地已有的文件&#xff0c;不需要再次上传 需要更新版本到3.1及更高 在【管理面板】-----【文件】导入 如上图&#xff1a; 选择目标用户、原始路径、目的路径&#xff0c;创建导入任务即可&#xff01;

[C++基础学习-06]----C++指针详解

前言 指针是一个存储变量地址的变量&#xff0c;可以用来访问内存中的数据。在C中&#xff0c;指针是一种非常有用的数据类型&#xff0c;可以帮助我们在程序中对内存进行操作和管理。 正文 01-指针简介 指针的基本概念如下&#xff1a; 声明指针&#xff1a;使用“*”符…

AI+客服行业落地应用

一、客服行业变迁 1.传统客服时代 &#xff08;1&#xff09;客服工作重复性高&#xff0c;技术含量低 &#xff08;2&#xff09;呼出效率低&#xff0c;客服水平参差不齐 &#xff08;3&#xff09;管理难度高&#xff0c;情绪不稳定 &#xff08;4&#xff09;服务质量…

【系统架构师】-选择题(十三)

1、在某企业的营销管理系统设计阶段&#xff0c;属性"员工"在考勤管理子系统中被称为"员工"&#xff0c;而在档案管理子系统中被称为"职工"&#xff0c;这类冲突称为&#xff08; 命名冲突&#xff09;。 同一个实体在同系统中存在不同的命名&am…

2024“天一永安杯“宁波第七届网络安全大赛极安云科战队部分WP

“天一永安杯”2024 宁波第七届网络安全大赛暨第九届大学生网络技术与信息安全大赛 大赛竞赛形式 一、线上初赛 参赛人员&#xff1a;各单位自行选拔3人&#xff08;设队长1名&#xff09;组成团队&#xff0c;不足3人不允许参赛。 竞赛时间&#xff1a;8&#xff1a;30-12&…

15 C语言常用函数

C语言常用函数 本次笔记参考哔站尚硅谷宋红康老师的C语言教程。 C语言是一种广泛应用的编程语言&#xff0c;它提供了一系列的标准库函数&#xff0c;使得程序员能够更高效地编写程序。函数是C语言编程中的基础&#xff0c;通过它们&#xff0c;程序员可以构建出功能丰富的应用…