1、修改config文件夹里的dev.env.js里的BASE_API,把地址改成请求后端的公共部分

1
BASE_API: '"http://192.168.xx.xx"',

2、接下来就是操作src文件,先在 views里写好vew组件(login.vue,regist.vue),写好到router里的index.js里配置好路径

login.vue

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
<template>
 <div class="login-container">
  <el-form autoComplete="on" :model="loginForm" :rules="loginRules" ref="loginForm" label-position="left"
     label-width="0px"
     class="card-box login-form">
   <h3 class="title">登录</h3>
   <el-form-item prop="name">
  <span class="svg-container svg-container_login">
   <svg-icon icon-class="user"/>
  </span>
    <el-input name="name" disabled type="text" v-model="loginForm.name" autoComplete="on"
      placeholder="用户名"/>
   </el-form-item>
   <el-form-item prop="password">
  <span class="svg-container">
   <svg-icon icon-class="password"></svg-icon>
  </span>
    <el-input name="password" :type="pwdType" @keyup.enter.native="handleLogin" v-model="loginForm.password"
      autoComplete="on"
      placeholder="密码"></el-input>
    <span class="show-pwd" @click="showPwd"><svg-icon icon-class="eye"/></span>
   </el-form-item>
   <el-form-item>
    <el-button type="primary" style="width:100%;" :loading="loading" @click.native.prevent="handleLogin">
    登录
    </el-button>
   </el-form-item>
  </el-form>
  </div>
</template>
<script>
 export default {
 name: 'login',
 data() {
  const validateUsername = (rule, value, callback) => {
  if (value.trim().length<1) {
   callback(new Error('用户名不能为空'))
  } else {
   callback()
  }
  };
  const validatePass = (rule, value, callback) => {
  if (value.trim().length < 1) {
   callback(new Error('密码不能为空'))
  } else {
   callback()
  }
  };
  return {
  loginForm: {
   name: '',
   password: ''
  },
  loginRules: {
   name: [{required: true, trigger: 'blur', validator: validateUsername}],
   password: [{required: true, trigger: 'blur', validator: validatePass}]
  },
  loading: false,
  pwdType: 'password'
  }
 },
 methods: {
  showPwd() {
  if (this.pwdType === 'password') {
   this.pwdType = ''
  } else {
   this.pwdType = 'password'
  }
  },
  handleLogin() {
  this.$refs.loginForm.validate(valid => {
   if (valid) {
   this.loading = true;
   this.$store.dispatch('Login', this.loginForm).then(() => {
    this.loading = false;
    this.$router.push({path: '/'});
   }).catch((e) => {
    this.loading = false
   })
   } else {
   console.log('error submit!!')
   return false
   }
  })
  }
 }
 }
</script>

router/index.js

1
{ path: '/login', component: _import('Login/login'), hidden: true }

3、在api里的login.js里写好与后端对接的接口地址,在stores里的modules里的user.js里定义user,有state,mutations,action,具体的请求操作写在action里,login.vue或regist.vue调用user.js里写好的请求,getter.js里定义store的getters

api/login.js

1
2
3
4
5
6
7
8
9
10
11
import request from '@/utils/request'
export function login(name,password) {
 return request({
 url: '/XX/XX',
 method: 'post',
 data: {
  name,
  password
 }
 })
}

stores/modules/user.js

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
import { login,regist,logout } from '@/api/login'
 import { getToken,setToken } from '@/utils/auth'
 const user = {
 state: {
  name:'',
  token:''
 },
 mutations: {
  SET_NAME: (state, name) => {
  state.name = name;
  },
  SET_TOKEN: (state, token) => {
  state.token = token;
  setToken(token);
  }
 },
 actions: {
  // 登录
  Login({ commit }, userInfo) {
  const name = userInfo.name.trim();
  const password = userInfo.password.trim();
  return new Promise((resolve, reject) => {
   login(name, password).then(response => {
   const data = response.data;
   commit('SET_NAME', data.name);
   commit('SET_TOKEN', data.token);
   setName(data.name);
   setToken(data.token);
   resolve(response); }).catch(error => { reject(error) }) }) },
  // 注册
  Regist({ commit }, userInfo) {
  const name= userInfo.name.trim();
  const password = userInfo.password.trim();
  return new Promise((resolve, reject) => {
   regist(name, password).then(response => {
   const data = response.data;
   commit('SET_NAME', data.name);
   commit('SET_TOKEN', data.token);
   setName(data.name);setToken(data.token);
   resolve(response);
   }).catch(error => {
   reject(error) }) }) },
  // 登出
  LogOut({ commit, state }) {
  return new Promise((resolve, reject) => {
  logout().then(response => {
   commit('SET_NAME', '');
   commit('SET_TOKEN', '');
   setName('');
   setToken(false);
   //removeName();
   //removeToken();
   resolve(response);
  }).catch(error => {
   reject(error)
  })
  })
 },
  // 前端 登出
  FedLogOut({ commit }) {
  return new Promise(resolve => {
 setToken(false);
commit('SET_TOKEN', false);
resolve()
  })
  }
 }
 }
 export default user

