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

作者: RtyXmd | 来源:发表于2018-08-27 23:24 被阅读86次
    项目地址

    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";
    
    最终效果预览
    效果预览

    相关文章

      网友评论

      • c48fd292d6e2:这些直接使用现成的layui是更方便,vue可以用来搞前台。

      本文标题:5.登录验证,重定向及访问限制

      本文链接:https://www.haomeiwen.com/subject/ifbtwftx.html