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

简介: 后台管理系统是公司必备的,从前些年由于技术人员的稀有,导致后台系统非常昂贵,近些年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进行实现

目录
相关文章
|
29天前
|
缓存 前端开发 JavaScript
利用代码分割优化前端性能:策略与实践
在现代Web开发中,代码分割是提升页面加载性能的有效手段。本文介绍代码分割的概念、重要性及其实现策略,包括动态导入、路由分割等方法,并探讨在React、Vue、Angular等前端框架中的具体应用。
|
2天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
21 3
|
18天前
|
缓存 监控 前端开发
探索前端性能优化:关键策略与代码实例
本文深入探讨前端性能优化的关键策略,结合实际代码示例,帮助开发者提升网页加载速度和用户体验,涵盖资源压缩、懒加载、缓存机制等技术。
|
18天前
|
人工智能 自然语言处理 前端开发
【AI系统】LLVM 前端和优化层
本文介绍了 LLVM 编译器的核心概念——LLVM IR,并详细讲解了 LLVM 的前端 Clang 如何将 C、C++ 等高级语言代码转换为 LLVM IR。文章还探讨了编译过程中的词法分析、语法分析和语义分析三个关键步骤,以及 LLVM 优化层的 Pass 机制,包括分析 Pass 和转换 Pass 的作用及依赖关系。
23 3
|
1月前
|
监控 前端开发 jenkins
Jenkins 在前端项目持续部署中的应用,包括其原理、流程以及具体的实现方法
本文深入探讨了Jenkins在前端项目持续部署中的应用,涵盖其基本原理、流程及具体实现方法。首先介绍了Jenkins的基本概念及其在自动化任务中的作用,随后详细解析了从前端代码提交到生产环境部署的全过程,包括构建、测试、部署等关键步骤。最后,强调了持续部署中的代码质量控制、环境一致性、监控预警及安全管理等注意事项,旨在帮助开发者高效、安全地实施持续部署。
59 5
|
1月前
|
Web App开发 缓存 监控
前端性能优化实战:从代码到部署的全面策略
前端性能优化实战:从代码到部署的全面策略
27 1
|
1月前
|
Web App开发 前端开发 JavaScript
前端性能优化实战:从代码到部署的全面指南
前端性能优化实战:从代码到部署的全面指南
31 1
|
29天前
|
缓存 监控 前端开发
前端性能优化:从代码到部署的全面策略
前端性能优化:从代码到部署的全面策略
|
2月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
177 2
|
2月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
48 0