【GO】K8s 管理系统项目33[前端部分–登录和登出]

news2024/9/9 4:46:25

K8s 管理系统项目[前端部分–登录和登出]

1. 登录登出流程

1.1 登录流程

登入流程总的分为5步:

  1. 账号密码验证
  2. token生成
  3. token验证
  4. 验证成功进行跳转
  5. 验证失败返回/login

请添加图片描述

1.2 登出流程

登出流程就相对简单,分为2步

  1. 删除Token
  2. 跳转/login

请添加图片描述

2. 登录代码

src/views/login/Login.vue

这个页面纠结了很久,主要是因为vue-cli从4到5后polyfills不再被包含造成一系报错.不得不放弃jwt改用md5实现.
还有个就是加密的话,如果jwt可以用加盐的方式进行加密.
md5原生只能通过特定的进行加密并比较.想了下单纯用用户名做token的md5加密每次进去都会是一样的.需要手工加个盐,那么就把登录时间作为盐,进行加密和验证.
当然这里只是个演示环境用的方法太简单了.生产中肯定不会这么用.或者小伙伴有更好的方法也请留言.

另外这里为了美观,添加了一个图片,如果不喜欢可以注释掉98行

<template>
  <div class="login">
    <!-- 用户登录卡片 -->
    <el-card class="login-card">
      <template #header>
        <div class="login-card-header">
          <span>用户登录</span>
        </div>
      </template>
      <!-- 表单 -->
      <el-form :model="loginData" :rules="loginDataRules" ref="loginData">
        <el-form-item prop="username">
          <!-- 用户名 -->
          <el-input prefix-icon="UserFilled" v-model.trim="loginData.username" maxlength="32" placeholder="请输入账号" clearable></el-input>
        </el-form-item>
        <el-form-item prop="password">
          <!-- 密码 -->
          <el-input prefix-icon="Lock" v-model.trim="loginData.password" maxlength="16" show-password placeholder="请输入密码" clearable></el-input>
        </el-form-item>
        <el-form-item>
          <!-- 登录按钮 -->
          <el-button type="primary" style="width: 100%;border-radius: 2px" :loading="loginLoading" @click="handleLogin">登 录</el-button>
        </el-form-item>
      </el-form>
    </el-card>
  </div>
</template>

<script>
import common from "../common/Config";
import httpClient from '../../utils/request';
import moment from 'moment';
import md5 from 'md5';

export default{
  data() {
    return {
      //加载等待动画
      loginLoading: false,
      //登录验证的后端接口
      loginUrl: common.loginAuth,
      loginData: {
        username: '',
        password: ''
      },
      //校验规则
      loginDataRules: {
        username: [{
          required: true,
          message: '请填写用户名',
          trigger: 'change'
        }],
        password: [{
          required: true,
          message: '请填写密码',
          trigger: 'change'
        }],
      }
    }
  },
  methods: {
    //登录方法
    handleLogin() {
      httpClient.post(this.loginUrl, this.loginData)
          .then(res => {
            //账号密码校验成功后的一系列操作
            localStorage.setItem('username', this.loginData.username);
            localStorage.setItem('loginDate', moment().format('YYYY-MM-DD_HH:mm:ss'));
            const salt = localStorage.getItem('username')+localStorage.getItem('loginDate')
            //生成token
            const tokenExpireTime = new Date(Date.now() + 24 * 60 * 60 * 1000); // 过期时间,24小时后
            // const token = jwt.sign(this.loginData.username, 'test', options);
            const token = md5(salt);
            localStorage.setItem('token', token); // 将Token保存到localStorage中
            localStorage.setItem('tokenExpireTime', tokenExpireTime.getTime().toString()); // 将过期时间保存到localStorage中
            //跳转至根路径
            this.$router.push('/');
            this.$message.success({
              message: res.msg
            })
          })
          .catch(res => {
            this.$message.error({
              message: res.msg
            })
          })
    }
  }
}
</script>

<style scoped>
.login {
  position: absolute;
  width: 100%;
  height: 100%;
  background: aquamarine;
  background-image: url(../../assets/img/login.png);
  background-size: 100%;
}
.login-card {
  position: absolute;
  left: 70%;
  top: 15%;
  width: 350px;
  border-radius: 5px;
  background: rgb(255, 255, 255);
  overflow: hidden;
}
.login-card-header {
  text-align: center;
}
</style>

3. 登录页路由

2.1 login页面

src/router/index.js

    {
        path: '/login',  //url路径
        component: () => import('@/views/login/Login.vue'),  //视图组件
        meta: {title: "登录", requireAuth: false},  //meta元信息
    }

2.2 拦截器

这里去验证是否有token和token是否过期.如果过期了就跳转到/login页面

