vue實(shí)現(xiàn)登錄功能
1.背景
完成了登錄的表單輸入框界面如下:

代碼:
<!-- 輸入框-->
<el-form label-width="0px" class="login_form">
<!-- 用戶名 -->
<el-form-item >
<el-input prefix-icon="el-icon-s-custom"></el-input>
</el-form-item>
<!-- 密碼 -->
<el-form-item >
<el-input prefix-icon="el-icon-lock"></el-input>
</el-form-item>
<!-- 按鈕區(qū)域 -->
<el-form-item >
<el-button type="primary">登錄</el-button>
<el-button type="info">重置</el-button>
</el-form-item>
</el-form>
2.表單數(shù)據(jù)綁定
可以查看element的官方案例
本案例代碼如下:
<div>
<!-- 輸入框-->
<el-form :model="loginForm" label-width="0px" class="login_form">
<!-- 用戶名 -->
<el-form-item>
<el-input v-model="loginForm.username" prefix-icon="el-icon-s-custom"></el-input>
</el-form-item>
<!-- 密碼 -->
<el-form-item>
<el-input v-model="loginForm.password" prefix-icon="el-icon-lock" type="password"></el-input>
</el-form-item>
<!-- 按鈕區(qū)域 -->
<el-form-item>
<el-button type="primary">登錄</el-button>
<el-button type="info">重置</el-button>
</el-form-item>
</el-form>
</div>
<script>
export default {
name: "Login",
data() {
return {
loginForm: {
username: 'admin',
password: '123456'
}
}
}
}
</script>
3.表單數(shù)據(jù)格式錯(cuò)誤提示
官方案例:

本案例代碼如下:
<template>
<div class="login_container">
<div class="login_box">
<!--登錄logo-->
<div class="avatar_box">
<img src="../assets/logo.png" alt="">
</div>
<div>
<!-- 輸入框-->
<el-form :model="loginForm" :rules="loginRules" label-width="0px" class="login_form">
<!-- 用戶名 prop="username" 與表單驗(yàn)證屬性對(duì)應(yīng)-->
<el-form-item prop="username">
<el-input v-model="loginForm.username" prefix-icon="el-icon-s-custom"></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>
<!-- 按鈕區(qū)域 -->
<el-form-item>
<el-button type="primary">登錄</el-button>
<el-button type="info">重置</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script>
export default {
name: "Login",
data() {
return {
// 表單數(shù)據(jù)
loginForm: {
username: 'admin',
password: '123456'
},
// 表單驗(yàn)證
loginRules: {
username: [
// trigger: 'blur' 表示失去焦點(diǎn)觸發(fā)
{required: true, message: '請(qǐng)輸入登錄賬號(hào)', trigger: 'blur'},
{min: 5, max: 12, message: '長(zhǎng)度在 6 到 12 個(gè)字符', trigger: 'blur'}
],
password: [
{required: true, message: '請(qǐng)輸入密碼', trigger: 'blur'},
{min: 6, max: 20, message: '長(zhǎng)度在 6 到 20 個(gè)字符', trigger: 'blur'}
],
}
}
}
}
</script>
<style lang="less" type="text/less" scoped>
.login_container {
background-color: #2b4b6b;
height: 100%;
}
.login_box {
width: 450px;
height: 300px;
background-color: #fff;
border-radius: 3px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
.avatar_box {
height: 130px;
width: 130px;
border: 1px solid #eee;
border-radius: 50%;
padding: 10px;
box-shadow: 0 0 10px #ddd;
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
img {
width: 100%;
height: 100%;
border-radius: 50%;
background-color: #eee;
}
}
}
.login_form {
position: absolute;
bottom: 0;
width: 100%;
padding: 0 20px;
box-sizing: border-box;
}
</style>
4.表單重置功能
官方案例如下:

