自定义组件--密码修改对话框(拿来即用型)

前言

        一个完整的系统中用户登录功能是不可或缺的,因此用户密码的修改对于前端开发者而言也是工作的重要一环,密码修改分为两种情况:一是用户自身想更换密码;另一种是忘记密码只能选择更换密码。本文自定义了一个通用且常见的组件--密码修改对话框,读者可直接拿去复用,效果如下图所示:

 完整的代码实现:

<template>
    <el-dialog
        :visible.sync="openPassWord"
        title="密码修改"
        center
        :lock-scroll="true"
        :show-close="true"
        :modal-append-to-body="true"
        :close-on-click-modal="false"
        :close-on-press-escape="false"
        width="48%"
        @closed="closeForm"
    >
        <el-form
            ref="passwordFormRef"
            :model="passwordForm"
            :rules="passwordRules"
            label-width="8em"
            label-position="left"
        >
            <el-form-item label="原密码:" prop="originalPass">
                <el-input
                    type="password"
                    autocomplete="off"
                    v-model="passwordForm.originalPass"
                    show-password
                    clearable
                    @input="replaceChinese($event, 'originalPass')"
                    maxlength="20"
                ></el-input>
            </el-form-item>
            <el-form-item label="新密码:" prop="newPass">
                <el-input
                    type="password"
                    autocomplete="off"
                    v-model="passwordForm.newPass"
                    show-password
                    clearable
                    @input="replaceChinese($event, 'newPass')"
                    maxlength="20"
                ></el-input>
            </el-form-item>
            <el-form-item label="新密码确认:" prop="confirmPass">
                <el-input
                    type="password"
                    autocomplete="off"
                    v-model="passwordForm.confirmPass"
                    show-password
                    clearable
                    @input="replaceChinese($event, 'confirmPass')"
                    maxlength="20"
                ></el-input>
            </el-form-item>
        </el-form>
        <br />
        <span>
            <p>
                <b><font color="#rrggbb">合法密码定义:</font></b>
            </p>
            <p>(1) 长度不低于8</p>
            <p>(2) 至少包含一位数字</p>
            <p>(3) 至少包含一个英文字母</p>
            <p>(4) 至少包含一个特殊字符</p>
        </span>
        <span slot="footer">
            <el-button type="primary" @click="submit">保存</el-button>
            <el-button @click="closeForm">关闭</el-button>
        </span>
    </el-dialog>
</template>

<script>
export default {
    name: 'PasswordModifyDialog',
    props: {
        userId: String,
    },
    data() {
        return {
            openPassWord: true,
            passwordForm: {
                originalPass: '',
                newPass: '',
                confirmPass: '',
            },
            passwordRules: {
                originalPass: [
                    { required: true, message: '请输入原密码', trigger: 'blur' }
                ],
                newPass: [
                    { required: true, validator: this.validateNewPassword, 
                      trigger: 'blur' }
                ],
                confirmPass: [
                    { required: true, validator: this.validateConfirmPassword,
                      trigger: 'blur'}
                ]
            },
        }
    },
    methods: {
        // 限制中文输入类型
        replaceChinese(value, item) {
            this.passwordForm[item] = String(value).replace(/[^\x00-\xff]/g, '')
        },
        validateNewPassword(rule, value, callback) {
            if (String(value).trim() == '') {
                callback(new Error('请输入新密码'))
            } else if (String(value).length < 8) {
                callback(new Error('密码长度须不少于8位'))
            } else if (value == this.passwordForm.originalPass) {
                callback(new Error('新密码不能和原密码相同'))
            } else if (!value.match('(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9])')) {
                callback(new Error('密码必须包含数字、英文字母和特殊字符'))
            } else {
                callback()
            }
        },
        validateConfirmPassword(rule, value, callback) {
            if (String(value).trim() == '') {
                callback(new Error('请重新输入新密码'))
            } else if (value !== this.passwordForm.newPass) {
                callback(new Error('两次密码输入不一致'))
            } else {
                callback()
            }
        },
        submit() {
            this.$refs.passwordFormRef.validate((valid) => {
                if (valid) {
                    axios({
                        method: 'post',
                        url: '/user/updatePassword',
                        params: {
                            userId: this.userId,
                            originalPass: this.passwordForm.originalPass,
                            newPass: this.passwordForm.newPass,
                            confirmPass: this.passwordForm.confirmPass,
                        }
                    }).then(function (response) {
                        this.$message({
                            message: response.data.message,
                            type: 'success'
                        })
                    }).catch(function (error) {
                        console.log(error)
                    })
                }
            })
        },
        closeForm() {
            this.openPassWord = false
            this.$emit('close')
        }
    }
}
</script>

