import { Component, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators, AbstractControl } from '@angular/forms'; import { NzMessageService } from 'ng-zorro-antd/message'; import { NzSafeAny } from 'ng-zorro-antd/core/types'; import { HttpClient } from '@angular/common/http'; import { NzModalRef } from 'ng-zorro-antd/modal'; @Component({ selector: 'app-forget', templateUrl: './forget.component.html', styleUrls: ['./forget.component.scss'] }) export class ForgetComponent implements OnInit { validateForm!: FormGroup; validateForm2!: FormGroup; validateForm3!: FormGroup; constructor(private fb: FormBuilder, private message: NzMessageService, private http: HttpClient, private modal: NzModalRef) { } ngOnInit(): void { this.validateForm = this.fb.group({ account: [null, [Validators.required]] }); this.validateForm2 = this.fb.group({ code: [null, [Validators.required]] }); const { password } = MyValidators; this.validateForm3 = this.fb.group({ newpassword: [null, [Validators.required, password]], affirmpassword: [null, [Validators.required, password]] }); } currentStep = 1 phoneNum: string step1() { console.log(this.validateForm) if (this.validateForm.invalid) { this.message.create('warning', '请填写完整'); } else { this.http.get('/api/services/app/User/GetPhoneNumber', { params: { userName: this.validateForm.value.account } }).subscribe({ next: (data: any) => { this.phoneNum = data.result this.currentStep = 2 } }) } } //发送验证码 codeCountDown = 0 code() { let params = { userName: this.validateForm.value.account, } this.http.post('/api/services/app/User/SendVerificationCode', null, { params: params }).subscribe({ next: (data: any) => { this.message.create('success', '已发送'); //按钮倒计时 this.codeCountDown = 30 let codesetInterval = setInterval(() => { this.codeCountDown = this.codeCountDown - 1 if (this.codeCountDown == 0) { clearInterval(codesetInterval) } }, 1000); } }) } step2() { if (this.validateForm2.invalid) { this.message.create('warning', '请填写完整'); } else { console.log(this.validateForm.value.account) let params = { userName: this.validateForm.value.account, code: this.validateForm2.value.code } this.http.get('/api/services/app/User/VerifyVerificationCode', { params: params }).subscribe({ next: (data: any) => { this.currentStep = 3 } }) } } step3() { if (this.validateForm3.valid) { let word = JSON.parse(JSON.stringify(this.validateForm3.value.newpassword)).toLowerCase() if (this.validateForm3.value.newpassword != this.validateForm3.value.affirmpassword) { this.message.create('warning', '两次密码输入不一致!'); return false } if (word.indexOf('sino') != -1 || word.indexOf('zhonghua') != -1) { this.message.create('warning', '口令禁止包含 sinochem、sino、zhonghua (含大小写变体) 等中国中化相关字符'); return false } else { let body = { userName: this.validateForm.value.account, code: this.validateForm2.value.code, newPassword: this.validateForm3.value.newpassword, } this.http.post('/api/services/app/User/ChangePasswordBySms', body).subscribe(data => { this.message.create('success', '修改成功!'); this.modal.close() return true }, err => { return false }) } } else { this.message.create('warning', '请填写完整!'); return false } } } export type MyErrorsOptions = { 'zh-cn': string; en: string } & Record; export type MyValidationErrors = Record; export class MyValidators extends Validators { static password(control: AbstractControl): MyValidationErrors | null { const value = control.value; if (isEmptyInputValue(value)) { return null; } return isPassword(value) ? null : { mobile: { 'zh-cn': `长度至少 8 位,必须包含大写字母、小写字母、数字、符号四种中的三种,且口令禁止包含 sinochem、sino、zhonghua (含大小写变体) 等中国中化相关字符`, en: `Password phone number is not valid` } }; } } function isEmptyInputValue(value: NzSafeAny): boolean { return value == null || value.length === 0; } function isPassword(value: string): boolean { return typeof value === 'string' && /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\W_!@#$%^&*`~()-+=]+$)(?![0-9\W_!@#$%^&*`~()-+=]+$)(?!.*[sS][iI][nN][oO].*)(?!.*[zZ][hH][oO][nN][gG][hH][uU][aA].*)[a-zA-Z0-9\W_!@#$%^&*`~()-+=]{8,99}$/.test(value); }