添加用户接口

This commit is contained in:
zpc 2024-11-16 19:06:08 +08:00
parent abc9cea3c1
commit 40d29b248f
10 changed files with 461 additions and 50 deletions

View File

@ -8,6 +8,7 @@ using CloudGaming.Code.MiddlewareExtend;
using CloudGaming.DtoModel.Account;
using CloudGaming.DtoModel.Account.Login;
using CloudGaming.DtoModel.Account.User;
using CloudGaming.DtoModel.Account.UserDiamondConsume;
using CloudGaming.GameModel.Db.Db_Ext;
using HuanMeng.DotNetCore.AttributeExtend;
@ -80,4 +81,29 @@ public class AccountController : CloudGamingControllerBase
AccountBLL account = new AccountBLL(ServiceProvider);
return await account.RealAuthentication(authenticationRequest.UserName, authenticationRequest.IdCard, authenticationRequest.DeviceNumber);
}
/// <summary>
/// 资产收入、支出
/// </summary>
/// <param name="consumeType">0支出收入</param>
/// <returns></returns>
[HttpGet]
[Authorize]
public async Task<List<UserDiamondConsumeDto>> GetUserDiamondConsumeList([FromQuery] int consumeType)
{
AccountBLL account = new AccountBLL(ServiceProvider);
return await account.GetUserDiamondConsumeList(consumeType);
}
/// <summary>
/// 修改用户昵称
/// </summary>
/// <param name="accountNickNameRequest"></param>
/// <returns></returns>
[HttpPost]
public async Task<BaseResponse<bool>> UpdateUserNickName([FromBody] AccountNickNameRequest accountNickNameRequest)
{
AccountBLL account = new AccountBLL(ServiceProvider);
return await account.UpdateUserNickName(accountNickNameRequest.NickName);
}
}

View File

@ -6,6 +6,7 @@ using CloudGaming.Code.Sms;
using CloudGaming.DtoModel.Account;
using CloudGaming.DtoModel.Account.Login;
using CloudGaming.DtoModel.Account.User;
using CloudGaming.DtoModel.Account.UserDiamondConsume;
using HuanMeng.DotNetCore.JwtInfrastructure;
using HuanMeng.DotNetCore.Redis;
@ -529,7 +530,7 @@ namespace CloudGaming.Code.Account
UserId = _UserId,
Ip = HttpContextAccessor.HttpContext.GetClientIpAddress()
};
await this.GetConsumeMoney(UserCurrencyType.).ConsumeMoneyAsync(10);
await this.UserConsumeDiamondMoneyAsync(10, "实名认证赠送");
await Dao.DaoUser.Context.T_User_LimitActionLog.AddAsync(limitActionLog);
await Dao.DaoUser.Context.SaveChangesAsync();
return "奖励已经发送,钻石*10";
@ -602,5 +603,67 @@ namespace CloudGaming.Code.Account
#endregion
/// <summary>
/// 资产收入、支出
/// </summary>
/// <param name="ConsumeType">0支出收入</param>
/// <returns></returns>
public async Task<List<UserDiamondConsumeDto>> GetUserDiamondConsumeList(int ConsumeType)
{
if (_UserId == 0)
{
return new List<UserDiamondConsumeDto>();
}
List<UserDiamondConsumeDto> userDiamondConsumeDtos = new List<UserDiamondConsumeDto>();
var list = await Dao.DaoUser.Context.T_User_DiamondList.Where(it => it.UserId == _UserId && it.CurrencyType == (int)UserCurrencyType. && it.ConsumeType == ConsumeType).OrderByDescending(it => it.UpdateAt).Take(200).ToListAsync();
list?.ForEach(it =>
{
UserDiamondConsumeDto userDiamondConsumeDto = new UserDiamondConsumeDto()
{
Title = it.Title,
};
if (ConsumeType == (int)UserCurrencyConsumeType.)
{
userDiamondConsumeDto.ConsumeDetails = $"+ {it.Consume.ToString("0.##")}{((UserCurrencyType)it.CurrencyType).ToString()}";
userDiamondConsumeDto.DatePrompt = $"{it.CreateAt.ToString("yyyy-MM-dd HH:mm:ss")}";
}
else
{
userDiamondConsumeDto.ConsumeDetails = $"- {it.Consume.ToString("0.##")}{((UserCurrencyType)it.CurrencyType).ToString()}";
userDiamondConsumeDto.DatePrompt = $"{it.CreateAt.ToString("yyyy-MM-dd HH:mm:00")} 至 {it.UpdateAt.ToString("yyyy-MM-dd HH:mm:00")}";
}
userDiamondConsumeDtos.Add(userDiamondConsumeDto);
});
return userDiamondConsumeDtos;
}
/// <summary>
/// 修改用户昵称
/// </summary>
/// <param name="nickName"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public async Task<BaseResponse<bool>> UpdateUserNickName(string nickName)
{
var user = await Dao.DaoUser.Context.T_User.FirstOrDefaultAsync(it => it.Id == _UserId);
if (user == null)
{
throw new Exception("用户不存在");
}
user.NickName = nickName;
var userPhone = await Dao.DaoUser.Context.T_User_Phone_Account.FirstOrDefaultAsync(it => it.UserId == _UserId);
if (userPhone != null)
{
userPhone.NikeName = nickName;
}
await Dao.DaoUser.Context.SaveChangesAsync();
this.UserInfo.NickName = nickName;
await this.SaveUserInfoCacheChangesAsync();
return new BaseResponse<bool>(ResonseCode.Success, "", true);
}
}
}

