router

export const constantRouterMap = [
{ path: '/login', component: () => import('@/views/login/index'), hidden: true },
...
]
#在路由js中,加入/login路由,hidden为true

  

views

<template>
<div class="login-container">
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on" label-position="left">
<h3 class="title">运维没烦恼</h3>
<el-form-item prop="username">
<el-input v-model="loginForm.username" name="username" type="text" auto-complete="on" placeholder="username" />
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
name="password"
auto-complete="on"
placeholder="password"
@keyup.enter.native="handleLogin" />
</el-form-item>
</el-form>
</div>
</template>
#先做一个form,带表单验证功能,将用户输入的账户信息给到loginForm

  

    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: this.redirect || '/' })
}).catch(() => {
this.loading = false
})
} else {
console.log('error submit!!')
return false
}
})
}
#把loginForm使用vuex传递到Login

  

auth

    Login({ commit }, userInfo) {
const username = userInfo.username.trim()
return new Promise((resolve, reject) => {
login(username, userInfo.password).then(response => {
setToken(response.token)
commit('SET_TOKEN', response.token)
resolve()
}).catch(error => {
reject(error)
})
})
},
#将账户信息传入login api,成功的话,后端api返回一个{‘token’:'value'}的字典

  

export function setToken(token) {
return Cookies.set(TokenKey, token)
}
#把token写入cookie

  

NProgress

export function getToken() {
return Cookies.get(TokenKey)
}
#从cookie获取token的函数

  

const whiteList = ['/login'] // 不重定向白名单
router.beforeEach((to, from, next) => {
NProgress.start()
if (getToken()) {
if (to.path === '/login') {
next({ path: '/' })
NProgress.done() // if current page is dashboard will not trigger afterEach hook, so manually handle it
} else {
// next()
if (store.getters.roles.length === 0) {
store.dispatch('GetInfo').then(res => { // 拉取用户信息
next()
}).catch((err) => {
store.dispatch('FedLogOut').then(() => {
Message.error(err || 'Verification failed, please login again')
next({ path: '/' })
})
})
} else {
next()
}
}
} else {
if (whiteList.indexOf(to.path) !== -1) {
next()
} else {
next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页
NProgress.done()
}
}
})
#检测url定向,如果使用getToken能从cookie获取到token,则说明用户已登录
#如果to页面为/login、则next到/
#如果不是to /login,如果store中roles的长度为0,则调用GetInfo函数
#再next

  

    GetInfo({ commit, state }) {
return new Promise((resolve, reject) => {
getInfo(state.token).then(response => {
const data = response.data
if (data.roles && data.roles.length > 0) { // 验证返回的roles是否是一个非空数组
commit('SET_ROLES', data.roles)
} else {
reject('getInfo: roles must be a non-null array !')
}
commit('SET_NAME', data.name)
commit('SET_AVATAR', data.avatar)
resolve(response)
}).catch(error => {
reject(error)
})
})
},
#调用getInfo api,传入token,返回的response.data包含三个key,roles,name,avaoar。写入state。

  

