killapp/Assets/Scripts/UI/Pages/HomePage/CheckPasswordPage.cs
“虞渠成” 10ad83d6b0 refactor: 优化密码校验与第三方登录逻辑,新增未设密码引导流程
1. 移除MainScene和UIManager中的首次启动标记逻辑
2. 新增DataManager的HasAnyPassword方法检测用户是否设置过密码
3. 完善HomePage的CheckPasswordPage,新增未设密码引导弹窗
4. 调整SelfVerificationCodePanel支持自定义返回回调
5. 适配苹果第三方登录无需强制设置密码的审核要求
6. 新增多语言词条支持密码引导文案
7. 移除HomePageCtrl在应用暂停时自动锁定按钮的逻辑
2026-09-20 14:04:59 +08:00

156 lines
6.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using Kill.Managers;
using Kill.Network;
using Kill.UI.Components;
using UnityEngine;
using UnityEngine.UI;
namespace Kill.UI.Pages
{
public class CheckPasswordPage : MonoBehaviour
{
class PasswordRequest
{
public string password;
}
public InputField passwordInput;
public Text errorText;
public GameObject plane;
// 未设置密码时的引导分支(仅在 passwordInput 等组件未挂时强制进入;正常面板同时具备输入与引导能力)
[Header("未设密码引导")]
public GameObject passwordCheckPanel; // 密码输入区域容器(含 InputField / 确认按钮等)
public GameObject passwordGuidePanel; // "引导去设置密码"提示区域容器
public Button setupPasswordBtn; // "立即设置密码" 按钮
public Button remindLaterBtn; // "稍后再说" 按钮
private void Awake()
{
if (setupPasswordBtn != null)
{
setupPasswordBtn.onClick.RemoveAllListeners();
setupPasswordBtn.onClick.AddListener(OnSetupPasswordClick);
}
if (remindLaterBtn != null)
{
remindLaterBtn.onClick.RemoveAllListeners();
remindLaterBtn.onClick.AddListener(OnRemindLaterClick);
}
}
public void OnEnable()
{
UIManager.Instance.RegisterBackAction(OnBack);
errorText.text="";
// 检测当前账号是否已设置过密码,决定显示密码输入面板还是引导面板
RefreshByPasswordState();
}
/// <summary>
/// 根据 userInfo 的密码标记切换显示:
/// 未设密码 → 始终显示引导面板(不显示密码输入框,避免用户输什么都是错的)
/// 已设密码 → 显示密码输入面板
/// 简单策略:未设密码时,每次 LockButtonPlane 激活都弹引导,不再用本地日期去重
/// </summary>
private void RefreshByPasswordState()
{
bool hasPassword = DataManager.Instance != null && DataManager.Instance.HasAnyPassword();
if (passwordGuidePanel != null) passwordGuidePanel.SetActive(!hasPassword);
if (passwordCheckPanel != null) passwordCheckPanel.SetActive(hasPassword);
}
public async void OnConfirm()
{
errorText.text="";
LoadingUI.Show();
try
{
string password = passwordInput != null ? passwordInput.text : "";
if (string.IsNullOrEmpty(password))
{
errorText.text = LanguageManager.Instance.GetLanguage("home_password_check_failed");
return;
}
PasswordRequest requestData=new PasswordRequest
{
password=passwordInput.text
};
var response = await NetworkCtrl.Instance.Post<LoginResponse>("/api/v1/auth/password/verify", requestData);
if (response != null && response.Data != null && response.Data.code == 200)
{
plane.SetActive(false);
gameObject.SetActive(false);
errorText.text="";
passwordInput.text="";
// 解锁成功,记录解锁时间(自动锁定倒计时起点)
DataManager.Instance.RecordUnlock();
}
else
{
errorText.text = LanguageManager.Instance.GetLanguage("home_password_check_failed");
passwordInput.text="";
}
}
catch (System.Exception ex)
{
Debug.LogError($"[CheckPasswordPage] 校验密码异常: {ex.Message}");
errorText.text = LanguageManager.Instance.GetLanguage("home_password_check_failed");
if (passwordInput != null) passwordInput.text = "";
}
finally
{
// 无论成功/失败/异常都关闭 Loading避免一直挂着
LoadingUI.Hide();
}
}
/// <summary>
/// 引导面板 - 立即设置密码
/// 关闭当前 LockButtonPlane 并打开个人中心的 设置密码 流程
/// </summary>
public void OnSetupPasswordClick()
{
OnSetPassword();
}
public SelfVerificationCodePanel verificationCodePanelPrefab;
public SelfSetPasswordPanel setPasswordPanelPrefab;
SelfVerificationCodePanel verificationCodePanel;
public void OnSetPassword()
{
verificationCodePanel = Instantiate(verificationCodePanelPrefab, transform);
verificationCodePanel.Init(OnSureVerificationCode, OnBack);
}
SelfSetPasswordPanel setPasswordPanel;
public void OnSureVerificationCode()
{
Destroy(verificationCodePanel.gameObject);
setPasswordPanel = Instantiate(setPasswordPanelPrefab, transform);
setPasswordPanel.Init(OnSetPasswordSuccess);
}
public void OnSetPasswordSuccess()
{
Destroy(setPasswordPanel.gameObject);
plane.SetActive(false);
gameObject.SetActive(false);
// 解锁成功,记录解锁时间(自动锁定倒计时起点)
DataManager.Instance.RecordUnlock();
}
/// <summary>
/// 引导面板 - 稍后再说
/// 仅关闭 LockButtonPlane下次再激活时仍会再次弹出引导面板未设密码时每次都提示
/// </summary>
public void OnRemindLaterClick()
{
gameObject.SetActive(false);
}
public void OnBack()
{
UIManager.Instance.RegisterBackAction(null);
gameObject.SetActive(false);
}
}
}