View File

@ -1,3 +1,5 @@
using Bogus.DataSets;
using CloudGaming.Code.Account.Contract;
using CloudGaming.Code.Account.Login;
using CloudGaming.Code.Account.UserCurrency;
@ -222,18 +224,148 @@ namespace CloudGaming.Code.Account
}
/// <summary>
///
/// 扣除当前用户钻石
/// </summary>
/// <param name="cloudGamingBase"></param>
/// <param name="userCurrencyType"></param>
/// <returns></returns>
public static IUserConsumeMoney GetConsumeMoney(this CloudGamingBase cloudGamingBase, UserCurrencyType userCurrencyType)
public static IUserConsumeMoney GetCurrentUserConsumeMoney(this CloudGamingBase cloudGamingBase, UserCurrencyType userCurrencyType, T_User_Currency currency = null)
{
if (UserCurrencyType. == userCurrencyType)
{
return new DiamondConsumeMoney(cloudGamingBase);
return new DiamondConsumeMoney(cloudGamingBase.Dao, cloudGamingBase._UserId, userCurrencyType, currency);
}
return new DiamondConsumeMoney(cloudGamingBase);
return new DiamondConsumeMoney(cloudGamingBase.Dao, cloudGamingBase._UserId, userCurrencyType, currency);
}
/// <summary>
/// 扣除当前用户钻石
/// </summary>
/// <param name="cloudGamingBase"></param>
/// <param name="userCurrencyType"></param>
/// <returns></returns>
public static IUserConsumeMoney GetCurrentUserConsumeMoney(this UserInfoCache userInfo, CloudGamingBase cloudGamingBase, UserCurrencyType userCurrencyType, T_User_Currency currency = null)
{
if (UserCurrencyType. == userCurrencyType)
{
return new DiamondConsumeMoney(cloudGamingBase.Dao, userInfo.UserId, userCurrencyType, currency);
}
return new DiamondConsumeMoney(cloudGamingBase.Dao, cloudGamingBase._UserId, userCurrencyType, currency);
}
/// <summary>
/// 扣除当前用户钻石
/// </summary>
/// <param name="cloudGamingBase"></param>
/// <param name="money"></param>
/// <param name="userDoamondAction"></param>
/// <returns></returns>
public static async Task<bool> UserConsumeDiamondMoneyAsync(this CloudGamingBase cloudGamingBase, decimal money, Action<T_User_DiamondList>? userDoamondAction = null)
{
T_User_Currency currency = new T_User_Currency();
var userConsumeMoney = new DiamondConsumeMoney(cloudGamingBase.Dao, cloudGamingBase.UserInfo.UserId, UserCurrencyType., currency);
try
{
var isSuccess = await userConsumeMoney.ConsumeMoneyAsync(money);
if (!isSuccess)
{
return false;
}
cloudGamingBase.UserInfo.Diamond = (int)currency.CurrencyMoney;
await cloudGamingBase.SaveUserInfoCacheChangesAsync();
UserCurrencyConsumeType consumeType = money >= 0 ? UserCurrencyConsumeType. : UserCurrencyConsumeType.;
T_User_DiamondList userDiamondList = new T_User_DiamondList()
{
CreateAt = DateTime.Now,
Consume = money,
ConsumeType = (int)consumeType,
CurrencyType = (int)UserCurrencyType.,
OrderCode = "",
Title = "",
UpdateAt = DateTime.Now,
UserId = cloudGamingBase.UserInfo.UserId
};
if (userDoamondAction != null)
{
userDoamondAction(userDiamondList);
}
await cloudGamingBase.Dao.DaoUser.Context.AddAsync(userDiamondList);
await cloudGamingBase.Dao.DaoUser.Context.SaveChangesAsync();
}
catch (Exception ex)
{
return false;
}
return true;
}
/// <summary>
///
/// </summary>
/// <param name="cloudGamingBase"></param>
/// <param name="money">金额</param>
/// <param name="title">资产支出标题</param>
/// <param name="orderId">订单号</param>
/// <returns></returns>
public static async Task<bool> UserConsumeDiamondMoneyAsync(this CloudGamingBase cloudGamingBase, decimal money, string title = "", string orderId = "")
{
return await UserConsumeDiamondMoneyAsync(cloudGamingBase, money, it => { it.Title = title; it.OrderCode = orderId; });
}
/// <summary>
/// 扣除当前用户钻石
/// </summary>
/// <param name="cloudGamingBase"></param>
/// <param name="userCurrencyType"></param>
/// <returns></returns>
public static async Task<bool> UserConsumeMoneyAsync(this CloudGamingBase cloudGamingBase, int userId, decimal money)
{
bool isSuccess = await UserConsumeDiamondMoneyAsync(userId, money, cloudGamingBase);
if (isSuccess)
{
await cloudGamingBase.SaveUserInfoCacheChangesAsync();
}
return isSuccess;
}
/// <summary>
/// 扣除当前用户钻石
/// </summary>
/// <param name="cloudGamingBase"></param>
/// <param name="userCurrencyType"></param>
/// <returns></returns>
public static async Task<bool> UserConsumeDiamondMoneyAsync(int userId, decimal money, CloudGamingBase cloudGamingBase)
{
T_User_Currency currency = new T_User_Currency();
var userConsumeMoney = new DiamondConsumeMoney(cloudGamingBase.Dao, userId, UserCurrencyType., currency);
try
{
var isSuccess = await userConsumeMoney.ConsumeMoneyAsync(money);
if (!isSuccess)
{
return false;
}
//清除缓存
string key = GetUserInfoRedisKey(userId);
var userInfo = await cloudGamingBase.RedisCache.StringGetAsync<UserInfoCache>(key);
if (userInfo != null)
{
userInfo.Diamond = (int)currency.CurrencyMoney;
await cloudGamingBase.RedisCache.StringSetAsync(key, userInfo, TimeSpan.FromMinutes(30));
}
}
catch (Exception ex)
{
return false;
}
return true;
}
}
}

