前端如何写后台管理系统登录验证详细流程和代码

简介: 后台管理系统是公司必备的,从前些年由于技术人员的稀有,导致后台系统非常昂贵,近些年IT行业的快速发展,使得一些中小型公司开始自己写后台,自己维护,从而获取利益的最大化。

项目前景:后台管理系统是公司必备的,从前些年由于技术人员的稀有,导致后台系统非常昂贵,近些年IT行业的快速发展,使得一些中小型公司开始自己写后台,自己维护,从而获取利益的最大化。
今天是一个简单的后台登录操作

演示效果:

image.png

一、页面布局(Vue+Element Ui)

image.png

二、登录的流程

1、调用登录接口
2、登录成功:
3、保存token
4、跳转到首页,并给出成功的提示
5、失败:给出错误提示,让用户重新登录
具体代码:
新建文件夹对axios进行封装
封装请求

import axios from "axios";

const service = axios.create({
   
   
  baseURL: "url地址",
  timeout: 3000
});

//请求拦截器
service.interceptors.request.use(
  function (config) {
   
   
    //判断如果不是登录页,必须携带token到后端,才能正常返回数据

    //判断如果不是login页,获取token,并通过请求头携带到后端
    if (config.url !== 'login') {
   
   
      const token = localStorage.getItem('token');

      //设置请求头
      config.headers['Authorization'] = token;

    }
    return config;
  },
  function(error) {
   
   
    return Promise.reject(error);
  }
);

//响应拦截器
service.interceptors.response.use(
  function(response) {
   
   
    return response;
  },
  function(error) {
   
   
    return Promise.reject(error);
  }
);

export default service;

请求接口api

import request from "./index";


export function login(data) {
   
   
  // console.log('data::',data)
  return request({
   
   
    url: "login",
    method: "POST",
    data
  });
}

在main.js中进行全局路由拦截

//全局路由拦截
router.beforeEach((to, from, next) => {
   
   
  console.log("from:", from);
  console.log("to:", to);
  if (to.meta.auth) {
   
   
    const token = localStorage.getItem('token')
    if (!token) {
   
   
      next({
   
   
        name: 'login',
        query: {
   
    redirect:to.fullPath  }
        })
    } else {
   
   
      next()
     }
  } else {
   
   
    next();
  }

})

登录页面代码

<template>
  <div class="login_wrap">
    <el-form
      class="login_form"
      label-position="right"
      label-width="80px"
      :model="userinfo"
      :rules="loginRules"
    >
      <h1>用户登录</h1>
      <el-form-item label="用户名" prop="username">
        <el-input v-model="userinfo.username"></el-input>
      </el-form-item>
      <el-form-item label="密码" prop="password">
        <el-input v-model="userinfo.password" type="password"></el-input>
      </el-form-item>
      <el-button type="primary" class="login_btn" @click.prevent="handleLogin"
        >登录</el-button
      >
    </el-form>
  </div>
</template>

<script>
//引入登录接口
import {
   
    login } from "@/http/api";
export default {
   
   
  name: "login",
  data() {
   
   
    return {
   
   
      userinfo: {
   
   
        username: "",
        password: ""
      },
      loginRules: {
   
   
        username: [
          {
   
    required: true, message: "请输入用户名", trigger: "blur" },
          {
   
    min: 5, max: 20, message: "长度在 5 到 20个字符", trigger: "blur" }
        ],
        password: [
          {
   
    required: true, message: "请输入密码", trigger: "blur" },
          {
   
    min: 5, max: 60, message: "长度在 5 到 20 个字符", trigger: "blur" }
        ]
      }
    };
  },
  methods: {
   
   
    async handleLogin() {
   
   
      /**
       * 调用登录接口
       * 成功:
       *     保存token
       *     跳转到首页,并给出成功的提示
       * 失败:给出错误提示,让用户重新登录
       */
      const res = await login(this.userinfo);
      const {
   
   
        meta: {
   
    msg, status }
      } = res.data;

      if (status === 200) {
   
   
        const {
   
    token } = res.data.data;
        localStorage.setItem("token", token);
        //记住上次没有token要访问的页面地址,如果登录成功,再返回到上次要访问到页面
        const {
   
    redirect } = this.$route.query;

        //如果直接登录,没有redirect,成功后直接跳转到home
        if (!redirect) {
   
   
          this.$router.push({
   
    name: "Home" });
        } else {
   
   
          this.$router.push({
   
    path: redirect });
        }

        this.$message({
   
   
          message: msg,
          type: "success"
        });
      } else {
   
   
        this.$message({
   
   
          message: msg,
          type: "error"
        });
      }
    }
  }
};
</script>

