项目地址
接上一篇,已经配置好了对应的页面及路由,整体逻辑就是在需要登录的页面(已经在meta中有needlogin属性)未登录无法访问,登陆页面在登录后无法访问,登录后跳转到原始访问的地址
登录页面
启动服务,通过路由手动进入登录页(目前为空白页)
登陆页面布局与登陆接口调用
// html
<template>
<div class="admin-login-container flex_center_center">
<div class="admin-login-form">
<h3>管理后台模板</h3>
<el-form :model="loginForm" :rules="loginRules" ref="loginRuleForm" label-width="80px">
<el-form-item label="用户名" prop="username">
<el-input v-model="loginForm.username"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input type="password" v-model="loginForm.password"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitLoginForm('loginRuleForm')">登录</el-button>
<el-button @click="resetLoginForm('loginRuleForm')">重置</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
// js
import { login } from "@/api/user";
export default {
data() {
return {
//登录表单
loginForm: {},
//登录验证
loginRules: {
username: [
{
required: true,
message: "请输入用户名",
trigger: "blur"
},
{ min: 3, max: 8, message: "长度在 3 到 8 个字符", trigger: "blur" }
],
password: [{ required: true, message: "请输入密码", trigger: "blur" }]
}
};
},
methods: {
//提交登录
async submitLoginForm(form) {
this.$refs[form].validate(async valid => {
if (valid) {
let res = await login(this.loginForm);
if (res) {
this.$message({
message: "登录成功",
type: "success"
});
this.$store.dispatch("setToken", res.token);
this.$route.query.redirect
? this.$router.push(this.$route.query.redirect)
: this.$router.push({ name: "Home" });
}
}
});
},
//重置
resetLoginForm(form) {
this.$refs[form].resetFields();
}
}
};
// css
.admin-login-container {
height: 100%;
background: #f6f6f6;
.admin-login-form {
width: 350px;
padding: 20px;
background: #fff;
border-radius: 10px;
text-align: center;
}
}
方便起见引入全局css样式 上下左右居中
// src/style/index.css
/* flex */
.flex_center_center {
display: flex;
justify-content: center;
align-items: center;
}
此时打开登陆页面 如下图
这里登陆接口的服务端逻辑是在easy-mock中写的 账号:rty 密码:123,只是做一个简单的验证,可以直接调我的接口,也可以自己写验证密码的模拟逻辑,下图是我写的登陆接口逻辑 ,具体方法可以参考easy-mock文档
登陆验证、重定向及限制访问
1.未登陆用户只能访问登陆、404页面,不能访问其他需要登陆权限的页面
2.在当前页面退出登陆后,再次登陆回重定向到之前的页面
3.已经登陆用户不能重复访问登陆页面
4.路由切换会验证用户登陆状态,为登陆会返回到登陆页
// src/permission.js
import router from "./router";
import Storage from "@/tools/storage";
//progress
import Progress from "nprogress";
import "nprogress/nprogress.css";
router.beforeEach((to, from, next) => {
Progress.start();
if (to.matched.some(res => res.meta.needLogin && !Storage.get("token"))) {
next({
path: "/login",
//将原生的跳转地址当作参数传入,后续登录成功之后,需要跳转到原始访问的地址
query: { redirect: to.path }
});
Progress.done();
return;
}
//登录状态下,不允许回退到登录页面
if (to.path === "/login" && Storage.get("token")) {
next(false);
Progress.done();
return;
}
next();
Progress.done();
});
router.afterEach(() => {
Progress.done(); // 结束Progress
});
全局引入登陆权限控制
// src/main.js
import "@/permission";