设计思路

  1. 定义路由的时候配置属性,这里使用needLogin标记访问页面是否需要登录
  2. 设置路由守卫,每个页面在跳转之前都要经过验证,校验用户信息是否存在,不存在跳转到登录页
  3. 用户登录后将用户信息存储在localStorage
  4. 退出登录后,将用户信息清空

代码实现

1、router文件夹的index.js文件中

  • 在router中每个地址在meta属性中配置needLogin熟悉,判断访问页面是否需要登录
  • 404页面放在最后,匹配所有链接,实现输入不存在的地址时自动跳转404页面
import Vue from 'vue'
import Router from 'vue-router'
import LoginCard from "../components/LoginCard";
import Home from "../components/Home";
import ErrorPage from "../components/ErrorPage"; Vue.use(Router) export default new Router({
routes: [
{
path: '/',
name: 'LoginCard',
component: LoginCard,
meta: {
needLogin: false
}
},
{
path: '/loginCard',
name: 'LoginCard',
component: LoginCard,
meta: {
needLogin: false
}
},
{
path: '/home',
name: 'Home',
component: Home,
meta: {
needLogin: true
}
}, {
path: '/*',
name: 'ErrorPage',
component: ErrorPage,
meta:{
needLogin: false
} }
]
})

2、在main.js中定义一个路由前置守卫,每次跳转页面进行判断,没有登陆自动挑战登陆界面

import Vue from 'vue'
import App from './App'
import router from './router'
import VueRouter from "vue-router";
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import * as auth from './utils/auth'
import store from './store'
import Vuex from "vuex"; Vue.config.productionTip = false;
Vue.use(ElementUI);
Vue.use(VueRouter);
Vue.use(Vuex) //这个方法需要放在new Vue之前,不然按F5刷新页面不会调用这个方法
router.beforeEach(function (to, from, next) {
console.log('是否需要登录才能访问')
if (to.meta.needLogin) {
if (auth.getAdminInfo()) {
console.log(auth.getAdminInfo())
console.log('有cookie信息')
next();
}else {
console.log('无cookie信息') next({
path:'/loginCard'
});
}
}else{
next();
}
}) new Vue({
el: '#app',
router,
store,
components: { App },
template: '<App/>'
})

3、编写一个存储数据的工具,使用cookie存储用户登录后的信息

import Cookies from 'js-cookie'

const adminInfo = "adminInfo"

//获取用户信息
export function getAdminInfo() {
const admin = Cookies.get(adminInfo)
if(admin){
return JSON.parse(admin)
}
return ''
}
//存储用户信息
export function setAdminInfo(admin) {
return Cookies.set(adminInfo, JSON.stringify(admin))
}
//移除用户信息
export function removeAdminInfo() { return Cookies.remove(adminInfo)
}

4、写一个登录页面,用户登录后就将数据存储在cookie中

 <template>
<div>
<el-form ref="loginForm" :rules="formRules" :model="loginUser" label-width="80px" class="login-box">
<h3 style="margin-bottom: 50px">欢迎登录</h3>
<el-form-item label="用户名" prop="username">
<el-input prefix-icon="el-icon-user" type="text" v-model="loginUser.username" placeholder="请输入用户名" :maxlength="50" clearable></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input prefix-icon="el-icon-lock" type="password" v-model="loginUser.password" placeholder="请输入密码" :maxlength="50" clearable>
</el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">登陆</el-button>
<el-button icon="" @click="resetForm">重置</el-button>
</el-form-item>
</el-form>
</div>
</template> <script>
import * as auth from '../utils/auth'
export default {
name: 'LoginCard',
data() {
return {
loginUser: {
username: '',
password: '',
},
formRules: {
//制定表单输入的规则
username: [{required: true, message: '用户名不能为空', trigger: 'blur'}],
password: [{required: true, message: '密码不能为空', trigger: 'blur'}]
}
}
},
methods: { onSubmit() {
//判断表单是否符合规则
this.$refs['loginForm'].validate((valid) => {
if (valid) {
if (this.loginUser.username !== '123456' || this.loginUser.password !== '123456'){
this.$message({
message:'账号或密码错误',
type: 'error',
});
return;
}
auth.setAdminInfo(this.loginUser);
this.$router.push({path:'/home'});
}
}
)
},
resetForm(){
this.$refs['loginForm'].resetFields();
},
}
}
</script>
<style scoped>
.login-box {
border: 1px solid #DCDFE6;
width: 400px;
margin: 180px auto;
padding: 35px 35px 15px 35px;
border-radius: 5px;
}
</style>

5、编写一个退出页面,用户退出以后,将用户信息从cookie中去除,跳转到登陆页面

 <template>
<div>
<h1>主页面</h1>
<el-button @click="logout">退出登录</el-button>
</div>
</template>
<script>
import * as auth from '../utils/auth' export default {
name : 'Home',
data() {
return {
};
},
methods: {
logout(){
auth.removeAdminInfo();
this.$router.push({path:'/loginCard'});
}
},
mounted() {
}
}
</script>

基本目录结构是这样的

最新文章

  1. arcgis api for js共享干货系列之一自写算法实现地图量算工具
  2. 【工作常用代码集】批量Telnet远端端口
  3. PHP设计模式(三)
  4. DAY1 linux 50条命令
  5. DPM总结
  6. 配置iSCSI多路径
  7. android之回调函数的意义
  8. [转]dos命令 cd命令使用说明[图文说明]
  9. ubuntu11.10(TQ210)下移植boa服务器
  10. rand,randn,randi函数区别
  11. editplus 正则删换行
  12. Canvas get/putImageData
  13. Android recyclerView的空数据显示
  14. 灵玖Nlpir Parser智能挖掘汉语精准分词
  15. MongoDB监控
  16. junit4X系列--Statement
  17. canvas线条的属性
  18. [Winfrom] 使用一个启动快捷方式,打开2个不同的窗体并且共用一个缓存空间
  19. webpack4的总结
  20. Redis学习一(基础入门).

热门文章

  1. lauyi渲染
  2. windows使用pyinstaller 打包sklearn模块出现死循环报错
  3. audio解决不能自动播放问题
  4. Spring IOC源码(二):IOC容器之 刷新前的准备
  5. Javascript | 分别用async await异步方法和Promise来实现一个简易的求职程序
  6. texlive编译lshort-zh-cn
  7. 5、枚举Enum
  8. 1、debug调试
  9. 在windows上构建OpenCascade
  10. 常用 Git 命令行操作