本案例代碼:
<template>
<div class="login_container">
<div class="login_box">
<!--登錄logo-->
<div class="avatar_box">
<img src="../assets/logo.png" alt="">
</div>
<div>
<!-- 輸入框-->
<el-form ref="loginFormRef" :model="loginForm" :rules="loginRules" label-width="0px" class="login_form">
<!-- 用戶名 prop="username" 與表單驗(yàn)證屬性對(duì)應(yīng)-->
<el-form-item prop="username">
<el-input v-model="loginForm.username" prefix-icon="el-icon-s-custom"></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>
<!-- 按鈕區(qū)域 -->
<el-form-item>
<el-button type="primary">登錄</el-button>
<el-button type="info" @click="resetLoginForm">重置</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script>
export default {
name: "Login",
data() {
return {
// 表單數(shù)據(jù)
loginForm: {
username: '',
password: ''
},
// 表單驗(yàn)證
loginRules: {
username: [
// trigger: 'blur' 表示失去焦點(diǎn)觸發(fā)
{required: true, message: '請(qǐng)輸入登錄賬號(hào)', trigger: 'blur'},
{min: 5, max: 12, message: '長(zhǎng)度在 6 到 12 個(gè)字符', trigger: 'blur'}
],
password: [
{required: true, message: '請(qǐng)輸入密碼', trigger: 'blur'},
{min: 6, max: 20, message: '長(zhǎng)度在 6 到 20 個(gè)字符', trigger: 'blur'}
],
}
}
},
methods:{
// 重置登錄表單
resetLoginForm(){
this.$refs.loginFormRef.resetFields()
}
}
}
</script>
<style lang="less" type="text/less" scoped>
.login_container {
background-color: #2b4b6b;
height: 100%;
}
.login_box {
width: 450px;
height: 300px;
background-color: #fff;
border-radius: 3px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
.avatar_box {
height: 130px;
width: 130px;
border: 1px solid #eee;
border-radius: 50%;
padding: 10px;
box-shadow: 0 0 10px #ddd;
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
img {
width: 100%;
height: 100%;
border-radius: 50%;
background-color: #eee;
}
}
}
.login_form {
position: absolute;
bottom: 0;
width: 100%;
padding: 0 20px;
box-sizing: border-box;
}
</style>
5.請(qǐng)求發(fā)出前數(shù)據(jù)校驗(yàn)

// 登錄
login() {
// 登錄前參數(shù)驗(yàn)證
this.$refs.loginFormRef.validate((valid) => {
if (!valid) {
console.log("參數(shù)驗(yàn)證失敗")
return
}
console.log("參數(shù)校驗(yàn)成功")
})
}
6.發(fā)起登錄請(qǐng)求
1.安裝:axios(可以cnpm安裝,也可以下載js引入文件)
cnpm install axios -S
-D 等價(jià)于 --save-dev
-S 等價(jià)于 --save
2.引入到vue項(xiàng)目中
import axios from 'axios'
axios.defaults.baseURL = 'http://127.0.0.1:XXXX/XXXXX'
Vue.prototype.$http = axios
3.發(fā)起登錄請(qǐng)求
<template>
<div class="login_container">
<div class="login_box">
<!--登錄logo-->
<div class="avatar_box">
<img src="../assets/logo.png" alt="">
</div>
<div>
<!-- 輸入框-->
<el-form ref="loginFormRef" :model="loginForm" :rules="loginRules" label-width="0px" class="login_form">
<!-- 用戶名 prop="username" 與表單驗(yàn)證屬性對(duì)應(yīng)-->
<el-form-item prop="username">
<el-input v-model="loginForm.username" prefix-icon="el-icon-s-custom"></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>
<!-- 按鈕區(qū)域 -->
<el-form-item>
<el-button type="primary" @click="login">登錄</el-button>
<el-button type="info" @click="resetLoginForm">重置</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script>
export default {
name: "Login",
data() {
return {
// 表單數(shù)據(jù)
loginForm: {
username: '',
password: ''
},
// 表單驗(yàn)證
loginRules: {
username: [
// trigger: 'blur' 表示失去焦點(diǎn)觸發(fā)
{required: true, message: '請(qǐng)輸入登錄賬號(hào)', trigger: 'blur'},
{min: 5, max: 12, message: '長(zhǎng)度在 6 到 12 個(gè)字符', trigger: 'blur'}
],
password: [
{required: true, message: '請(qǐng)輸入密碼', trigger: 'blur'},
{min: 6, max: 20, message: '長(zhǎng)度在 6 到 20 個(gè)字符', trigger: 'blur'}
],
}
}
},
methods: {
// 重置登錄表單
resetLoginForm() {
this.$refs.loginFormRef.resetFields()
},
// 登錄
login() {
// 登錄前參數(shù)驗(yàn)證
this.$refs.loginFormRef.validate(async (valid) => {
if (!valid) {
console.log("參數(shù)驗(yàn)證失敗")
return
}
// 發(fā)起網(wǎng)絡(luò)請(qǐng)求登錄
let {data: result} = await this.$http.post('login', this.loginForm)
console.log("result:" + result)
if (result.meta.status !== 200) {
console.log("登錄失敗")
return
}
console.log("登錄成功")
})
}
}
}
</script>
<style lang="less" type="text/less" scoped>
.login_container {
background-color: #2b4b6b;
height: 100%;
}
.login_box {
width: 450px;
height: 300px;
background-color: #fff;
border-radius: 3px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
.avatar_box {
height: 130px;
width: 130px;
border: 1px solid #eee;
border-radius: 50%;
padding: 10px;
box-shadow: 0 0 10px #ddd;
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
img {
width: 100%;
height: 100%;
border-radius: 50%;
background-color: #eee;
}
}
}
.login_form {
position: absolute;
bottom: 0;
width: 100%;
padding: 0 20px;
box-sizing: border-box;
}
</style>
7.消息提示配置
1.添加element 消息組件

