Vue实现登录功能

一、Vue登录逻辑梳理:

1、登录流程

  • 用户在前端输入用户名和密码,点击登录按钮。

登录成功后的逻辑:

主要功能和流程:

  1. 异步函数 signInSuccess:这是一个异步函数,使用了 async 关键字,意味着函数内部可能包含异步操作。

  2. 后端权限控制:首先调用 initBackEndControlRoutes() 函数来初始化后端控制路由,并等待其返回结果。如果 isNoPower 为真(即没有权限),则显示警告消息,清除会话信息(可能是用户信息或令牌等)。

  3. 登录成功处理:如果有权限,继续执行登录成功后的逻辑。具体包括:

    • 初始化当前时间信息并格式化。
    • 检查路由中是否有 redirect 参数,如果有则根据参数进行路由跳转,否则跳转到根路径 /
    • 显示登录成功提示信息,包括当前时间和登录文本。
    • 启动加载状态,可能是为了防止页面首次加载时出现空白或显示加载状态。
  4. 路由跳转:根据条件进行路由跳转,可能是根据 URL 中的参数决定跳转目标。

  5. 消息提示:使用 useMessage() 函数来显示不同类型的消息,包括警告和成功消息。

  6. 加载状态:使用 NextLoading.start() 来启动加载状态,可能是为了提供更好的用户体验。

总体来说,这段代码主要负责处理用户登录成功后的一系列操作,包括权限控制、路由跳转、消息提示和加载状态管理。如果你有任何具体问题或需要进一步解释,请随时告诉我。

 

全局的加载状态管理功能:

 

NextLoading 的对象,用于管理页面的全局加载状态。让我来解释一下这段代码的主要功能和结构:

  1. 导入依赖:代码中导入了 Vue 3 中的 nextTick 方法以及一个自定义的样式表 loading.scss

  2. 全局 Loading 对象NextLoading 对象包含两方法:

    • start() 方法:用于创建加载状态。在页面中动态创建一个包含加载动画的元素,并插入到页面的顶部,显示加载状态。设置了 window.nextLoading 变量为 true,可能用于全局状态管理。
    • done(time) 方法:用于移除加载状态。通过 nextTick 等待页面更新后再执行,可以传入一个延迟时间 time,在延迟后移除加载状态元素,并将 window.nextLoading 变量设置为 false
  3. 加载元素结构start() 方法中创建的加载状态元素包含了一组加载动画的 HTML 结构,通过设置不同的类名和样式来展示加载效果。

  4. 动态插入和移除:在 start() 方法中,将创建的加载状态元素插入到页面的顶部,显示加载状态。在 done() 方法中,通过查询元素并移除的方式来隐藏加载状态。

  5. 全局状态管理:通过设置 window.nextLoading 变量来记录加载状态,可能在其他地方用于判断页面是否处于加载状态。

这段代码的作用是在页面中实现一个全局的加载状态管理功能,通过调用 NextLoading.start() 和 NextLoading.done() 方法来显示和隐藏加载状态。这样的实现可以提升用户体验,让用户清晰地知道页面正在加载中。

JS:

/**
 * 页面全局 Loading
 * @method start 创建 loading
 * @method done 移除 loading
 */
const NextLoading = {
    // 创建 loading
    start: () => {
        const bodys = document.body;
        const div = document.createElement('div');
        div.setAttribute('class', 'loading-next');
        const htmls = `
            <div class="loading-next-box">
                <div class="loading-next-box-warp">
                    <div class="loading-next-box-item"></div>
                    <div class="loading-next-box-item"></div>
                    <div class="loading-next-box-item"></div>
                    <div class="loading-next-box-item"></div>
                    <div class="loading-next-box-item"></div>
                    <div class="loading-next-box-item"></div>
                    <div class="loading-next-box-item"></div>
                    <div class="loading-next-box-item"></div>
                    <div class="loading-next-box-item"></div>
                </div>
            </div>
        `;
        div.innerHTML = htmls;
        bodys.insertBefore(div, bodys.childNodes[0]);
        window.nextLoading = true;
    },
    // 移除 loading
    done: (time = 0) => {
        setTimeout(() => {
            window.nextLoading = false;
            const el = document.querySelector('.loading-next');
            if (el) {
                el.parentNode.removeChild(el);
            }
        }, time);
    },
};

 