<style scoped>
/deep/ .el-dialog__header {
    background-color: #bb7feb;
}
/deep/ .el-dialog__title {
    font-weight: bold;
    color: #fff;
    font-size: 22px;
}
/deep/ .el-dialog__body {
    background-color: #fffaf0;
    font-size: 13px;
}
/deep/ .el-dialog__footer {
    background-color: #fffaf0;
}
/deep/ .el-form-item__label {
    font-weight: bold;
}
</style>

备注

1、上述密码修改对话框是做成了一个自定义组件,属性只定义了一个 userId,使用时需在父组件中添加上该属性值,父组件通过该属性将用户名传递给子组件,从而完成密码的修改功能;

2、该对话框有个关闭按钮触发的方法 closeForm() ,在父组件中可以添加一个 @close 的事件方法去处理关闭对话框后的业务逻辑;

3、在通讯方法 axios() 中传递了一个 params 对象给后台,这个 params 对象中涉及到密码字段的在本文未加密,但在实际的工程项目中是必须要加密后传输到后台的,以防黑客抓包获取到用户密码等内部信息造成信息泄露风险,然后后台拿到密文再解密,具体的加解密方法需要读者自行书写添加进去,本文略。

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

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

相关文章

IDEA快速生成项目树形结构图

下图用的IDEA工具&#xff0c;但我觉得WebStorm 应该也可以 文章目录 进入项目根目录下&#xff0c;进入cmd输入如下指令&#xff1a; 只有文件夹 tree . > list.txt 包括文件夹和文件 tree /f . > list.txt 还可以为相关包路径加上注释

【STM32嵌入式系统设计与开发---拓展】——1_9_1上拉输入和下拉输入

在使用GPIO引脚时&#xff0c;上拉输入和下拉输入的选择取决于外部电路的特性和应用需求。以下是它们各自的应用场景&#xff1a; 1、上拉输入&#xff08;Pull-up Input&#xff09; 用途: 当默认状态需要为高电平时。 避免引脚悬空&#xff08;floating&#xff09;导致的…

Three.JS 使用RGBELoader和CubeTextureLoader 添加环境贴图

导入RGBELoader模块&#xff1a; import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader.js"; 使用 addRGBEMappingk(environment, background,url) {rgbeLoader new RGBELoader();rgbeLoader.loadAsync(url).then((texture) > {//贴图模式 经纬…

MongoDB教程(八):mongoDB数据备份与恢复

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言MongoDB 备…

socket功能定义和一般模型

1. socket的功能定义 socket是为了使两个应用程序间进行数据交换而存在的一种技术&#xff0c;不仅可以使同一个主机上两个应用程序间可以交换数据&#xff0c;而且可以使网络上的不同主机间上的应用程序间进行通信。 2. 图解socket的服务端/客户端模型

深度学习落地实战:基于UNet实现血管瘤超声图像分割

前言 大家好&#xff0c;我是机长 本专栏将持续收集整理市场上深度学习的相关项目&#xff0c;旨在为准备从事深度学习工作或相关科研活动的伙伴&#xff0c;储备、提升更多的实际开发经验&#xff0c;每个项目实例都可作为实际开发项目写入简历&#xff0c;且都附带完整的代…

cpp 强制转换

一、static_cast static_cast 是 C 中的一个类型转换操作符&#xff0c;用于在类的层次结构中进行安全的向上转换&#xff08;从派生类到基类&#xff09;或进行不需要运行时类型检查的转换。它主要用于基本数据类型之间的转换、对象指针或引用的向上转换&#xff08;即从派生…

【Redis】集群

文章目录 一、集群是什么&#xff1f;二、 Redis集群分布式存储为什么redis集群的最大槽数是16384&#xff08;不太懂&#xff09;redis的集群主节点数量基本不可能超过1000个 三、 配置集群&#xff08;三主三从&#xff09;3.1 配置config文件3.2 启动六台redis3.2 通过redis…

