This commit is contained in:
Putoo
2026-05-15 17:08:04 +08:00
parent 52ad7e79ec
commit 78759387f7
13 changed files with 511 additions and 632 deletions

View File

@@ -0,0 +1,7 @@
namespace Application.Domain;
public class UserCache
{
public static string BaseCacheKey = "BaseUserCache:{0}";
public static string BaseCacheKeys = "BaseUserCache:{0}:{1}";
}

View File

@@ -0,0 +1,33 @@
namespace Application.Domain;
public interface IGameAccountService
{
/// <summary>
/// 根据OpenId获取账号信息
/// </summary>
/// <param name="openId"></param>
/// <returns></returns>
Task<game_account> GetAccInfoByOpenId(string openId);
/// <summary>
/// 根据AccId获取账号信息
/// </summary>
/// <param name="accId"></param>
/// <returns></returns>
Task<game_account> GetAccInfoByAccId(string accId);
Task<game_account> GetAccInfoByToken(string token);
/// <summary>
/// 注册账号
/// </summary>
/// <param name="userName"></param>
/// <param name="nick"></param>
/// <param name="pwd"></param>
/// <param name="remAccId"></param>
/// <param name="openId"></param>
/// <returns></returns>
Task<game_account> Regist(string userName, string nick, string pwd, string remAccId = "",
string openId = "");
Task<bool> UpdateAccountToken(string accId);
}

View File

@@ -0,0 +1,160 @@
using Photon.Core.Assist;
namespace Application.Domain;
public class GameAccountService : IGameAccountService, ITransient
{
private readonly ISqlSugarClient _dbClient;
private readonly IRedisCache _redisClient;
public GameAccountService(ISqlSugarClient dbClient, IRedisCache redisClient)
{
_dbClient = dbClient;
_redisClient = redisClient;
}
public async Task<game_account> GetAccInfoByOpenId(string openId)
{
string key = string.Format(UserCache.BaseCacheKeys, "UserAccountData", "OpenId");
if (await _redisClient.HExistsHashAsync(key, openId))
{
return await _redisClient.GetHashAsync<game_account>(key, openId);
}
else
{
var db = _dbClient.AsTenant().GetConnectionWithAttr<game_account>();
var data = await db.Queryable<game_account>().Where(it => it.openId == openId).FirstAsync();
await _redisClient.AddHashAsync(key, openId, data);
return data;
}
}
public async Task<game_account> GetAccInfoByAccId(string accId)
{
string key = string.Format(UserCache.BaseCacheKeys, "UserAccountData", "AccId");
if (await _redisClient.HExistsHashAsync(key, accId))
{
return await _redisClient.GetHashAsync<game_account>(key, accId);
}
else
{
var db = _dbClient.AsTenant().GetConnectionWithAttr<game_account>();
var data = await db.Queryable<game_account>().Where(it => it.accId == accId).FirstAsync();
await _redisClient.AddHashAsync(key, accId, data);
return data;
}
}
public async Task<game_account> GetAccInfoByToken(string token)
{
var db = _dbClient.AsTenant().GetConnectionWithAttr<game_account>();
var data = await db.Queryable<game_account>().Where(it => it.token == token).FirstAsync();
return data;
}
private async Task ClearCache(string clearId)
{
string openId = string.Empty;
string accId = string.Empty;
var accInfo = await GetAccInfoByAccId(clearId);
if (accInfo != null)
{
accId = accInfo.accId;
openId = accInfo.openId;
}
else
{
accInfo = await GetAccInfoByOpenId(clearId);
if (accInfo != null)
{
accId = accInfo.accId;
openId = accInfo.openId;
}
}
if (!string.IsNullOrEmpty(openId))
{
string key = string.Format(UserCache.BaseCacheKeys, "UserAccountData", "OpenId");
await _redisClient.DelHashAsync(key, openId);
}
if (!string.IsNullOrEmpty(accId))
{
string key = string.Format(UserCache.BaseCacheKeys, "UserAccountData", "AccId");
await _redisClient.DelHashAsync(key, accId);
}
}
public async Task<game_account> Regist(string userName, string nick, string pwd, string remAccId = "",
string openId = "")
{
game_account result = new game_account();
try
{
var db = _dbClient.AsTenant().GetConnectionWithAttr<game_account>();
await _dbClient.AsTenant().BeginTranAsync();
string accId = StringAssist.NewGuid;
result.accId = accId;
result.userName = userName;
result.nick = nick;
string sid = await CreateToken();
result.token = sid;
result.npwd = pwd;
result.remAccId = remAccId;
result.remCode = StringAssist.RandomString(6);
result.pwd = EncryptAssist.Md5Encryption(pwd);
result.status = 1;
result.addTime = DateTime.Now;
result.openId = openId;
bool isok = await db.Insertable(result).ExecuteCommandAsync() > 0;
if (isok)
{
await ClearCache(openId);
}
else
{
result = null;
}
await _dbClient.AsTenant().CommitTranAsync();
}
catch
{
result = null;
await _dbClient.AsTenant().RollbackTranAsync();
}
return result;
}
private async Task<string> CreateToken()
{
var db = _dbClient.AsTenant().GetConnectionWithAttr<game_account>();
string token = string.Empty;
bool ok = true;
while (ok)
{
token = string.Format("{0}", StringAssist.RandomString(32));
if (await db.Queryable<game_account>().Where(it => it.token == token).AnyAsync() == false)
{
ok = false;
}
}
return token;
}
public async Task<bool> UpdateAccountToken(string accId)
{
var db = _dbClient.AsTenant().GetConnectionWithAttr<game_account>();
string token = await CreateToken();
bool result = await db.Updateable<game_account>().SetColumns(it => it.token == token)
.Where(it => it.accId == accId).ExecuteCommandAsync() > 0;
if (result)
{
await ClearCache(accId);
}
return result;
}
}