人力资源平台项目总结(2)

2023-11-10

目录

1、路由和页面

1.1 左侧菜单的显示逻辑,设置菜单图标 (重点!)

2、组织架构

2.1. 认识组织架构

2.2 将树形的操作内容单独抽提成组件 

2.3 获取组织架构数据,并进行树形处理(重点!)

2.4 删除部门功能实现

2.5 新增部门功能-建立组件 

2.6 完成新增部门的规则校验 

2.7 新增部门功能-部门负责人数据 

2.8 新增功能-提交-取消-关闭 (新增知识sync修饰符)

2.9 编辑部门功能实现数据回写 (新知识,获取组件实例可以调组件方法)

2.10 同时支持编辑和新增场景 

2.11 给数据获取添加加载进度条

3、公司和角色 

3.1 读取公司角色信息 

3.2 删除角色功能 

3.3 编辑角色功能 

3.4 新增角色功能 


1、路由和页面

首先,我们需要知道类似这种大型中台项目的页面路由是如何设置的。 

 

因为复杂中台项目的页面众多,不可能把所有的业务都集中在一个文件上进行管理和维护,并且还有最重要的,前端的页面中主要分为两部分,一部分是所有人都可以访问的, 一部分是只有有权限的人才可以访问的,拆分多个模块便于更好的控制 

删除多余的静态路由表 src/router/index.js 

/**
 * constantRoutes
 * a base page that does not have permission requirements
 * all roles can be accessed
 */
export const constantRoutes = [
  {
    path: '/login',
    component: () => import('@/views/login/index'),
    hidden: true
  },

  {
    path: '/404',
    component: () => import('@/views/404'),
    hidden: true
  },

  {
    path: '/',
    component: Layout,
    redirect: '/dashboard',
    children: [{
      path: 'dashboard',
      name: 'Dashboard',
      component: () => import('@/views/dashboard/index'),
      meta: { title: 'Dashboard', icon: 'dashboard' }
    }]
  },

  // 404 page must be placed at the end !!!
  { path: '*', redirect: '/404', hidden: true }
]

 并且我们发现,删除了其他页面之后,左侧导航菜单的数据也只剩下了首页

接下来,我们可以将人力资源需要做的模块快速搭建相应的页面和路由 

根据上图中的结构,在views目录下,建立对应的目录,给每个模块新建一个index.vue,作为每个模块的主页

$ mkdir departments employees setting salarys social attendances approvals permission

 根据以上的标准建立好对应页面之后,接下来建立每个模块的路由规则

$ touch departments.js employees.js setting.js salarys.js salarys.js social.js attendances.js approvals.js permission.js

 设置每个模块的路由规则

如员工 employees.js 

// 导出属于员工的路由规则
import Layout from '@/layout'
//  {  path: '', component: '' }
// 每个子模块 其实 都是外层是layout  组件位于layout的二级路由里面
export default {
  path: '/employees', // 路径
  name: 'employees', // 给路由规则加一个name
  component: Layout, // 组件
  // 配置二级路的路由表
  children: [{
    path: '', // 这里当二级路由的path什么都不写的时候 表示该路由为当前二级路由的默认路由
    component: () => import('@/views/employees'),
    // 路由元信息  其实就是存储数据的对象 我们可以在这里放置一些信息
    meta: {
      title: '员工管理' // meta属性的里面的属性 随意定义 但是这里为什么要用title呢, 因为左侧导航会读取我们的路由里的meta里面的title作为显示菜单名称
    }
  }]
}

// 当你的访问地址 是 /employees的时候 layout组件会显示 此时 你的二级路由的默认组件  也会显示

 上述代码中,我们用到了meta属性,该属性为一个对象,里面可放置自定义属性,主要用于读取一些配置和参数,并且值得注意的是:我们的meta写了二级默认路由上面,而不是一级路由,因为当存在二级路由的时候,访问当前路由信息访问的就是二级默认路由

1.1 左侧菜单的显示逻辑,设置菜单图标 (重点!)

2、组织架构

2.1. 认识组织架构

 

 

 实现组织架构的头部内容:

首先实现头部的结构,采用element的行列布局

 <el-card class="tree-card">
        <!-- 用了一个行列布局 -->
        <el-row type="flex" justify="space-between" align="middle" style="height: 40px">
          <el-col>
            <span>江苏传智播客教育科技股份有限公司</span>
          </el-col>
          <el-col :span="4">
            <el-row type="flex" justify="end">
              <!-- 两个内容 -->
              <el-col>负责人</el-col>
              <el-col>
                <!-- 下拉菜单 element -->
                <el-dropdown>
                  <span>
                    操作<i class="el-icon-arrow-down" />
                  </span>
                  <!-- 下拉菜单 -->
                  <el-dropdown-menu slot="dropdown">
                    <el-dropdown-item>添加子部门</el-dropdown-item>
                  </el-dropdown-menu>
                </el-dropdown>
              </el-col>
            </el-row>
          </el-col>
        </el-row>
      </el-card>

 树形组件认识

 

<el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick"></el-tree>

<script>
  export default {
    data() {
      return {
        data: [{
          label: '一级 1',
          children: [{
            label: '二级 1-1',
            children: [{
              label: '三级 1-1-1'
            }]
          }]
        }, {
          label: '一级 2',
          children: [{
            label: '二级 2-1',
            children: [{
              label: '三级 2-1-1'
            }]
          }, {
            label: '二级 2-2',
            children: [{
              label: '三级 2-2-1'
            }]
          }]
        }, {
          label: '一级 3',
          children: [{
            label: '二级 3-1',
            children: [{
              label: '三级 3-1-1'
            }]
          }, {
            label: '二级 3-2',
            children: [{
              label: '三级 3-2-1'
            }]
          }]
        }],
        defaultProps: {
          children: 'children',
          label: 'label'
        }
      };
    },
    methods: {
      handleNodeClick(data) {
        console.log(data);
      }
    }
  };
</script>

 实现树形的静态组织架构

 <el-tree :data="departs" :props="defaultProps" :default-expand-all="true">
          <!-- 传入内容 插槽内容 会循环多次 有多少节点 就循环多少次 -->
          <!-- 作用域插槽 slot-scope="obj" 接收传递给插槽的数据   data 每个节点的数据对象-->
          <el-row slot-scope="{ data }" type="flex" justify="space-between" align="middle" style="height: 40px; width: 100%">
            <el-col>
              <!-- 左侧内容 -->
              <span>{{ data.name }}</span>
            </el-col>
            <el-col :span="4">
              <el-row type="flex" justify="end">
                <el-col>{{ data.manager }}</el-col>
                <el-col>
                  <!-- 放置下拉菜单 -->
                  <el-dropdown>
                    <!-- 内容 -->
                    <span>操作
                      <i class="el-icon-arrow-down" />
                    </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>

            <!-- 右侧内容 -->
            </el-col>
          </el-row>        </el-tree>
<script>
export default {
  data() {
    return {
      departs: [{ name: '总裁办', manager: '曹操', children: [{ name: '董事会', manager: '曹丕' }] },
        { name: '行政部', manager: '刘备' },
        { name: '人事部', manager: '孙权' }],
      defaultProps: {
        label: 'name' // 表示 从这个属性显示内容
      }
    }
  }
}
</script>

2.2 将树形的操作内容单独抽提成组件 

 

<template>
  <el-row type="flex" justify="space-between" align="middle" style="height: 40px;width: 100%">
    <el-col>
      <!-- 名称应该变成 对应的节点中的name -->
      <span>{{ treeNode.name }}</span>
    </el-col>
    <el-col :span="4">
      <el-row type="flex" justify="end">
        <!-- 两个内容 -->
        <el-col>{{ treeNode.manager }}</el-col>
        <el-col>
          <!-- 下拉菜单 element -->
          <el-dropdown>
            <span>
              操作<i class="el-icon-arrow-down" />
            </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>
    </el-col>
  </el-row>
</template>

<script>
// 该组件需要对外开放属性 外部需要提供一个对象 对象里需要有name  manager
export default {
  // props可以用数组来接收数据 也可以用对象来接收
  // props: {   props属性: {  配置选项 }  }
  props: {
    //   定义一个props属性
    treeNode: {
      type: Object, // 对象类型
      required: true // 要求对方使用您的组件的时候 必须传treeNode属性 如果不传 就会报错
    }
  }
}
</script>

  在组织架构中应用操作栏组件

 

 2.3 获取组织架构数据,并进行树形处理(重点!)

封装API接口,获取组织架构数据 

 