View File

@ -1,4 +1,6 @@
using CloudGaming.Code.Account.Contract;
using CloudGaming.Code.DataAccess;
using CloudGaming.DtoModel.Account.User;
using System;
using System.Collections.Generic;
@ -9,13 +11,72 @@ using System.Threading.Tasks;
namespace CloudGaming.Code.Account.UserCurrency
{
/// <summary>
///
/// 扣除或者充值用户钻石
/// </summary>
public class DiamondConsumeMoney(CloudGamingBase cloudGamingBase) : IUserConsumeMoney
/// <param name="dao"></param>
/// <param name="userId"></param>
/// <param name="userCurrencyType"></param>
/// <param name="userCurrency"></param>
public class DiamondConsumeMoney(DAO dao, int userId, UserCurrencyType userCurrencyType, T_User_Currency userCurrency = null) : IUserConsumeMoney
{
public Task<bool> ConsumeMoneyAsync(decimal money)
/// <summary>
/// 用户余额扣除
/// </summary>
/// <param name="money"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public async Task<bool> ConsumeMoneyAsync(decimal money)
{
throw new NotImplementedException();
var currency = await dao.DaoUser.Context.T_User_Currency.Where(it => it.CurrencyType == (int)userCurrencyType && it.UserId == userId).FirstOrDefaultAsync();
if (currency == null)
{
currency = new T_User_Currency()
{
CreateAt = DateTime.Now,
CurrencyMoney = 0,
CurrencyName = userCurrencyType.ToString(),
CurrencyType = (int)userCurrencyType,
UserId = userId,
UpdateAt = DateTime.Now,
};
await dao.DaoUser.Context.T_User_Currency.AddAsync(currency);
await dao.DaoUser.Context.SaveChangesAsync();
}
currency.CurrencyMoney += money;
if (currency.CurrencyMoney < 0)
{
throw new Exception("余额不足");
}
UserCurrencyConsumeType consumeType = money >= 0 ? UserCurrencyConsumeType. : UserCurrencyConsumeType.;
var currency_Log = new T_User_Currency_Log()
{
Consume = money,
ConsumeType = (int)consumeType,
CreateAt = DateTime.Now,
CurrencyType = (int)userCurrencyType,
Remarks = $"于{DateTime.Now:yyyy-MM-dd HH:mm:ss}{consumeType}[{Math.Abs(money)}]{userCurrencyType};",
UpdateAt = DateTime.Now,
UserId = userId,
};
await dao.DaoUser.Context.T_User_Currency_Log.AddAsync(currency_Log);
await dao.DaoUser.Context.SaveChangesAsync();
if (userCurrency != null)
{
userCurrency.CurrencyMoney = currency.CurrencyMoney;
userCurrency.UpdateAt = currency.UpdateAt;
userCurrency.Id = currency.Id;
userCurrency.CurrencyName = currency.CurrencyName;
userCurrency.CreateAt = currency.CreateAt;
userCurrency.CurrencyType = currency.CurrencyType;
}
else
{
userCurrency = currency;
}
return true;
}
}
}

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CloudGaming.DtoModel.Account.User
{
/// <summary>
///
/// </summary>
public class AccountNickNameRequest
{
/// <summary>
///
/// </summary>
public string NickName { get; set; }
}
}

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CloudGaming.DtoModel.Account.User;
/// <summary>
/// 用户消费类型
/// </summary>
public enum UserCurrencyConsumeType
{
/// <summary>
///
/// </summary>
= 0,
/// <summary>
///
/// </summary>
= 1
}

