Vue项目实战之人力资源平台系统(七)员工管理模块

前言

一、封装一个通用的工具栏

1.1 通用工具栏效果图

在后续的业务开发中,经常会用到一个类似下图的工具栏:
在这里插入图片描述

1.2 组件基本布局

在src/components/PageTools目录下新建index.vue组件:

<template>
  <el-card class="page-tools">
    <el-row type="flex" justify="space-between" align="middle">
      <el-col>
        <div  v-if="showBefore" class="before">
          <i class="el-icon-info" />
          <!-- 定义前面得插槽 -->
          <slot name="before" />
        </div>
      </el-col>
      <el-col>
        <el-row type="flex" justify="end">
           <!-- 定义后面的插槽 -->
           <slot name="after" />
        </el-row>
      </el-col>
    </el-row>
  </el-card>
</template>


<script>
export default {
    
    
  props: {
    
    
    showBefore: {
    
    
      type: Boolean,
      default: false
    }


  }
}
</script>

<style lang='scss'>
.page-tools {
    
    
    margin: 10px 0;
    .before {
    
    
      line-height: 34px;
    i {
    
    
      margin-right: 5px;
      color: #409eff;
    }
    display: inline-block;
    padding: 0px 10px;
    border-radius: 3px;
    border: 1px solid rgba(145, 213, 255, 1);
    background: rgba(230, 247, 255, 1);
  }
}
</style>

1.3 全局注册组件

首先在src/componets/目录下新建index.vue文件,该文件负责所有的公共的组件的全局注册:

import PageTools from './PageTools'

export default {
    
    
  install(Vue) {
    
    
    //  注册全局的通用栏组件对象
    Vue.component('PageTools', PageTools)
  }
}

然后在项目入口文件src/main.js中进行注册:

import Component from '@/components'
Vue.use(Component) // 注册自己的插件

二、员工列表展示

2.1 员工列表页面效果图

在这里插入图片描述

2.2 员工列表页面基础布局

在src/employees/index.vue中添加如下代码:

<template>
  <div class="dashboard-container">
    <div class="app-container">
      <!-- 上一节注册的通用组件 -->
      <page-tools :show-before="true">
        <span slot="before">166条记录</span>
        <template slot="after">
          <el-button size="small" type="warning">导入</el-button>
          <el-button size="small" type="danger">导出</el-button>
          <el-button size="small" type="primary">新增员工</el-button>
        </template>
      </page-tools>

      <!-- 放置表格和分页 -->
      <el-card>
        <el-table border>
          <el-table-column label="序号" sortable="" />
          <el-table-column label="姓名" sortable="" />
          <el-table-column label="工号" sortable="" />
          <el-table-column label="聘用形式" sortable="" />
          <el-table-column label="部门" sortable="" />
          <el-table-column label="入职时间" sortable="" />
          <el-table-column label="账户状态" sortable="" />
          <el-table-column label="操作" sortable="" fixed="right" width="280">
            <template>
              <el-button type="text" size="small">查看</el-button>
              <el-button type="text" size="small">转正</el-button>
              <el-button type="text" size="small">调岗</el-button>
              <el-button type="text" size="small">离职</el-button>
              <el-button type="text" size="small">角色</el-button>
              <el-button type="text" size="small">删除</el-button>
            </template>
          </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-card>
    </div>
  </div>
</template>

2.3 获取员工列表数据并分页展示

首先,在src/api/employees.js中封装获取员工数据的请求:

/**
* 获取员工的综合列表数据
* ***/
export function getEmployeeList(params) {
    
    
  return request({
    
    
    url: '/sys/user',
    params
  })
}

然后,在src/employees/index.vue中实现加载数据和分页的逻辑:

import {
    
     getEmployeeList } from '@/api/employees'
export default {
    
    
  data() {
    
    
    return {
    
    
      loading: false,
      list: [], // 接数据的
      page: {
    
    
        page: 1, // 当前页码
        size: 10,
        total: 0 // 总数
      }
    }
  },
  created() {
    
    
    this.getEmployeeList()
  },
  methods: {
    
    
    changePage(newPage) {
    
    
      this.page.page = newPage
      this.getEmployeeList()
    },
    async getEmployeeList() {
    
    
      this.loading = true
      const {
    
     total, rows } = await getEmployeeList(this.page)
      this.page.total = total
      this.list = rows
      this.loading = false
    }
  }
}

最后,绑定表格:

  <el-card v-loading="loading">
    <el-table border :data="list">
      <el-table-column label="序号" sortable="" type="index" />
      <el-table-column label="姓名" sortable="" prop="username" />
      <el-table-column label="工号" sortable="" prop="workNumber" />
      <el-table-column label="聘用形式" sortable="" prop="formOfEmployment" />
      <el-table-column label="部门" sortable="" prop="departmentName" />
      <el-table-column label="入职时间" sortable="" prop="timeOfEntry" />
      <el-table-column label="账户状态" sortable="" prop="enableState" />
      <el-table-column label="操作" sortable="" fixed="right" width="280">
        <template>
          <el-button type="text" size="small">查看</el-button>
          <el-button type="text" size="small">转正</el-button>
          <el-button type="text" size="small">调岗</el-button>
          <el-button type="text" size="small">离职</el-button>
          <el-button type="text" size="small">角色</el-button>
          <el-button type="text" size="small">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 分页组件 -->
    <el-row type="flex" justify="center" align="middle" style="height: 60px">
      <el-pagination
        layout="prev, pager, next"
        :page-size="page.size"
        :current-page="page.page"
        :total="page.total"
        @current-change="changePage"
      />
    </el-row>
  </el-card>

