vue实现登录拦截


Posted in Javascript onJune 29, 2020

本文实例为大家分享了vue实现登录拦截的具体代码,供大家参考,具体内容如下

需求:用户只有登录了,用户名存储在本地储存时,才能进入首页,如果本地存储没有用户名,就不能进入首页

1、登录页面的实现

<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;
 }
}

vue实现登录拦截

首先首页需要用户登录成功,且本地有username的存储,才能进入首页,那么就要在首页的路由中配置拦截。

1、首页路由

{
 path: '/',
 name: 'home',
 component: Home,
 meta: {
 requireAuth: true //配置拦截
 },
 },

2、登录页面路由

{
 path: '/login',
 name: 'login',
 component: () => import(/* webpackChunkName: "about" */ '../views/Login.vue')
 }

路由钩子函数

router.beforeEach((to,from,next)=>{
 if(to.meta.requireAuth){
 if(localStorage.getItem('username')){
 next();
 }else{
 next({
 path:'/login'
 })
 }
 }else{
 next();
 }
})

登录页面的验证:

<script>
export default {
 name: 'login',
 data() {
 return {
  username:"",
  psd:'',
  userKey:false,
  psdKey:false
 }
 },
 
 methods: {
 //用户名验证
 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: '用户名格式错误(6到16位,字母数字下划线,减号,中间不能有空格)',
   type: 'warning'
  });
  }else{
  this.userKey = true;//用户名格式正确
  }
 },
 //密码验证
 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: '密码格式错误(密码包含 数字,英文,字符中的两种以上,长度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>

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js String对象中常用方法小结(字符串操作)
Jan 27 Javascript
jquery控制页面部分刷新的方法
Jun 24 Javascript
AngularJS使用angular-formly进行表单验证
Dec 27 Javascript
浅谈移动端之js touch事件 手势滑动事件
Nov 07 Javascript
jQuery Ajax请求后台数据并在前台接收
Dec 10 Javascript
js 颜色选择插件
Jan 23 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
Jan 24 Javascript
webpack进阶——缓存与独立打包的用法
Aug 02 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
Oct 24 Javascript
vue下history模式刷新后404错误解决方法
Aug 18 Javascript
ios设备中angularjs无法改变页面title的解决方法
Sep 13 Javascript
vue中watch和computed的区别与使用方法
Aug 23 Javascript
Laravel 如何在blade文件中使用Vue组件的示例代码
Jun 28 #Javascript
JavaScript多种图形实现代码实例
Jun 28 #Javascript
从Node.js事件触发器到Vue自定义事件的深入讲解
Jun 26 #Javascript
Vue如何提升首屏加载速度实例解析
Jun 25 #Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
Jun 25 #Javascript
国内常用的js类库大全(CDN公共库)
Jun 24 #Javascript
viewer.js实现图片预览功能
Jun 24 #Javascript
You might like
15个小时----从修改程序到自己些程序
2006/10/09 PHP
基于wordpress主题制作的具体实现步骤
2013/05/10 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
laravel获取不到session的三种解决办法【推荐】
2018/09/16 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
jQuery插件开发汇总
2016/05/15 Javascript
Summernote实现图片上传功能的简单方法
2016/07/11 Javascript
浅谈原生JS实现jQuery的animate()动画示例
2017/03/08 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
微信小程序实现跑马灯效果完整代码(附效果图)
2018/05/30 Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
2018/09/03 Javascript
jquery.pager.js实现分页效果
2019/07/29 jQuery
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
JavaScript 如何计算文本的行数的实现
2020/09/14 Javascript
Python多线程和队列操作实例
2015/06/21 Python
对Python实现简单的API接口实例讲解
2018/12/10 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
2019/03/05 Python
华为校园招聘上机笔试题 扑克牌大小(python)
2020/04/22 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
工商管理实习自我鉴定
2013/09/28 职场文书
采购人员的个人自我评价
2014/01/16 职场文书
秋季运动会稿件
2014/01/30 职场文书
公司会计岗位职责
2014/02/13 职场文书
管理提升方案
2014/06/04 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
寒山寺导游词
2015/02/03 职场文书
个人优缺点总结
2015/02/28 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
最感人的道歉情书
2015/05/12 职场文书
MySQL中CURRENT_TIMESTAMP的使用方式
2021/11/27 MySQL
Go语言怎么使用变长参数函数
2022/07/15 Golang