diff --git a/src/CloudGaming/Api/CloudGaming.Api/Controllers/GameController.cs b/src/CloudGaming/Api/CloudGaming.Api/Controllers/GameController.cs index 4117bce..b1743b0 100644 --- a/src/CloudGaming/Api/CloudGaming.Api/Controllers/GameController.cs +++ b/src/CloudGaming/Api/CloudGaming.Api/Controllers/GameController.cs @@ -1,10 +1,15 @@ using CloudGaming.Api.Base; using CloudGaming.Code.Cache; +using CloudGaming.Code.DataAccess; using CloudGaming.Code.Game; using CloudGaming.Code.MiddlewareExtend; using CloudGaming.DtoModel.Game; using CloudGaming.GameModel.Db.Db_Game; +using CloudGaming.Model.DbSqlServer.Db_User; +using HuanMeng.DotNetCore.Base; + +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace CloudGaming.Api.Controllers @@ -55,11 +60,11 @@ namespace CloudGaming.Api.Controllers /// /// [HttpGet] - [RedisCache(2, 2, 0)] - public GameInfoDto GetGameInfo([FromQuery] string gameId) + //[RedisCache(2, 2, 0)] + public async Task GetGameInfo([FromQuery] string gameId) { GameBLL gamebll = new GameBLL(this.ServiceProvider); - return gamebll.GetGameInfo(gameId); + return await gamebll.GetGameInfo(gameId); } /// /// 根据游戏类型Id 获取游戏列表 @@ -87,5 +92,34 @@ namespace CloudGaming.Api.Controllers return gamebll.GameSearch(gameId); } + + /// + /// 我的收藏列表 + /// + /// + [HttpGet] + public async Task> GetGameCollect() + { + GameBLL gamebll = new GameBLL(this.ServiceProvider); + return await gamebll.GetGameCollect(); + } + /// + /// 收藏游戏 + /// + /// + /// + [HttpPost] + [Authorize] + public async Task> GameCollect([FromBody] GameCollectRequest collectRequest) + { + if (string.IsNullOrEmpty(collectRequest.GameId)) + { + return new BaseResponse(ResonseCode.Error, "游戏不能未空"); + } + GameBLL gamebll = new GameBLL(this.ServiceProvider); + return await gamebll.GameCollect(collectRequest.GameId); + } + + } } diff --git a/src/CloudGaming/Code/CloudGaming.Code/Account/AccountExtend.cs b/src/CloudGaming/Code/CloudGaming.Code/Account/AccountExtend.cs index 8720983..41c0c26 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Account/AccountExtend.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Account/AccountExtend.cs @@ -461,5 +461,24 @@ namespace CloudGaming.Code.Account } + /// + /// 获取游戏收藏记录 + /// + /// + /// + /// + /// + + public static async Task> GetUserGameCollect(this UserInfoCache userInfoCache, DAO dao, IDatabase database) + { + if (userInfoCache.GameCollects == null) + { + userInfoCache.GameCollects = new List(); + var favorite = await dao.DaoUser.Context.T_User_GameFavorite.Where(it => it.UserId == userInfoCache.UserId).OrderByDescending(it => it.FavoriteTime).Select(it => it.GameId).ToListAsync(); + userInfoCache.GameCollects.AddRange(favorite ?? new List()); + await SaveUserInfoCacheChangesAsync(userInfoCache, database); + } + return userInfoCache.GameCollects; + } } } diff --git a/src/CloudGaming/Code/CloudGaming.Code/Game/GameBLL.cs b/src/CloudGaming/Code/CloudGaming.Code/Game/GameBLL.cs index 643a808..0808612 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Game/GameBLL.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Game/GameBLL.cs @@ -1,9 +1,11 @@ +using CloudGaming.Code.Account; using CloudGaming.Code.Cache; using CloudGaming.DtoModel.Game; using System; using System.Collections.Generic; using System.Linq; +using System.Net.WebSockets; using System.Text; using System.Threading.Tasks; @@ -67,7 +69,7 @@ namespace CloudGaming.Code.Game /// /// /// - public GameInfoDto GetGameInfo(string gameId) + public async Task GetGameInfo(string gameId) { if (string.IsNullOrEmpty(gameId)) { @@ -79,6 +81,15 @@ namespace CloudGaming.Code.Game return null; } var gameInfo = Mapper.Map(game); + if (_UserId > 0) + { + //IsCollect + var gameIds = await UserInfo.GetUserGameCollect(Dao, RedisCache); + if (gameIds.Contains(gameId)) + { + gameInfo.IsCollect = true; + } + } return gameInfo; } @@ -128,7 +139,7 @@ namespace CloudGaming.Code.Game .ToList(); var gameIntroduceMatches = Cache.GameInfos - .Where(it => it.GameIntroduce.Contains(gameName) ) + .Where(it => it.GameIntroduce.Contains(gameName)) .Select(it => new GameListDto(it, ImageResStyle.中等LOGO)) .ToList(); @@ -146,5 +157,82 @@ namespace CloudGaming.Code.Game .ToList(); return list; } + + /// + /// 我的收藏 + /// + /// + public async Task> GetGameCollect() + { + if (_UserId == 0) + { + return new List(); + } + var favorite = await Dao.DaoUser.Context.T_User_GameFavorite.Where(it => it.UserId == _UserId).OrderByDescending(it => it.FavoriteTime).ToListAsync(); + if (favorite == null || favorite.Count == 0) + { + return new List(); + } + List list = new List(); + var gameData = Cache.GameEntityCache; + favorite.ForEach(it => + { + if (string.IsNullOrEmpty(it.GameId)) + { + return; + } + var game = gameData[it.GameId]; + if (game == null) + { + return; + } + var o = new GameListDto() + { + GameId = it.GameId, + GameName = game.GameName ?? "", + GameIconImage = game.ImageIconId + }; + list.Add(o); + }); + return list; + } + + /// + /// + /// + /// + /// + public async Task> GameCollect(string gameId) + { + var favorite = await Dao.DaoUser.Context.T_User_GameFavorite.Where(it => it.UserId == _UserId && it.GameId == gameId).OrderByDescending(it => it.FavoriteTime).FirstOrDefaultAsync(); + if (favorite != null) + { + Dao.DaoUser.Context.T_User_GameFavorite.Remove(favorite); + await Dao.DaoUser.Context.SaveChangesAsync(); + var degameIds = await UserInfo.GetUserGameCollect(Dao, RedisCache); + degameIds.Remove(gameId); + await this.SaveUserInfoCacheChangesAsync(); + return new BaseResponse(ResonseCode.Success, "取消收藏成功"); + } + var game = Cache.GameEntityCache[gameId]; + if (game == null) + { + throw MessageBox.ErrorShow("收藏的游戏不存在"); + } + favorite = new T_User_GameFavorite() + { + FavoriteTime = DateTime.Now, + GameId = gameId, + UserId = _UserId, + Desc = "" + }; + + await Dao.DaoUser.Context.T_User_GameFavorite.AddAsync(favorite); + await Dao.DaoUser.Context.SaveChangesAsync(); + var gameIds = await UserInfo.GetUserGameCollect(Dao, RedisCache); + gameIds.Add(gameId); + await this.SaveUserInfoCacheChangesAsync(); + return new BaseResponse(ResonseCode.Success, "收藏成功"); + } } } diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/Account/User/UserInfoCache.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/Account/User/UserInfoCache.cs index 7ff01a6..e034737 100644 --- a/src/CloudGaming/Model/CloudGaming.DtoModel/Account/User/UserInfoCache.cs +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/Account/User/UserInfoCache.cs @@ -3,6 +3,7 @@ using CloudGaming.DtoModel.Account.User.Cache; using System; using System.Collections.Generic; using System.Linq; +using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; @@ -33,8 +34,16 @@ namespace CloudGaming.DtoModel.Account.User /// public Dictionary BuyProductCount { get; set; } + /// + /// 七天签到功能 + /// public UserSevenDayCache? UserSevenDay { get; set; } - + /// + /// 收藏的游戏列表 + /// + public List GameCollects { get; set; } + + } } diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/Game/GameCollectRequest.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/Game/GameCollectRequest.cs new file mode 100644 index 0000000..f3cf8dc --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/Game/GameCollectRequest.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudGaming.DtoModel.Game +{ + /// + /// 游戏收藏 + /// + public class GameCollectRequest + { + /// + /// 游戏Id + /// + public string GameId { get; set; } + } +} diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/Game/GameInfoDto.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/Game/GameInfoDto.cs index 6a71ed6..eff71ae 100644 --- a/src/CloudGaming/Model/CloudGaming.DtoModel/Game/GameInfoDto.cs +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/Game/GameInfoDto.cs @@ -85,5 +85,10 @@ namespace CloudGaming.DtoModel.Game /// [Images] public int GameShareUserIcon { get; set; } + + /// + /// 游戏是否收藏 + /// + public bool IsCollect { get; set; } } } diff --git a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/CloudGamingUserContext.cs b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/CloudGamingUserContext.cs index 58f5671..0ea0a99 100644 --- a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/CloudGamingUserContext.cs +++ b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/CloudGamingUserContext.cs @@ -63,6 +63,11 @@ public partial class CloudGamingUserContext : MultiTenantDbContext//DbContext /// public virtual DbSet T_User_DiamondList { get; set; } + /// + /// 我的游戏收藏 + /// + public virtual DbSet T_User_GameFavorite { get; set; } + /// /// 意向订单表 /// @@ -279,6 +284,35 @@ public partial class CloudGamingUserContext : MultiTenantDbContext//DbContext } }); + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("PK_T_USER_FAVORITE"); + + entity.ToTable(tb => tb.HasComment("我的游戏收藏")); + + entity.HasIndex(e => e.UserId, "UserId"); + + entity.Property(e => e.Id).HasComment("主键"); + entity.Property(e => e.Desc) + .HasMaxLength(50) + .HasComment("备注") + .UseCollation("Chinese_PRC_CI_AS"); + entity.Property(e => e.FavoriteTime) + .HasComment("收藏时间") + .HasColumnType("datetime"); + entity.Property(e => e.GameId) + .HasMaxLength(100) + .HasComment("游戏Id") + .UseCollation("Chinese_PRC_CI_AS"); + entity.Property(e => e.TenantId).HasComment("租户"); + entity.Property(e => e.UserId).HasComment("用户Id"); + //添加全局筛选器 + if (this.TenantInfo != null) + { + entity.HasQueryFilter(it => it.TenantId == this.TenantInfo.TenantId); + } + }); + modelBuilder.Entity(entity => { entity.HasKey(e => e.Id).HasName("PK__T_User_I__3214EC07D27A8CE9"); diff --git a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_DiamondList.cs b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_DiamondList.cs index c5ef16d..620916a 100644 --- a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_DiamondList.cs +++ b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_DiamondList.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace CloudGaming.Model.DbSqlServer.Db_User; diff --git a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_GameFavorite.cs b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_GameFavorite.cs new file mode 100644 index 0000000..e361ecc --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_GameFavorite.cs @@ -0,0 +1,41 @@ +using System; + +namespace CloudGaming.Model.DbSqlServer.Db_User; + +/// +/// 我的游戏收藏 +/// +public partial class T_User_GameFavorite: MultiTenantEntity +{ + public T_User_GameFavorite() { } + + /// + /// 主键 + /// + public virtual int Id { get; set; } + + /// + /// 用户Id + /// + public virtual int UserId { get; set; } + + /// + /// 游戏Id + /// + public virtual string GameId { get; set; } = null!; + + /// + /// 收藏时间 + /// + public virtual DateTime FavoriteTime { get; set; } + + /// + /// 备注 + /// + public virtual string? Desc { get; set; } + + /// + /// 所属租户 + /// + public override Guid TenantId { get; set; } + }