280 lines
6.9 KiB
TypeScript
280 lines
6.9 KiB
TypeScript
import { _decorator, EditBox, Label } from "cc";
|
|||
|
|
import Utils from "../../../Main/Common/Utils";
|
||
|
|
import li_BaseView from "../../../Main/Common/li_BaseView";
|
||
|
|
import { GButton } from "../../../Main/Common/GButton";
|
||
|
|
import { ViewManager } from "../../../Main/Manager/ViewManager";
|
||
|
|
|
||
|
|
const { ccclass, property } = _decorator;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 安全验证页面
|
||
|
|
* 预制体位于 resources/loginPanel/SafeCheckPanel
|
||
|
|
*/
|
||
|
|
@ccclass("SafeCheckPanel")
|
||
|
|
export class SafeCheckPanel extends li_BaseView {
|
||
|
|
private _nodeTab: any = {};
|
||
|
|
|
||
|
|
// 验证码倒计时
|
||
|
|
private _countdown: number = 0;
|
||
|
|
private _countdownTimer: any = null;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 组件初始化时调用
|
||
|
|
*/
|
||
|
|
onLoadCT(): void {
|
||
|
|
// 解析节点,将子节点存储到 _nodeTab 中
|
||
|
|
Utils.parseNode(this.node, this._nodeTab);
|
||
|
|
|
||
|
|
// 初始化UI
|
||
|
|
this.initUI();
|
||
|
|
|
||
|
|
// 注册事件监听
|
||
|
|
this.registerListener();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 初始化UI
|
||
|
|
*/
|
||
|
|
private initUI(): void {
|
||
|
|
// 初始化发送按钮状态
|
||
|
|
this.updateSendBtnState(true);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 注册事件监听
|
||
|
|
*/
|
||
|
|
private registerListener(): void {
|
||
|
|
// 绑定发送验证码按钮点击事件
|
||
|
|
if (this._nodeTab.SendBtn) {
|
||
|
|
GButton.BandClick(this._nodeTab.SendBtn, this.onClickSendCode, this);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 绑定确定按钮点击事件
|
||
|
|
if (this._nodeTab.ConfirmBtn) {
|
||
|
|
GButton.BandClick(this._nodeTab.ConfirmBtn, this.onClickConfirm, this);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 绑定关闭按钮点击事件
|
||
|
|
if (this._nodeTab.CloseBtn) {
|
||
|
|
GButton.BandClick(this._nodeTab.CloseBtn, this.onClickClose, this);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 点击发送验证码按钮
|
||
|
|
*/
|
||
|
|
private onClickSendCode(): void {
|
||
|
|
// 如果正在倒计时,不允许再次发送
|
||
|
|
if (this._countdown > 0) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 获取邮箱输入框
|
||
|
|
const emailInput = this._nodeTab.EmailInput?.getComponent(EditBox);
|
||
|
|
|
||
|
|
if (!emailInput) {
|
||
|
|
console.error("未找到邮箱输入框");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const email = emailInput.string.trim();
|
||
|
|
|
||
|
|
// 验证邮箱
|
||
|
|
if (!email) {
|
||
|
|
console.log("请输入邮箱");
|
||
|
|
// TODO: 显示提示信息
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!this.isValidEmail(email)) {
|
||
|
|
console.log("请输入有效的邮箱地址");
|
||
|
|
// TODO: 显示提示信息
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// TODO: 调用后端接口发送验证码
|
||
|
|
console.log("发送验证码到:", email);
|
||
|
|
this.requestSendCode(email);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 调用后端接口发送验证码
|
||
|
|
*/
|
||
|
|
private requestSendCode(email: string): void {
|
||
|
|
// TODO: 实现后端发送验证码接口调用
|
||
|
|
// 示例:
|
||
|
|
// const data = { email: email, type: 'forgetPassword' };
|
||
|
|
// NetworkManager.request('/api/sendCode', data, (response) => {
|
||
|
|
// if (response.success) {
|
||
|
|
// // 发送成功,开始倒计时
|
||
|
|
// this.startCountdown();
|
||
|
|
// } else {
|
||
|
|
// // 发送失败,显示错误信息
|
||
|
|
// console.error('发送验证码失败:', response.message);
|
||
|
|
// }
|
||
|
|
// });
|
||
|
|
|
||
|
|
console.log("TODO: 实现发送验证码接口调用");
|
||
|
|
// 临时模拟发送成功,启动倒计时
|
||
|
|
this.startCountdown();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 开始倒计时
|
||
|
|
*/
|
||
|
|
private startCountdown(): void {
|
||
|
|
this._countdown = 60; // 60秒倒计时
|
||
|
|
this.updateSendBtnState(false);
|
||
|
|
|
||
|
|
this._countdownTimer = setInterval(() => {
|
||
|
|
this._countdown--;
|
||
|
|
|
||
|
|
if (this._countdown <= 0) {
|
||
|
|
// 倒计时结束
|
||
|
|
clearInterval(this._countdownTimer);
|
||
|
|
this._countdownTimer = null;
|
||
|
|
this.updateSendBtnState(true);
|
||
|
|
} else {
|
||
|
|
// 更新按钮文本
|
||
|
|
this.updateSendBtnState(false);
|
||
|
|
}
|
||
|
|
}, 1000);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 更新发送按钮状态
|
||
|
|
*/
|
||
|
|
private updateSendBtnState(canSend: boolean): void {
|
||
|
|
if (!this._nodeTab.SendBtn) return;
|
||
|
|
|
||
|
|
const label = this._nodeTab.SendBtn.getComponentInChildren(Label);
|
||
|
|
if (label) {
|
||
|
|
if (canSend) {
|
||
|
|
label.string = "发送验证码";
|
||
|
|
} else {
|
||
|
|
label.string = `${this._countdown}秒后重试`;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// TODO: 可以设置按钮的可交互状态
|
||
|
|
// const button = this._nodeTab.SendBtn.getComponent(Button);
|
||
|
|
// if (button) {
|
||
|
|
// button.interactable = canSend;
|
||
|
|
// }
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 点击确定按钮
|
||
|
|
*/
|
||
|
|
private onClickConfirm(): void {
|
||
|
|
// 获取邮箱和验证码输入框
|
||
|
|
const emailInput = this._nodeTab.EmailInput?.getComponent(EditBox);
|
||
|
|
const codeInput = this._nodeTab.CodeInput?.getComponent(EditBox);
|
||
|
|
|
||
|
|
if (!emailInput || !codeInput) {
|
||
|
|
console.error("未找到邮箱或验证码输入框");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const email = emailInput.string.trim();
|
||
|
|
const code = codeInput.string.trim();
|
||
|
|
|
||
|
|
// 验证输入
|
||
|
|
if (!email) {
|
||
|
|
console.log("请输入邮箱");
|
||
|
|
// TODO: 显示提示信息
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!this.isValidEmail(email)) {
|
||
|
|
console.log("请输入有效的邮箱地址");
|
||
|
|
// TODO: 显示提示信息
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!code) {
|
||
|
|
console.log("请输入验证码");
|
||
|
|
// TODO: 显示提示信息
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// TODO: 调用后端接口验证验证码
|
||
|
|
console.log("验证验证码:", email, code);
|
||
|
|
this.requestVerifyCode(email, code);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 调用后端接口验证验证码
|
||
|
|
*/
|
||
|
|
private requestVerifyCode(email: string, code: string): void {
|
||
|
|
// TODO: 实现后端验证验证码接口调用
|
||
|
|
// 示例:
|
||
|
|
// const data = {
|
||
|
|
// email: email,
|
||
|
|
// code: code,
|
||
|
|
// type: 'forgetPassword'
|
||
|
|
// };
|
||
|
|
// NetworkManager.request('/api/verifyCode', data, (response) => {
|
||
|
|
// if (response.success) {
|
||
|
|
// // 验证成功,跳转到修改密码页面
|
||
|
|
// this.openNewPasswordPanel(email, code);
|
||
|
|
// } else {
|
||
|
|
// // 验证失败,显示错误信息
|
||
|
|
// console.error('验证码错误:', response.message);
|
||
|
|
// // TODO: 显示错误提示
|
||
|
|
// }
|
||
|
|
// });
|
||
|
|
|
||
|
|
console.log("TODO: 实现验证验证码接口调用");
|
||
|
|
// 临时模拟验证成功,跳转到修改密码页面
|
||
|
|
this.openNewPasswordPanel(email, code);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 打开修改密码页面
|
||
|
|
*/
|
||
|
|
private openNewPasswordPanel(email: string, code: string): void {
|
||
|
|
// 关闭当前页面
|
||
|
|
this.close();
|
||
|
|
|
||
|
|
// 打开修改密码页面,并传递邮箱和验证码信息
|
||
|
|
ViewManager.I.openMainView("loginPanel/NewPasswordPanel", {
|
||
|
|
email: email,
|
||
|
|
code: code,
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 点击关闭按钮
|
||
|
|
*/
|
||
|
|
private onClickClose(): void {
|
||
|
|
// 清理倒计时定时器
|
||
|
|
if (this._countdownTimer) {
|
||
|
|
clearInterval(this._countdownTimer);
|
||
|
|
this._countdownTimer = null;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 关闭当前界面
|
||
|
|
this.close();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 验证邮箱格式
|
||
|
|
*/
|
||
|
|
private isValidEmail(email: string): boolean {
|
||
|
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
||
|
|
return emailRegex.test(email);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 界面销毁时调用
|
||
|
|
*/
|
||
|
|
protected onDestroy(): void {
|
||
|
|
// 清理倒计时定时器
|
||
|
|
if (this._countdownTimer) {
|
||
|
|
clearInterval(this._countdownTimer);
|
||
|
|
this._countdownTimer = null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|