专栏首页前端vue5.登录验证,重定向及访问限制

5.登录验证,重定向及访问限制

项目地址

github地址、 码云地址

接上一篇,已经配置好了对应的页面及路由,整体逻辑就是在需要登录的页面(已经在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";
最终效果预览

效果预览

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 编写接口连接并查询数据库数据(二)

    安装测试工具postman 不想下载软件的话可以用谷歌插件postman 这个东西是测试用的,不需要的可以不下载

    RtyXmd
  • Vue+SessionStorage实现简单的登录

    我是基于vue脚手架cli做的,没用过cli的可以看下我之前写的cli脚手架搭建

    RtyXmd
  • 微信公众号授权登陆PHP

    在微信公众号请求用户网页授权之前,要先到公众平台官网中修改授权回调域名 正式公众号:开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信...

    RtyXmd
  • GDC server down解决方案

    Y大宽
  • uni-app 结合云函数开发小程序博客(二):云函数实现登录注册

    不好意思大家,个人原因拖了一周时间才发表第二篇,没想到还有朋友在支持,非常感谢和抱歉。第一篇中已经引入了第三方样式,实现了主题和语言的切换;本篇主要开始页面的搭...

    一只图雀
  • 找编程工作,需要参加软件资格考试嘛?

    疑惑一 找编程工作,需要参加软件资格考试嘛? 联盟群里很多人问要不要参加软考,其实这个事情一分为二去对待,真正的比较牛的私人企业像腾讯,阿里,百度,面试的时候才...

    程序员互动联盟
  • 在腾讯云服务器上如何发布自己的网站

    这篇文章教小白怎么在腾讯云服务器上如何发布自己的网站,做一个自己的网站很简单,做一个好站很难

    主机优惠教程
  • 用腾讯云建自己的网站详细教程

    现在很多人想给自己留下一些记忆,或者是想让更多人了解自己,了解自己的知识想建立一个属于介绍自己的网站,那么怎么才能建立一个自己的网站呢

    主机优惠教程
  • 从零开始学量化(四):用python写一个择时策略回测

    看多了前面的铺垫,接下来写一写可以实操的。本篇给出写择时策略回测的详细步骤,并用代码展示全过程,代码用python写,数据和代码后台回复“择时”获取,可以自己测...

    量化小白
  • bootstrap3 css样式

    <p class="lead"> Packtís mission is to help the world put software to work in n...

    用户5760343

扫码关注云+社区

领取腾讯云代金券