---
title: '10/26 VueJS 教學筆記: Login 登入機制實作'
disqus: hackmd
---
10/26 VueJS 教學筆記: Login 登入機制實作
===
綱要
[TOC]
Login 登入機制實作
---
一般來說,登入後變更路由的驗證會看 Session Storange 或 Cookies 中的 token 是否有效,由此判斷該進入哪個路由。
![](https://i.imgur.com/zeNq9wD.png)
先在`router.js`底下新增 login 的頁面與指定 component 名稱、路徑。
```javascript=
import Vue from 'vue'
import Router from 'vue-router'
import Cookies from 'js-cookie'
Vue.use(Router)
const router = new Router({
routes: [
{
path: '/',
name: 'Login'm
component: () => import('./views/Login.vue')
},
// 其他路由
{
path: '/home',
name: 'home',
component: Home,
meta: { requireAuth: true }, // 用來作為此頁是否需要權限驗證的設定
children: [...]
},
// ...
]
})
export default router
```
打好基本的外觀並定義表單v-model:
[Github範例](https://github.com/fortes1219/vue_0803/blob/0803/src/views/Login.vue)
```htmlmixed=
<template>
<div class="row vertical inset" data-width="20rem">
<el-input v-model="loginForm.username" type="text" placeholder="Username" data-space-bottom="0.5rem" />
<el-input v-model="loginForm.password" type="password" placeholder="Password" data-space-bottom="0.5rem" />
<el-button type="primary" @click="handleLogin" >Login</el-button>
<br>
<el-button @click="removeCookie">Clear</el-button>
</div>
</template>
```
```javascript=
// 引入js-cookie
import Cookies from 'js-cookie'
export default {
data() {
return{
loginForm: {
username: '',
password: '',
token: ''
}
}
},
// methods
}
```
增加表單 submit 後的登入判斷方法
```javascript=
methods: {
handleLogin() {
const token = 'asds32adsavrAS3Fadf5567' // token本身就是加密過的字串,隨意
let username = this.loginForm.username
let password = this.loginForm.password
// 帳號密碼需驗證不能為空
if (username !== '' && password !== '') {
this.loginForm.token = token
} else {
alert('帳號密碼不能為空')
}
Cookies.set('login', JSON.stringify(this.loginForm), { expires: 1 })
console.log(this.loginForm)
// cookie當中有token被設置才能改變路由
if (Cookies.get('login') && this.loginForm.token) {
this.$router.push({name: 'Dashboard'})
}
},
// 將Cookies清除的測試用button事件
removeCookie() {
Cookies.remove('login')
}
}
```
光是在 login 頁面還不能完全做到攔截不正確登入訊息,我們必須在`router.js`做更進一步處理,Vue官方文件中對於 Router 的敘述可以參照[這裡](https://router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E7%BB%84%E4%BB%B6%E5%86%85%E7%9A%84%E5%AE%88%E5%8D%AB)。
[Github範例](https://github.com/fortes1219/vue_0803/blob/0803/src/router.js)
```javascript=
import Vue from 'vue'
import Router from 'vue-router'
import Cookies from 'js-cookie'
Vue.use(Router)
const router = new Router({ routes: [...] })
router.beforeEach(async(to, from, next) => {
// 看看 to 和 from 兩個 arguments 會吐回什麼訊息
console.log('to: ', to)
console.log('from: ', from)
})
export default router
```
由上面的`console.log()`可以看到以下結果:
![](https://i.imgur.com/G0GycYm.png)
to 回傳的物件是目的路由資訊,from 則是從哪個路由出發。
接下來看看如果沒有帶 token 時,怎麼攔截跳轉路由的 request:
```javascript=
import Vue from 'vue'
import Router from 'vue-router'
import Cookies from 'js-cookie'
Vue.use(Router)
const router = new Router({ routes: [...] })
router.beforeEach(async(to, from, next) => {
// 看看 to 和 from 兩個 arguments 會吐回什麼訊息
console.log('to: ', to)
console.log('from: ', from)
// 目的路由在meta上是否有設置requireAuth: true
if (to.meta.requireAuth) {
// 獲取Cookies當中的login資訊並取得token
const info = Cookies.get('login')
console.log(token)
if (info) {
const token = JSON.parse(info).token
// 如果token不為空,且確實有這個欄位則讓路由變更
if (token.length > 0 || token === undefined) {
next()
} else {
// 未通過則導回login頁面
next({ name: 'Login' })
}
} else {
next({ name: 'Login' })
}
} else {
next()
}
})
export default router
```
EXTRA
---
如果你希望跳轉路由時,能有類似 Youtube 那樣的小橫條出現在畫面上端跑過場,可以考慮使用這個外掛:[NProgress](https://github.com/rstacruz/nprogress)
安裝:`npm install nprogress`
然後在`router.js`的`beforeEach()`和`afterEach()` 上各自設定 `NProgress.start()` 以及 `NProgress.end()`
```javascript=
import Vue from 'vue'
import Router from 'vue-router'
import Cookies from 'js-cookie'
import NProgress from 'nprogress'
router.beforeEach(async(to, from, next) => {
// ...
NProgress.start()
}
router.afterEach((to: Route) => {
// ...
NProgress.done()
}
```
###### tags: `VueJS` `Cookies` `Login`