代码功能概述

这段代码实现了一个完整的鸿蒙密码生成器应用,展示了ArkTS在随机数生成、选项配置和剪贴板操作等方面的核心能力。主要功能包括:

- 密码生成:基于用户配置的字符类型和长度生成随机密码

- 强度评估:实时计算并可视化显示密码强度等级

- 配置管理:通过滑块和开关组件调节密码参数

- 复制功能:模拟将生成的密码复制到系统剪贴板

- 实时反馈:提供密码强度指示和操作状态提示

2. 代码逻辑分析

应用采用"状态驱动UI"的现代化开发模式:

1. 初始化阶段:应用启动时,通过`aboutToAppear()`生命周期方法生成初始密码

2. 状态管理:使用多个`@State`装饰器管理密码生成的各种状态参数

3. 用户交互:

   - 调节密码长度滑块 → 更新`passwordLength` → 重新生成密码

   - 切换字符类型开关 → 更新对应布尔状态 → 重新生成密码

   - 点击操作按钮 → 触发密码生成或复制功能

4. 实时计算:每次密码生成后自动计算强度等级并更新UI显示

完整代码:

// 鸿蒙密码生成器 - PasswordGeneratorTutorial.ets
// 本应用演示ArkTS的随机数生成、选项配置和剪贴板操作

@Entry
@Component
struct PasswordGeneratorTutorial {
  // @State装饰器:管理密码生成状态
  @State generatedPassword: string = '';
  @State passwordLength: number = 12;
  @State includeUppercase: boolean = true;
  @State includeLowercase: boolean = true;
  @State includeNumbers: boolean = true;
  @State includeSymbols: boolean = false;
  @State strengthLevel: number = 0;
  @State isCopied: boolean = false;

  // 字符集定义
  private readonly UPPERCASE: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  private readonly LOWERCASE: string = 'abcdefghijklmnopqrstuvwxyz';
  private readonly NUMBERS: string = '0123456789';
  private readonly SYMBOLS: string = '!@#$%^&*()_+-=[]{}|;:,.<>?';

  // 生命周期:组件创建时生成初始密码
  aboutToAppear() {
    this.generatePassword();
  }

  build() {
    Column({ space: 20 }) {
      // 应用标题
      Text('密码生成器')
        .fontSize(32)
        .fontWeight(FontWeight.Bold)
        .fontColor('#2C3E50')
        .margin({ top: 20 })

      // 密码显示区域
      this.BuildPasswordDisplay()

      // 密码强度指示器
      this.BuildStrengthIndicator()

      // 长度调节器
      this.BuildLengthSlider()

      // 字符类型选项
      this.BuildCharacterOptions()

      // 操作按钮
      this.BuildActionButtons()
    }
    .width('100%')
    .height('100%')
    .padding(20)
    .backgroundColor('#ECF0F1')
  }

  // 构建密码显示区域 - 演示文本选择和复制功能
  @Builder BuildPasswordDisplay() {
    Column({ space: 10 }) {
      // 密码显示框
      Text(this.generatedPassword)
        .fontSize(24)
        .fontWeight(FontWeight.Medium)
        .fontColor('#2C3E50')
        .textAlign(TextAlign.Center)
        .width('100%')
        .padding(20)
        .backgroundColor(Color.White)
        .border({ width: 2, color: '#3498DB' })
        .borderRadius(12)
        .onClick(() => {
          this.copyToClipboard();
        })

      // 复制状态提示
      if (this.isCopied) {
        Text('已复制到剪贴板!')
          .fontSize(14)
          .fontColor('#27AE60')
      }
    }
    .width('100%')
  }

  // 构建强度指示器 - 演示条件样式
  @Builder BuildStrengthIndicator() {
    Column({ space: 8 }) {
      // 强度标签
      Row({ space: 10 }) {
        Text('密码强度:')
          .fontSize(16)
          .fontColor('#7F8C8D')

        Text(this.getStrengthText())
          .fontSize(16)
          .fontWeight(FontWeight.Medium)
          .fontColor(this.getStrengthColor())
      }
      .width('100%')
      .justifyContent(FlexAlign.SpaceBetween)

      // 强度进度条
      Row({ space: 5 }) {
        // 修复:明确指定数组类型和索引类型
        ForEach(Array.from({ length: 4 }), (_: undefined, index: number) => {
          Rect()
            .width('23%')
            .height(8)
            .fill(index < this.strengthLevel ? this.getStrengthColor() : '#BDC3C7')
            .borderRadius(4)
        })
      }
      .width('100%')
    }
    .width('100%')
    .padding(15)
    .backgroundColor(Color.White)
    .borderRadius(10)
  }

  // 构建长度调节器 - 演示Slider组件
  @Builder BuildLengthSlider() {
    Column({ space: 10 }) {
      Row({ space: 10 }) {
        Text('密码长度:')
          .fontSize(16)
          .fontColor('#7F8C8D')
          .layoutWeight(1)

        Text(this.passwordLength.toString())
          .fontSize(18)
          .fontWeight(FontWeight.Bold)
          .fontColor('#2C3E50')
      }
      .width('100%')

      Slider({
        value: this.passwordLength,
        min: 4,
        max: 32,
        step: 1,
        style: SliderStyle.OutSet
      })
        .onChange((value: number) => {
          this.passwordLength = Math.floor(value);
          this.generatePassword();
        })
        .width('100%')
        .trackColor('#BDC3C7')
        .selectedColor('#3498DB')
    }
    .width('100%')
    .padding(15)
    .backgroundColor(Color.White)
    .borderRadius(10)
  }

