【鸿蒙开发实战】鸿蒙密码生成器
·
代码功能概述
这段代码实现了一个完整的鸿蒙密码生成器应用,展示了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免费进入
更多推荐


所有评论(0)