// 导入md5
import md5 from 'md5';
//路由守卫,路由拦截
router.beforeEach((to, from, next) => {
    //启动进度条
    NProgress.start()
    //设置头部
    if (to.meta.title) {
        document.title = to.meta.title
    } else {
        document.title = "Kubernetes"
    }
    // 放行
    if (window.location.pathname == '/login') {
        next()
    }else{
        // 获取localStorage中保存的Token和过期时间
        const storedToken = localStorage.getItem('token');
        const storedTokenExpireTime = localStorage.getItem('tokenExpireTime');
        // 如果没有保存Token或过期时间,或者Token已经过期,则跳转到登录页面

        if (!storedToken || !storedTokenExpireTime || Date.now() > parseInt(storedTokenExpireTime)) {
            // 删除localStorage中保存的Token和过期时间
            localStorage.removeItem('token');
            localStorage.removeItem('tokenExpireTime');

            // 如果当前不在登录页面,则跳转到登录页面
            if (window.location.pathname !== '/login') {
                window.location.href = '/login';
            }
        } else {
            // 验证Token是否正确
            const salt = localStorage.getItem('username')+localStorage.getItem('loginDate')
            const token = md5(salt); // 使用md5算法生成Token

            if (token === storedToken) {
                // Token正确,且在有效期内,继续进行其他操作
                // TODO: 继续访问
                next()
            } else {
                // Token错误,跳转到登录页面
                localStorage.removeItem('token');
                localStorage.removeItem('tokenExpireTime');

                // 如果当前不在登录页面,则跳转到登录页面
                if (window.location.pathname !== '/login') {
                    window.location.href = '/login';
                }
            }
        }
    }
})

4. 登出代码

src/layout/Layout.vue

这部分还是比较简单的.其实和路由守卫判断token失效是一样的

<script>
	//登出
    logout() {
      //移除用户名
      localStorage.removeItem('username');
      //移除token
      localStorage.removeItem('token');
      //跳转至/login页面
      this.$router.push('/login');
    }
</script>

5. 效果

登录页

请添加图片描述

清理掉本地存储进行登录

请添加图片描述

密码验证成功后会生成username,loginDate,token,tokenExpireTime这4个键值对

其中username存放用户名,loginDate存放登录时间(用于产生过期时间和作为md5运算的盐),token存放md5加密后的token,tokenExpireTime存放token过期时间.

请添加图片描述

此时进行不同页面切换,可以正常访问

请添加图片描述

如果修改username,loginDate,token则会因为token验证失败跳转到登录页面

请添加图片描述

再访问其他任意页面就调回了/login页面并清理掉了token和tokenExpireTime

请添加图片描述

调小tokenExpireTime值一样(将值由1677733016817改为1627733016817)

请添加图片描述

一样会清理掉token和tokenExpireTime并跳转/login

请添加图片描述
至此,整个前后端的开发已经完成.下面进入环境部署环节

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/393843.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue双向绑定原理

Vue双向绑定的原理 vue的双向绑定原理&#xff1a;vue数据的双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的。其核心就是通过obj.defineProperty()方法来实现数据的劫持&#xff0c;在数据变化时发布消息给订阅者&#xff0c;触发相应的监听回调。也就是说数据和视…

windows安装Stable Diffusion WebUI及问题解决记录

本文将详细介绍stable diffusion webui的下载、安装及问题解决。 StableDiffusion是2022年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像&#xff0c;尽管它也可以应用于其他任务&#xff0c;如内补绘制、外补绘制&#xff0c;以及在提示词​&#…

AUTOSAR知识点Com(五):CANIf模式PUD Channel

1、概述 每个L-PDU分配给一个专用的物理CAN通道&#xff0c;该通道连接CAN控制器和CAN网络。通过这种方式&#xff0c;所有属于物理通道的L-PDU都可以在处理逻辑上&#xff0c;单一的L-PDU通道组上进行控制。这些逻辑组表示ECU连接到底层CAN网络的所有I-PDU。图 展示了L-PDU信道…

category排序专辑

case1——对有限类型的字段按指定要求排序&#xff1a; #学历分布 xueli_tsdf.pivot_table(index学历,values教师id,aggfunccount,marginsTrue,margins_name总计) xueli_ts[占比]np.round(xueli_ts[教师id]/xueli_ts.loc[总计,教师id],2) xueli_ts.reset_index(inplaceTrue)xu…

Adding Conditional Control to Text-to-Image Diffusion Models

安全验证 - 知乎知乎&#xff0c;中文互联网高质量的问答社区和创作者聚集的原创内容平台&#xff0c;于 2011 年 1 月正式上线&#xff0c;以「让人们更好的分享知识、经验和见解&#xff0c;找到自己的解答」为品牌使命。知乎凭借认真、专业、友善的社区氛围、独特的产品机制…

Java要学到什么程度才能找工作?小白怎么去面试Java岗位?

作为一个Java初学者&#xff0c;到底要学哪些知识点才能找到月薪过万的工作&#xff1f;或者说&#xff0c;怎样才能适应企业的开发流程&#xff0c;不至于进了公司都不知道怎么把需求转换成代码。甚至&#xff0c;唯唯诺诺的加班&#xff0c;一点自信都没有。本期文章&#xf…

STM32开发(18)----CubeMX配置RTC

CubeMX配置RTC前言一、什么是RTC&#xff1f;RTC时钟源RTC备份域二、实验过程1.CubeMX配置2.代码实现3.实验结果总结前言 本章介绍使用STM32CubeMX对RTC进行配置的方法&#xff0c;RTC的原理、概念和特点&#xff0c;配置各个步骤的功能&#xff0c;并通过实验方式验证。 一、…