2.4 员工列表中的数据进行格式化

2.4.1 利用列格式化属性处理聘用形式

员工列表中的聘用形式需要我们进行显示内容的处理,可以使用el-table-column的formatter属性进行设置:

//这实际上是我们需要的枚举数据,该数据的存放文件位于src/api文件夹下
import  EmployeeEnum from '@/api/constant/employees'

<!-- 格式化聘用形式 -->
<el-table-column label="聘用形式" sortable :formatter="formatEmployment" />
// 格式化聘用形式
formatEmployment(row, column, cellValue, index) {
    
    
  // 要去找 1所对应的值
  const obj = EmployeeEnum.hireType.find(item => item.id === cellValue)
  return obj ? obj.value : '未知'
}

2.4.2 通过过滤器处理时间格式

将提供的工具方法导入src,然后在main.js中将工具方法转化成过滤器:

import * as filters from '@/filters' // 引入工具类
// 注册全局的过滤器
Object.keys(filters).forEach(key => {
    
    
  // 注册过滤器
  Vue.filter(key, filters[key])
})

然后在src/employees/index.vue中使用:

   <el-table-column label="入职时间" sortable="" align="center">
        <!-- 作用域插槽 -->
        <template slot-scope="{ row }">{
    
    {
    
     row.timeOfEntry | formatDate }}</template>
   </el-table-column>

2.4.3 开关组件switch显示账户状态

<el-table-column label="账户状态" align="center" sortable="" prop="enableState">
            <template slot-scope="{ row }">
              <!-- 根据当前状态来确定 是否打开开关 -->
              <el-switch :value="row.enableState === 1" />
            </template>
</el-table-column>

三、实现删除员工功能

首先,在src/api/employees.js中封装删除员工的请求:

/**
* 删除员工接口
* ****/
export function delEmployee(id) {
    
    
  return request({
    
    
    url: `/sys/user/${
      
      id}`,
    method: 'delete'
  })
}

然后,在src/employees/index.vue中实现删除功能:

<el-button type="text" size="small" @click="deleteEmployee(row.id)">删除</el-button>

    // 删除员工
    async deleteEmployee(id) {
    
    
      try {
    
    
        await this.$confirm('您确定删除该员工吗')
        await delEmployee(id)
        this.getEmployeeList()
        this.$message.success('删除员工成功')
      } catch (error) {
    
    
        console.log(error)
      }
    }

四、实现新增员工功能

4.1 新建员工弹窗组件效果图:

在这里插入图片描述

4.2 新建一个弹窗组件

在src/views/employees/components/目录下新建add-employee.vue文件:

<template>
  <el-dialog title="新增员工" :visible="showDialog">
    <!-- 表单 -->
    <el-form label-width="120px">
      <el-form-item label="姓名">
        <el-input style="width:50%" placeholder="请输入姓名" />
      </el-form-item>
      <el-form-item label="手机">
        <el-input style="width:50%" placeholder="请输入手机号" />
      </el-form-item>
      <el-form-item label="入职时间">
        <el-date-picker style="width:50%" placeholder="请选择入职时间" />
      </el-form-item>
      <el-form-item label="聘用形式">
        <el-select style="width:50%" placeholder="请选择" />
      </el-form-item>
      <el-form-item label="工号">
        <el-input style="width:50%" placeholder="请输入工号" />
      </el-form-item>
      <el-form-item label="部门">
        <el-input style="width:50%" placeholder="请选择部门" />
      </el-form-item>
      <el-form-item label="转正时间">
        <el-date-picker style="width:50%" placeholder="请选择转正时间" />
      </el-form-item>
    </el-form>
    <!-- footer插槽 -->
    <template v-slot:footer>
      <el-row type="flex" justify="center">
        <el-col :span="6">
          <el-button size="small">取消</el-button>
          <el-button type="primary" size="small">确定</el-button>
        </el-col>
      </el-row>
    </template>
  </el-dialog>
</template>


<script>
export default {
    
    
  props: {
    
    
    showDialog: {
    
    
      type: Boolean,
      default: false
    }
  }
}
</script>

4.3 引用弹出层,点击弹出

在src/employees/index.vue中添加如下代码:

import AddDemployee from './components/add-employee'

<el-button icon="plus" type="primary" size="small" @click="showDialog = true">新增员工</el-button>

<!-- 放置新增组件 -->
<add-employee :show-dialog.sync="showDialog" />

4.4 新增员工的表单校验

