封装一个通用的工具栏
目标
:封装一个通用的工具栏供大家使用
通用工具栏的组件结构
在后续的业务开发中,经常会用到一个类似下图的工具栏,作为公共组件,进行一下封装
组件 src/components/PageTools/index.vue
组件统一注册
为了方便所有的页面都可以不用引用该组件,可以进行全局注册
提供注册入口 src/componets/index.js
在入口处进行注册 src/main.js
提交代码
本节任务
: 封装一个通用的工具栏
员工列表页面的基本布局和结构
目标
:实现员工列表页面的基本布局和结构
结构代码 src/employees/index.vue
提交代码
本节任务
:员工列表页面的基本布局和结构
员工列表数据请求和分页加载
目标
实现员工数据的加载和分页请求
首先,封装员工的加载请求 src/api/employees.js
然后,实现加载数据和分页的逻辑
绑定表格
提交代码
本节任务
员工列表数据请求和分页加载
员工列表中的数据进行格式化
目标
:将列表中的内容进行格式化
利用列格式化属性处理聘用形式
上小节中,列表中的聘用形式/入职时间和账户状态需要进行显示内容的处理
那么聘用形式中1代表什么含义,这实际上是我们需要的枚举数据,该数据的存放文件位于我们提供的 资源/枚举
中,可以将枚举下的文件夹放于 src/api
文件夹下
针对聘用形式,可以使用el-table-column的formatter属性进行设置
过滤器解决时间格式的处理
针对入职时间,我们可以采用作用域插槽进行处理
问题来了,过滤器从哪里呢?
在 资源/过滤器
中,我们提供了若干工具方法,我们可以将其转化成过滤器,首先将其拷贝到**src
**
在 main.js
中将工具方法转化成过滤器
好了,现在可以愉快的用过滤器的方式使用工具类的方法了
最后一项,账户状态,可以用开关组件switch进行显示
提交代码
本节任务
员工列表中的数据进行格式化
删除员工功能
目标
实现删除员工的功能
首先封装 删除员工的请求
删除功能
提交代码
本节任务
: 删除员工功能
新增员工功能-弹层-校验-部门
目标
:实现新增员工的功能
新建员工弹层组件
当我们点击新增员工时,我们需要一个类似的弹层
类似**组织架构
**的组件,同样新建一个弹层组件 src/views/employees/components/add-employee.vue
引用弹出层,点击弹出
父组件中引用,弹出层
新增员工的表单校验
封装新增员工api src/api/employees.js
针对员工属性,添加校验规则
绑定数据和规则校验
加载部门数据转化树形
聘用形式和选择部门的处理
员工的部门是从树形部门中选择一个部门
获取部门数据,转化树形
点击部门赋值表单数据
选择部门,赋值表单数据
点击部门时触发
聘用形式
新增员工功能-确定-取消
调用新增接口
新增员工的功能和组织架构的功能极其类似,这里不做过多阐述
提交代码
本节任务
新增员工功能和弹层
员工导入组件封装
目标
:封装一个导入excel数据的文件
首先封装一个类似的组件,首先需要注意的是,类似功能,vue-element-admin已经提供了,我们只需要改造即可 代码地址
类似功能性的组件,我们只需要会使用和封装即可
excel导入功能需要使用npm包 xlsx
,所以需要安装 **xlsx
**插件
将vue-element-admin提供的导入功能新建一个组件,位置: src/components/UploadExcel
注册全局的导入excel组件
修改样式和布局
提交代码
本节任务
:员工导入组件封装
员工的导入
目标
:实现员工的导入
建立公共导入的页面路由
新建一个公共的导入页面,挂载路由 src/router/index.js
创建import路由组件 src/views/import/index.vue
分析excel导入代码,封装接口
封装导入员工的api接口
实现excel导入
获取导入的excel数据, 导入excel接口
为了让这个页面可以服务更多的导入功能,我们可以在页面中用参数来判断,是否是导入员工
当excel中有日期格式的时候,实际转化的值为一个数字,我们需要一个方法进行转化
需要注意,导入的手机号不能和之前的存在的手机号重复
逻辑判断
员工页面跳转
目标
: 实现员工的导入
员工导出excel功能
目标: 实现将员工数据导出功能
日常业务中,我们经常遇到excel导出功能, 怎么使用呢
Excel 的导入导出都是依赖于js-xlsx来实现的。
在 js-xlsx
的基础上又封装了Export2Excel.js来方便导出数据。
安装excel所需依赖和按需加载
由于 Export2Excel
不仅依赖js-xlsx
还依赖file-saver
和script-loader
。
所以你先需要安装如下命令:
由于js-xlsx
体积还是很大的,导出功能也不是一个非常常用的功能,所以使用的时候建议使用懒加载。使用方法如下:
excel导出参数的介绍
vue-element-admin提供了导出的功能模块,在课程资源/excel导出目录下,放置到src目录下
参数
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|
header | 导出数据的表头 | Array | / | [] |
data | 导出的具体数据 | Array | / | |
filename | 导出文件名 | String | / | excel-list |
autoWidth | 单元格是否要自适应宽度 | Boolean | true / false | true |
bookType | 导出文件类型 | String | xlsx, csv, txt, more | xlsx |
excel导出基本的结构
我们最重要的一件事,就是把表头和数据进行相应的对应
因为数据中的key是英文,想要导出的表头是中文的话,需要将中文和英文做对应
然后,完成导出代码
导出时间格式的处理
扩展
复杂表头的导出
当需要导出复杂表头的时候,vue-element-admin同样支持该类操作
vue-element-admin 提供的导出方法中有 multiHeader和merges 的参数
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|
multiHeader | 复杂表头的部分 | Array | / | |
merges | 需要合并的部分 | Array | / | [] |
multiHeader里面是一个二维数组,里面的一个元素是一行表头,假设你想得到一个如图的结构
mutiHeader应该这样定义
multiHeader中的一行表头中的字段的个数需要和真正的列数相等,假设想要跨列,多余的空间需要定义成空串
它主要对应的是标准的表头
如果,我们要实现其合并的效果, 需要设定merges选项
merges的顺序是没关系的,只要配置这两个属性,就可以导出复杂表头的excel了
提交代码
**本节任务
**实现将员工数据导出功能
员工详情页创建和布局
目标
:创建员工详情的主要布局页面和基本布局
详情页的基本布局和路由
建立详情页路由
建立基本架构
列表跳转到详情
读取和保存用户信息的接口
加载个人基本信息 > 该接口已经在之前提供过了 src/api/user.js
保存个人基本信息 src/api/employees.js
实现用户名和密码的修改
注意
:这里有个缺陷,接口中读取的是后端的密文,我们并不能解密,所以当我们没有任何修改就保存时,会校验失败,因为密文超过了规定的12位长度,为了真的修改密码,我们设定了一个临时的字段 password2,用它来存储我们的修改值,最后保存的时候,把password2传给password
用户名和密码的修改 src/views/employees/detail.vue
绑定表单数据
提交代码
个人组件和岗位组件封装
封装个人详情组件
我们将员工个人信息分为三部分,账户,个人, 岗位,这个小节我们对个人组件和岗位组件进行封装
封装个人组件 src/views/employees/components/user-info.vue
本章节个人数据过于**繁杂,庞大
**,同学们在开发期间,拷贝代码即可,我们只写关键部位的代码
定义user-info的数据
在detail.vue组件中,注册并使用
在以上代码中,我们使用了动态组件component,它通过 **is
属性来绑定需要显示在该位置的组件,is属性可以直接为注册组件
**的组件名称即可
封装岗位组件
同理,封装岗位组件
封装岗位组件 src/views/employee/components/job-info.vue
定义岗位数据
在detail.vue组件中,注册并使用
本节任务
:完成个人组件和岗位组件封装
员工个人信息和岗位信息-读取-保存
目标
:实现个人信息的岗位信息的读取和校验,保存
读取个人保存个人信息
这个环节里面大部分都是繁杂的属性和重复的过程,所以该环节直接将过程代码拷贝到项目中即可
封装 读取个人信息 保存个人信息 读取岗位信息 保存岗位信息
读取,保存个人信息 user-info
需要注意:这里的保存实际上分成了两个接口,这是接口的设计,我们只能遵守
读取保存岗位信息
读取,保存岗位信息 job-info
提交代码
本节任务
实现个人信息的岗位信息的读取和校验,保存
配置腾讯云Cos
目标
: 配置一个腾讯云cos
由于上课的开发的特殊性,我们不希望把所有的图片都上传到我们自己的官方服务器上,这里我们可以采用一个腾讯云的图片方案
上边图的意思就是说,我们找一个可以免费上传图片的服务器,帮我们 代管图片
,我们在自己的数据库里只保存一个地址就行, 这其实也是很多项目的处理方案,会有一个 公共的文件服务器
第一步,我们必须先拥有一个腾迅云的开发者账号(小心腾讯云的广告电话)
请按照腾讯云的注册方式,注册自己的账号
第二步,实名认证
选择个人账户
填写个人身份信息
下一步,扫描二维码授权
手机端授权
点击领取免费产品
选择对象存储COS
我们免费拥有**6个月的50G流量
**的对象存储空间使用权限,足够我们上传用户头像的使用了
点击0元试用,开通服务
到这一步,账号的部分就操作完毕,接下来,我们需要来创建一个存储图片的存储桶
登录 对象存储控制台 ,创建存储桶。设置存储桶的权限为 公有读,私有写
设置cors规则
AllowHeader 需配成*
,如下图所示。
因为我们本身没有域名,所以这里设置成***
**,仅限于测试,正式环境的话,这里需要配置真实的域名地址
到这里,我们的腾讯云存储桶就设置好了。
封装上传图片组件-上传组件需求分析
目标
梳理整个的上传过程
初始化cos对象参数
名称 | 描述 |
---|
SecretId | 开发者拥有的项目身份识别 ID,用以身份认证,可在 API 密钥管理 页面获取 |
SecretKey | 开发者拥有的项目身份密钥,可在 API 密钥管理 页面获取 |
注意,上述的参数我们在本次开发过程中,直接将参数放置在前端代码中存储,但是腾讯云本身是不建议这么做的,因为**敏感信息
**放在前端很容易被捕获,由于我们本次是测试研发,所以这个过程可以忽略
正确的做法应该是,通过网站调用接口换取敏感信息
相关文档
实例化 上传sdk
到目前为止,我们上传图片准备的内容就已经OK,接下来,我们在**src/componets
** 新建一个**ImageUpload
** 组件
该组件需要满足什么要求呢?
- 可以显示传入的图片地址
- 可以删除传入的图片地址
- 可以上传图片到云服务器
- 上传到腾讯云之后,可以返回图片地址,显示
- 上传成功之后,可以回调成功函数
这个上传组件简单吗?
no ! ! !
看似需求很明确,但是它真正的实现很复杂,我们通过一个图来看一下
从上图中,我们可以看到,实际上是有两种场景的,本地场景和已经上传的场景
下个章节,针对这个场景我们进行开发
封装上传组件-代码实现
目标
实现上传组件的代码部分
JavaScript SDK 需浏览器支持基本的 HTML5 特性(支持 IE10 以上浏览器),以便支持 ajax 上传文件和计算文件 MD5 值。
新建文件上传组件
安装JavaScript SDK
新建上传图片组件 src/components/ImageUpload/index.vue
上传组件,我们可以沿用element的el-upload组件,并且采用照片墙的模式 list-type="picture-card"
放置el-upload组件
全局注册组件
点击图片进行预览
限定上传的图片数量和action
action为什么给#, 因为前面我们讲过了,我们要上传到腾讯云,需要自定义的上传方式,action给个#防止报错
预览
预览弹层
根据上传数量控制上传按钮
控制上传显示
删除图片和添加图片
删除文件
添加文件
上传之前检查
控制上传图片的类型和上传大小, 如果不满足条件 返回false上传就会停止
上传动作调用上传腾讯云
上传动作为el-upload的http-request属性
我们需要在该方法中,调用腾讯云的上传方法
腾讯云文档地址
身份ID和密钥可以通过腾讯云平台获取
登录 访问管理控制台 ,获取您的项目 SecretId 和 SecretKey。
实现代码
上传成功之后处理返回数据
如何处理返回成功的返回数据
确定要上传记录id
处理返回数据
我们在fileList中设置了属性为upload为true的属性,表示该图片已经上传成功了,如果fileList还有upload不为true的数据,那就表示该图片还没有上传完毕
上传的进度条显示
为了再上传图片过程中显示进度条,我们可以使用element-ui的进度条显示当前的上传进度
放置进度条
通过腾讯云sdk监听上传进度
完整代码
上传动作中,用到了上个小节中,我们注册的腾讯云cos的**存储桶名称
和地域名称
**
通过上面的代码,我们会发现,我们把上传之后的图片信息都给了**fileList数据
,那么在应用时,就可以直接获取该实例的fileList数据即可
**
提交代码
本节任务
完成上传组件的封装
在员工详情中应用上传组件
目标
:应用封装好的上传组件
将员工的头像和证件照赋值给上传组件
在**user-info.vue
**中放置上传组件
员工头像
读取时赋值头像
员工证件照
读取时赋值照片
保存时处理头像和证件照的保存
当点击保存更新时,获取图片的内容
上面代码中,upload如果为true,表示该图片已经完成上传,以此来判断图片是否已经上传完成
保存时读取头像
提交代码
本节任务
: 在员工详情中应用上传组件
员工列表显示图片
目标
:在员工列表中心显示图片
员工的头像可以在列表项中添加一列来进行显示
我们尝试用之前的指令来处理图片的异常问题,但是发现只有两三张图片能显示
这是因为有的员工的头像的地址为空,给img赋值空的src不能触发错误事件,针对这一特点,我们需要对指令进行升级
插入节点的钩子里面判断空, 然后在组件更新之后的钩子中同样判断空
这样我们可以看到每个用户的头像了,如果没有头像则显示默认图片
任务
:员工列表显示图片
图片地址生成二维码
目标
将图片地址生成二维码显示
我们想完成这样一个功能,当我们拥有头像地址时,将头像地址生成一个二维码,用手机扫码来访问
首先,需要安装生成二维码的插件
qrcode的用法是
dom为一个canvas的dom对象, info为转化二维码的信息
我们尝试将canvas标签放到dialog的弹层中
在点击员工的图片时,显示弹层,并将图片地址转化成二维码
打印员工信息
目标
完成个人信息和工作信息的打印功能
新建打印页面及路由
创建页面组件
该页面内容实际上就是读取个人和详情的接口数据,根据传入的type类型决定显示个人还是岗位
type为**personal
时显示个人,为job
**时显示岗位
新建打印页面路由
完成详情到打印的跳转
个人
岗位
利用vue-print-nb进行打印
首先,打印功能我们借助一个比较流行的插件
它的用法是
首先注册该插件
使用v-print指令的方式进行打印
最终,我们看到的效果
提交代码
**本节任务
**打印员工信息