View File

@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CloudGaming.DtoModel.Account.UserDiamondConsume
{
/// <summary>
///
/// </summary>
public class UserDiamondConsumeDto
{
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; } = null!;
/// <summary>
/// 详情
/// </summary>
public string ConsumeDetails { get; set; }
/// <summary>
/// 创建时间,资产
/// </summary>
public string DatePrompt { get; set; }
}
}

View File

@ -58,6 +58,11 @@ public partial class CloudGamingUserContext : MultiTenantDbContext//DbContext
/// </summary>
public virtual DbSet<T_User_Data> T_User_Data { get; set; }
/// <summary>
/// 资产收入、支出表
/// </summary>
public virtual DbSet<T_User_DiamondList> T_User_DiamondList { get; set; }
/// <summary>
/// 意向订单表
/// </summary>
@ -190,26 +195,11 @@ public partial class CloudGamingUserContext : MultiTenantDbContext//DbContext
.HasComment("创建时间")
.HasColumnType("datetime");
entity.Property(e => e.CurrencyType).HasComment("金额类型");
entity.Property(e => e.ExpiresAt)
.HasComment("消耗的结束时间")
.HasColumnType("datetime");
entity.Property(e => e.GameId)
.HasMaxLength(200)
.HasComment("消耗的游戏Id");
entity.Property(e => e.IsShow).HasComment("是否显示给用户");
entity.Property(e => e.OrderId)
.HasMaxLength(64)
.HasComment("订单号")
.UseCollation("Chinese_PRC_CI_AS");
entity.Property(e => e.Remarks)
.HasMaxLength(200)
.HasMaxLength(255)
.HasComment("备注")
.UseCollation("Chinese_PRC_CI_AS");
entity.Property(e => e.TenantId).HasComment("租户");
entity.Property(e => e.Title)
.HasMaxLength(200)
.HasComment("标题")
.UseCollation("Chinese_PRC_CI_AS");
entity.Property(e => e.UpdateAt)
.HasComment("修改时间")
.HasColumnType("datetime");
@ -254,6 +244,41 @@ public partial class CloudGamingUserContext : MultiTenantDbContext//DbContext
}
});
modelBuilder.Entity<T_User_DiamondList>(entity =>
{
entity.HasKey(e => e.Id).HasName("PK__T_User_D__3214EC07EF4BDC87");
entity.ToTable(tb => tb.HasComment("资产收入、支出表"));
entity.Property(e => e.Id).ValueGeneratedNever();
entity.Property(e => e.Consume)
.HasComment("金额变化")
.HasColumnType("decimal(18, 0)");
entity.Property(e => e.ConsumeType).HasComment("收入还是支出");
entity.Property(e => e.CreateAt)
.HasComment("创建时间")
.HasColumnType("datetime");
entity.Property(e => e.CurrencyType).HasComment("货币类型");
entity.Property(e => e.Extend)
.HasMaxLength(255)
.HasComment("扩展字段");
entity.Property(e => e.OrderCode)
.HasMaxLength(64)
.HasComment("订单编号");
entity.Property(e => e.Title)
.HasMaxLength(255)
.HasComment("标题");
entity.Property(e => e.UpdateAt)
.HasComment("结束时间")
.HasColumnType("datetime");
entity.Property(e => e.UserId).HasComment("用户Id");
//添加全局筛选器
if (this.TenantInfo != null)
{
entity.HasQueryFilter(it => it.TenantId == this.TenantInfo.TenantId);
}
});
modelBuilder.Entity<T_User_IntentOrder>(entity =>
{
entity.HasKey(e => e.Id).HasName("PK__T_User_I__3214EC07D27A8CE9");

View File

@ -21,11 +21,6 @@ public partial class T_User_Currency_Log: MultiTenantEntity
/// </summary>
public virtual int UserId { get; set; }
/// <summary>
/// 标题
/// </summary>
public virtual string? Title { get; set; }
/// <summary>
/// 金额类型
/// </summary>
@ -55,24 +50,4 @@ public partial class T_User_Currency_Log: MultiTenantEntity
/// 修改时间
/// </summary>
public virtual DateTime UpdateAt { get; set; }
/// <summary>
/// 订单号
/// </summary>
public virtual string? OrderId { get; set; }
/// <summary>
/// 是否显示给用户
/// </summary>
public virtual bool IsShow { get; set; }
/// <summary>
/// 消耗的结束时间
/// </summary>
public virtual DateTime? ExpiresAt { get; set; }
/// <summary>
/// 消耗的游戏Id
/// </summary>
public virtual string? GameId { get; set; }
}

View File

@ -0,0 +1,58 @@
using System;
namespace CloudGaming.Model.DbSqlServer.Db_User;
/// <summary>
/// 资产收入、支出表
/// </summary>
public partial class T_User_DiamondList: MultiTenantEntity
{
public T_User_DiamondList() { }
public virtual int Id { get; set; }
/// <summary>
/// 用户Id
/// </summary>
public virtual int UserId { get; set; }
/// <summary>
/// 标题
/// </summary>
public virtual string Title { get; set; } = null!;
/// <summary>
/// 收入还是支出
/// </summary>
public virtual int ConsumeType { get; set; }
/// <summary>
/// 订单编号
/// </summary>
public virtual string? OrderCode { get; set; }
/// <summary>
/// 金额变化
/// </summary>
public virtual decimal Consume { get; set; }
/// <summary>
/// 货币类型
/// </summary>
public virtual int CurrencyType { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public virtual DateTime CreateAt { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public virtual DateTime UpdateAt { get; set; }
/// <summary>
/// 扩展字段
/// </summary>
public virtual string? Extend { get; set; }
}