2.使用

8.登錄成功后token存放
// 登錄
login() {
// 登錄前參數(shù)驗(yàn)證
this.$refs.loginFormRef.validate(async (valid) => {
if (!valid) return ;
// 發(fā)起網(wǎng)絡(luò)請(qǐng)求登錄
let {data: result} = await this.$http.post('login', this.loginForm)
console.log(result)
if (result.meta.status !== 200){
this.$message.error(result.meta.msg)
return
}
this.$message.success("登錄成功")
// token放入 sessionStorage
window.sessionStorage.setItem('token', result.data.token)
// 跳轉(zhuǎn)到home路徑
this.$router.push("/home")
})
}
9.路由導(dǎo)航守衛(wèi)-登錄攔截

import Vue from 'vue'
import Router from 'vue-router'
import Login from '@/components/Login'
import Home from '@/components/Home'
Vue.use(Router)
const router = new Router({
routes: [
{
path: "/",
redirect: "/login"
},
{
path: '/login',
name: 'Login',
component: Login
}
,
{
path: '/home',
name: 'Home',
component: Home
}
]
})
router.beforeEach((to, from, next) => {
// to 將要訪問的路徑
// from 從哪里跳轉(zhuǎn)來的
// next 放行
// 判斷是不是登錄登錄,登錄路徑直接放行
if (to.path == '/login') {
next()
return
}
// 獲取token,看是否有token,有token放行
const token = window.sessionStorage.getItem("token")
if (!token) {
next('/login')
return;
}
// 放行
next();
})
export default router
10.退出功能
<template>
<div>
<el-button type="info" @click="logout">退出</el-button>
</div>
</template>
<script>
export default {
name: "Home",
methods: {
// 退出登錄
logout() {
window.sessionStorage.clear()
this.$router.push("/login")
}
}
}
</script>
<style lang="less" scoped>
</style>
以上就是vue實(shí)現(xiàn)登錄功能的詳細(xì)內(nèi)容,更多關(guān)于vue 登錄功能的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
element-ui中Table表格省市區(qū)合并單元格的方法實(shí)現(xiàn)
這篇文章主要介紹了element-ui中Table表格省市區(qū)合并單元格的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
watch(監(jiān)視屬性)和computed(計(jì)算屬性)的區(qū)別及實(shí)現(xiàn)案例
watch和computed是vue實(shí)例對(duì)象中的兩個(gè)重要屬性,watch是監(jiān)視屬性,用來監(jiān)視vue實(shí)例對(duì)象上屬性和方法的變化,computed被稱為計(jì)算屬性,可以將data對(duì)象中的屬性進(jìn)行計(jì)算得到新的屬性,這篇文章主要介紹了watch(監(jiān)視屬性)和computed(計(jì)算屬性)的區(qū)別,需要的朋友可以參考下2023-05-05

