✔ 完成员工的 excel 导入导出/下载功能。
✔ 完成员工的增删改查功能。
员工管理-导出excel

- axios 配置 responseType 为 blob,接收的二进制流文件为 Blob 格式,
src/api/employee.js
。
1 | /** |
- 响应拦截器判断是不是 blob 类型,如果是直接返回数据,不再进行解构,
src/utils/request.js
。
1 | service.interceptors.response.use( |
- 安装 file-saver。
1 | npm i file-saver |
- 点击按钮调用接口,使用 file-saver 将 blob 转化成文件下载,
src/views/employee/index.vue
。
1 | <el-button size="mini" @click="exportEmployee">excel导出</el-button> |
1 | import FileSaver from 'file-saver' |
员工管理-excel导入


- 创建员工导入组件,
src/views/employee/components/import-excel.vue
。
1 | <template> |
- 在员工管理页面-导入该组件并注册使用,
src/views/employee/index.vue
。
1 | import ImportExcel from './components/import-excel.vue' |
- 声明一个控制该弹层的变量,
src/views/employee/index.vue
。
1 | data() { |
- 使用该组件,并且应用变量,
src/views/employee/index.vue
。
1 | <import-excel :show-excel-dialog.sync="showExcelDialog" /> |
- 点击员工展示导入弹出层,
src/views/employee/index.vue
。
1 | <el-button size="mini" @click="showExcelDialog = true">excel导入</el-button> |
员工管理-下载导入模板

- 封装下载模板的 API,
src/api/employee.js
。
1 | /** |
- 点击按钮进行下载模板,
src/views/employee/components/import-excel.vue
。
1 | <el-button type="text" @click="getTemplate">下载导入模板</el-button> |
1 | import { |
员工管理-员工导入-上传excel

- 封装上传 excel 的 API,
src/api/employee.js
。
1 | /** |
- 点击上传,弹出文件选择框,
src/views/employee/components/import-excel.vue
。
1 | <el-button type="text" @click="handleUpload">点击上传</el-button> |
1 | handleUpload() { |
- 监听文件改变 -> 上传 excel -> 关闭弹层,
src/views/employee/components/import-excel.vue
。
1 | <input ref="excel-upload-input" class="excel-upload-input" type="file" accept=".xlsx, .xls" @change="uploadChange"> |
1 | export default { |
这里为什么不管成功或者失败都要清空文件选择器中的内容呢? 因为不论成功或者失败,再点击上传都会去选择一个新的 excel,所以这里使用 finally 等到最后,将内容清空。
父组件需要监听上传成功的事件, src/views/employee/index.vue
1 | <import-excel :show-excel-dialog.sync="showExcelDialog" @uploadSuccess="getEmployeeList" /> |
员工管理-删除员工


- 封装删除员工的 API,
src/api/employee.js
。
1 | /** |
- 放置气泡框确认框,
src/views/employee/index.vue
。
1 | <template #default="{row}"> |
- 删除方法实现,
src/views/employee/index.vue
。
1 | // 删除员工方法 |
添加员工和路由

- 创建一个员工详情页面(直接拷贝),
src/views/employee/detail.vue
。
1 | <template> |
- 配置员工详情的路由信息,
src/router/modules/employee.js
。
1 | import layout from '@/layout' |
- 点击添加员工跳转到详情页,
src/views/employee/index.vue
。
1 | <el-button size="mini" type="primary" @click="$router.push('/employee/detail')">添加员工</el-button> |
添加员工-表单数据校验


表单校验规则如下。
姓名:必填;1~4 个字符。
手机号:必填。
部门:必填。
聘用形式:必填。
入职时间:必填。
转正时间:必填;不能小于入职时间。
- 定义数据和规则,
src/views/employee/detail.vue
。
1 | export default { |
- 绑定表单数据和属性,
src/views/employee/detail.vue
。
1 | <el-form ref="userForm" :model="userInfo" :rules="rules" label-width="220px"> |
添加员工-封装部门级联组件


Cascader 级联组件常用的属性如下。
options 为一个树形结构的数据源。
props 可以设置数据源中的字段如 label(展示),value(存取)。
separator 为展示的分隔符。
- 创建 select-tree 组件,
src/views/employee/components/select-tree.vue
1 | <template> |
- 使用 select-tree 组件,
src/views/employee/detail.vue
1 | // 引入组件 |
1 | <el-form-item label="部门" prop="departmentId"> |
添加员工-级联组件-双向绑定

- 接收 value 属性,
src/views/employee/components/select-tree.vue
。
1 | export default { |
- 级联改变触发 input 事件,
src/views/employee/components/select-tree.vue
。
1 | <el-cascader :value="value" size="mini" :options="treeData" :props="props" separator="-" @change="changeValue" /> |
1 | changeValue(list) { |
- 在父组件使用 v-model 双向绑定,
src/views/employee/detail.vue
。
1 | <select-tree v-model="userInfo.departmentId" class="inputW" /> |
添加员工-新增员工

- 封装新增员工 API,
src/api/employee.js
。
1 | export function addEmployee(data) { |
- 点击保存按钮进行新增,
src/views/employee/detail.vue
。
1 | import { addEmployee } from '@/api/employee' |
编辑员工-查看员工


- 封装获取员工详情的 API,
src/api/employee.js
。
1 | /** |
- 点击查看时跳转到详情携带 id,
src/views/employee/index.vue
。
1 | <el-button size="mini" type="text" @click="$router.push(`/employee/detail/${row.id}`)">查看</el-button> |
- 配置详情的路由支持新增模式和编辑模式,
src/router/modules/employee.js
。
? 表示可有可无,可以传 id 也可以选择不传,页面都能正确显示。
1 | export default { |
- 员工详情页判断是否有 id,有 id 就查询详情数据,
src/views/employee/detail.vue
。
1 | import { getEmployeeDetail } from '@/api/employee' |
编辑员工-保存员工

- 封装更新员工的 API,
src/api/employee.js
。
1 | export function updateEmployee(data) { |
- 保存时区分保存和新增场景,
src/views/employee/detail.vue
。
1 | import { updateEmployee } from '@/api/employee' |
- 编辑模式下,手机号和工号不可编辑,
src/views/employee/detail.vue
1 | <!-- 工号 --> |