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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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;
 }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253

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

{
    path: '/',
    name: 'home',
    component: Home,
    meta: {
        requireAuth: true //配置拦截
      },
  },
1
2
3
4
5
6
7
8
2、登录页面路由

{
    path: '/login',
    name: 'login',
    component: () => import(/* webpackChunkName: "about" */ '../views/Login.vue')
  }
1
2
3
4
5
路由钩子函数

router.beforeEach((to,from,next)=>{
  if(to.meta.requireAuth){
    if(localStorage.getItem('username')){
      next();
    }else{
      next({
        path:'/login'
      })
    }
  }else{
    next();
  }
})
1
2
3
4
5
6
7
8
9
10
11
12
13
登录页面的验证:

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

(0)

相关推荐

  • vue实现登录拦截

    需求:用户只有登录了,用户名存储在本地储存时,才能进入首页,如果本地存储没有用户名,就不能进入首页 1.登录页面的实现 <template>   <div class="htmleaf-container">   <div class="demo form-bg">          <div class="container">              <div class="r

  • vue+axios实现登录拦截的实例代码

    一个项目学会vue全家桶+axios实现登录.拦截.登出功能,以及利用axios的http拦截器拦截请求和响应. 前言 该项目是利用了Github 提供的personal token作为登录token,通过token访问你的Repository List.通过这个项目学习如何实现一个前端项目中所需要的 登录及拦截.登出.token失效的拦截及对应 axios 拦截器的使用. 准备你需要先生成自己的 Github Personal Token( 生成Token). Token 生成后 访问Demo

  • vue axios登录请求拦截器

    当我们在做接口请求时,比如判断登录超时时候,通常是接口返回一个特定的错误码,那如果我们每个接口都去判断一个耗时耗力,这个时候我们可以用拦截器去进行统一的http请求拦截. 1.安装配置axios cnpm install --save axios  我们可以建一个js文件来做这个统一的处理,新建一个axios.js,如下 import axios from 'axios' import { Indicator } from 'mint-ui'; import { Toast } from 'mi

  • vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)

    一.路由拦截 登录拦截逻辑 第一步:路由拦截 首先在定义路由的时候就需要多添加一个自定义字段requireAuth,用于判断该路由的访问是否需要登录.如果用户已经登录,则顺利进入路由, 否则就进入登录页面. const routes = [ { path: '/', name: '/', component: Index }, { path: '/repository', name: 'repository', meta: { requireAuth: true, // 添加该字段,表示进入这个

  • Vue登录拦截 登录后继续跳转指定页面的操作

    在开发中我们经常遇到这样的需求,需要用户登录后才可以访问该页面,如果用户没有登录点击该页面时则自动跳转到登录页面,登录后又跳转到链接的页面而不是首页,这种问题该如何去做呢? 1.在路由器router下的 index.js 的配置中,给需要拦截登录的页面的路由上加一个meta: {loginRequest: true} ,其中loginRequest 变量自己可以随意定义 2.在main.js文件里面添加beforeEach钩子函数 解释: router.beforeEach((to, from,

  • vue路由实现登录拦截

    一.概述 在项目开发中每一次路由的切换或者页面的刷新都需要判断用户是否已经登录,前端可以判断,后端也会进行判断的,我们前端最好也进行判断. vue-router提供了导航钩子:全局前置导航钩子 beforeEach和全局后置导航钩子 afterEach,他们会在路由即将改变前和改变后进行触发.所以判断用户是否登录需要在beforeEach导航钩子中进行判断. 导航钩子有3个参数: 1.to:即将要进入的目标路由对象: 2.from:当前导航即将要离开的路由对象: 3.next :调用该方法后,才

  • Vue添加请求拦截器及vue-resource 拦截器使用

    一.现象 统一处理错误及配置请求信息 二.解决 1.安装 axios  , 命令: npm install axios --save-dev 2.在根目录的config目录下新建文件 axios.js  ,内容如下: import axios from 'axios' // 配置默认的host,假如你的API host是:http://api.htmlx.club axios.defaults.baseURL = 'http://api.htmlx.club' // 添加请求拦截器 axios.

  • vue axios请求拦截实例代码

    axios 简介 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征: 从浏览器中创建 XMLHttpRequest 从 node.js 发出 http 请求 支持 Promise API 拦截请求和响应 转换请求和响应数据 取消请求 自动转换JSON数据 客户端支持防止 CSRF/XSRF 下面代码给大家介绍vue axios 请求拦截,具体代码如下所示: import axios from 'axios';//引入axios依赖 imp

  • vue-resource请求实现http登录拦截或者路由拦截的方法

    本文介绍了vue-resource请求实现http登录拦截或者路由拦截的方法,分享给大家,具体如下: 项目需求 项目是前后台分离,前端负责数据对接,以及业务逻辑的处理,后台只需要给相应的接口即可 后台会控制接口的授权情况(即,未登录的接口,统一返回401未授权状态码,前端根据vue-resource的拦截器拦截符合条件的状态,并做出相应的处理.) 以下为两个系统的登录页面,作为请求超时或者登录拦截的跳转页面 以上是登录超时,登录弹窗框自动弹出来 代码片段 路由文件 export default

  • Vue中axios拦截器如何单独配置token

    在了解到cookie.session.token的作用后学习token的使用 cookie cookie是随着url将参数发送到后台,安全性最低,并且大小受限,不超过4kb左右,它的数据保存在客户端 session session数据保存在服务端,在内存中开辟空间存储数据,session文件名即sessionID保存在cookie内,随cookie传送到服务端后在服务端匹配session文件 token token是服务端的一种算法,如果登录成功,服务端就会根据算法生成一个字符串,将字符串传递回

随机推荐