You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Angular 4的popup弹出框中实现密码强度校验功能

Angular 4 弹出框密码强度校验实现方案

前置说明

你可以按需选择弹窗实现方案,以下通用实现不强制引入额外UI依赖,也可适配Angular Material MatDialog、ngx-bootstrap模态框等常用组件。

步骤1:封装密码强度校验工具函数

新建src/app/utils/password-strength.ts文件,存放通用校验逻辑,可根据业务需求调整校验规则:

export enum PasswordStrengthLevel {
  Weak = '弱',
  Medium = '中',
  Strong = '强'
}

// 校验密码强度,返回强度等级、已满足/未满足规则列表
export function checkPasswordStrength(password: string): { 
  level: PasswordStrengthLevel, 
  validRules: string[], 
  invalidRules: string[] 
} {
  // 自定义校验规则,可按需增减
  const rules = [
    { regex: /.{8,}/, text: '长度不少于8位' },
    { regex: /[A-Z]/, text: '包含至少1个大写字母' },
    { regex: /[a-z]/, text: '包含至少1个小写字母' },
    { regex: /[0-9]/, text: '包含至少1个数字' },
    { regex: /[!@#$%^&*(),.?":{}|<>]/, text: '包含至少1个特殊字符' }
  ];
  const validRules = [];
  const invalidRules = [];
  rules.forEach(rule => {
    rule.regex.test(password) ? validRules.push(rule.text) : invalidRules.push(rule.text);
  });
  // 根据已满足规则数量判定强度等级
  let level = PasswordStrengthLevel.Weak;
  if (validRules.length >= 5) level = PasswordStrengthLevel.Strong;
  else if (validRules.length >=3) level = PasswordStrengthLevel.Medium;
  return { level, validRules, invalidRules };
}

步骤2:创建密码弹窗组件

执行命令生成组件:ng generate component password-popup

组件逻辑文件 password-popup.component.ts

import { Component, Output, EventEmitter } from '@angular/core';
import { FormControl } from '@angular/forms';
import { checkPasswordStrength, PasswordStrengthLevel } from 'src/app/utils/password-strength';

@Component({
  selector: 'app-password-popup',
  templateUrl: './password-popup.component.html',
  styleUrls: ['./password-popup.component.css']
})
export class PasswordPopupComponent {
  @Output() close = new EventEmitter<string|null>(); // 关闭弹窗时抛出密码,取消则返回null
  passwordControl = new FormControl('');
  strengthLevel: PasswordStrengthLevel = PasswordStrengthLevel.Weak;
  validRules: string[] = [];
  invalidRules: string[] = [];

  // 输入密码时实时校验
  onPasswordInput() {
    const password = this.passwordControl.value || '';
    const res = checkPasswordStrength(password);
    this.strengthLevel = res.level;
    this.validRules = res.validRules;
    this.invalidRules = res.invalidRules;
  }

  // 强度等级对应色值
  getLevelColor() {
    const colorMap = {
      [PasswordStrengthLevel.Weak]: '#f5222d',
      [PasswordStrengthLevel.Medium]: '#faad14',
      [PasswordStrengthLevel.Strong]: '#52c41a'
    };
    return colorMap[this.strengthLevel] || '#bfbfbf';
  }

  confirm() {
    this.close.emit(this.passwordControl.value);
  }

  cancel() {
    this.close.emit(null);
  }
}

组件模板文件 password-popup.component.html

<div class="popup-wrapper">
  <h3>设置密码</h3>
  <div class="input-group">
    <input 
      type="password" 
      placeholder="请输入密码" 
      [formControl]="passwordControl" 
      (input)="onPasswordInput()"
    >
  </div>
  <!-- 强度指示器 -->
  <div class="strength-wrap">
    <span>密码强度:<span [style.color]="getLevelColor()">{{ strengthLevel }}</span></span>
    <div class="progress-bar">
      <div 
        class="progress-fill" 
        [style.width]="(validRules.length / 5) * 100 + '%'" 
        [style.backgroundColor]="getLevelColor()"
      ></div>
    </div>
  </div>
  <!-- 校验规则展示 -->
  <div class="rules-wrap">
    <p>需满足以下要求:</p>
    <ul>
      <li *ngFor="let rule of invalidRules" class="invalid">❌ {{ rule }}</li>
      <li *ngFor="let rule of validRules" class="valid">✅ {{ rule }}</li>
    </ul>
  </div>
  <!-- 操作按钮 -->
  <div class="btn-group">
    <button (click)="cancel()">取消</button>
    <button (click)="confirm()" [disabled]="invalidRules.length > 0">确认</button>
  </div>
</div>

组件样式文件 password-popup.component.css

.popup-wrapper {
  width: 420px;
  padding: 24px;
  background: #fff;
  border-radius: 8px;
  box-sizing: border-box;
}
.input-group input {
  width: 100%;
  padding: 8px 12px;
  border: 1px solid #d9d9d9;
  border-radius: 4px;
  box-sizing: border-box;
  margin: 12px 0;
}
.progress-bar {
  width: 100%;
  height: 6px;
  background: #f5f5f5;
  border-radius: 3px;
  margin: 8px 0;
  overflow: hidden;
}
.progress-fill {
  height: 100%;
  transition: all 0.3s ease;
}
.rules-wrap ul {
  list-style: none;
  padding-left: 0;
  margin: 8px 0;
  font-size: 14px;
}
.rules-wrap .invalid { color: #999; }
.rules-wrap .valid { color: #52c41a; }
.btn-group {
  display: flex;
  justify-content: flex-end;
  gap: 12px;
  margin-top: 20px;
}
.btn-group button {
  padding: 6px 16px;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}
.btn-group button:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

步骤3:调用弹窗组件

在需要触发弹窗的父组件中直接引用即可,示例用*ngIf控制显隐:

父组件模板

<button (click)="showPwdPopup = true">设置密码</button>
<app-password-popup 
  *ngIf="showPwdPopup"
  (close)="handlePopupClose($event)"
></app-password-popup>

父组件逻辑

showPwdPopup = false;

handlePopupClose(password: string|null) {
  this.showPwdPopup = false;
  if (password) {
    // 处理确认提交的密码逻辑
    console.log('提交的密码:', password);
  }
}

如果使用Angular Material MatDialog,只需将PasswordPopupComponent加入模块的entryComponents数组,调用dialog.open(PasswordPopupComponent)方法即可打开弹窗。


内容的提问来源于stack exchange,提问作者VaraPrasad Panyam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:54:08