铜管和铝管、铝管和铝管焊接操作介绍

一、部分品牌冰箱、空调采用铜铝管或铝铝管之间的连接方式&#xff0c;连接方式有以下两种&#xff1a; 1、洛克环&#xff1a;是方便简单的方式&#xff0c;但其需从德国采购&#xff0c;成本过于高昂而且采购周期长&#xff1b; 2、铜铝异种材料钎焊技术&#xff1a;国内可…

怎样在 PostgreSQL 中优化对大表的索引创建和维护的性能开销?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 怎样在 PostgreSQL 中优化对大表的索引创建和维护的性能开销&#xff1f;一、理解大表和索引的概念&am…

[C++]——同步异步日志系统(7)

同步异步日志系统 一、日志器管理模块&#xff08;单例模式&#xff09;1.1 对日志器管理器进行设计1.2 实现日志器管理类的各个功能1.3. 设计一个全局的日志器建造者1.4 测试日志器管理器的接口和全局建造者类 二、宏函数和全局接口设计2.1 新建一个.h,文件,文件里面放我们写的…

小欧吃苹果-OPPO 2024届校招正式批笔试题-数据开发(C卷)

在处理这个问题前&#xff0c;先看一个经典的贪心算法题目。信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统http://ybt.ssoier.cn:8088/problem_show.php?pid1320 注意移动纸牌的贪心策略并不是题目中给出的移动次序&#xff1a;第1堆纸牌9<10&#xff0c;因为是…

几何相关计算

目录 一、 判断两个矩形是否相交 二、判断两条线段是否相交 三、判断点是否在多边形内 四、垂足计算 五、贝塞尔曲线 六、坐标系 一、 判断两个矩形是否相交 当矩形1的最大值比矩形2的最小值都小&#xff0c;那矩形1和矩形2一定不相交&#xff0c;其他同理。 struct Po…

【STM32】按键控制LED光敏传感器控制蜂鸣器(江科大)

一、按键控制LED LED.c #include "stm32f10x.h" // Device header/*** 函 数&#xff1a;LED初始化* 参 数&#xff1a;无* 返 回 值&#xff1a;无*/ void LED_Init(void) {/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENAB…

醇香之旅:探索红酒的无穷魅力

在浩渺的饮品世界里&#xff0c;红酒如同一颗璀璨的星辰&#xff0c;闪烁着诱人的光芒。它以其不同的醇香和深邃的韵味&#xff0c;吸引着无数人的目光。今天&#xff0c;就让我们一起踏上这场醇香之旅&#xff0c;探索雷盛红酒所带来的无穷魅力。 一、初识红酒的醇香 当我们…

去除重复字母

题目链接 去除重复字母 题目描述 注意点 s 由小写英文字母组成1 < s.length < 10^4需保证 返回结果的字典序最小&#xff08;要求不能打乱其他字符的相对位置&#xff09; 解答思路 本题与移掉 K 位数字类似&#xff0c;需要注意的是&#xff0c;并不是每个字母都能…

张量分解(4)——SVD奇异值分解

&#x1f345; 写在前面 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;这里是hyk写算法了吗&#xff0c;一枚致力于学习算法和人工智能领域的小菜鸟。 &#x1f50e;个人主页&#xff1a;主页链接&#xff08;欢迎各位大佬光临指导&#xff09; ⭐️近…

01 机器学习概述

目录 1. 基本概念 2. 机器学习三要素 3. 参数估计的四个方法 3.1 经验风险最小化 3.2 结构风险最小化 3.3 最大似然估计 3.4 最大后验估计 4. 偏差-方差分解 5. 机器学习算法的类型 6. 数据的特征表示 7. 评价指标 1. 基本概念 机器学习&#xff08;Machine Le…

【python】PyQt5的窗口界面的各种交互逻辑实现,轻松掌控图形化界面程序

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

C# modbus 图表

控件&#xff1a;chart1(图表)&#xff0c;cartesianChart1(第三方添加图表)&#xff0c;timer(时间) 添加第三方&#xff1a; 效果&#xff1a;图标会根据连接的温度&#xff0c;湿度用timer时间进行改变 Chart1控件样式&#xff1a;Series添加线条&#xff0c;颜色&#xf…