add all
This commit is contained in:
@@ -14,7 +14,9 @@
|
||||
"GUID:ff2731b992f0b4736afeff3719a96ad4",
|
||||
"GUID:7a400ff9720ed4ff3ab2d2ef3c6b8a86",
|
||||
"GUID:d9925423e828d479c9063ea882f31e06",
|
||||
"GUID:cfcd2ce455f8d1944942cdd919ecaa60"
|
||||
"GUID:cfcd2ce455f8d1944942cdd919ecaa60",
|
||||
"GUID:9069ac25d95ca17448b247f3bb1c769f",
|
||||
"GUID:9069ac25d95ca17448a247f3bb1c769f"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
|
||||
@@ -87,7 +87,7 @@ namespace IchniOnline.Online.Logic
|
||||
try
|
||||
{
|
||||
var result = await IchniOnlineApiClient.Instance.PostAsync<LoginResponseDto>("/api/auth/third-party/login", dto);
|
||||
|
||||
Debug.Log(JsonUtility.ToJson(result.Data));
|
||||
IsLoggingIn = false;
|
||||
|
||||
if (result.IsSuccess)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using IchniOnline.Online.Models;
|
||||
using IchniOnline.Online.Network.Models;
|
||||
using TapSDK.Login;
|
||||
using UnityEngine;
|
||||
|
||||
@@ -15,15 +16,7 @@ namespace IchniOnline.Online.Logic
|
||||
/// <summary>
|
||||
/// 本地是否存在有效的登录缓存
|
||||
/// </summary>
|
||||
public static bool HasCachedLogin
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!ES3.KeyExists(ES3_KEY)) return false;
|
||||
var data = ES3.Load<LoginCacheData>(ES3_KEY);
|
||||
return data != null && data.IsValid;
|
||||
}
|
||||
}
|
||||
public static bool HasCachedLogin => HasValidSession;
|
||||
|
||||
/// <summary>
|
||||
/// 获取缓存的登录数据,无缓存返回 null
|
||||
@@ -38,7 +31,17 @@ namespace IchniOnline.Online.Logic
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将 TapTap 登录结果写入本地缓存
|
||||
/// 缓存的 JWT 令牌,无缓存或无会话返回 null
|
||||
/// </summary>
|
||||
public static string CachedJwtToken => CachedData?.jwtToken;
|
||||
|
||||
/// <summary>
|
||||
/// 是否存在有效的服务端会话(JWT 令牌存在且 hasServerSession 为 true)
|
||||
/// </summary>
|
||||
public static bool HasValidSession => CachedData?.IsValid ?? false;
|
||||
|
||||
/// <summary>
|
||||
/// 将 TapTap 登录结果写入本地缓存,保留已有的服务端会话数据
|
||||
/// </summary>
|
||||
public static void SaveFromTapTapAccount(TapTapAccount account)
|
||||
{
|
||||
@@ -48,18 +51,68 @@ namespace IchniOnline.Online.Logic
|
||||
return;
|
||||
}
|
||||
|
||||
var data = new LoginCacheData(
|
||||
account.openId,
|
||||
account.unionId,
|
||||
account.name,
|
||||
account.avatar,
|
||||
account.email
|
||||
);
|
||||
LoginCacheData data;
|
||||
if (ES3.KeyExists(ES3_KEY))
|
||||
{
|
||||
data = ES3.Load<LoginCacheData>(ES3_KEY) ?? new LoginCacheData();
|
||||
}
|
||||
else
|
||||
{
|
||||
data = new LoginCacheData();
|
||||
}
|
||||
|
||||
data.openId = account.openId;
|
||||
data.unionId = account.unionId;
|
||||
data.name = account.name;
|
||||
data.avatar = account.avatar;
|
||||
data.email = account.email;
|
||||
|
||||
ES3.Save(ES3_KEY, data);
|
||||
Debug.Log($"[LoginCacheManager] 已缓存登录数据,openId={data.openId}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 保存服务端认证会话(JWT + 用户信息),保留已有的 TapTap 数据
|
||||
/// </summary>
|
||||
public static void SaveAuthSession(string jwtToken, LoginResponseDto response)
|
||||
{
|
||||
if (string.IsNullOrEmpty(jwtToken) || response == null)
|
||||
{
|
||||
Debug.LogWarning("[LoginCacheManager] jwtToken 或 response 为 null,跳过缓存");
|
||||
return;
|
||||
}
|
||||
|
||||
LoginCacheData data;
|
||||
if (ES3.KeyExists(ES3_KEY))
|
||||
{
|
||||
data = ES3.Load<LoginCacheData>(ES3_KEY) ?? new LoginCacheData();
|
||||
}
|
||||
else
|
||||
{
|
||||
data = new LoginCacheData();
|
||||
}
|
||||
|
||||
data.UpdateFromServerResponse(response);
|
||||
|
||||
ES3.Save(ES3_KEY, data);
|
||||
Debug.Log($"[LoginCacheManager] 已缓存服务端会话,userId={data.userId}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清除服务端会话数据,保留 TapTap 原始数据
|
||||
/// </summary>
|
||||
public static void ClearSession()
|
||||
{
|
||||
if (!ES3.KeyExists(ES3_KEY)) return;
|
||||
|
||||
var data = ES3.Load<LoginCacheData>(ES3_KEY);
|
||||
if (data == null) return;
|
||||
|
||||
data.ClearServerSession();
|
||||
ES3.Save(ES3_KEY, data);
|
||||
Debug.Log("[LoginCacheManager] 已清除服务端会话,保留 TapTap 数据");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 写入模拟数据(供编辑器工具使用)
|
||||
/// </summary>
|
||||
|
||||
@@ -27,6 +27,12 @@ namespace IchniOnline.Online.Logic
|
||||
/// </summary>
|
||||
public event Action<string> OnLoginFailed;
|
||||
|
||||
/// <summary>
|
||||
/// TapTap 登录成功并获取 AccessToken 后触发,参数为 TapTapAccount 和 AccessToken。
|
||||
/// AuthService 可订阅此事件在通用成功流程之前拦截 token 进行 API 调用。
|
||||
/// </summary>
|
||||
public event Action<TapTapAccount, AccessToken> OnLoginWithToken;
|
||||
|
||||
private bool _initialized;
|
||||
|
||||
private void Awake()
|
||||
@@ -60,8 +66,10 @@ namespace IchniOnline.Online.Logic
|
||||
enableLog = true
|
||||
};
|
||||
// TapSDK 初始化
|
||||
|
||||
TapTapSDK.Init(coreOptions);
|
||||
_initialized = true;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -87,6 +95,7 @@ namespace IchniOnline.Online.Logic
|
||||
// 发起 Tap 登录
|
||||
var account = await TapTapLogin.Instance.LoginWithScopes(scopes.ToArray());
|
||||
Debug.Log($"TapTap 登录成功,用户 ID:{account.openId},name:{account.name}");
|
||||
OnLoginWithToken?.Invoke(account, account.accessToken);
|
||||
LoginCacheManager.SaveFromTapTapAccount(account);
|
||||
OnLoginSuccess?.Invoke(account);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using IchniOnline.Online.Network.Models;
|
||||
|
||||
namespace IchniOnline.Online.Models
|
||||
{
|
||||
@@ -16,6 +17,14 @@ namespace IchniOnline.Online.Models
|
||||
public string email;
|
||||
public long cacheTimestamp;
|
||||
|
||||
// Server session fields
|
||||
public string jwtToken;
|
||||
public string userId;
|
||||
public string displayName;
|
||||
public string avatarUrl;
|
||||
public int permission;
|
||||
public bool hasServerSession;
|
||||
|
||||
public LoginCacheData() { }
|
||||
|
||||
public LoginCacheData(string openId, string unionId, string name, string avatar, string email)
|
||||
@@ -28,6 +37,26 @@ namespace IchniOnline.Online.Models
|
||||
this.cacheTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
||||
}
|
||||
|
||||
public bool IsValid => !string.IsNullOrEmpty(openId);
|
||||
public bool IsValid => hasServerSession && !string.IsNullOrEmpty(jwtToken);
|
||||
|
||||
public void UpdateFromServerResponse(LoginResponseDto response)
|
||||
{
|
||||
this.jwtToken = response.Token;
|
||||
this.userId = response.User.UserId;
|
||||
this.displayName = response.User.DisplayName;
|
||||
this.avatarUrl = response.User.AvatarUrl;
|
||||
this.permission = response.User.Permission;
|
||||
this.hasServerSession = true;
|
||||
}
|
||||
|
||||
public void ClearServerSession()
|
||||
{
|
||||
this.jwtToken = null;
|
||||
this.userId = null;
|
||||
this.displayName = null;
|
||||
this.avatarUrl = null;
|
||||
this.permission = 0;
|
||||
this.hasServerSession = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace IchniOnline.Online.Network
|
||||
private static IchniOnlineApiClient _instance;
|
||||
public static IchniOnlineApiClient Instance => _instance ??= new IchniOnlineApiClient();
|
||||
|
||||
public string BaseUrl { get; set; } = "http://localhost:5433";
|
||||
public string BaseUrl { get; set; } = "http://localhost:53734";
|
||||
public string JwtToken { get; set; }
|
||||
|
||||
private IchniOnlineApiClient() { }
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 907170849dc345b29c0f7d072e1ca5db
|
||||
timeCreated: 1781501503
|
||||
@@ -1,6 +1,6 @@
|
||||
using System;
|
||||
using IchniOnline.Online.Logic;
|
||||
using TapSDK.Login;
|
||||
using IchniOnline.Online.Network.Models;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
@@ -58,46 +58,43 @@ namespace Ichni.UI
|
||||
Debug.LogWarning("[LoginPage] tapTapButton 未赋值");
|
||||
}
|
||||
|
||||
// 在 Start 中订阅事件(确保 ThirdPartyServiceManager.Instance 已初始化)
|
||||
SubscribeThirdPartyEvents();
|
||||
// 在 Start 中订阅 AuthService 事件
|
||||
SubscribeAuthEvents();
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
UnsubscribeThirdPartyEvents();
|
||||
UnsubscribeAuthEvents();
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
// 每次启用时重新订阅(处理 DontDestroyOnLoad 场景切换等情况)
|
||||
SubscribeThirdPartyEvents();
|
||||
SubscribeAuthEvents();
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
UnsubscribeThirdPartyEvents();
|
||||
UnsubscribeAuthEvents();
|
||||
}
|
||||
|
||||
#region ThirdPartyServiceManager Event Subscription
|
||||
#region IchniOnlineAuthService Event Subscription
|
||||
|
||||
private void SubscribeThirdPartyEvents()
|
||||
private void SubscribeAuthEvents()
|
||||
{
|
||||
if (ThirdPartyServiceManager.Instance == null) return;
|
||||
ThirdPartyServiceManager.Instance.OnLoginSuccess -= OnTapTapLoginSuccess;
|
||||
ThirdPartyServiceManager.Instance.OnLoginCanceled -= OnTapTapLoginCanceled;
|
||||
ThirdPartyServiceManager.Instance.OnLoginFailed -= OnTapTapLoginFailed;
|
||||
IchniOnlineAuthService.OnLoginSuccess -= OnAuthLoginSuccess;
|
||||
IchniOnlineAuthService.OnLoginFailed -= OnAuthLoginFailed;
|
||||
IchniOnlineAuthService.OnLoginCanceled -= OnAuthLoginCanceled;
|
||||
|
||||
ThirdPartyServiceManager.Instance.OnLoginSuccess += OnTapTapLoginSuccess;
|
||||
ThirdPartyServiceManager.Instance.OnLoginCanceled += OnTapTapLoginCanceled;
|
||||
ThirdPartyServiceManager.Instance.OnLoginFailed += OnTapTapLoginFailed;
|
||||
IchniOnlineAuthService.OnLoginSuccess += OnAuthLoginSuccess;
|
||||
IchniOnlineAuthService.OnLoginFailed += OnAuthLoginFailed;
|
||||
IchniOnlineAuthService.OnLoginCanceled += OnAuthLoginCanceled;
|
||||
}
|
||||
|
||||
private void UnsubscribeThirdPartyEvents()
|
||||
private void UnsubscribeAuthEvents()
|
||||
{
|
||||
if (ThirdPartyServiceManager.Instance == null) return;
|
||||
ThirdPartyServiceManager.Instance.OnLoginSuccess -= OnTapTapLoginSuccess;
|
||||
ThirdPartyServiceManager.Instance.OnLoginCanceled -= OnTapTapLoginCanceled;
|
||||
ThirdPartyServiceManager.Instance.OnLoginFailed -= OnTapTapLoginFailed;
|
||||
IchniOnlineAuthService.OnLoginSuccess -= OnAuthLoginSuccess;
|
||||
IchniOnlineAuthService.OnLoginFailed -= OnAuthLoginFailed;
|
||||
IchniOnlineAuthService.OnLoginCanceled -= OnAuthLoginCanceled;
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -111,7 +108,7 @@ namespace Ichni.UI
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 点击 TapTap 按钮:发起 TapTap 登录
|
||||
/// 点击 TapTap 按钮:通过 AuthService 发起 TapTap 登录
|
||||
/// </summary>
|
||||
private void OnTapTapClicked()
|
||||
{
|
||||
@@ -121,39 +118,48 @@ namespace Ichni.UI
|
||||
tapTapButton.interactable = false;
|
||||
if (closeButton != null) closeButton.interactable = false;
|
||||
|
||||
ThirdPartyServiceManager.Instance?.StartTapTapLogin();
|
||||
Debug.Log("[LoginPage] 正在登录...");
|
||||
IchniOnlineAuthService.LoginWithTapTap();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// TapTap 登录成功回调
|
||||
/// AuthService 登录成功回调
|
||||
/// </summary>
|
||||
private void OnTapTapLoginSuccess(TapTapAccount account)
|
||||
private void OnAuthLoginSuccess(LoginResponseDto response)
|
||||
{
|
||||
_isLoggingIn = false;
|
||||
Debug.Log($"[LoginPage] TapTap 登录成功,用户:{account.name}");
|
||||
|
||||
if (response == null || response.User == null)
|
||||
{
|
||||
Debug.Log("[LoginPage] 登录成功(无用户详情)");
|
||||
FadeOut(0.5f, false, RestoreStartPage);
|
||||
return;
|
||||
}
|
||||
|
||||
Debug.Log($"[LoginPage] 登录成功,用户:{response.User.DisplayName}(ID: {response.User.UserId})");
|
||||
|
||||
// 登录成功后淡出登录页
|
||||
FadeOut(0.5f, false, RestoreStartPage);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// TapTap 登录取消回调
|
||||
/// AuthService 登录失败回调
|
||||
/// </summary>
|
||||
private void OnTapTapLoginCanceled()
|
||||
private void OnAuthLoginFailed(string error)
|
||||
{
|
||||
_isLoggingIn = false;
|
||||
RestoreButtons();
|
||||
Debug.Log("[LoginPage] 用户取消了 TapTap 登录");
|
||||
Debug.LogError($"[LoginPage] 登录失败:{error}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// TapTap 登录失败回调
|
||||
/// AuthService 登录取消回调
|
||||
/// </summary>
|
||||
private void OnTapTapLoginFailed(string error)
|
||||
private void OnAuthLoginCanceled()
|
||||
{
|
||||
_isLoggingIn = false;
|
||||
RestoreButtons();
|
||||
Debug.LogError($"[LoginPage] TapTap 登录失败:{error}");
|
||||
Debug.Log("[LoginPage] 用户取消了登录");
|
||||
}
|
||||
|
||||
private void RestoreButtons()
|
||||
|
||||
@@ -44,7 +44,7 @@ namespace Ichni.UI
|
||||
AudioManager.Post(AK.EVENTS.TOUCHTOSTART);
|
||||
|
||||
// 已有登录缓存 → 跳过 LoginPage,直接进入章节选择
|
||||
if (LoginCacheManager.HasCachedLogin)
|
||||
if (LoginCacheManager.HasValidSession)
|
||||
{
|
||||
FadeOut();
|
||||
floatingParticles.GetComponent<Renderer>().material.DOColor(Color.clear, "_BaseColor", 0.5f).Play();
|
||||
|
||||
Reference in New Issue
Block a user