<style lang="scss" scoped>
.login_wrap {
   
   
  width: 100%;
  height: 100%;
  background: #072765;
}

.login_form {
   
   
  width: 40%;
  height: 260px;
  padding: 30px;
  background: #fff;
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  top: 0;
  margin: auto;

  h1 {
   
   
    text-align: center;
    margin: 10px 0;
  }
}

.login_btn {
   
   
  width: 100%;
}
</style>

总结:以上是一个后台管理系统实现登录的流程思路,具体请结合API进行实现

目录
相关文章
|
21天前
|
JavaScript 前端开发 Docker
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
在使用 Deno 构建项目时,生成的可执行文件体积较大,通常接近 100 MB,而 Node.js 构建的项目体积则要小得多。这是由于 Deno 包含了完整的 V8 引擎和运行时,使其能够在目标设备上独立运行,无需额外安装依赖。尽管体积较大,但 Deno 提供了更好的安全性和部署便利性。通过裁剪功能、使用压缩工具等方法,可以优化可执行文件的体积。
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
|
4天前
|
前端开发 JavaScript
前端界的革命:掌握这些新技术,让你的代码简洁到让人惊叹!
前端技术的快速发展带来了许多令人惊叹的新特性。ES6及其后续版本引入了箭头函数、模板字符串等简洁语法,极大减少了代码冗余。React通过虚拟DOM和组件化思想,提高了代码的可维护性和效率。Webpack等构建工具通过模块化和代码分割,优化了应用性能和加载速度。这些新技术正引领前端开发的革命,使代码更加简洁、高效、可维护。
9 2
|
4天前
|
前端开发 JavaScript 测试技术
前端工程师的必修课:如何写出优雅、可维护的代码?
前端工程作为数字世界的门面,编写优雅、可维护的代码至关重要。本文从命名规范、模块化设计、注释与文档、遵循最佳实践四个方面,提供了提升代码质量的方法。通过清晰的命名、合理的模块划分、详细的注释和持续的学习,前端工程师可以写出高效且易于维护的代码,为项目的成功打下坚实基础。
11 2
|
9天前
|
监控 前端开发 JavaScript
前端开发的终极奥义:如何让你的代码既快又美,还不易出错?
【10月更文挑战第31天】前端开发是一个充满挑战与机遇的领域,本文从性能优化、代码美化和错误处理三个方面,探讨了如何提升代码的效率、可读性和健壮性。通过减少DOM操作、懒加载、使用Web Workers等方法提升性能;遵循命名规范、保持一致的缩进与空行、添加注释与文档,让代码更易读;通过输入验证、try-catch捕获异常、日志与监控,增强代码的健壮性。追求代码的“快、美、稳”,是每个前端开发者的目标。
23 3
|
11天前
|
前端开发 JavaScript 开发者
前端开发的终极技巧:如何让你的代码既简洁又高效,还能减少bug?
【10月更文挑战第30天】前端开发充满挑战与创新,如何编写简洁高效且少bug的代码是开发者关注的重点。本文介绍五大技巧:1. 模块化,提高代码复用性;2. 组件化,降低代码耦合度;3. 使用现代框架,提高开发效率;4. 统一代码规范,降低沟通成本;5. 利用工具,优化代码质量。掌握这些技巧,让前端开发更高效。
23 1
|
17天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
25 1
|
21天前
|
前端开发 安全 API
前端全栈之路Deno篇(三):一次性搞懂和学会用Deno 2.0 的权限系统详解和多种权限配置权限声明方式
本文深入解析了 Deno 2.0 的权限系统,涵盖主包和第三方包的权限控制机制,探讨了通过命令行参数、权限 API 和配置文件等多种权限授予方式,并提供了代码示例和运行指导,帮助开发者有效管理权限,提升应用安全性。
|
28天前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
120 2
|
28天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
36 0
|
29天前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。