【Vue管理后台】用户登录强制修改密码

【Ruoyi管理后台】用户登录强制修改密码 这篇文章已经实现了这个需求,因为个人业务中强制改密页面是进入系统且浮动于其他页面上方,进入强制改密页面的同时其他页面会向后台请求,如果清空token后会造成其他的请求失败。本文整体步骤与参考博文一致,详细步骤请参考【Ruoyi管理后台】用户登录强制修改密码 这篇文章,本文只是对某些方法进行了简单修改,进入强制改密页面时不清空token,使用Vue的路由守卫来拦截未修改密码的用户访问系统的特定页面。

一、login.vue页面修改

调整 handleLogin 函数,不必暂存token,而是存储res_code和rest_sign。

this.$store.dispatch("Login", this.loginForm).then((res) => {if (res.res_code && res.res_code === 1001) {// 判断到后端接口返回的重置密码标识码// 设置res_code与res_sign,守卫路由获取判断使用localStorage.setItem("res_code", 1001);localStorage.setItem("res_sign", response.reset_sign);// 重定向到重置密码页,并带上校验参数this.redirect = '/reset?' + 'sign=' + res.reset_sign + '&username=' + this.loginForm.username;}this.$router.push({ path: this.redirect || "/" }).catch(()=>{});}).catch(() => {this.loading = false;if (this.captchaOnOff) {this.getCode();}});

二、强制改密页面修改

强制改密页面对博文中页面进行了简单修改,进入页面后不用清空token,增加了统一的关闭窗口方法closeWin,修改成功与取消修改时清空设置内容与token,跳转到登录页面。

<template><el-dialog :close-on-click-modal="false" title="密码过期,请修改密码" :visible.sync="thisVisible" width="600px" append-to-body :show-close="false"><el-form ref="resetForm" :model="resetForm" :rules="secretRules" label-width="80px"><el-row><el-col :span="18"><el-form-item  label="旧密码" prop="oldPassword"><el-input v-model="resetForm.oldPassword" placeholder="请输入旧密码" type="password" :type="oldflagType" maxlength="20" auto-complete="off"><i slot="suffix":class="this.oldflag?'mdi mdi-eye':'mdi mdi-eye-off'"style="margin-top: 8px;font-size: 18px;"@click="getoldFlag()"></i></el-input></el-form-item></el-col></el-row><el-row><el-col :span="18" style="margin-top: 5px"><el-form-item label="新密码" prop="newPassword"><el-input v-model="resetForm.newPassword" placeholder="请输入新密码" type="password" :type="flagType" maxlength="20" auto-complete="off"><i slot="suffix":class="this.flag?'mdi mdi-eye':'mdi mdi-eye-off'"style="margin-top: 8px;font-size: 18px;"@click="getFlag()"></i></el-input></el-form-item></el-col></el-row><el-row><el-col :span="18" style="margin-top: 5px"><el-form-item label="确认密码" prop="confirmPassword"><el-input v-model="resetForm.confirmPassword" placeholder="请再次输入新密码" type="password" :type="reflagType" maxlength="20" auto-complete="off"><i slot="suffix":class="this.reflag?'mdi mdi-eye':'mdi mdi-eye-off'"style="margin-top: 8px;font-size: 18px;"@click="getreFlag()"></i></el-input></el-form-item></el-col></el-row></el-form><div slot="footer" class="dialog-footer"><el-button type="primary" @click="submitForm">确 定</el-button><el-button @click="closeWin" >取 消</el-button></div></el-dialog></template><script>
import { resetUserProfilePwd } from "@/api/system/user";
import { setToken } from '@/utils/auth'import { updateUserPwd } from "@/api/system/user";
import { getCodeImg } from "@/api/login";
import {MessageBox} from "element-ui";
import store from "@/store/store";
export default {name: 'serviceDialog',watch:{sdVasible:{handler(newValue){this.thisVisible = true;}}},data() {const equalToPassword = (rule, value, callback) => {if (this.resetForm.newPassword !== value) {callback(new Error("两次输入的密码不一致"));} else {// const reg = /^(?![A-z0-9]+$)(?![A-z~!@#$%^&*()_+]+$)(?![0-9~!@#$%^&*()_+]+$)([A-z0-9~!@#$%^&*()_+]{12,})/g// if (!reg.test(value)) {//   callback(new Error("输入的密码必须包含数字、大小写字母、符号"));// }callback();}};return {oldflag: false,oldflagType: 'password',flag: false,flagType: 'password',reflag: false,reflagType: 'password',thisVisible:true,resetForm: {username: "",oldPassword: "",newPassword: "",confirmPassword: "",code: "",sign: "",uuid: ""},serviceSelectList: [],secretRules: {oldPassword: [{required: true,message: '请输入旧密码',trigger: 'blur'}],newPassword: [{ required: true, message: "新密码不能为空", trigger: "blur" },{ pattern: /(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[^a-zA-Z0-9]).{8,20}/,message: '新密码长度必须介于 8 和 20 之间,并且包含大写字母、小写字母、数字、特殊字符',  trigger: "blur" }],confirmPassword: [{ required: true, message: "再次输入新密码", trigger: "blur" },{ required: true, validator: equalToPassword, trigger: "blur" },{ pattern: /(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[^a-zA-Z0-9]).{8,20}/,message: '新密码长度必须介于 8 和 20 之间,并且包含大写字母、小写字母、数字、特殊字符',  trigger: "blur"}]}}},mounted() {// 先清除token,防止回退后能直接登录,从而绕过强制重置密码的逻辑//setToken('');// 设置标志位,其他页面拿到这个值后不再向后端发送请求//localStorage.setItem("res_code", 1001);// 获取当前链接的参数const params = this.$route.query;this.resetForm.sign = params.sign;this.resetForm.username = params.username;this.token = params.token;},methods: {getFlag(){this.flag = !this.flag;this.flagType = this.flag?'text':'password'},getoldFlag(){this.oldflag = !this.oldflag;this.oldflagType = this.oldflag?'text':'password'},getreFlag(){this.reflag = !this.reflag;this.reflagType = this.reflag?'text':'password'},closeWin() {this.resetForm={username: "",oldPassword: "",newPassword: "",confirmPassword: "",code: "",sign: "",uuid: ""},this.$emit('closeWin');//删除登录成功设置的token//localStorage.removeItem("reset_token");localStorage.removeItem("res_code");localStorage.removeItem("res_sign");//清除token,强制登录setToken("")// 跳转到登录页//this.$router.push("/authentication/FullLogin");this.$router.push({ path: "/fulllogin" }).catch(() => {});},submitForm(){this.$refs.resetForm.validate(valid => {if (valid) {this.loading = true;resetUserProfilePwd(this.resetForm).then(response => {if(response.code=='200') {MessageBox.confirm('修改成功,新密码是:' + this.resetForm.newPassword, '系统提示', {confirmButtonText: '重新登录',showCancelButton: false, // 关闭取消按钮//cancelButtonText: '取消',type: 'warning'}).then(() => {this.closeWin()}).catch(() => {});}else{this.$message.success("修改失败" );}}).catch(() => {this.loading = false;})}});}}
};
</script>

三、重点:增加守卫路由

使用Vue的路由守卫来拦截密码过期未修改的用户访问系统的特定页面。在用户尝试访问系统的任何页面时,检查用户的密码过期状态,如果用户未修改,则直接显示强制改密页面。

在router.js中增加beforeEach,根据密码状态过滤访问页面,防止用户绕过强制改密页面。

router.beforeEach((to, from, next) => {const token = getToken();const res_code = localStorage.getItem("res_code");const res_sign = localStorage.getItem("res_sign");const username = store.state.user.nameif(token){if(to.name!=='resetPwd' && res_code==='1001'){// 重定向到强制改密页面next({ path: '/resetPwd?' + 'sign=' + res_sign+ '&username=' + username}); }else {next(); // 继续正常的路由}}else{next(); // 继续正常的路由}});

四、参考文章

【Ruoyi管理后台】用户登录强制修改密码

五、致谢

最后感谢博主reui-CSDN博客,以及博主的答疑。

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

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

相关文章

经验报告 - SCADE Suite 6 KCG 经历 DO-178B 认证过程中进行的活动

详细内容可参考 ICFP’09 《Experience Report: Using Objective Caml to Develop Safety-Critical Embedded Tools in a Certification Framework》。 数十年前&#xff0c;民用航空电子机构就定义了机载嵌入式代码的认证要求。DO-178B 标准&#xff08;RTCA/DO-178B&#xff…

5.神经网络-激活函数

目录 1. 激活函数不是阶跃函数 1.1 激活函数和阶跃函数都是非线性函数 1.2 激活函数不是阶跃函数 2. sigmoid 函数 2.1 sigmoid 函数表达式 2.2 sigmoid 函数 Python 实现 2.4 sigmoid 函数图 3. ReLU 函数 3.1 ReLU 函数表达式 3.2 ReLU 函数 Python 实现 3.4 ReLU…

线性集合:ArrayList,LinkedList,Vector/Stack

共同点&#xff1a;都是线性集合 ArrayList ArrayList 底层是基于数组实现的&#xff0c;并且实现了动态扩容&#xff08;当需要添加新元素时&#xff0c;如果 elementData 数组已满&#xff0c;则会自动扩容&#xff0c;新的容量将是原来的 1.5 倍&#xff09;&#xff0c;来…

Rust使用HashSet对Vec类型的元素进行去重

在Rust语言中&#xff0c;对Vec类型的元素进行去重&#xff0c;一种常见的方法是使用一个HashSet来帮助我们快速检查元素是否已经存在。以下是使用HashSet对Vec进行去重的示例代码&#xff1a; use std::collections::HashSet;fn main() {let vec_numbers vec![1, 2, 2, 3, 4…

Java后端初始化项目(项目模板)

介绍 emmmm&#xff0c;最近看了一些网络资料&#xff0c;也是心血来潮&#xff0c;想自己手工搭建一个java后端的初始化项目模板来简化一下开发&#xff0c;也就发一个模板的具体制作流程&#xff0c;&#xff08;一步一步搭建&#xff0c;从易到难&#xff09; ok&#xff…

引用类型String的值传递和引用传递

引用传递(pass by reference)是指在调用方法时将实际参数的地址直接传递到方法中,在方法中对参数所进行的修改,将影响到实际参数。 值传递(pass by value)是指在调用方法时将实际参数拷贝一份传递到方法中,在方法中对参数修改,不会影响到实际参数。 基本类型传的是值的拷…

vue2和vue3区别: 探索关键差异

vue2和vue3区别&#xff1a; 探索关键差异 Vue.js 作为流行的前端框架&#xff0c;其版本 3 带来了许多令人兴奋的改进和新功能。虽然 Vue 3 保持了与 Vue 2 的相似性&#xff0c;但也存在一些关键差异需要开发者注意。本文将通过表格形式&#xff0c;清晰地展现 Vue 2 和 Vue …

在多线程程序中,如何保证线程的安全?

在多线程程序中保证线程安全通常涉及以下一些关键技术和策略&#xff1a; 1. 使用同步机制 同步方法&#xff1a;通过在方法签名前添加 synchronized 关键字&#xff0c;确保一次只有一个线程能够执行该方法。同步代码块&#xff1a;通过 synchronized 关键字同步一个代码块&…

刷代码随想录有感(63):将有序数组转换为二叉搜索树(其实时二叉平衡搜索树)

题干&#xff1a; 代码&#xff1a; class Solution { public:TreeNode* traversal(vector<int>& nums, int left, int right){if(left > right)return NULL;int mid left (right - left)/2;TreeNode* NewRoot new TreeNode(nums[mid]);NewRoot->left tra…

文心一言指令:解锁自然语言处理新时代的技术探索

在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是研究与应用的热点&#xff0c;它致力于让机器理解、生成并运用人类语言&#xff0c;架起人机交互的桥梁。随着技术的飞速发展&#xff0c;一个全新的概念——“文心一言指令”应运而生&#xff0c;这一…

【GO】go语言中的HTTP标准库 - http编程

上一节已经学习了HTTP的基础知识&#xff0c;本章将学习关于go语言的HTTP编程&#xff0c;最重要的是掌握 net/http 包的用法&#xff0c;以及如何自己编写一个简单的Web服务端&#xff0c;通过客户端访问Server端等。 编写简单的Web 服务器 http.ListenAndServe 启动 Http S…

制作跳动的爱心网页效果

html <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>跳动的爱心</title> <link rel&q…

K-means聚类模型:深入解析与应用指南

K-means聚类是一种广泛使用的无监督学习算法&#xff0c;它通过迭代过程将数据集划分为K个聚类。以下是一篇关于K-means聚类模型的技术文章&#xff0c;将从不同的角度进行详尽的描述。 1. 引言 K-means聚类算法是一种简单且高效的聚类方法&#xff0c;广泛应用于数据挖掘、市…

Chatgpt的应用场景

文案创作类&#xff1a; 作为一名大型语言模型&#xff0c;ChatGPT可以为使用者提供多种文本处理和文字创作方面的服务&#xff0c;例如&#xff1a; 文本生成和创作 ChatGPT可以基于您提供的主题、关键词或文本段落&#xff0c;生成符合使用者要求的新文本。这些文本可以是文…

Linux:Figshare网站文件下载(非浏览器)

参考aws亚马逊云下载figshare内容 Linux wget -c 下载网页内容crul -C_figshare怎么下载数据-CSDN博客 尝试一下 mamba search awscli mamba install awscli2.15.48 aws --version通过网页获取下载链接 比如&#xff1a; https://s3-eu-west-1.amazonaws.com/pfigshare-u-…

Centos 停服倒计时!你的操作系统何去何从?

在计算机技术的不断演进中&#xff0c;操作系统扮演着至关重要的角色。然而&#xff0c;对于许多企业和个人用户来说&#xff0c;CentOS的突然停服消息带来了一场不小的冲击。作为一款备受欢迎的企业级Linux发行版&#xff0c;CentOS的停服意味着用户需要重新评估自己的操作系统…

如何清除DNS缓存,刷新DNS

大家在使用域名访问服务器的时候&#xff0c;经常会遇到一个问题&#xff0c;同一个局域网里的两台电脑&#xff0c;一台可以访问而另一台不行。这是为什么呢&#xff1f;这里我要和大家说下DNS缓存的问题&#xff0c;顾名思义&#xff0c;每台电脑都有DNS缓存&#xff0c;在域…

Torch添加、修改子模块

1. add_module link 2.net[2] 对nn.Sequential的索引 import torch.nn as nn model nn.Sequential(nn.Conv2d(1,20,5),nn.ReLU(),nn.Conv2d(20,64,5),nn.ReLU())print(model) print(model[2]) # 通过索引获取第几个层 运行结果为&#xff1a; Sequential((0): Conv2d(1, 2…

2024年数维杯数学建模

高质量原创论文已完成 需要的私我

vue3配置基础路径

我们在部署项目的时候&#xff0c;有时项目很多时&#xff0c;可能并不是直接部署到根目录下&#xff0c;那么就需要给项目配置一个公共目录。例如&#xff1a;www.iotzzh.com/zh-admin&#xff0c;用这个地址去访问项目而不是直接使用www.iotzzh.com。 那么在vue3中需要改两处…