  // 构建字符类型选项 - 演示Toggle组件组
  @Builder BuildCharacterOptions() {
    Column({ space: 12 }) {
      Text('字符类型:')
        .fontSize(16)
        .fontColor('#7F8C8D')
        .alignSelf(ItemAlign.Start)

      // 大写字母选项
      this.BuildOptionToggle('包含大写字母 (A-Z)', this.includeUppercase, (value: boolean) => {
        this.includeUppercase = value;
        this.generatePassword();
      })

      // 小写字母选项
      this.BuildOptionToggle('包含小写字母 (a-z)', this.includeLowercase, (value: boolean) => {
        this.includeLowercase = value;
        this.generatePassword();
      })

      // 数字选项
      this.BuildOptionToggle('包含数字 (0-9)', this.includeNumbers, (value: boolean) => {
        this.includeNumbers = value;
        this.generatePassword();
      })

      // 符号选项
      this.BuildOptionToggle('包含符号 (!@#$)',
        this.includeSymbols, (value: boolean) => {
          this.includeSymbols = value;
          this.generatePassword();
        })
    }
    .width('100%')
    .padding(15)
    .backgroundColor(Color.White)
    .borderRadius(10)
  }

  // 构建选项开关 - 演示@Builder复用
  @Builder BuildOptionToggle(label: string, isOn: boolean, onChange: (value: boolean) => void) {
    Row({ space: 10 }) {
      Text(label)
        .fontSize(14)
        .fontColor('#2C3E50')
        .layoutWeight(1)
        .textAlign(TextAlign.Start)

      Toggle({ type: ToggleType.Switch, isOn: isOn })
        .onChange(onChange)
        .width(40)
    }
    .width('100%')
  }

  // 构建操作按钮 - 演示多个按钮布局
  @Builder BuildActionButtons() {
    Row({ space: 15 }) {
      // 生成新密码按钮
      Button('重新生成')
        .onClick(() => {
          this.generatePassword();
        })
        .backgroundColor('#3498DB')
        .fontColor(Color.White)
        .layoutWeight(1)
        .height(50)
        .borderRadius(10)

      // 复制按钮
      Button('复制密码')
        .onClick(() => {
          this.copyToClipboard();
        })
        .backgroundColor('#2ECC71')
        .fontColor(Color.White)
        .layoutWeight(1)
        .height(50)
        .borderRadius(10)
    }
    .width('100%')
  }

  // 生成密码 - 核心算法
  private generatePassword(): void {
    // 构建可用字符集
    let charPool: string = '';

    if (this.includeLowercase) charPool += this.LOWERCASE;
    if (this.includeUppercase) charPool += this.UPPERCASE;
    if (this.includeNumbers) charPool += this.NUMBERS;
    if (this.includeSymbols) charPool += this.SYMBOLS;

    // 检查是否有可用的字符类型
    if (charPool.length === 0) {
      this.generatedPassword = '请选择至少一种字符类型';
      this.strengthLevel = 0;
      return;
    }

    // 生成密码
    let password: string = '';
    const poolLength: number = charPool.length;

    for (let i = 0; i < this.passwordLength; i++) {
      const randomIndex: number = Math.floor(Math.random() * poolLength);
      password += charPool[randomIndex];
    }

    this.generatedPassword = password;
    this.calculateStrength();
    this.isCopied = false;
  }

  // 计算密码强度
  private calculateStrength(): void {
    let strength: number = 0;

    // 长度评分
    if (this.passwordLength >= 16) strength += 2;
    else if (this.passwordLength >= 12) strength += 1;

    // 字符类型多样性评分
    let typeCount: number = 0;
    if (this.includeLowercase) typeCount++;
    if (this.includeUppercase) typeCount++;
    if (this.includeNumbers) typeCount++;
    if (this.includeSymbols) typeCount++;

    if (typeCount >= 4) strength += 2;
    else if (typeCount >= 3) strength += 1;

    this.strengthLevel = Math.min(strength, 3);
  }

  // 获取强度文本
  private getStrengthText(): string {
    const texts: string[] = ['弱', '一般', '强', '非常强'];
    return texts[this.strengthLevel];
  }

  // 获取强度颜色
  private getStrengthColor(): string {
    const colors: string[] = ['#E74C3C', '#F39C12', '#F1C40F', '#27AE60'];
    return colors[this.strengthLevel];
  }

  // 复制到剪贴板(模拟)
  private copyToClipboard(): void {
    if (this.generatedPassword && !this.generatedPassword.includes('请选择')) {
      // 在实际应用中,这里会调用系统剪贴板API
      console.log('复制密码:', this.generatedPassword);
      this.isCopied = true;

      // 3秒后隐藏复制提示
      setTimeout(() => {
        this.isCopied = false;
      }, 3000);
    }
  }
}

想入门鸿蒙开发又怕花冤枉钱?别错过!现在能免费系统学 -- 从 ArkTS 面向对象核心的类和对象、继承多态,到吃透鸿蒙开发关键技能,还能冲刺鸿蒙基础 +高级开发者证书,更惊喜的是考证成功还送好礼!快加入我的鸿蒙班,一起从入门到精通,班级链接:点击https://developer.huawei.com/consumer/cn/training/classDetail/b7365031334e4353a9a0fd6785bb0791?type=1?ha_source=hmosclass&ha_sourceId=89000248免费进入

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