vue實(shí)現(xiàn)登錄攔截
本文實(shí)例為大家分享了vue實(shí)現(xiàn)登錄攔截的具體代碼,供大家參考,具體內(nèi)容如下
需求:用戶只有登錄了,用戶名存儲(chǔ)在本地儲(chǔ)存時(shí),才能進(jìn)入首頁,如果本地存儲(chǔ)沒有用戶名,就不能進(jìn)入首頁
1、登錄頁面的實(shí)現(xiàn)
<template> <div class="htmleaf-container"> <div class="demo form-bg"> <div class="container"> <div class="row"> <div class="col-md-offset-3 col-md-6"> <form class="form-horizontal"> <span class="heading">用戶登錄</span> <div class="form-group"> <input type="text" class="form-control" id="inputtxt" placeholder="用戶名" v-model="username" @blur="inputUserBlur" @focus="inputFocus"> <i class="fa fa-user"></i> </div> <div class="form-group help"> <input type="password" class="form-control" id="inputPassword3" placeholder="密碼" v-model="psd" @blur="inputPsdBlur"> <i class="fa fa-lock"></i> <a href="#" rel="external nofollow" class="fa fa-question-circle"></a> </div> <div class="form-group"> <div class="main-checkbox"> <input type="checkbox" value="None" id="checkbox1" name="check"/> <label for="checkbox1"></label> </div> <span class="text">記住我</span> <button type="button" class="btn btn-default" @click="loginBtn">立刻登錄</button> </div> </form> </div> </div> </div> </div> </div> </template>
<style lang="less" scoped> @import 'http://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css'; @import 'http://cdn.bootcss.com/font-awesome/4.6.3/css/font-awesome.min.css'; @import '.././assets/login/css/index.css'; .form-bg{ padding: 2em 0; } .form-horizontal{ background: #fff; padding-bottom: 40px; border-radius: 15px; text-align: center; } .form-horizontal .heading{ display: block; font-size: 35px; font-weight: 700; padding: 35px 0; border-bottom: 1px solid #f0f0f0; margin-bottom: 30px; } .form-horizontal .form-group{ padding: 0 40px; margin: 0 0 25px 0; position: relative; } .form-horizontal .form-control{ background: #f0f0f0; border: none; border-radius: 20px; box-shadow: none; padding: 0 20px 0 45px; height: 40px; transition: all 0.3s ease 0s; } .form-horizontal .form-control:focus{ background: #e0e0e0; box-shadow: none; outline: 0 none; } .form-horizontal .form-group i{ position: absolute; top: 12px; left: 60px; font-size: 17px; color: #c8c8c8; transition : all 0.5s ease 0s; } .form-horizontal .form-control:focus + i{ color: #00b4ef; } .form-horizontal .fa-question-circle{ display: inline-block; position: absolute; top: 12px; right: 60px; font-size: 20px; color: #808080; transition: all 0.5s ease 0s; } .form-horizontal .fa-question-circle:hover{ color: #000; } .form-horizontal .main-checkbox{ float: left; width: 20px; height: 20px; background: #11a3fc; border-radius: 50%; position: relative; margin: 5px 0 0 5px; border: 1px solid #11a3fc; } .form-horizontal .main-checkbox label{ width: 20px; height: 20px; position: absolute; top: 0; left: 0; cursor: pointer; } .form-horizontal .main-checkbox label:after{ content: ""; width: 10px; height: 5px; position: absolute; top: 5px; left: 4px; border: 3px solid #fff; border-top: none; border-right: none; background: transparent; opacity: 0; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .form-horizontal .main-checkbox input[type=checkbox]{ visibility: hidden; } .form-horizontal .main-checkbox input[type=checkbox]:checked + label:after{ opacity: 1; } .form-horizontal .text{ float: left; margin-left: 7px; line-height: 20px; padding-top: 5px; text-transform: capitalize; } .form-horizontal .btn{ float: right; font-size: 14px; color: #fff; background: #00b4ef; border-radius: 30px; padding: 10px 25px; border: none; text-transform: capitalize; transition: all 0.5s ease 0s; } @media only screen and (max-width: 479px){ .form-horizontal .form-group{ padding: 0 25px; } .form-horizontal .form-group i{ left: 45px; } .form-horizontal .btn{ padding: 10px 20px; } } </style>
index.css
/* @font-face { font-family: 'icomoon'; src:url('../fonts/icomoon.eot?rretjt'); src:url('../fonts/icomoon.eot?#iefixrretjt') format('embedded-opentype'), url('../fonts/icomoon.woff?rretjt') format('woff'), url('../fonts/icomoon.ttf?rretjt') format('truetype'), url('../fonts/icomoon.svg?rretjt#icomoon') format('svg'); font-weight: normal; font-style: normal; } */ [class^="icon-"], [class*=" icon-"] { font-family: 'icomoon'; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; /* Better Font Rendering =========== */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } body, html { font-size: 100%; padding: 0; margin: 0;} /* Reset */ *, *:after, *:before { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } /* Clearfix hack by Nicolas Gallagher: http://nicolasgallagher.com/micro-clearfix-hack/ */ .clearfix:before, .clearfix:after { content: " "; display: table; } .clearfix:after { clear: both; } body{ background: #494A5F; font-weight: 500; font-size: 1.05em; font-family: "Microsoft YaHei","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif; } a{ color: rgba(255, 255, 255, 0.6);outline: none;text-decoration: none;-webkit-transition: 0.2s;transition: 0.2s;} a:hover,a:focus{color:#74777b;text-decoration: none;} .htmleaf-container{ margin: 0 auto; } .bgcolor-1 { background: #f0efee; } .bgcolor-2 { background: #f9f9f9; } .bgcolor-3 { background: #e8e8e8; }/*light grey*/ .bgcolor-4 { background: #2f3238; color: #fff; }/*Dark grey*/ .bgcolor-5 { background: #df6659; color: #521e18; }/*pink1*/ .bgcolor-6 { background: #2fa8ec; }/*sky blue*/ .bgcolor-7 { background: #d0d6d6; }/*White tea*/ .bgcolor-8 { background: #3d4444; color: #fff; }/*Dark grey2*/ .bgcolor-9 { background: #ef3f52; color: #fff;}/*pink2*/ .bgcolor-10{ background: #64448f; color: #fff;}/*Violet*/ .bgcolor-11{ background: #3755ad; color: #fff;}/*dark blue*/ .bgcolor-12{ background: #3498DB; color: #fff;}/*light blue*/ .bgcolor-20{ background: #494A5F;color: #D5D6E2;} /* Header */ .htmleaf-header{ padding: 1em 190px 1em; letter-spacing: -1px; text-align: center; background: #66677c; } .htmleaf-header h1 { color: #D5D6E2; font-weight: 600; font-size: 2em; line-height: 1; margin-bottom: 0; } .htmleaf-header h1 span { display: block; font-size: 60%; font-weight: 400; padding: 0.8em 0 0.5em 0; color: #c3c8cd; } /*nav*/ .htmleaf-demo a{color: #fff;text-decoration: none;} .htmleaf-demo{width: 100%;padding-bottom: 1.2em;} .htmleaf-demo a{display: inline-block;margin: 0.5em;padding: 0.6em 1em;border: 3px solid #fff;font-weight: 700;} .htmleaf-demo a:hover{opacity: 0.6;} .htmleaf-demo a.current{background:#1d7db1;color: #fff; } /* Top Navigation Style */ .htmleaf-links { position: relative; display: inline-block; white-space: nowrap; font-size: 1.5em; text-align: center; } .htmleaf-links::after { position: absolute; top: 0; left: 50%; margin-left: -1px; width: 2px; height: 100%; background: #dbdbdb; content: ''; -webkit-transform: rotate3d(0,0,1,22.5deg); transform: rotate3d(0,0,1,22.5deg); } .htmleaf-icon { display: inline-block; margin: 0.5em; padding: 0em 0; width: 1.5em; text-decoration: none; } .htmleaf-icon span { display: none; } .htmleaf-icon:before { margin: 0 5px; text-transform: none; font-weight: normal; font-style: normal; font-variant: normal; font-family: 'icomoon'; line-height: 1; speak: none; -webkit-font-smoothing: antialiased; } /* footer */ .htmleaf-footer{width: 100%;padding-top: 10px;} .htmleaf-small{font-size: 0.8em;} .center{text-align: center;} /****/ .related { color: #fff; background: #494A5F; text-align: center; font-size: 1.25em; padding: 0.5em 0; overflow: hidden; } .related > a { vertical-align: top; width: calc(100% - 20px); max-width: 340px; display: inline-block; text-align: center; margin: 20px 10px; padding: 25px; font-family: "Microsoft YaHei","宋體","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif, FreeSans, Arimo; } .related a { display: inline-block; text-align: left; margin: 20px auto; padding: 10px 20px; opacity: 0.8; -webkit-transition: opacity 0.3s; transition: opacity 0.3s; -webkit-backface-visibility: hidden; } .related a:hover, .related a:active { opacity: 1; } .related a img { max-width: 100%; opacity: 0.8; border-radius: 4px; } .related a:hover img, .related a:active img { opacity: 1; } .related h3{font-family: "Microsoft YaHei", sans-serif;font-size: 1.2em} .related a h3 { font-size: 0.85em; font-weight: 300; margin-top: 0.15em; color: #fff; } /* icomoon */ .icon-htmleaf-home-outline:before { content: "\e5000"; } .icon-htmleaf-arrow-forward-outline:before { content: "\e5001"; } @media screen and (max-width: 1024px) { .htmleaf-header { padding: 2em 10% 2em; } .htmleaf-header h1 { font-size:1.4em; } .htmleaf-links{font-size: 1.4em} } @media screen and (max-width: 960px) { .htmleaf-header { padding: 2em 10% 2em; } .htmleaf-header h1 { font-size:1.2em; } .htmleaf-links{font-size: 1.2em} .related h3{font-size: 1em;} .related a h3 { font-size: 0.8em; } } @media screen and (max-width: 766px) { .htmleaf-header h1 { font-size:1.3em; } .htmleaf-links{font-size: 1.3em} } @media screen and (max-width: 640px) { .htmleaf-header { padding: 2em 10% 2em; } .htmleaf-header h1 { font-size:1em; } .htmleaf-links{font-size: 1em} .related h3{font-size: 0.8em;} .related a h3 { font-size: 0.6em; } }
首先首頁需要用戶登錄成功,且本地有username的存儲(chǔ),才能進(jìn)入首頁,那么就要在首頁的路由中配置攔截。
1、首頁路由
{ path: '/', name: 'home', component: Home, meta: { requireAuth: true //配置攔截 }, },
2、登錄頁面路由
{ path: '/login', name: 'login', component: () => import(/* webpackChunkName: "about" */ '../views/Login.vue') }
路由鉤子函數(shù)
router.beforeEach((to,from,next)=>{ if(to.meta.requireAuth){ if(localStorage.getItem('username')){ next(); }else{ next({ path:'/login' }) } }else{ next(); } })
登錄頁面的驗(yàn)證:
<script> export default { name: 'login', data() { return { username:"", psd:'', userKey:false, psdKey:false } }, methods: { //用戶名驗(yàn)證 inputUserBlur(){ let filter = /^[a-zA-Z0-9_]{6,16}$/; console.log('blur'); if(this.username.trim() == ''){ this.$message.error('用戶名不能為空'); }else if(!filter.test(this.username)){ this.$message({ message: '用戶名格式錯(cuò)誤(6到16位,字母數(shù)字下劃線,減號(hào),中間不能有空格)', type: 'warning' }); }else{ this.userKey = true;//用戶名格式正確 } }, //密碼驗(yàn)證 inputPsdBlur(){ let filter = /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)])+$).{6,20}$/; console.log('blur'); if(this.psd.trim() == ''){ this.$message.error('密碼不能為空'); }else if(!filter.test(this.psd)){ this.$message({ message: '密碼格式錯(cuò)誤(密碼包含 數(shù)字,英文,字符中的兩種以上,長度6-20)', type: 'warning' }); }else{ this.psdKey = true;//密碼格式正確 } }, //登錄 loginBtn(){ console.log(this.userKey,this.psdKey) if(this.userKey && this.psdKey){ this.$message({ message: '恭喜你,登錄成功', type: 'success' }); localStorage.setItem('username',JSON.stringify(this.username)); this.username = ''; this.psd = ''; this.$router.push('/') }else{ this.$message.error('用戶名和密碼不能為空'); } } }, } </script>
關(guān)于vue.js組件的教程,請(qǐng)大家點(diǎn)擊專題vue.js組件學(xué)習(xí)教程進(jìn)行學(xué)習(xí)。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue-router中scrollBehavior的巧妙用法
本文給大家介紹vue-router中scrollBehavior的妙用,文中給大家提到了兩種解決方案,需要的朋友可以參考下2018-07-07el-table表頭添加勾選框的實(shí)現(xiàn)示例
本文主要介紹了el-table表頭添加勾選框的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01vuejs實(shí)現(xiàn)標(biāo)簽選項(xiàng)卡動(dòng)態(tài)更改css樣式的方法
這篇文章主要介紹了vuejs實(shí)現(xiàn)標(biāo)簽選項(xiàng)卡-動(dòng)態(tài)更改css樣式的方法,代碼分為html和js兩部分,需要的朋友可以參考下2018-05-05Vue 中使用lodash對(duì)事件進(jìn)行防抖和節(jié)流操作
這篇文章主要介紹了Vue 中使用lodash對(duì)事件進(jìn)行防抖和節(jié)流操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07Vue實(shí)現(xiàn)路由過渡動(dòng)效的4種方法
Vue 路由過渡是對(duì) Vue 程序一種快速簡便的增加個(gè)性化效果的的方法,這篇文章主要介紹了Vue實(shí)現(xiàn)路由過渡動(dòng)效的4種方法,感興趣的可以了解一下2021-05-05