前端控制路由的初始化方法和相关功能的实现。它主要涉及到前端控制路由的权限管理和动态路由添加。以下是代码的详细介绍:

  1. 初始化前端控制路由initFrontEndControlRoutes 方法是用于初始化前端控制路由的方法。它包括界面 loading 动画开始执行、初始化用户信息、添加动态路由以及设置递归过滤有权限的路由到 Pinia 的 routesList 中。

  2. 添加动态路由setAddRoute 方法用于添加动态路由。它循环处理 baseRoutes 第一个顶级 children 的路由一维数组,并通过 router.addRoute 方法添加路由。

  3. 删除/重置路由frontEndsResetRoute 方法用于删除或重置路由。它也循环处理 baseRoutes 第一个顶级 children 的路由一维数组,并通过 router.removeRoute 方法删除路由。

  4. 过滤有权限的路由setFilterRouteEnd 方法用于获取有当前用户权限标识的路由数组,并进行对原路由的替换。它替换 baseRoutes 第一个顶级 children 的路由,并添加 notFoundAndNoPower 路由。

  5. 缓存多级嵌套数组处理后的一维数组setCacheTagsViewRoutes 方法用于缓存多级嵌套数组处理后的一维数组。它用于 tagsView、菜单搜索中,未过滤隐藏的路由。

  6. 设置递归过滤有权限的路由setFilterMenuAndCacheTagsViewRoutes 方法用于设置递归过滤有权限的路由到 Pinia 的 routesList 中,并缓存多级嵌套数组处理后的一维数组。

  7. 判断用户权限hasRoles 方法用于判断路由的 meta.roles 中是否包含当前登录用户的权限字段。

  8. 过滤有权限的路由setFilterHasRolesMenu 方法用于获取当前用户权限标识去比对路由表,设置递归过滤有权限的路由。

这些方法共同实现了前端控制路由的权限管理和动态路由添加的功能。

 

  • 前端发送登录请求到后端的登录接口,携带用户名和密码。
  • 后端接收请求,验证用户名和密码,验证成功后生成一个 token,并返回给前端。

2.Token 存储

   前端接收到 token 后,将 token 存储到 localStorage 、sessionStorage和 Vuex (pinia)中。

2.1  封装 localStorage 和 sessionStorage:

import Cookies from "js-cookie";

const Local = {
    setKey(key) {
        return `${__NEXT_NAME__}:${key}`;
    },
    set(key, val) {
        window.localStorage.setItem(Local.setKey(key), JSON.stringify(val));
    },
    get(key) {
        let json = window.localStorage.getItem(Local.setKey(key));
        return JSON.parse(json);
    },
    remove(key) {
        window.localStorage.removeItem(Local.setKey(key));
    },
    clear() {
        window.localStorage.clear();
    },
};

const Session = {
    set(key, val) {
        if (key === 'token' || key === 'refresh_token') {
            Cookies.set(key, val);
        }
        window.sessionStorage.setItem(key, JSON.stringify(val));
    },
    get(key) {
        if (key === 'token' || key === 'refresh_token') return Cookies.get(key);
        let json = window.sessionStorage.getItem(key);
        return JSON.parse(json);
    },
    remove(key) {
        if (key === 'token' || key === 'refresh_token') return Cookies.remove(key);
        window.sessionStorage.removeItem(key);
    },
    clear() {
        Cookies.remove('token');
        Cookies.remove('refresh_token');
        Cookies.remove('tenantId');
        window.sessionStorage.clear();
    },
    getToken() {
        return this.get('token');
    },
    getTenant() {
        return Local.get('tenantId') ? Local.get('tenantId') : 1;
    },
};

2.前端在每次路由跳转时,检查 localStorage 中是否存在 token,如果不存在则跳转到登录页面。

3.请求头携带 Token

  • 在每次向后端发送请求时,前端在请求头中加入 token,以便后端验证用户身份。

4.后端验证 Token

  • 后端在接收到请求时,判断请求头中是否携带 token。
  • 如果有 token,后端验证 token 的有效性,验证成功则返回数据,验证失败(如 token 过期)则返回 401 状态码。
  • 如果请求头中没有 token,则返回 401 状态码。