getter.js:

1
2
3
4
5
const getters={
 name:state=>state.user.name,
 token:state=>state.user.token
}
export default getter

4、在utils里的auth.js里对cookies进行操作,写入,读取,删除用户权限,是否登录的标志等

1
2
3
4
5
6
7
8
9
10
11
12
13
import Cookies from 'js-cookies'
export function setName(name) {
 return Cookies.set("name", name);
}
export function getName() {
 return Cookies.get("name");
}
export function setToken(token) {
 return Cookies.set("token", token);
}
export function getToken() {
 return Cookies.get("token");
}

5、在permission.js里写白名单,对白名单以外的跳转进行拦截然后跳转登录,同时判断用户权限,是否登录,等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import router from './router'
import store from './store'
import NProgress from 'nprogress' // Progress 进度条
import 'nprogress/nprogress.css'// Progress 进度条样式
import {Message} from 'element-ui'
import {getName, getToken} from "@/utils/auth"; // 验权
const whiteList = ['/login', '/regist']; // 不重定向白名单
router.beforeEach((to, from, next) => {
 NProgress.start();
 if (whiteList.indexOf(to.path) !== -1) {
 next();
 } else {
 if (getToken()==="true") {
  next();
  NProgress.done()
 } else {
  next({path: '/login'});
  NProgress.done()
 }
 }
})
router.afterEach(() => {
 NProgress.done() // 结束Progress
})

6、utils里的request.js里写拦截码,对后端返回的特定码进行拦截然后做相应的操作

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
import axios from 'axios'
import { Message, MessageBox } from 'element-ui'
import store from '../store'
// 创建axios实例
const service = axios.create({
 baseURL: process.env.BASE_API, // api的base_url
 timeout: 15000     // 请求超时时间
});
// respone拦截器
service.interceptors.response.use(
 response => {
 /**
 * code为非200是抛错 可结合自己业务进行修改
 */
 const res = response.data;
 //const res = response;
 if (res.code !== '200' && res.code !== 200) {
  if (res.code === '4001' || res.code === 4001) {
  MessageBox.confirm('用户名或密码错误,请重新登录', '重新登录', {
   confirmButtonText: '重新登录',
   cancelButtonText: '取消',
   type: 'warning'
  }).then(() => {
   store.dispatch('FedLogOut').then(() => {
    location.reload()// 为了重新实例化vue-router对象 避免bug
   })
  })
  }
  if (res.code === '4009' || res.code === 4009) {
  MessageBox.confirm('该用户名已存在,请重新注册!', '重新注册', {
   confirmButtonText: '重新注册',
   cancelButtonText: '取消',
   type: 'warning'
  }).then(() => {
   store.dispatch('FedLogOut').then(() => {
   location.reload()// 为了重新实例化vue-router对象 避免bug
   })
  })
  }
  return Promise.reject('error')
 } else {
  return response.data
 }
 },
 error => {
 Message({
  message: error.message,
  type: 'error',
  duration: 5 * 1000
 });
 return Promise.reject(error)
 }
)
export default service

