登录
开发前git的相关配置
- 在
git
创建一个新的分支(每开发一个新功能,最好新建一个分支,开发完了以后再合并到主分支上面) - 创建新的分支
git checkout -b login
,创建子分支login
,并且切换到该分支上 - 查看当前项目的所有分支
git branch
创建登录组件并配置相关路由
- 把
login
组件当作重定向的组件,即:
const routes = [
{
path:'/', redirect: '/login'},
{
path:'/login', component: Login}
]
- 引入全局样式
global.css
,然后在入口文件main.js
中引入全局样式import '路径'
//引入全局样式文件
import '@/assets/css/global.css'
- 然后用绝对定位的方式在组件
login
的正中间布局一个盒子 - 安装
element-ui
插件(安装完以后,别忘了在main.js
中引入,否则报错) - 引入
el-form、el-form-item
组件,其中可以把两个按钮组件el-button
也放在组件el-form-item
中
如果把
el-form
的宽度设置为100%
,然后在来个padding
,把输入框挤进去,发现右边的输入框会超出,原因是form
表单默认是content-box
,解决办法:改为border-box
即可。
在输入框中图标,用elementui
中输入框的属性加图标,而不要用加标签<i>
的方法。即可以通过prefix-icon
和suffix-icon
属性在input
组件首部和尾部增加显示图标,也可以通过slot
来放置图标。
- 使用阿里图标库
- 把下载的
font
文件夹放入资源目录assets
下- 在入口文件
main.js
中导入字体图标import '@/assets/fonts/iconfont.css'
- 使用:先添加基类
iconfont
,然后添加想要的图标的类名
- 设置请求拦截器,使得每次发送网络请求时都要在请求头中加入权限字段。
instance.interceptors.request.use(config =>{
config.headers.Authorization = window.sessionStorage.getItem('token')
return config
})
- 调用验证方法
validate
,校验输入框内容是否合法
this.$refs.loginFormRef.validate(回调函数)
- 发送登录的网络请求,其中,
将登录成功之后的token
,保存到客户端的sessionStorage
中;
项目中除了登录之外的其他API接口,必须在登录之后才能访问;
token
只应在当前网站打开期间生效,所以将token
保存在sessionStorage
中
login(){
this.$refs.loginFormRef.validate(async valid =>{
if(!valid) return
const {
data} = await requestLoginData({
params:this.loginForm})
if(data.meta.status === 200){
this.$message.success('登录成功')
window.sessionStorage.setItem('token',data.data.token)
this.$router.push('/home')
}else{
this.$message.error('您输入的用户或者密码不正确')
}
})
- 设置路由导航守卫
router.beforeEach((to, from, to) =>{
if(to.path == '/login') return next();
const token = window.sessionStorage.getItem('token')
if(!token){
return next('/login')
}
next()
})
- 重置按钮实现表单的重置。实现方法:调用
element
中自带的方法resetFields
preSet(){
this.$refs.loginFormRef.resetFields()
}
代码同步和上传
- 查看代码状态:
git status
- 添加至缓存区:
git add
- 提交:
git commit -m "完成了登录功能"
- 查看分支状态:
git branch
- 合并到主分支
- 切换到主分支:
git checkout master
- 基于主分支合并其他所有分支:
git merge login
- 切换到主分支:
- 把本地代码推送到云端:
git push
- 以上只是主分支
master
推送到云端,如果想把login
分支也推送到云端,则需- 切换到
login
分支 - 推送到云端:
git push -u origin login
- 切换到
Home页面
- 页面布局
<el-container>
<el-header>Header</el-header>
<el-container>
<el-aside>Aside</el-aside>
<el-main>Main</el-main>
</el-container>
</el-container>
-
头部中的退出功能实现
主要任务:点击退出后,因为是基于token
方式的登录,所以只需销毁本地token
即可。这样,后续的请求就不会携带token
,必须重新登录才能产生新的token
,再访问页面。
其中,销毁本地token
的语法为:window.sessionStorage.clear()
-
侧边栏区域的实现
- 点击合并的实现。给
el-aside
动态绑定宽度,而不是给el-menu
动态绑定。
<el-aside :width="isCollapse ? '64px' :' 200px'">
- 关于菜单左边多出来的一个边框像素,给
el-meun、el-submenu
添加overflow:hidden
都可以。
- 点击合并的实现。给
Welcome组件
- 利用重定向,在
main
中展示Welcome
- 新建
Welcome
组件 - 配置路由信息
- 新建
{
path:'/home',
component: Home,
redirect: '/welcome',
children:[
{
path:'/welcome',
component: Welcome
}]
}
- 在
main
中设置路由占位符<router-view/>
- 利用
path
信息,配置main
中的路由跳转。需要注意的是:路由中的path
信息要和返回数据中的path
要一致 - 如何保证在刷新页面以后,菜单中的
menu-item
也处于激活状态?
在
menu
中有个属性:default-active
,保存的就是当前激活菜单的index
,也就是想要菜单中的某一项处于高亮激活状态,那就把那一项index
的值赋值给default-active
。
在点击某一个菜单后,就把当前菜单的index
存储进sessionStorage
中,刷新页面后,再把保存的值赋值给default-active
1. 给二级菜单都绑定一个单击事件
2. 注意一下是否要加'/'
的问题
3. 通过传递参数的形式,把当前激活菜单的path
存储进sessionStorage
中
4. 在生命周期函数create
中,获取sessionStorage
中的激活路径并赋值
5. 最后再把再次点击菜单的激活路径进行更新赋值,实现高亮效果的切换
User组件
- 导航面包屑区域
- 作用域插槽的用法:
<template slot-scope="scope">
</template>
- 改变状态时,要发送网络请求,如果网络请求发送失败,则还需改会原来的状态。且改变状态时,可以调用
el-switch
自带的change
事件 - 头部输入框中的
v-model
值可以设置为:发送网络请求时,传递的参数query
,然后可以给输入框添加clearable
属性,紧接着就可以添加clear
事件,且事件响应函数都是网络请求函数getUserData
,这样就可以很快速的实现搜索
和清除输入框
的功能。
重点:把当前输入框的v-model
的值绑定为发送网络请求时的参数 - 自定义校验规则的实现
- 在
data
中定义规则变量,注意是写在return
的上面
- 在
// 验证邮箱的规则
var checkEmail = (rule, value, cb) => {
// 验证邮箱的正则表达式
const regEmail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/
if (regEmail.test(value)) {
// 合法的邮箱
return cb()
}
cb(new Error('请输入合法的邮箱'))
}
// 验证手机号的规则
var checkMobile = (rule, value, cb) => {
// 验证手机号的正则表达式
const regMobile = /^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/
if (regMobile.test(value)) {
return cb()
}
cb(new Error('请输入合法的手机号'))
}
- 使用校验规则
email:[
{
required: true, message: '请输入用户名', trigger: 'blur' },
{
min: 3, max: 15, message: '长度在 3 到 15 个字符', trigger: 'blur' },
{
validator: checkEmail, trigger: 'blur'}
],
mobile:[
{
required: true, message: '请输入用户名', trigger: 'blur' },
{
min: 3, max: 15, message: '长度在 3 到 15 个字符', trigger: 'blur' },
{
validator: checkMobile, trigger: 'blur'}
]
- 关闭
Dialog
对话框后,输入框中的数据要重置- 为
Dialog
添加自带的close
事件函数 - 通过对
Form
表单设置的ref
,在调用resetFields
方法,实现表单的重置
- 为
- 给点击
Dialog
对话框里面的确定
按钮添加预校验,然后在发送网络请求,添加用户
this.$refs.userDialogRef.validate(valid =>{
//首先判断是否校验通过
//如果通过了,才发送网络
})
- 编辑用户信息的
Dialog
对话框在关闭后,也要进行重置表单方法的调用,这个时候的重置,不是重置表单信息,而是重置验证规则,它和添加用户信息的Dialog
里面的表单重置不一样。 - 删除按钮的实现,要用
elementUI
中的弹框提示组件Message Box
,或者与其说是个弹框组件,不如说是个方法的调用
Roles组件
- 通过
<el-table-column type="expand" >
的expand
属性,就可以实现在表格中新建一个展开列 - 在展开列中,数据的布局方式是通过
Layout
布局实现的,并没有使用现成的组件,因为没有组件可用 - 在展开列中
- 先用作用域插槽获取当前行的数据(template)
- 然后就是一个行标签
el-row
,并在此标签上通过v-for
循环,渲染一级权限数据- 行标签
el-row
中有两列- 第一个列标签
el-col
中渲染出具体的数据- 第二个列标签
el-col
中,里面又嵌套了一个行标签el-row
- 第二个行标签
el-row
中又有两个列标签,通过在第二个行标签el-row
中通过v-for
的形式渲染数据- 第一个列标签
el-col
中渲染出具体的数据,即二级权限的数据- 第二个列标签
el-col
中,放的是el-tag
标签,并且直接在改标签上通过v-for
的形式渲染出三级权限的数据
- 为每一个
el-tag
标签添加属性closable
,这样就能实现el-tag
标签的删除图标 - 在单击了
el-tag
标签的删除图标后,弹出MessageBox
弹框,并用于显示是否确认删除该权限 - 再给每行的
el-tag
标签添加上边框线、下边框线的过程中,使用了动态绑定类名、类名数组以及三元表达式判断是否添加类名 - 让一级权限和二级权限的
el-tag
标签居中,也是通过动态绑定类名实现的。