在src/views/employees/components/add-employee.vue中添加校验规则:

  data() {
    
    
    return {
    
    
      formData: {
    
    
        username: '',
        mobile: '',
        formOfEmployment: '',
        workNumber: '',
        departmentName: '',
        timeOfEntry: '',
        correctionTime: ''
      },
      rules: {
    
    
        username: [{
    
     required: true, message: '用户姓名不能为空', trigger: 'blur' }, {
    
    
          min: 1, max: 4, message: '用户姓名为1-4位'
        }],
        mobile: [{
    
     required: true, message: '手机号不能为空', trigger: 'blur' }, {
    
    
          pattern: /^1[3-9]\d{9}$/, message: '手机号格式不正确', trigger: 'blur'
        }],
        formOfEmployment: [{
    
     required: true, message: '聘用形式不能为空', trigger: 'blur' }],
        workNumber: [{
    
     required: true, message: '工号不能为空', trigger: 'blur' }],
        departmentName: [{
    
     required: true, message: '部门不能为空', trigger: 'change' }],
        timeOfEntry: [{
    
     required: true, message: '入职时间', trigger: 'blur' }]
      }
    }
  }

然后绑定数据:

<el-form :model="formData" :rules="rules" label-width="120px">
  <el-form-item label="姓名" prop="username">
    <el-input v-model="formData.username" style="width:50%" placeholder="请输入姓名" />
  </el-form-item>
  <el-form-item label="手机" prop="mobile">
    <el-input v-model="formData.mobile" style="width:50%" placeholder="请输入手机号" />
  </el-form-item>
  <el-form-item label="入职时间" prop="timeOfEntry">
    <el-date-picker v-model="formData.timeOfEntry" style="width:50%" placeholder="请选择日期" />
  </el-form-item>
  <el-form-item label="聘用形式" prop="formOfEmployment">
    <el-select v-model="formData.formOfEmployment" style="width:50%" placeholder="请选择" />
  </el-form-item>
  <el-form-item label="工号" prop="workNumber">
    <el-input v-model="formData.workNumber" style="width:50%" placeholder="请输入工号" />
  </el-form-item>
  <el-form-item label="部门" prop="departmentName">
    <el-input v-model="formData.departmentName" style="width:50%" placeholder="请选择部门" />
  </el-form-item>
  <el-form-item label="转正时间" prop="correctionTime">
    <el-date-picker v-model="formData.correctionTime" style="width:50%" placeholder="请选择日期" />
  </el-form-item>
</el-form>

4.5 获取并展示部门数据

首先,获取部门数据并将其转化为树形结构:

import {
    
     getDepartments } from '@/api/departments'
import {
    
     transListToTreeData } from '@/utils'
  data () {
    
    
      return {
    
    
       treeData: [], // 定义数组接收树形数据
       showTree: false, // 控制树形的显示或者隐藏
       loading: false, // 控制树的显示或者隐藏进度条
      }
  },
  methods: {
    
    
      async getDepartments() {
    
    
      this.showTree = true
      this.loading = true
      const {
    
     depts } = await getDepartments()
      // depts是数组 但不是树形
      this.treeData = transListToTreeData(depts, '')
      this.loading = false
    },
  }

然后,点击选择部门显示数据:

<el-form-item label="部门" prop="departmentName">
        <el-input v-model="formData.departmentName" style="width:50%" placeholder="请选择部门" @focus="getDepartments" />
        <!-- 放置一个tree组件 -->
        <el-tree
          v-if="showTree"
          v-loading="loading"
          :data="treeData"
          default-expand-all=""
          :props="{ label: 'name' }"
          @node-click="selectNode"
        />
</el-form-item>
选择一个部门时触发:

    selectNode(node) {
    
    
      this.formData.departmentName = node.name
      this.showTree = false
    }

4.6 点击弹窗的确定按钮提交表单数据

在src/api/employees.js中封装新增员工的请求:

/** **
*  新增员工的接口
* **/
export function addEmployee(data) {
    
    
  return request({
    
    
    method: 'post',
    url: '/sys/user',
    data
  })
}

然后在src/views/employees/components/add-employee.vue中调用新增接口:

<el-button size="small" @click="btnCancel">取消</el-button>
<el-button type="primary" size="small" @click="btnOK">确定</el-button>

// 点击确定时 校验整个表单
async btnOK() {
    
    
  try {
    
    
    await this.$refs.addEmployee.validate()
    // 调用新增接口
    await addEmployee(this.formData) // 新增员工
    // 告诉父组件更新数据
    // this.$parent 可以直接调用到父组件的实例 实际上就是父组件this
    // this.$emit
    this.$parent.getEmployeeList()
    this.$parent.showDialog = false
  } catch (error) {
    
    
    console.log(error)
  }
},
btnCancel() {
    
    
  // 重置原来的数据
  this.formData = {
    
    
    username: '',
    mobile: '',
    formOfEmployment: '',
    workNumber: '',
    departmentName: '',
    timeOfEntry: '',
    correctionTime: ''
  }
  this.$refs.addEmployee.resetFields() // 重置校验结果
  this.$emit('update:showDialog', false)
}

总结

猜你喜欢

转载自blog.csdn.net/qq_40652101/article/details/126940354