vue教程5-账户登录的更多相关文章

  1. 症状解决,原因不详的用非默认管理权限账户登录COM注册成功但找不到类型问题

    http://social.msdn.microsoft.com/Forums/en-US/11f01ceb-52a4-438f-b7ef-727ce7a3e191/atl-project-in-vs ...

  2. win10 用微软账户登录无法访问共享的问题

    百度找了一大堆可以解决的,最终最简单的方式(可能是bug): 测试了一下,Win10用微软账户登录的,连局域网共享时,输入用户名的时候,前面加个乱七八糟的域名就可以访问了: 比如: 用户名:   ba ...

  3. ubuntu12.04管理员账户登录不了桌面,只能客人会话登录

    ubuntu12.04管理员账户登录不了桌面,只能客人会话登录 求助!!ubuntu12.04管理员账户登录不了桌面,只能客人会话登录. 登录管理员账户时,输入密码后,一直在登录界面循环 费了好大劲啊 ...

  4. ubuntu12.04管理员账户登录不了桌面,仅仅能客人会话登录

    ubuntu12.04管理员账户登录不了桌面,仅仅能客人会话登录 求助!!ubuntu12.04管理员账户登录不了桌面,仅仅能客人会话登录. 登录管理员账户时,输入password后,一直在登录界面循 ...

  5. 如何取消Microsoft账户登录电脑

    手贱用Microsoft账户登录了一下笔记本里面的日历,TNND微软直接就把你电脑的登录账户直接改成了微软账户,花了1个小时才搞回去. 步骤如下: 0--脑残微软的设计,点了下日历,弹出下面这个,绝对 ...

  6. mysql全局权限账户%登录不上ERROR 1045 (28000): Access denied for user 'mhz'@'localhost' (using password: YES)

    mysql全局权限账户%登录不上ERROR 1045 (28000): Access denied for user 'mhz'@'localhost' (using password: YES) 解 ...

  7. vue axios封装以及登录token过期跳转问题

    Axios配置JWT/封装插件/发送表单数据 首先请务必已仔细阅读 Axios 文档并熟悉 JWT: 中文文档 JWT 中文文档 安装 npm install axios npm install es ...

  8. 利用开机账户登录“轻松访问”创建Windows后门

    利用开机账户登录“轻松访问”创建Windows后门 实验原理: 利用登录账户界面的“轻松访问”中的“放大镜”,把它替换为cmd.exe程序,实现在不登录的情况下打开命令提示符,并进行一些操作(打开的c ...

  9. vue教程3-05 vue组件数据传递、父子组件数据获取,slot,router路由

    vue教程3-05 vue组件数据传递 一.vue默认情况下,子组件也没法访问父组件数据 <!DOCTYPE html> <html lang="en"> ...

随机推荐

  1. 应用提交 App Store 上架被拒绝

    审核的参考资料 https://developer.apple.com/icloud/documentation/data-storage/index.html https://developer.a ...

  2. Promise 入门与使用

    Tags: ECMAScript6 参考资料 promises-book Promise对象 we-have-a-problem-with-promises Promise最初被提出是在 E语言中, ...

  3. liunx让命令窗口显示段路径的方法

    平时我们使用linux终端命令行的时候,常常会被一个问题困扰,那就是文件路径过长,有时候甚至超过了一行,这样看起来非常别扭,其实只要两步就可以解决这个问题: 1,修改.bashrc文件(用户根目录下) ...

  4. Educational Codeforces Round 17 颓废记

    又被虐了... (记一次惨痛的Codeforces) 好不容易登上去了Codeforces,22:35准时开打 第一题,一看:这不SB题嘛?直接枚举因数上啊.9min才过掉了pretest 第二题.. ...

  5. [Codeforces 452E] Three Strings

    [题目链接] https://codeforces.com/contest/452/problem/E [算法] 构建后缀数组 用并查集合并答案即可 时间复杂度 : O(NlogN) [代码] #in ...

  6. Mysql误删了root用户怎么办

    1.停止mysql服务:在mysql安装目录下找到my.ini:在my.ini中找到以下片段[mysqld]:另起一行加入代码:skip-grant-tables 并保存 2.启动mysql服务,并登 ...

  7. 相对路径转绝对路径C++实现

    #include<iostream> #include<string> #include<vector> using namespace std; //相对路径转绝 ...

  8. ORACLE常用数据库字段类型

    ORACLE常用数据库字段类型   常用的数据库字段类型如下:   字段类型 中文说明 限制条件 其它说明  CHAR 固定长度字符串 最大长度2000 bytes     VARCHAR2 可变长度 ...

  9. Advanced R之编程风格

    转载请注明出处,谢谢.   编程风格指导 好的编码风格如同正确使用标点符号一样重要.没有编码规范仍然可以管理代码,但是有代码规范会使代码更易阅读.如同标点样式,编码规范也有不同.下面描述的是我所使用的 ...

  10. Tomcat的目录结构详解

    转自:https://blog.csdn.net/u012661010/article/details/73381599