vue+vuex+axios实现登录、注册页权限拦截的更多相关文章

  1. Vue+Vuex 实现自动登录功能

    刚刚实现了Vue+Vuex的自动登录功能,在实现的时候遇到了一些问题,这里记录一下: 因为这个还不够完善,在写完下列代码后,又进行了补充,可以从https://www.cnblogs.com/xiao ...

  2. vue+vuex+axios+echarts画一个动态更新的中国地图

    一. 生成项目及安装插件 # 安装vue-cli npm install vue-cli -g # 初始化项目 vue init webpack china-map # 切到目录下 cd china- ...

  3. Vue+Vuex实现自动登录 升级版

    Vue+Vuex实现自动登录 升级版 之前实现的版本在这里:Vue+Vuex实现自动登录       在之前实现的版本中,如果你进行测试,可以看到在浏览器的local Storage中,确实里面有了我 ...

  4. Vue的axios如何全局注册

    最近用 Vue 写项目的时候,用到 axios ,因为 axios 不能用 Vue.use() ,所以在每个 .vue 文件中使用 axios 时就需要 import , .vue 文件少的话还好说, ...

  5. 一 注册功能&登录功能,权限拦截

    注册功能: 前端JSP:提供表单注册信息以及访问路径,发送请求到Strus2. Struts2 : 通过模型驱动接收并封装User对象,Spring依赖注入(无参构造+setter方法)获取业务层Us ...

  6. vue新手入门之使用vue框架搭建用户登录注册案例,手动搭建webpack+Vue项目(附源码,图文详解,亲测有效)

    前言 本篇随笔主要写了手动搭建一个webpack+Vue项目,掌握相关loader的安装与使用,包括css-loader.style-loader.vue-loader.url-loader.sass ...

  7. vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据

    在vue项目中组件间相互传值或者后台获取的数据需要供多个组件使用的情况很多的话,有必要考虑引入vuex来管理这些凌乱的状态,今天这边博文用来记录这一整个的过程,后台api接口是使用webpack-se ...

  8. Vue学习之路之登录注册实例代码

    Vue学习之路之登录注册实例代码:https://www.jb51.net/article/118003.htm vue项目中路由验证和相应拦截的使用:https://blog.csdn.net/wa ...

  9. WordPress插件:自定义登录注册插件:DX Login Register

    众所周知,wordpress自带的注册系统比较简单,需要接收邮件密码才能完成.不过对于国内的站长来说,会碰到不少麻烦.首先个人站长一般都使用虚拟主机,有不少还是使用国外的,你的服务器不一定会提供邮件发 ...

随机推荐

  1. java语言基础--方法的执行图解

    1.调用m1方法(压栈) 2.m1调用m2方法(压栈) 3.m2调用m3方法(压栈) 4.运行m3(弹栈) 5.运行m2(弹栈) 6.运行m1(弹栈)

  2. 【Effective Java读书笔记】创建和销毁对象(一):考虑使用静态工厂方法代替构造器

    类可以提供一个静态方法,返回类的一个静态实例,如Boolean包装类的一个获取实例的静态方法 public static Boolean valueOf(boolean b) { return (b ...

  3. js中数组常用方法总结

    操作数组 印象中数组有很多方法,系统的整理一下,放在自己家里方便回头查~ Array.map() 此方法是将数组中的每个元素调用一个提供的函数,结果作为一个新的数组返回,并没有改变原来的数组 1 2 ...

  4. 17python-BS编程

    1.前端概述(1)上网:就是下载网页(2)浏览器:就是一个解释器2.BS模式的了解(1)BS模式:-----b:browser(浏览器)   s:server(服务端)(2)BS模式运行过程:brow ...

  5. Eclipse 运行弹出A Java Exception has occurred.并报错Exception in thread 的解决方案

    这个问题是由较高版本的JDK编译的java class文件试图在较低版本的JVM上运行而产生的错误. 1.解决措施就是保证jvm(java命令)和jdk(javac命令)版本一致.如果是linux版本 ...

  6. 2018.9.12 B树总结

    1. B-Tree B-树是一种平衡的多路查找树,它在文件系统中很有用. 1.1 B-Tree 特性 关键字集合分布在整颗树中: 任何一个关键字出现且只出现在一个结点中: 搜索有可能在非叶子结点结束: ...

  7. libpointmatcher安装和使用

    libpointmatcher介绍: libpointmatcher is a modular library implementing the Iterative Closest Point (IC ...

  8. 安装Scala开发环境

    Scala 介绍 Step 1: 安装 Java开发环境 Scala 版本与Java版本的兼容关系 从Oracle网站下载JDK URL: http://www.oracle.com/technetw ...

  9. Appium环境搭建——安卓模拟器(AVD)调试 2-运行Apk失败点的总结

    如何优化AVD模拟器运行速度? 解决方法:开启IntelHAXM 查询intelhaxm是否已经开启: sc query intelhaxm 若开启成功,则如图所示 若没有开启,可以通过BIOS打开, ...

  10. 顺序栈代码实现&&stack库

    #include<iostream> using namespace std; ; typedef int Elemtype; struct SqStack { Elemtype *bas ...