import TreeTools from './components/tree-tools'
import { getDepartments } from '@/api/departments'
export default {
  components: {
    TreeTools
  },
  data() {
    return {
      company: { }, // 就是头部的数据结构
      departs: [],
      defaultProps: {
        label: 'name' // 表示 从这个属性显示内容
      }
    }
  },
  created() {
    this.getDepartments() // 调用自身的方法
  },
  methods: {
    async getDepartments() {
      const result = await getDepartments()
      this.company = { name: result.companyName, manager: '负责人' }
      this.departs = result.depts // 需要将其转化成树形结构
      console.log(result)
    }
  }
}

 将数组数据转化成树形结构

 

 

 2.4 删除部门功能实现

封装删除接口,注册下拉菜单事件 

 

 

调用删除接口,通知父组件更新数据 

 

 

2.5 新增部门功能-建立组件 

 

们需要构建一个新增部门的窗体组件 

src/views/department/components/add-dept.vue 

 

<template>
  <!-- 新增部门的弹层 -->
  <el-dialog title="新增部门">
    <!-- 表单组件  el-form   label-width设置label的宽度   -->
    <!-- 匿名插槽 -->
    <el-form label-width="120px">
      <el-form-item label="部门名称">
        <el-input style="width:80%" placeholder="1-50个字符" />
      </el-form-item>
      <el-form-item label="部门编码">
        <el-input style="width:80%" placeholder="1-50个字符" />
      </el-form-item>
      <el-form-item label="部门负责人">
        <el-select style="width:80%" placeholder="请选择" />
      </el-form-item>
      <el-form-item label="部门介绍">
        <el-input style="width:80%" placeholder="1-300个字符" type="textarea" :rows="3" />
      </el-form-item>
    </el-form>
    <!-- el-dialog有专门放置底部操作栏的 插槽  具名插槽 -->
    <el-row slot="footer" type="flex" justify="center">
      <!-- 列被分为24 -->
      <el-col :span="6">
        <el-button type="primary" size="small">确定</el-button>
        <el-button size="small">取消</el-button>
      </el-col>
    </el-row>
  </el-dialog>
</template>

 点击新增子部门显示弹层组件

 

 

2.6 完成新增部门的规则校验 

完成新增表单的基本校验条件 

 

 

配置新增表单的基本校验规则 

data() {
    return {
      // 定义表单数据
      formData: {
        name: '', // 部门名称
        code: '', // 部门编码
        manager: '', // 部门管理者
        introduce: '' // 部门介绍
      },
      // 定义校验规则
      rules: {
        name: [{ required: true, message: '部门名称不能为空', trigger: 'blur' },
          { min: 1, max: 50, message: '部门名称要求1-50个字符', trigger: 'blur' }],
        code: [{ required: true, message: '部门编码不能为空', trigger: 'blur' },
          { min: 1, max: 50, message: '部门编码要求1-50个字符', trigger: 'blur' }],
        manager: [{ required: true, message: '部门负责人不能为空', trigger: 'blur' }],
        introduce: [{ required: true, message: '部门介绍不能为空', trigger: 'blur' },
          { trigger: 'blur', min: 1, max: 300, message: '部门介绍要求1-50个字符' }]
      }
    }
  }

  部门名称和部门编码的自定义校验

 

 处理首部内容的pid数据 

 

2.7 新增部门功能-部门负责人数据 

 

 

