0.利用vue脚手架创建项目
一.布局
1.登录官网https://element.eleme.cn/#/zh-CN
在[组件]中找到需要的组件
2.复制对应代码写入.vue文件中的< template >标签中
<el-form>
<!-- 用户名 -->
<el-form-item>
<el-input prefix-icon="el-icon-user"></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item>
<el-input prefix-icon="el-icon-lock" type="password"></el-input>
</el-form-item>
<!-- 按钮 -->
<el-form-item>
<el-button type="primary">登录</el-button>
<el-button type="info">重置</el-button>
</el-form-item>
</el-form>
若使用第三方导入的字体图标,下载后,打开示例html,根据使用步骤进行使用
(1)将下载的fonts
文件夹放在资源文件夹/src/assets
中
(2)在main.js
中导入字体图标文件
// 导入字体图标
import './assets/fonts/iconfont'
(3)添加类名使用字体图标
<!-- 用户名 -->
<el-form-item>
<el-input prefix-icon="iconfont icon-user"></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item>
<el-input prefix-icon="iconfont icon-lock_fill" type="password"></el-input>
</el-form-item>
3.element-ui是按需导入的,因此需要在plugins文件夹中找到element.js
中导入用到的组件
import Vue from 'vue'
import { Button, Form, FormItem, Input } from 'element-ui'
// 注册为全局可用的组件
Vue.use(Button)
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Input)
二.表单的数据绑定
1.在行为区(即< script >标签中)的data中定义数据对象
<script>
export default {
data() {
return {
// 登录表单的数据绑定对象
loginForm: {
username: 'jennie',
password: '123'
}
}
}
}
</script>
2.为el-form加上:model属性进行数据对象绑定
<el-form :model="loginForm" label-width="0px" class="login_form">
3.为每个表单项的文本输入框使用v-model绑定到对象具体的属性
<el-input v-model="loginForm.username" prefix-icon="el-icon-user"></el-input>
三.表单的数据验证
1.为el-form
通过属性绑定指定rules校验对象
2. 在行为区(即< script >
标签中)的data中定义校验对象,其中每一个属性都是一个验证规则
// 表单验证规则对象
loginFormRules: {
// 验证用户名
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{
min: 3,
max: 10,
message: '长度在 3 到 10 个字符之间',
trigger: 'blur'
}
],
// 验证密码
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{
min: 6,
max: 15,
message: '长度在 6 到 15 个字符之间',
trigger: 'blur'
}
]
}
3.对不同表单项el-form-item
通过prop指定不同验证规则进行表单的验证
<!-- 用户名 -->
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
prefix-icon="el-icon-user"
></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
prefix-icon="el-icon-lock"
type="password"
></el-input>
</el-form-item>
四.表单的重置(resetFields的使用)
1.获取表单实例对象
方法:给需要获取实例对象的组件添加ref
的引用,并且为每一个数据项使用prop
绑定数据(!!!重要)
<el-form :model="loginForm" :rules="loginFormRules" label-width="0px" class="login_form" ref="loginFormRef">
<!-- 用户名 -->
<el-form-item prop="username">
<el-input v-model="loginForm.username" prefix-icon="el-icon-user"></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item prop="password">
<el-input v-model="loginForm.password" prefix-icon="el-icon-lock" type="password"></el-input>
</el-form-item>
<!-- 按钮 -->
<el-form-item class="btns">
<el-button type="primary" @click="login">登录</el-button>
<el-button type="info" @click="resetLoginForm">重置</el-button>
</el-form-item>
</el-form>
2.在重置按钮上添加点击重置事件
<el-button type="info" @click="resetLoginForm">重置</el-button>
3.在行为区(即< script >
标签中)的methods中定义点击重置事件,其中使用实例对象中的方法resetFields
注:在methods定义的方法中,this指向当前组件的实例对象,其中有一个属性$refs包含我们添加的ref引用对象
<script>
export default {
data() {
return {...}
},
methods: {
// 重置
resetLoginForm() {
this.$refs.loginFormRef.resetFields()
}
}
}
</script>
五.登录
包含预验证(使用validate)、发送axios请求、进行弹窗提示、保存登录信息、跳转页面。
1.为登录按钮绑定单击事件
<el-button type="primary" @click="login">登录</el-button>
2.定义登录函数validate()
接收回调函数,从而获取验证结果。因此可以在里面写匿名的箭头函数,箭头函数的第一个形参为验证的布尔值,通过该布尔值即可判断表单验证是否成功(验证规则为前面定义的loginFormRules
)。
(1)配置发送请求所用的axios包–>在入口文件main.js中对axios进行全局配置
// 导入axios包
import axios from 'axios'
// 配置请求根路径
axios.defaults.baseURL = 'http://127.0.0.1:8888/api/private/v1/'
// 将axios包挂载到vue原型对象上
Vue.prototype.$http = axios
(2)发送请求并配置弹窗提示
在element.js中导入Message组件,Message的配置需要进行全局挂载
import { Message } from 'element-ui'
Vue.prototype.$message = Message
发送请求并调用弹窗方法显示请求结果
login() {
this.$refs.loginFormRef.validate(async valid => {
if (!valid) return false
// 通过http发送axios请求,post(请求地址,请求对象)
// 如果返回的是promise对象,可以使用async await简化操作,然后进行解构
const { data: res } = await this.$http.post('login', this.loginForm)
console.log(res)
if (res.meta.status !== 200) {
// 登陆失败
return this.$message.error('登录失败')
}
this.$message.success('登录成功')
})
}
(3)登录信息的保存
将登录成功后的token,保存到客户端的sessionStorage中。
localStorage是持久化的存储机制,sessionStorage是会话期间的存储机制,token只在当前网站打开期间生效,因此保存在sessionStorage中。
// 请求返回包含token,因此可以直接保存
window.sessionStorage.setItem('token', res.data.token)
(4)编程式导航跳转后台主页。
// 编程式导航跳转 $router是编程式导航对象,包含push方法跳转
this.$router.push('/home')
六.登录拦截
未登录直接通过url访问特定页面,重新导航到登录页面。因此给路由对象挂载一个导航守卫。router.js更改后如下:
import Vue from 'vue'
import Router from 'vue-router'
import Login from './components/Login.vue'
import Home from './components/Home.vue'
Vue.use(Router)
const router = new Router({
routes: [
{ path: '/', redirect: '/login' },
{ path: '/login', component: Login },
{ path: '/home', component: Home }
]
})
// 挂载路由导航守卫
router.beforeEach((to, from, next) => {
// to是将要访问的路径,from是从哪个路径跳转而来
// next是函数,next()为放行,next('./login)为强制跳转
if (to.path === '/login') {
return next()
}
// 获取token
const tokenStr = window.sessionStorage.getItem('token')
if (!tokenStr) {
return next('/login')
}
next()
})
export default router
如果出现RangeError: Maximum call stack size exceeded
,可能是因为路由跳转出现了死循环,需要排查一下问题出现的地方。
七.退出登录
实际上只需要销毁保存的token。
logout() {
// 清空sessionStorage
window.sessionStorage.clear()
// 编程式导航
this.$router.push('/login')
}