5.401 状态码处理

  • 前端在接收到 401 状态码时,清除 localStorage 和 Vuex 中的 token 信息。
  • 前端跳转到登录页面,提示用户重新登录。
  • 可以考虑实现一个 token 刷新机制,尝试使用 refresh token 来获取新的 access token,避免用户频繁登录。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「Mac畅玩鸿蒙与硬件26」UI互动应用篇3 - 倒计时和提醒功能实现

本篇将带领你实现一个倒计时和提醒功能的应用&#xff0c;用户可以设置倒计时时间并开始计时。当倒计时结束时&#xff0c;应用会显示提醒。该项目涉及时间控制、状态管理和用户交互&#xff0c;是学习鸿蒙应用开发的绝佳实践项目。 关键词 UI互动应用倒计时器状态管理用户交互…

(62)使用RLS自适应滤波器进行系统辨识的MATLAB仿真

文章目录 前言一、基本概念二、RLS算法原理三、RLS算法的典型应用场景四、MATLAB仿真代码五、仿真结果1.滤波器的输入信号、参考信号、输出信号、误差信号2.对未知系统进行辨识得到的系数 总结与后续 前言 RLS&#xff08;递归最小二乘&#xff09;自适应滤波器是一种用于系统…

Oracle 12C安装教程

Oracle 12c&#xff0c;全称Oracle Database 12c&#xff0c;是Oracle 11g的升级版&#xff0c;新增了很多新的特性。 Oracle 12c下载 打开Oracle的官方中文网站&#xff0c;选择相应的版本即可。 下载地址&#xff1a;http://www.oracle.com/technetwork/cn/database/enterp…

探索空间计算与 VR 设备的未来:4K4DGen 高分辨率全景 4D 内容生成系统

在当今科技飞速发展的时代,空间计算和 VR 设备正逐渐成为人们体验沉浸式场景的重要工具。而今天,我们要为大家介绍一款具有创新性的技术 ——4K4DGen 高分辨率全景 4D 内容生成系统,它为 VR/AR 沉浸式体验带来了全新的可能性。 一、项目概述 4K4DGen 项目的核心目标是实现 …

【无标题】项目管理软件:日常任务管理,TODO任务清单

无论是在工作、学习还是个人事务的处理上&#xff0c;我们都面临着众多的任务和事项。而 TODO 任务管理&#xff0c;可以帮助我们高效、有序的完成工作任务。 TODO 任务管理的重要性&#xff1a; TODO 任务管理不仅仅是简单地列出要做的事情&#xff0c;它是一种系统性的方法…

数据库中的用户管理和权限管理

​ 我们进行数据库操作的地方其实是数据库的客户端&#xff0c;是我们在客户端将操作发送给数据库的服务器&#xff08;MySQL的服务器是mysqld&#xff09;&#xff0c;由数据库处理之后发送回来处理结果&#xff08;其实就是一种网络服务&#xff09;。所以可以存在多个客户端…

HTML 块级元素和内联(行内)元素详解

在 HTML 中,元素根据它们在页面中的表现方式分为两类:块级元素 和 内联元素(行内元素)。了解块级元素和内联元素的特性与使用方法,是掌握HTML开发的重要基础。本文将深入探讨这两类元素的特点及其在实际开发中的应用。 文章目录 一、块级元素1.1 块级元素是什么?1.2 块级…

科研绘图系列:R语言差异分析双侧柱状图(grouped barplot)

文章目录 介绍加载R包数据画图系统信息介绍 双侧柱状图(grouped barplot),也称为分组柱状图,是一种用于展示不同组别之间比较的数据可视化图表。它通过将不同组别的柱状图并排放置,可以直观地比较不同组在各个类别上的表现或特征。以下是双侧柱状图的一些关键特点和用途:…

【数据结构】哈希/散列表

目录 一、哈希表的概念二、哈希冲突2.1 冲突概念2.2 冲突避免2.2.1 方式一哈希函数设计2.2.2 方式二负载因子调节 2.3 冲突解决2.3.1 闭散列2.3.2 开散列&#xff08;哈希桶&#xff09; 2.4 性能分析 三、实现简单hash桶3.1 内部类与成员变量3.2 插入3.3 获取value值3.4 总代码…

Go语言基础语法

