項目地址
接上一篇,已經配置好了對應的頁面及路由,整體邏輯就是在需要登錄的頁面(已經在meta中有needlogin屬性)未登錄無法訪問,登陸頁面在登錄后無法訪問,登錄后跳轉到原始訪問的地址
登錄頁面
啟動服務,通過路由手動進入登錄頁(目前為空白頁)
image.png
登陸頁面布局與登陸接口調用
// 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文檔
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";
最終效果預覽
效果預覽