Vue elelment登录验证 简单版
http.js
import axios from 'axios'
import { Message, Loading } from 'element-ui';
import router from './router'
let loading //定义loading变量
function startLoading() { //使用Element loading-start 方法
loading = Loading.service({
lock: true,
text: '加载中...',
background: 'rgba(0, 0, 0, 0.7)'
})
}
function endLoading() { //使用Element loading-close 方法
loading.close()
}
// 请求拦截 设置统一header
axios.interceptors.request.use(config => {
// 加载
startLoading()
if (localStorage.eleToken)
config.headers.Authorization = localStorage.eleToken
return config
}, error => {
return Promise.reject(error)
})
// 响应拦截 401 token过期处理
axios.interceptors.response.use(response => {
endLoading()
return response
}, error => {
// 错误提醒
endLoading()
Message.error(error.response.data)
const { status } = error.response
if (status == 401) {
Message.error('token值无效,请重新登录')
// 清除token
localStorage.removeItem('eleToken')
// 页面跳转
router.push('/login')
}
return Promise.reject(error)
})
export default axios
router.js
import Vue from 'vue'
import Router from 'vue-router'
import Index from './views/Index.vue'
import Register from './views/Register'
import Nofind from './views/404'
import Login from './views/Login'
import Home from './views/Home'
import InfoShow from './views/InfoShow'
import FoundList from './views/FoundList'
Vue.use(Router)
const router = new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [
{ path: '*', name: '/404', component: Nofind },
{ path: '/', redirect: '/index' },
{ path: '/register', name: 'register', component: Register },
{ path: '/login', name: 'login', component: Login },
{
path: '/index',
name: 'index',
component: Index,
children: [
{ path: '', component: Home },
{ path: '/home', name: 'home', component: Home },
{ path: '/infoshow', name: 'infoshow', component: InfoShow },
{ path: '/foundlist', name: 'foundlist', component: FoundList }
]
}
]
})
// 添加路由守卫
router.beforeEach((to, from, next) => {
const isLogin = localStorage.eleToken ? true : false;
if (to.path == "/login" || to.path == "/register") {
next();
} else {
isLogin ? next() : next("/login");
}
})
export default router;
app.vue
<template>
<div id="app">
<router-view/>
</div>
</template>
<script>
import jwt_decode from "jwt-decode";
export default {
name: "app",
created() {
if (localStorage.eleToken) {
const decode = jwt_decode(localStorage.eleToken);
this.$store.dispatch("setIsAutnenticated", !this.isEmpty(decode));
this.$store.dispatch("setUser", decode);
}
},
methods: {
isEmpty(value) {
return (
value === undefined ||
value === null ||
(typeof value === "object" && Object.keys(value).length === 0) ||
(typeof value === "string" && value.trim().length === 0)
);
}
}
};
</script>
<style>
html,
body,
#app {
width: 100%;
height: 100%;
}
</style>
views/login.vue
<template>
<div class="login">
<section class="form_container">
<div class="manage_tip">
<span class="title">米修在线后台管理系统</span>
</div>
<el-form :model="loginUser" :rules="rules" ref="loginForm" class="loginForm" label-width="60px">
<el-form-item label="邮箱" prop="email">
<el-input v-model="loginUser.email" placeholder="请输入邮箱"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="loginUser.password" placeholder="请输入密码" type="password"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('loginForm')" class="submit_btn">登 录</el-button>
</el-form-item>
<div class="tiparea">
<p>还没有账号?现在<router-link to='/register'>注册</router-link></p>
</div>
</el-form>
</section>
</div>
</template>
<script>
import jwt_decode from "jwt-decode";
export default {
name: "login",
data() {
return {
loginUser: {
email: "",
password: ""
},
rules: {
email: [
{
type: "email",
required: true,
message: "邮箱格式不正确",
trigger: "change"
}
],
password: [
{ required: true, message: "密码不能为空", trigger: "blur" },
{ min: 6, max: 30, message: "长度在 6 到 30 个字符", trigger: "blur" }
]
}
};
},
methods: {
submitForm(formName) {
this.$refs[formName].validate(valid => {
if (valid) {
this.$axios.post("/api/users/login", this.loginUser).then(res => {
// 登录成功
const { token } = res.data;
localStorage.setItem("eleToken", token);
// 解析token
const decode = jwt_decode(token);
// 存储数据
this.$store.dispatch("setIsAutnenticated", !this.isEmpty(decode));
this.$store.dispatch("setUser", decode);
// 页面跳转
this.$router.push("/index");
});
} else {
console.log("error submit!!");
return false;
}
});
},
isEmpty(value) {
return (
value === undefined ||
value === null ||
(typeof value === "object" && Object.keys(value).length === 0) ||
(typeof value === "string" && value.trim().length === 0)
);
}
}
};
</script>
<style scoped>
.login {
position: relative;
width: 100%;
height: 100%;
background: url(../assets/bg.jpg) no-repeat center center;
background-size: 100% 100%;
}
.form_container {
width: 370px;
height: 210px;
position: absolute;
top: 20%;
left: 34%;
padding: 25px;
border-radius: 5px;
text-align: center;
}
.form_container .manage_tip .title {
font-family: "Microsoft YaHei";
font-weight: bold;
font-size: 26px;
color: #fff;
}
.loginForm {
margin-top: 20px;
background-color: #fff;
padding: 20px 40px 20px 20px;
border-radius: 5px;
box-shadow: 0px 5px 10px #cccc;
}
.submit_btn {
width: 100%;
}
.tiparea {
text-align: right;
font-size: 12px;
color: #333;
}
.tiparea p a {
color: #409eff;
}
</style>
store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const types = {
SET_IS_AUTNENTIATED: 'SET_IS_AUTNENTIATED', // 是否认证通过
SET_USER: 'SET_USER' // 用户信息
}
const state = { // 需要维护的状态
isAutnenticated: false, // 是否认证
user: {} // 存储用户信息
}
const getters = {
isAutnenticated: state => state.isAutnenticated,
user: state => state.user
}
const mutations = {
[types.SET_IS_AUTNENTIATED](state, isAutnenticated) {
if (isAutnenticated)
state.isAutnenticated = isAutnenticated
else
state.isAutnenticated = false
},
[types.SET_USER](state, user) {
if (user)
state.user = user
else
state.user = {}
}
}
const actions = {
setIsAutnenticated: ({ commit }, isAutnenticated) => {
commit(types.SET_IS_AUTNENTIATED, isAutnenticated)
},
setUser: ({ commit }, user) => {
commit(types.SET_USER, user)
},
clearCurrentState: ({ commit }) => {
commit(types.SET_IS_AUTNENTIATED, false)
commit(types.SET_USER, null)
}
}
export default new Vuex.Store({
state,
getters,
mutations,
actions
})
Vue elelment登录验证 简单版的更多相关文章
- shiro登录验证简单理解
这两天接手了下师兄的项目,要给系统加个日志管理模块,其中需要记录登录功能的日志,那么首先要知道系统的登录是在哪里实现验证的. 该系统把所有登录验证还有权限控制的工作都交给了shiro. 这篇文章就先简 ...
- 解决 VUE 微信登录验证 【感谢原文:https://segmentfault.com/a/1190000009493199】
[感谢原文:https://segmentfault.com/a/1190000009493199] SPA单页应用中微信授权登录的一点思路 单页应用应该如何解决微信授权登录的尴尬跳转?后退无法返回? ...
- SSO单点登录PHP简单版
前面做了一个新项目,需要用户资源可以需要共享.由于之前没有做过这样的东西,回家之后,立马网站百度"单点登录".帖子很多,甄别之后,这里列几篇认为比较有营养. http://blog ...
- vue结合element-ui做简单版todolist
结合element-ui首先需要npm安装element-ui npm i element-ui -S: 然后在入口文件中引入: import ElementUI from 'element-ui'; ...
- 自定义Django中间件(登录验证中间件实例)
前戏 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装饰 ...
- 小米抢购(简单版v0.1)-登录并验证抢购权限,以及获取真实抢购地址
小米(简单版)-登录并验证抢购权限,以及获取真实抢购地址! 并不是复制到浏览器就行了的 还得传递所需要的参数 这里只是前部分 后面的自己发挥了 { "stime": 1389 ...
- 【笔记】vue+springboot前后端分离实现token登录验证和状态保存的简单实现方案
简单实现 token可用于登录验证和权限管理. 大致步骤分为: 前端登录,post用户名和密码到后端. 后端验证用户名和密码,若通过,生成一个token返回给前端. 前端拿到token用vuex和lo ...
- 全栈前端入门必看 koa2+mysql+vue+vant 构建简单版移动端博客
koa2+mysql+vue+vant 构建简单版移动端博客 具体内容展示 开始正文 github地址 <br/> 觉得对你有帮助的话,可以star一下^_^必须安装:<br/> ...
- 写一个简单易用可扩展vue表单验证插件(vue-validate-easy)
写一个vue表单验证插件(vue-validate-easy) 需求 目标:简单易用可扩展 如何简单 开发者要做的 写了一个表单,指定一个name,指定其验证规则. 调用提交表单方法,可以获取验证成功 ...
随机推荐
- 尾递归(java)
一般递归: 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多 ...
- Java面试通关要点汇总整理
简历篇 请自我介绍 请介绍项目 基础篇 基本功 面向对象的特征 final, finally, finalize 的区别 int 和 Integer 有什么区别 重载和重写的区别 抽象类和接口有什么区 ...
- mysql join update
SELECT CONCAT('UPDATE free_for_demo_orders SET product_id=',product_id,',order_created_time=','&quo ...
- kubectl 安装
下载kubectl二进制文件curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.10.0/bin/linux/a ...
- JS继承 小白文
继承我的理解是 一个对象 能够使用另一个对象的方法和属性 继承需要一个父类构造函数 一.通过原型链继承 通过 创建一个 Person 的实例对象,该对象身上 不仅有 name 和 age 等方法, 也 ...
- 模拟画图题P1185 绘制二叉树
题目链接P1185 绘制二叉树 题意概述 根据规则绘制一棵被删去部分节点的满二叉树.节点用 \(o\) 表示,树枝用/\表示.每一层树枝长度会变化,以满足叶子结点有如下特定: 相邻叶子节点是兄 ...
- JS事件——添加、移除事件
element.addEventListener(event, function, useCapture) 方法用于向指定元素添加事件句柄. event: 必须.字符串,指定事件名.注意: 例 使 ...
- ElasticSearch生命周期管理-索引策略配置与操作
概述 本文是在本人学习研究ElasticSearch的生命周期管理策略时,发现官方未提供中文文档,有的也是零零散散,此文主要是翻译官方文档Policy phases and actions模块. 注: ...
- 报错:ER_NO_DEFAULT_FOR_FIELD: Field 'status' doesn't have a default value
小白入门级错误,数据库插入数据时报错;ER_NO_DEFAULT_FOR_FIELD: Field 'status' doesn't have a default value 百度说是my.ini文 ...
- 基于Appium的UI自动化测试
为什么需要UI自动化测试 移动端APP是一个复杂的系统,不同功能之间耦合性很强,很难仅通过单元测试保障整体功能.UI测试是移动应用开发中重要的一环,但是执行速度较慢,有很多重复工作量,为了减少这些工作 ...