2.8 新增功能-提交-取消-关闭 (新增知识sync修饰符

 

 

利用sync修饰符关闭新增弹层 

 

取消时重置数据和校验 

 

2.9 编辑部门功能实现数据回写 (新知识,获取组件实例可以调组件方法)

点击编辑弹出层,记录当前节点 

 

 

父组件调用子组件的获取详情方法 

 

 

 根据计算属性显示控制标题

 

2.10 同时支持编辑和新增场景 

封装编辑接口,保存区分场景 

 

 

 校验规则支持编辑场景下的校验 

   // 现在定义一个函数 这个函数的目的是 去找 同级部门下 是否有重复的部门名称
    const checkNameRepeat = async(rule, value, callback) => {
      // 先要获取最新的组织架构数据
      const { depts } = await getDepartments()
      //  检查重复规则 需要支持两种 新增模式 / 编辑模式
      // depts是所有的部门数据
      // 如何去找技术部所有的子节点
      let isRepeat = false
      if (this.formData.id) {
        // 有id就是编辑模式
        // 编辑 张三 => 校验规则 除了我之外 同级部门下 不能有叫张三的
        isRepeat = depts.filter(item => item.id !== this.formData.id && item.pid === this.treeNode.pid).some(item => item.name === value)
      } else {
        // 没id就是新增模式
        isRepeat = depts.filter(item => item.pid === this.treeNode.id).some(item => item.name === value)
      }

      isRepeat ? callback(new Error(`同级部门下已经有${value}的部门了`)) : callback()
    }
    // 检查编码重复
    const checkCodeRepeat = async(rule, value, callback) => {
      // 先要获取最新的组织架构数据
      //  检查重复规则 需要支持两种 新增模式 / 编辑模式
      const { depts } = await getDepartments()
      let isRepeat = false
      if (this.formData.id) {
        // 编辑模式  因为编辑模式下 不能算自己
        isRepeat = depts.some(item => item.id !== this.formData.id && item.code === value && value)
      } else {
        // 新增模式
        isRepeat = depts.some(item => item.code === value && value) // 这里加一个 value不为空 因为我们的部门有可能没有code
      }

      isRepeat ? callback(new Error(`组织架构中已经有部门使用${value}编码`)) : callback()
    }

 2.11 给数据获取添加加载进度条

3、公司和角色 

建立公司角色页面的基本结构 

<template>
  <div class="dashboard-container">
    <div class="app-container">
      <el-card>
        <el-tabs>
          <!-- 放置页签 -->
          <el-tab-pane label="角色管理">
            <!-- 新增角色按钮 -->
            <el-row style="height:60px">
              <el-button
                icon="el-icon-plus"
                size="small"
                type="primary"
              >新增角色</el-button>
            </el-row>
            <!-- 表格 -->
            <el-table border="">
              <el-table-column label="序号" width="120" />
              <el-table-column label="角色名称" width="240" />
              <el-table-column label="描述" />
              <el-table-column label="操作">
                <el-button size="small" type="success">分配权限</el-button>
                <el-button size="small" type="primary">编辑</el-button>
                <el-button size="small" type="danger">删除</el-button>
              </el-table-column>
            </el-table>
            <!-- 分页组件 -->
            <el-row type="flex" justify="center" align="middle" style="height: 60px">
              <!-- 分页组件 -->
              <el-pagination layout="prev,pager,next" />
            </el-row>
          </el-tab-pane>
          <el-tab-pane label="公司信息">
            <el-alert
              title="对公司名称、公司地址、营业执照、公司地区的更新,将使得公司资料被重新审核,请谨慎修改"
              type="info"
              show-icon
              :closable="false"
            />
            <el-form label-width="120px" style="margin-top:50px">
              <el-form-item label="公司名称">
                <el-input disabled style="width:400px" />
              </el-form-item>
              <el-form-item label="公司地址">
                <el-input disabled style="width:400px" />
              </el-form-item>
              <el-form-item label="邮箱">
                <el-input disabled style="width:400px" />
              </el-form-item>
              <el-form-item label="备注">
                <el-input type="textarea" :rows="3" disabled style="width:400px" />
              </el-form-item>
            </el-form>
          </el-tab-pane>

        </el-tabs>
      </el-card>
    </div>
  </div>
</template>

3.1 读取公司角色信息 

读取角色列表数据 

 

 

 

读取公司信息数据 

 

 

 

3.2 删除角色功能 

 

 

 

3.3 编辑角色功能 

 封装编辑接口,新建编辑弹层 

 

 

实现编辑功能,为新增功能留口 

3.4 新增角色功能 

 

 新增功能实现和编辑功能合并(处理关闭)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

人力资源平台项目总结(2) 的相关文章

随机推荐

  • Prometheus原理详解

    引言 zabbix是传统的监控系统 出现比云原生早 使用的是SQL关系型数据库 而Prometheus基于谷歌的borgemon使用的go语言开发 使用TSDB数据库 所以支持云原生 zabbix最新发布的6 0版本 知道自己处于生死存亡时
  • dbeaver sqlserver 驱动_免费通用数据库工具DBeaver安装及使用教程

    目录 DBeaver简介 DBeaver的安装 界面功能区简介 MySQL数据源配置 Oracle数据源配置 DBeaver简介 DBeaver 是一个基于 Java 开发 免费开源的通用数据库管理和开发工具 使用非常友好的 ASL 协议
  • linux动态库编译多重依赖,Linux动态库多重依赖

    1 动态库依赖关系 test gt hello gt world 2 源文件 world cpp include void world void printf world n hello cpp include void world voi
  • Unity关于Input的静态函数的使用

    Input GetAxis GetAxis这个函数 接收指定轴向的输入 比如 Horizontal Vertical 返回值在 1到1之间 Input GetKey KeyCode W GetKey这个函数 需要移动或者需要一直按着按键那种
  • 返回类型和return语句

    return语句中之当前正在执行的函数 并将控制权返回到调用该函数的地方 无返回值函数 没有返回值的return语句只能用在返回类型是void的函数中 返回void的函数不要求非得有return语句 因为这类函数最后一句后面会吟诗执行ret
  • 机器学习之人脸识别(Face Recognition)

    机器学习之机器是如何识别人脸 Face Recognition 的 目前 一些机器学习技术已经被广泛应用于人脸识别 人脸支付以及身份认证领域 例如支付宝的FACEID 阿里的Alipay ETC等等 这个领域内的算法多以传统的Eigen F
  • [转]虚拟驾舱Cockpit可选的芯片平台

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com 与传统的多芯片
  • redis的多路复用原理

    redis服务端对于命令的处理是单线程的 但是在I O层面却可以同时面对多个客户端并发的提供服务 并发到内部单线程的转化通过多路复用框架实现 一个IO操作的完整流程是数据请求先从用户态到内核态 也就是操作系统层面 然后再调用操作系统提供的a
  • mysql表示数字的数据类型的长度

    在mysql当中表示数字的数据类型 有这么几个 从小到大以此是 tinyint 128 127 smallint 32 768 32767 mediumint 8 388 608 8388607 这三个对应java的数据类型是int类型 i
  • Java-Java绘图坐标体系

    坐标体系介绍 坐标原点位于左上角 以像素为单位 在java坐标系中 第一个是x坐标 表示当前位置为水平方向 距离坐标原点x个像素 第二个是y坐标 表示当前位置为垂直防线 距离坐标原点y个像素 像素介绍 像素是一个密度单位 计算机在屏幕上显示
  • httpservletresponse 获取body_获取请求体数据

    将一些获取请求体数据 请求体数据post请求的时候才有
  • 关于github在vscode上的认证以及密钥缓存机制

    今天在向GitHub仓库提交代码的时候收到了这封邮件 说是使用密码的认证将要被舍弃了 提醒我换成两步验证 2FA 切换成两步验证很顺利 突然很好奇GitHub密码在Mac上是怎么保存的 vscode的设置里有两个选项 如下图 保存密码的地方
  • html如何添加环绕标签,html给定标签选项并添加标签(附代码)

    这篇文章给大家介绍的内容是关于html给定标签选项并添加标签 附代码 有一定的参考价值 有需要的朋友可以参考一下 希望对你有所帮助 HTML haveTags addTags 返回的数组 CSS havetags span addtags
  • ctfshow 萌新web系列--3

  • Linux shell判断含有通配符的文件是否存在

    方法一 使用 ls jpg gt dev null 命令 if ls jpg gt dev null then echo 当前文件夹下 未找到 jpg文件 else echo 当前文件夹下 存在 jpg文件 fi 方法二 使用 ls jpg
  • Descriptors cannot not be created directly

    1 Descriptors cannot not be created directly 在运行诸如深度学习python等程序时 如mmdetection mmdetection3d中的程序 会出现报错 Descriptors cannot
  • 后氧传感器正常数据_氧传感器电压多少正常?氧传感器数据流分析介绍

    氧传感器作用是什么 氧传感器用以检测排气中氧的浓度 并向ECU发出反馈信号 再由ECU控制喷油器喷油量的增减 从而将混合气的空燃比控制在理论值附近 氧传感器是利用陶瓷敏感元件测量汽车排气管道中的氧电势 由化学平衡原理计算出对应的氧浓度 达到
  • Redis启动与关闭

    安装redis之后 在命令行窗口中输入 redis server redis windows conf 启动redis 关闭命令行窗口就是关闭 redis redis作为windows服务启动方式 redis server service
  • Xilinx_RAM_IP核的使用

    Xilinx RAM IP核的使用 说明 单口RAM 伪双口RAM 双口RAM的读写 以及RAM资源占用的分析 环境 Vivado2018 3 IP核 Block Memory Generator 参考手册 UG473 7 Series F
  • 人力资源平台项目总结(2)

    目录 1 路由和页面 1 1 左侧菜单的显示逻辑 设置菜单图标 重点 2 组织架构 2 1 认识组织架构 2 2 将树形的操作内容单独抽提成组件 2 3 获取组织架构数据 并进行树形处理 重点 2 4 删除部门功能实现 2 5 新增部门功能