Linux常见漏洞修复

一、nginx 修复TLS1.0&#xff0c;TLS1.1协议漏洞 1、漏洞描述 服务端口漏洞名称加固建议nginx443TLS版本1.0协议检测启用对TLS 1.2或1.3的支持&#xff0c;并禁用对TLS 1.0的支持。nginx443TLS版本1.1协议检测启用对TLS 1.2或1.3的支持&#xff0c;并禁用对TLS 1.1的支持。 …

Linux27 -- 通过抓包观察三次握手和四次挥手、链接的状态(tcp状态转移图)、TIME_WAIT 存在的原因

tcp协议的特点&#xff1a; 面向连接的&#xff0c;可靠的&#xff0c;流式服务 //面试常问&#xff1a; 一、通过抓包观察三次握手、四次挥手 工具&#xff1a;tcpdump 命令 抓冲我到他从他到我的数据包。 需要管理员权限。 运行示例&#xff1a; 进入管理员权限&#xff…

使用Advanced Installer打包程序及运行环境

Advanced Installer 工具版本&#xff1a;20.1.1 设置产品信息 选中右侧【Product Details】输入产品信息 设置文件和文件夹 添加使用VS发布之后的程序文件夹 设置文件夹刷新 选中文件夹&#xff0c;右键选择属性&#xff0c;选中Synchronize标签。启用“Synchronize conten…

InfluxDB 2 介绍与使用 flux查询 数据可视化

一、关键概念 相比V1 移除了database 和 RP&#xff0c;增加了bucket。 V2具有以下几个概念&#xff1a; timestamp、field key、field value、field set、tag key、tag value、tag set、measurement、series、point、bucket、bucket schema、organization 新增的概念&…

微服务 分布式搜索引擎 Elastic Search RestAPI

文章目录⛄引言一、RestAPI⛅导入数据⏰mapping映射分析⚡初始化RestClient二、索引库操作⌚创建索引库✒️删除索引库⚡判断索引库是否存在⛵小结⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#x…

synchronized 与 volatile 关键字

目录1.前言1.synchronized 关键字1. 互斥2.保证内存可见性3.可重入2. volatile 关键字1.保证内存可见性2.无法保证原子性3.synchronized 与 volatile 的区别1.前言 synchronized关键字和volatile是大家在Java多线程学习时接触的两个关键字&#xff0c;很多同学可能学习完就忘记…

QSGS四参数随机生长2D软件 quartet structure generation set

软件简介 AbyssFish四参数随机生长2D软件采用四参数随机生长算法quartet structure generation set (QSGS)&#xff0c;可用于构建二维随机孔隙图。 软件提供图片长度、宽度&#xff1b;随机生长算法的分布概率、生长概率、概率密度&#xff08;暂不考虑多相材料相互作用&…

可视化项目管理,控制项目进度,项目经理需要做好以下工作

对于项目的管理者来说&#xff0c;项目信息透明&#xff0c;能够更容易让管理者发现项目中的问题&#xff0c;及时找到问题的原因和相关任务的责任人。 当项目信息能相对精准地呈现给管理者时&#xff0c;也能促进项目成员也能更加认真负责的完成任务&#xff0c;不会找借口推…

Elasticsearch使用——中级篇

在上一篇&#xff0c;已经导入了大量数据到elasticsearch中&#xff0c;实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。本篇&#xff0c;研究下elasticsearch的数据搜索功能。分别使用DSL和RestClient实现搜索。1.DSL查询文档elasticsearch的…

电子技术——功率耗散

电子技术——功率耗散 如今许多集成电路系统都是电池供电的&#xff0c;对于功率耗散限制很严格。其他高性能电路&#xff0c;例如计算机服务器机房产品&#xff0c;有着严格的热耗散功率限制。所以&#xff0c;减小IC中的功率耗散变成了IC设计中最重要的挑战性的设计。 本节…

层次聚类:BIRCH 聚类、Lance–Williams equation

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 BIRCH 聚类 要求数据为向量形式&#xff0c;则通过构建 CF-tree (Clustering Feature Tree) 实现可扩展地高效聚类&#x…

嵌入式linux物联网毕业设计项目智能语音识别基于stm32mp157开发板

stm32mp157开发板FS-MP1A是华清远见自主研发的一款高品质、高性价比的Linux单片机二合一的嵌入式教学级开发板。开发板搭载ST的STM32MP157高性能微处理器&#xff0c;集成2个Cortex-A7核和1个Cortex-M4 核&#xff0c;A7核上可以跑Linux操作系统&#xff0c;M4核上可以跑FreeRT…

数据结构之二叉树(上)

文章目录前言一、二叉树的定义二、二叉树的几种情况三、特殊的二叉树1. 满二叉树2. 完全二叉树四、二叉树的存储结构1. 顺序存储2. 链式存储五、二叉树的性质总结前言 本文主要介绍了二叉树的基本概念以及二叉树的存储结构 一、二叉树的定义 一棵二叉树是结点的一个有限集合&…