一、创建工程 说明&#xff1a; &#xff08;1&#xff09;go.mod文件是go项目依赖管理文件&#xff0c;相当于前端的package.json&#xff0c;也就是Java项目中的Maven的pom.xml。 二、打印数据到控制台 &#xff08;1&#xff09;引入fmt &#xff08;2&#xff09;使用fmt…

class com.alibaba.fastjson2.JSONObject cannot be cast to class com.ruoyi.sys

class com.alibaba.fastjson2.JSONObject cannot be cast to class com.ruoyi.sys ry-cloud报错原因解决 ry-cloud 报错 系统监控→在线用户打开后报错 报错信息如下 class com.alibaba.fastjson2.JSONObject cannot be cast to class com.ruoyi.sys原因 type导致&#xff…

用 Python 从零开始创建神经网络(一)

用 Python 从零开始创建神经网络&#xff08;一&#xff09; 引言1. A Single Neuron&#xff1a;Example 1代码部分&#xff1a; Example 2代码部分&#xff1a; 2. A Layer of Neurons&#xff1a;Example 1代码部分&#xff1a; 引言 本教程专为那些对神经网络已有基础了解…

双指针算法习题解答

1.移动零 题目链接&#xff1a;283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a;该题要求将数组中为0的元素全部转移到数组的末尾&#xff0c;同时不能改变非零元素的相对位置。 解题思路&#xff1a;我们可以用变量dest和cur将该数组分为三个区域。…

思源笔记轻松连接本地Ollama大语言模型,开启AI写作新体验!

文章目录 前言1. 下载运行Ollama框架2. Ollama下载大语言模型3. 思源笔记设置连接Ollama4. 测试笔记智能辅助写作5. 安装Cpolar工具6. 配置Ollama公网地址7. 笔记设置远程连接Ollama8. 固定Ollama公网地址 前言 今天我们要聊聊如何通过cpolar内网穿透技术&#xff0c;把国产笔…

SAP ABAP开发学习——WDA 五 使用表格控件实例

目录 实现 先建一个Web Dynpro Component 将两个view关联 input_view中添加按钮 output_view创建按钮 创建一个服务 input_view中使用向导创建两个输入框 output部分创建输出表单 output inbound 创建APPLICATION 效果 实现 先建一个Web Dynpro Component 将两个vi…

qt QCompleter详解

1、概述 QCompleter是Qt框架中的一个类&#xff0c;用于为文本输入提供自动完成功能。它可以与Qt的输入控件&#xff08;如QLineEdit、QTextEdit等&#xff09;结合使用&#xff0c;根据用户的输入实时过滤数据源&#xff0c;并在输入控件下方或内部显示补全建议列表。用户可以…

数据采集-Kepware连接倍福(Beckhoff)PLC(OPCUA协议)

KepserverEX 连接倍福(beckhoff)-ADS协议 系列文章目录 数据采集-Kepware 安装证书异常处理 数据采集-Kepware OPCUA 服务器实现 数据采集-Kepware连接倍福(Beckhoff)PLC(ADS协议) 目录 KepserverEX 连接倍福(beckhoff)-ADS协议系列文章目录前言一、OPC UA&#xff08;OPC统一…

vue中html如何转成pdf下载,pdf转base64,忽略某个元素渲染在pdf中,方法封装

一、下载 html2Canvas jspdf npm install jspdf html2canvas二、封装转换下载方法 htmlToPdf.js import html2Canvas from html2canvas import JsPDF from jspdf/*** param {*} reportName 下载时候的标题* param {*} isDownload 是否下载默认为下载&#xff0c;传false不…

接口测试面试题及答案(后续)

一、你们什么时候测试接口 一般有需求就会做&#xff0c;后台的接口开发好&#xff0c;就可以开始测。例外&#xff0c;如果增加了新需求&#xff0c;也要做接口测试&#xff0c;还有就是开发对后台的接口做了修改&#xff0c;交互逻辑发生变化&#xff0c;我们也要重新对接口…

萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?

随着智慧城市和数字化转型的推进&#xff0c;视频监控系统已成为保障公共安全、提升管理效率的重要工具。特别是在大中型项目中&#xff0c;跨区域的网络化视频监控需求日益增长&#xff0c;这要求视频监控管理平台不仅要具备强大的视频资源管理能力&#xff0c;还要能够适应多…