From 14e93f469715ded9d86d998fd3aebac5e94a39ce Mon Sep 17 00:00:00 2001 From: LittleFish-233 Date: Sun, 2 Jul 2023 09:13:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8A=98=E6=89=A3=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E7=AD=9B=E9=80=89=E4=BB=B7=E6=A0=BC=E6=97=A0=E6=95=88?= =?UTF-8?q?=E7=9A=84bug=EF=BC=8C=E5=AE=8C=E6=88=90=E5=88=86=E4=BA=AB?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=BA=93=E9=A1=B5=E9=9D=A2=E5=89=8D=E5=8D=8A?= =?UTF-8?q?=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Application/Helper/AppHelper.cs | 8 +- .../SteamInfors/ISteamInforService.cs | 2 +- .../SteamInfors/SteamInforService.cs | 49 ++-- .../Controllers/SteamAPIController.cs | 51 +++- .../Anniversaries/JudgableGamesSortType.cs | 22 ++ .../ViewModel/Steam/DiscountPageHelper.cs | 2 +- .../Steam/SteamGamesOverviewModel.cs | 34 +++ .../ViewModel/Steam/SteamUserInforModel.cs | 19 ++ .../ViewModel/Theme/ThemeModel.cs | 23 ++ .../ClaimExtensions.cs | 5 + .../Components/Clients/EditCard.razor | 18 +- .../Pages/Users/Clients.razor | 20 +- .../DataModels/Account/ExternalProvider.cs | 1 + .../CnGalWebSite.IdentityServer.csproj | 1 + .../Services/ImplicitProfileService.cs | 83 ++++++ .../CnGalWebSite.IdentityServer/Startup.cs | 8 +- .../CnGalWebSite.Server/Pages/_Layout.cshtml | 2 + .../CnGalWebSite.Server/bundleconfig.json | 3 +- .../wwwroot/css/anniversary.css | 36 +++ .../wwwroot/styles/bundle-css.css | 37 +++ .../wwwroot/styles/bundle-css.min.css | 2 +- .../PlayedGames/ListGameRecordCard.razor | 104 +++++++- .../PlayedGames/SteamUserInforCard.razor | 251 +++++++++++------- .../Space/UserPlayedGameListView.razor | 22 +- .../Anniversaries/PlayedGames/MainCard.razor | 2 +- .../Home/Anniversaries/Ratings/GameCard.razor | 2 - .../Anniversaries/Ratings/GameGroup.razor | 44 +-- .../Shared/Editors/Users/MainCard.razor | 15 +- .../Pages/Normal/Home/Anniversaries.razor | 79 +++--- .../Service/DataCatcheService.cs | 4 +- .../Service/IDataCacheService.cs | 2 +- 31 files changed, 721 insertions(+), 230 deletions(-) create mode 100644 CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Steam/SteamGamesOverviewModel.cs create mode 100644 CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Steam/SteamUserInforModel.cs create mode 100644 CnGalWebSite/CnGalWebSite.IdentityServer/Services/ImplicitProfileService.cs create mode 100644 CnGalWebSite/CnGalWebSite.Server/wwwroot/css/anniversary.css diff --git a/CnGalWebSite/CnGalWebSite.APIServer/Application/Helper/AppHelper.cs b/CnGalWebSite/CnGalWebSite.APIServer/Application/Helper/AppHelper.cs index ba4d8c25b..98625b86d 100644 --- a/CnGalWebSite/CnGalWebSite.APIServer/Application/Helper/AppHelper.cs +++ b/CnGalWebSite/CnGalWebSite.APIServer/Application/Helper/AppHelper.cs @@ -292,8 +292,14 @@ public async Task GetAPICurrentUserAsync(HttpContext context) return null; } var user = await _userRepository.FirstOrDefaultAsync(s => s.Id == id); - if(user!=null) + if (user != null) { + //是否更新SteamId + if (string.IsNullOrEmpty(user.SteamId) || user.SteamId.Replace("、", ",").Replace(",", ",").Contains(',') == false) + { + user.SteamId = context.User?.Claims?.GetUserSteamId(); + await _userRepository.UpdateAsync(user); + } return user; } diff --git a/CnGalWebSite/CnGalWebSite.APIServer/Application/SteamInfors/ISteamInforService.cs b/CnGalWebSite/CnGalWebSite.APIServer/Application/SteamInfors/ISteamInforService.cs index eeacd9e43..316d84c87 100644 --- a/CnGalWebSite/CnGalWebSite.APIServer/Application/SteamInfors/ISteamInforService.cs +++ b/CnGalWebSite/CnGalWebSite.APIServer/Application/SteamInfors/ISteamInforService.cs @@ -14,6 +14,6 @@ public interface ISteamInforService /// Task UpdateUserSteam(ApplicationUser user); - Task> GetSteamUserInfors(List steamids); + Task> GetSteamUserInfors(List steamids, ApplicationUser user); } } diff --git a/CnGalWebSite/CnGalWebSite.APIServer/Application/SteamInfors/SteamInforService.cs b/CnGalWebSite/CnGalWebSite.APIServer/Application/SteamInfors/SteamInforService.cs index a5c679ef9..f07491012 100644 --- a/CnGalWebSite/CnGalWebSite.APIServer/Application/SteamInfors/SteamInforService.cs +++ b/CnGalWebSite/CnGalWebSite.APIServer/Application/SteamInfors/SteamInforService.cs @@ -18,7 +18,7 @@ namespace CnGalWebSite.APIServer.Application.SteamInfors { public class SteamInforService : ISteamInforService { - private readonly IRepository _steamInforRepository; + private readonly IRepository _storeInfoRepository; private readonly IRepository _userRepository; private readonly IRepository _playedGameRepository; private readonly IRepository _entryRepository; @@ -27,11 +27,11 @@ public class SteamInforService : ISteamInforService private readonly HttpClient _httpClient; private readonly ILogger _logger; - public SteamInforService(IRepository steamInforRepository, IRepository userRepository, IRepository entryRepository, + public SteamInforService(IRepository storeInfoRepository, IRepository userRepository, IRepository entryRepository, IConfiguration configuration, IRepository playedGameRepository, IRepository steamUserInforRepository, ILogger logger, HttpClient httpClient) { - _steamInforRepository = steamInforRepository; + _storeInfoRepository = storeInfoRepository; _userRepository = userRepository; _configuration = configuration; _playedGameRepository = playedGameRepository; @@ -79,15 +79,15 @@ public async Task UpdateUserSteam(ApplicationUser user) //查找 var userGames = await _playedGameRepository.GetAll().Where(s => s.ApplicationUserId == user.Id).ToListAsync(); - var appids = steamGames.games.Select(s => s.appid).Distinct(); - var steams = await _steamInforRepository.GetAll().AsNoTracking() + var appids = steamGames.games.Select(s => s.appid.ToString()).Distinct(); + var steams = await _storeInfoRepository.GetAll().AsNoTracking() .Include(s => s.Entry) - .Where(s => string.IsNullOrWhiteSpace(s.Entry.Name) == false && s.Entry.IsHidden == false) - .Where(s => appids.Contains(s.SteamId)) + .Where(s => string.IsNullOrWhiteSpace(s.Entry.Name) == false && s.Entry.IsHidden == false && s.PlatformType == PublishPlatformType.Steam) + .Where(s => appids.Contains(s.Link)) .Select(s => new { s.EntryId, - s.SteamId + SteamId = s.Link }) .ToListAsync(); @@ -98,7 +98,7 @@ public async Task UpdateUserSteam(ApplicationUser user) if (steamTemp != null) { item.IsInSteam = true; - item.PlayDuration = steamGames.games.FirstOrDefault(s => s.appid == steamTemp.SteamId)?.playtime_forever ?? 0; + item.PlayDuration = steamGames.games.FirstOrDefault(s => s.appid.ToString() == steamTemp.SteamId)?.playtime_forever ?? 0; } else { @@ -120,9 +120,9 @@ public async Task UpdateUserSteam(ApplicationUser user) _ = await _playedGameRepository.InsertAsync(new PlayedGame { IsInSteam = true, - PlayDuration = steamGames.games.FirstOrDefault(s => s.appid == item.SteamId)?.playtime_forever ?? 0, + PlayDuration = steamGames.games.FirstOrDefault(s => s.appid.ToString() == item.SteamId)?.playtime_forever ?? 0, EntryId = item.EntryId, - Type = ((steamGames.games.FirstOrDefault(s => s.appid == item.SteamId)?.playtime_forever ?? 0) > 0) ? PlayedGameType.Played : PlayedGameType.UnPlayed, + Type = ((steamGames.games.FirstOrDefault(s => s.appid.ToString() == item.SteamId)?.playtime_forever ?? 0) > 0) ? PlayedGameType.Played : PlayedGameType.UnPlayed, ApplicationUserId = user.Id, ShowPublicly = true, LastEditTime = now @@ -132,23 +132,42 @@ public async Task UpdateUserSteam(ApplicationUser user) } - public async Task> GetSteamUserInfors(List steamids) + public async Task> GetSteamUserInfors(List steamids, ApplicationUser user) { - var model = await _steamUserInforRepository.GetAllListAsync(s => steamids.Contains(s.SteamId)); + var steams = await _steamUserInforRepository.GetAllListAsync(s => steamids.Contains(s.SteamId)); foreach (var item in steamids) { //不存在则获取 - if (model.Any(s => s.SteamId == item) == false) + if (steams.Any(s => s.SteamId == item) == false) { var temp = await UpdateSteamUserInfor(item); if (temp != null) { - model.Add(temp); + steams.Add(temp); } } } + var model = new List(); + + var gameIds = user == null ? new List() : await _playedGameRepository.GetAll().AsNoTracking().Where(s => s.ApplicationUserId == user.Id && s.IsInSteam && s.EntryId != null).Select(s => s.EntryId.Value).ToListAsync(); + + foreach (var item in steams) + { + //计算总价格 + var price = gameIds.Any() ? await _storeInfoRepository.GetAll().AsNoTracking().Where(s => s.PlatformType == PublishPlatformType.Steam && s.OriginalPrice != null && s.EntryId != null && gameIds.Contains(s.EntryId.Value)).SumAsync(s => s.OriginalPrice.Value) : 0; + + model.Add(new SteamUserInforModel + { + + SteamId = item.SteamId, + Image = item.Image, + Name = item.Name, + Price = price + }); + } + return model; } diff --git a/CnGalWebSite/CnGalWebSite.APIServer/Controllers/SteamAPIController.cs b/CnGalWebSite/CnGalWebSite.APIServer/Controllers/SteamAPIController.cs index f7c592354..55245f51f 100644 --- a/CnGalWebSite/CnGalWebSite.APIServer/Controllers/SteamAPIController.cs +++ b/CnGalWebSite/CnGalWebSite.APIServer/Controllers/SteamAPIController.cs @@ -26,22 +26,24 @@ public class SteamAPIController : ControllerBase private readonly IRepository _entryRepository; private readonly IRepository _tagRepository; - private readonly IRepository _steamInforRepository; + private readonly IRepository _storeInfoRepository; + private readonly IRepository _playedGameRepository; private readonly IAppHelper _appHelper; private readonly IHttpService _httpService; private readonly ISteamInforService _steamInforService; private readonly IRepository _userRepository; - public SteamAPIController(IRepository steamInforRepository, ISteamInforService steamInforService, IRepository tagRepository, + public SteamAPIController(IRepository storeInfoRepository, ISteamInforService steamInforService, IRepository tagRepository, IRepository playedGameRepository, IAppHelper appHelper, IRepository entryRepository, IRepository userRepository, IHttpService httpService) { _entryRepository = entryRepository; _appHelper = appHelper; - _steamInforRepository = steamInforRepository; + _storeInfoRepository = storeInfoRepository; _steamInforService = steamInforService; _userRepository = userRepository; _tagRepository = tagRepository; _httpService = httpService; + _playedGameRepository = playedGameRepository; } [AllowAnonymous] @@ -54,7 +56,7 @@ public async Task GetSteamHtml(int steamId) [AllowAnonymous] [HttpGet("{id}")] - public async Task>> GetUserSteamInforAsync(string id) + public async Task>> GetUserSteamInforAsync(string id) { //获取当前用户ID var user = await _appHelper.GetAPICurrentUserAsync(HttpContext); @@ -68,12 +70,12 @@ public async Task>> GetUserSteamInforAsync(str if (string.IsNullOrWhiteSpace(objectUser.SteamId)) { - return new List(); + return new List(); } var steamids = objectUser.SteamId.Replace(",", ",").Replace("、", ",").Split(','); - var model = await _steamInforService.GetSteamUserInfors(steamids.ToList()); + var model = await _steamInforService.GetSteamUserInfors(steamids.ToList(),user); return model; @@ -102,6 +104,43 @@ public async Task>> GetFreeGamesAsync( return model; } + [AllowAnonymous] + [HttpGet] + public async Task> GetSteamGamesOverview() + { + var users = await _playedGameRepository.GetAll().AsNoTracking().Include(s => s.ApplicationUser).Where(s => s.IsInSteam && s.ApplicationUser != null).GroupBy(s => s.ApplicationUserId).Where(s => s.Any()).Select(s => new HasMostGamesUserModel + { + Count = s.Count(), + Name = s.First().ApplicationUser.UserName, + Image = s.First().ApplicationUser.PhotoPath, + PersonalSignature = s.First().ApplicationUser.PersonalSignature, + }).OrderByDescending(s => s.Count).Take(10).ToListAsync(); + + var userCount = await _playedGameRepository.GetAll().AsNoTracking().Include(s => s.ApplicationUser).Where(s => s.IsInSteam && s.ApplicationUser != null).GroupBy(s => s.ApplicationUserId).Where(s => s.Any()).CountAsync(); + + var games = await _playedGameRepository.GetAll().AsNoTracking().Include(s => s.Entry).Where(s => s.IsInSteam && s.Entry != null && string.IsNullOrWhiteSpace(s.Entry.Name) == false && s.Entry.IsHidden == false) + .GroupBy(s => s.EntryId).Where(s => s.Any()).Select(s => new + { + Rate = (double)s.Count() / userCount, + s.First().Entry + }).OrderByDescending(s => s.Rate).Take(10).ToListAsync(); + + var highestGames = new List(); + foreach (var item in games) + { + var entry =new PossessionRateHighestGameModel(); + entry.SynchronizationProperties(_appHelper.GetEntryInforTipViewModel(item.Entry)); + entry.Rate = item.Rate; + highestGames.Add(entry); + } + + return new SteamGamesOverviewModel + { + Count = await _storeInfoRepository.GetAll().AsNoTracking().CountAsync(s => s.PlatformType == PublishPlatformType.Steam && string.IsNullOrWhiteSpace(s.Link) == false), + HasMostGamesUsers = users, + PossessionRateHighestGames = highestGames + }; + } } } diff --git a/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Anniversaries/JudgableGamesSortType.cs b/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Anniversaries/JudgableGamesSortType.cs index 2a659e051..5bdf32115 100644 --- a/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Anniversaries/JudgableGamesSortType.cs +++ b/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Anniversaries/JudgableGamesSortType.cs @@ -31,4 +31,26 @@ public enum JudgableGamesDisplayType [Display(Name = "条幅")] LongCard, } + + public enum PlayedGamesSortType + { + [Display(Name = "游玩状态")] + Type, + [Display(Name = "游玩时间")] + Time, + [Display(Name = "我的评分")] + Score, + [Display(Name = "名称")] + Name, + } + + public enum PlayedGamesDisplayType + { + [Display(Name = "大卡片")] + LargeCard, + [Display(Name = "预览图")] + SmallCard, + [Display(Name = "条幅")] + LongCard, + } } diff --git a/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Steam/DiscountPageHelper.cs b/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Steam/DiscountPageHelper.cs index 1fcaf749e..e67cff482 100644 --- a/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Steam/DiscountPageHelper.cs +++ b/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Steam/DiscountPageHelper.cs @@ -117,7 +117,7 @@ public void SetItems() //筛选价格区间 if (maxOriginalPrice < MaxOriginalPriceLimit && maxOriginalPrice >= 0) { - Items = Items.Where(s => s.OriginalPrice <= maxOriginalPrice*100); + Items = Items.Where(s => s.OriginalPrice <= maxOriginalPrice); } diff --git a/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Steam/SteamGamesOverviewModel.cs b/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Steam/SteamGamesOverviewModel.cs new file mode 100644 index 000000000..d521dc66f --- /dev/null +++ b/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Steam/SteamGamesOverviewModel.cs @@ -0,0 +1,34 @@ +using CnGalWebSite.DataModel.ViewModel.Search; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CnGalWebSite.DataModel.ViewModel.Steam +{ + public class SteamGamesOverviewModel + { + public int Count { get; set; } + + public List PossessionRateHighestGames { get; set; } + + public List HasMostGamesUsers { get; set; } + } + + public class PossessionRateHighestGameModel : EntryInforTipViewModel + { + public double Rate { get; set; } + } + + public class HasMostGamesUserModel + { + public string Name { get; set; } + + public string Image { get; set; } + + public int Count { get; set; } + + public string PersonalSignature { get; set; } + } +} diff --git a/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Steam/SteamUserInforModel.cs b/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Steam/SteamUserInforModel.cs new file mode 100644 index 000000000..4c0ce3178 --- /dev/null +++ b/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Steam/SteamUserInforModel.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CnGalWebSite.DataModel.ViewModel.Steam +{ + public class SteamUserInforModel + { + public string SteamId { get; set; } + + public string Image { get; set; } + + public string Name { get; set; } + + public double Price { get; set; } + } +} diff --git a/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Theme/ThemeModel.cs b/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Theme/ThemeModel.cs index 55bcd182a..db580ceed 100644 --- a/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Theme/ThemeModel.cs +++ b/CnGalWebSite/CnGalWebSite.DataModel/ViewModel/Theme/ThemeModel.cs @@ -72,6 +72,12 @@ public enum ThemeType } public class AnniversariesSetting + { + public JudgableGamesSetting JudgableGamesSetting { get;set; }=new JudgableGamesSetting(); + public PlayedGameSetting PlayedGameSetting { get; set; } = new PlayedGameSetting(); + } + + public class JudgableGamesSetting { public string SearchString { get; set; } public JudgableGamesSortType SortType { get; set; } @@ -87,4 +93,21 @@ public class AnniversariesSetting public int CurrentPage { get; set; } = 1; } + + public class PlayedGameSetting + { + public string SearchString { get; set; } + public PlayedGamesSortType SortType { get; set; } + public PlayedGamesDisplayType DisplayType { get; set; } + + public int TabIndex { get; set; } = 1; + + public int MaxCount { get; set; } = 24; + + public int Count { get; set; } + + public int TotalPages => (Count / MaxCount) + 1; + + public int CurrentPage { get; set; } = 1; + } } diff --git a/CnGalWebSite/CnGalWebSite.Extensions/ClaimExtensions.cs b/CnGalWebSite/CnGalWebSite.Extensions/ClaimExtensions.cs index 527fde592..d20fde9e3 100644 --- a/CnGalWebSite/CnGalWebSite.Extensions/ClaimExtensions.cs +++ b/CnGalWebSite/CnGalWebSite.Extensions/ClaimExtensions.cs @@ -55,5 +55,10 @@ public static string GetUserId(this IEnumerable claims) { return claims?.FirstOrDefault(s => s.Type == JwtClaimTypes.Subject || s.Type == ClaimTypes.NameIdentifier)?.Value; } + + public static string GetUserSteamId(this IEnumerable claims) + { + return claims?.FirstOrDefault(s => s.Type == "SteamId")?.Value; + } } } diff --git a/CnGalWebSite/CnGalWebSite.IdentityServer.Admin.Shared/Components/Clients/EditCard.razor b/CnGalWebSite/CnGalWebSite.IdentityServer.Admin.Shared/Components/Clients/EditCard.razor index b3c6fa9a3..ee341f625 100644 --- a/CnGalWebSite/CnGalWebSite.IdentityServer.Admin.Shared/Components/Clients/EditCard.razor +++ b/CnGalWebSite/CnGalWebSite.IdentityServer.Admin.Shared/Components/Clients/EditCard.razor @@ -13,7 +13,7 @@ else @(Id==0? "添加应用" : "编辑应用") @Model.ClientName - Id:@Model.Id + Id:@Model.Id @@ -92,13 +92,13 @@ else @code { - [Parameter] - public int Id { get; set; } - [Parameter] - public EventCallback OnEdited { get; set; } + [Parameter] + public int Id { get; set; } + [Parameter] + public EventCallback OnEdited { get; set; } - [Parameter] - public IEnumerable> AllowedScopes { get; set; } + [Parameter] + public IEnumerable> AllowedScopes { get; set; } ClientEditModel Model; @@ -113,12 +113,12 @@ else IEnumerable> _allowedGrantTypes = new List> - { +{ new KeyValuePair("authorization_code","授权码"), new KeyValuePair("password","密码") }; IEnumerable> _allowedScopes = new List> - { +{ new KeyValuePair("openid","查看OpenID"), new KeyValuePair("profile","查看用户资料"), new KeyValuePair("IdentityServerApi","管理开放平台"), diff --git a/CnGalWebSite/CnGalWebSite.IdentityServer.Admin.Shared/Pages/Users/Clients.razor b/CnGalWebSite/CnGalWebSite.IdentityServer.Admin.Shared/Pages/Users/Clients.razor index ed9360f16..45559c504 100644 --- a/CnGalWebSite/CnGalWebSite.IdentityServer.Admin.Shared/Pages/Users/Clients.razor +++ b/CnGalWebSite/CnGalWebSite.IdentityServer.Admin.Shared/Pages/Users/Clients.razor @@ -23,7 +23,7 @@ @if (Model == null) { - + } else @@ -31,7 +31,7 @@ @foreach (var item in Model) { - + } } @@ -40,7 +40,7 @@ - + @code { @@ -53,10 +53,22 @@ public ErrorHandler ErrorHandler { get; set; } CnGalWebSite.IdentityServer.Admin.Shared.Components.Clients.EditCard editCard; + List> _scopes; protected override async Task OnInitializedAsync() { - await Refresh(); + try + { + _scopes = (await _httpService.GetAsync>>("api/identityresources/all")).ToList(); + _scopes.AddRange(await _httpService.GetAsync>>("api/apiscopes/all")); + + await Refresh(); + } + catch (Exception ex) + { + ErrorHandler.ProcessError(ex, "获取所有用户角色失败"); + } + } public async Task Refresh() diff --git a/CnGalWebSite/CnGalWebSite.IdentityServer.Models/DataModels/Account/ExternalProvider.cs b/CnGalWebSite/CnGalWebSite.IdentityServer.Models/DataModels/Account/ExternalProvider.cs index bef0ef8bc..16ceba142 100644 --- a/CnGalWebSite/CnGalWebSite.IdentityServer.Models/DataModels/Account/ExternalProvider.cs +++ b/CnGalWebSite/CnGalWebSite.IdentityServer.Models/DataModels/Account/ExternalProvider.cs @@ -16,6 +16,7 @@ public string Icon "GitHub" => "mdi mdi-github", "Gitee" => "mdi mdi-alpha-g-circle", "QQ" => "mdi mdi-qqchat", + "Steam" => "mdi mdi-steam", _ => "mdi mdi-link" }; } diff --git a/CnGalWebSite/CnGalWebSite.IdentityServer/CnGalWebSite.IdentityServer.csproj b/CnGalWebSite/CnGalWebSite.IdentityServer/CnGalWebSite.IdentityServer.csproj index b24558a61..c3be9f158 100644 --- a/CnGalWebSite/CnGalWebSite.IdentityServer/CnGalWebSite.IdentityServer.csproj +++ b/CnGalWebSite/CnGalWebSite.IdentityServer/CnGalWebSite.IdentityServer.csproj @@ -22,6 +22,7 @@ + diff --git a/CnGalWebSite/CnGalWebSite.IdentityServer/Services/ImplicitProfileService.cs b/CnGalWebSite/CnGalWebSite.IdentityServer/Services/ImplicitProfileService.cs new file mode 100644 index 000000000..a6b0067a1 --- /dev/null +++ b/CnGalWebSite/CnGalWebSite.IdentityServer/Services/ImplicitProfileService.cs @@ -0,0 +1,83 @@ + +using CnGalWebSite.IdentityServer.Models.DataModels.Account; +using IdentityModel; +using IdentityServer4.Models; +using IdentityServer4.Services; +using Microsoft.AspNetCore.Identity; +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using System.Threading.Tasks; + +namespace CnGalWebSite.IdentityServer.Services +{ + public class ImplicitProfileService : IProfileService + { + private readonly UserManager _userManager; + private readonly RoleManager _roleManager; + + public ImplicitProfileService( + UserManager userManager, + RoleManager roleManager) + { + _userManager = userManager; + _roleManager = roleManager; + } + + public async Task> GetClaimsFromUserAsync(ApplicationUser user) + { + var claims = new List { + new Claim(JwtClaimTypes.Subject,user.Id.ToString()), + new Claim(JwtClaimTypes.Name,user.UserName), + new Claim(JwtClaimTypes.PreferredUserName,user.UserName) + }; + + var role = await _userManager.GetRolesAsync(user); + role.ToList().ForEach(f => + { + claims.Add(new Claim(JwtClaimTypes.Role, f)); + }); + + + //添加SteamId + var steamUrl = (await _userManager.GetLoginsAsync(user)).FirstOrDefault(s => s.ProviderDisplayName == "Steam")?.ProviderKey; + if (string.IsNullOrWhiteSpace(steamUrl)==false) + { + claims.Add(new Claim("SteamId", steamUrl.Split('/').Last())); + + } + return claims; + } + + /// + /// 获取用户Claims + /// 用户请求userinfo endpoint时会触发该方法 + /// http://localhost:5003/connect/userinfo + /// + /// + /// + public async Task GetProfileDataAsync(ProfileDataRequestContext context) + { + var subjectId = context.Subject.Claims.FirstOrDefault(c => c.Type == "sub").Value; + var user = await _userManager.FindByIdAsync(subjectId); + context.IssuedClaims = await GetClaimsFromUserAsync(user); + } + + /// + /// 判断用户是否可用 + /// Identity Server会确定用户是否有效 + /// + /// + /// + public async Task IsActiveAsync(IsActiveContext context) + { + var subjectId = context.Subject.Claims.FirstOrDefault(c => c.Type == "sub").Value; + var user = await _userManager.FindByIdAsync(subjectId); + context.IsActive = user != null; //该用户是否已经激活,可用,否则不能接受token + + /* + 这样还应该判断用户是否已经锁定,那么应该IsActive=false + */ + } + } +} diff --git a/CnGalWebSite/CnGalWebSite.IdentityServer/Startup.cs b/CnGalWebSite/CnGalWebSite.IdentityServer/Startup.cs index c9c61f519..a483eda30 100644 --- a/CnGalWebSite/CnGalWebSite.IdentityServer/Startup.cs +++ b/CnGalWebSite/CnGalWebSite.IdentityServer/Startup.cs @@ -31,6 +31,7 @@ using IdentityServer4.EntityFramework.Mappers; using System.Linq; using CnGalWebSite.Core.Services.Query; +using CnGalWebSite.IdentityServer.Services; namespace CnGalWebSite.IdentityServer { @@ -147,7 +148,8 @@ public void ConfigureServices(IServiceCollection services) { options.ConfigureDbContext = b => b.UseMySql(Configuration["DefaultDBConnection"], ServerVersion.AutoDetect(Configuration["DefaultDBConnection"]), sql => sql.MigrationsAssembly(migrationsAssembly)); }) - .AddAspNetIdentity(); + .AddAspNetIdentity() + .AddProfileService(); //设置证书 if (string.IsNullOrWhiteSpace(Configuration["CertPath"]) || string.IsNullOrWhiteSpace(Configuration["CertPassword"])) @@ -184,6 +186,10 @@ public void ConfigureServices(IServiceCollection services) options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme; options.ClientId = Configuration["GiteeClientId"]; options.ClientSecret = Configuration["GiteeClientSecret"]; + }) + .AddSteam(options => + { + options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme; }); //API终结点 diff --git a/CnGalWebSite/CnGalWebSite.Server/Pages/_Layout.cshtml b/CnGalWebSite/CnGalWebSite.Server/Pages/_Layout.cshtml index 7cbf1bb12..c39f64c80 100644 --- a/CnGalWebSite/CnGalWebSite.Server/Pages/_Layout.cshtml +++ b/CnGalWebSite/CnGalWebSite.Server/Pages/_Layout.cshtml @@ -82,6 +82,8 @@ + + diff --git a/CnGalWebSite/CnGalWebSite.Server/bundleconfig.json b/CnGalWebSite/CnGalWebSite.Server/bundleconfig.json index 732905994..f943aa0ab 100644 --- a/CnGalWebSite/CnGalWebSite.Server/bundleconfig.json +++ b/CnGalWebSite/CnGalWebSite.Server/bundleconfig.json @@ -7,7 +7,8 @@ "wwwroot/css/site.css", "wwwroot/css/official-website.css", "wwwroot/css/article-introduce.css", - "wwwroot/css/home.css" + "wwwroot/css/home.css", + "wwwroot/css/anniversary.css" ] }, { diff --git a/CnGalWebSite/CnGalWebSite.Server/wwwroot/css/anniversary.css b/CnGalWebSite/CnGalWebSite.Server/wwwroot/css/anniversary.css new file mode 100644 index 000000000..0ee54c013 --- /dev/null +++ b/CnGalWebSite/CnGalWebSite.Server/wwwroot/css/anniversary.css @@ -0,0 +1,36 @@ + +/*分享库存*/ +.anniversary-page .user-steam-card { + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: center; + flex-wrap: wrap; + gap: 1rem; +} + + .anniversary-page .user-steam-card .user-info { + display: flex; + flex-direction: column; + align-items: center; + gap: .8rem; + } + + .anniversary-page .user-steam-card .user-info .image { + height: 6rem; + border-radius: 50%; + } + + .anniversary-page .user-steam-card .user-info .name { + font-size: large; + font-weight: bold; + } + + .anniversary-page .user-steam-card .goal .key { + font-size: large; + } + + .anniversary-page .user-steam-card .goal .value { + font-size: xxx-large; + font-weight: bold; + } diff --git a/CnGalWebSite/CnGalWebSite.Server/wwwroot/styles/bundle-css.css b/CnGalWebSite/CnGalWebSite.Server/wwwroot/styles/bundle-css.css index 40083e2df..958b6952b 100644 --- a/CnGalWebSite/CnGalWebSite.Server/wwwroot/styles/bundle-css.css +++ b/CnGalWebSite/CnGalWebSite.Server/wwwroot/styles/bundle-css.css @@ -2516,3 +2516,40 @@ a .aspect-ratio + p > strong { .hot-tags-card .item:hover i { color: var(--active-color); } + + +/*分享库存*/ +.anniversary-page .user-steam-card { + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: center; + flex-wrap: wrap; + gap: 1rem; +} + + .anniversary-page .user-steam-card .user-info { + display: flex; + flex-direction: column; + align-items: center; + gap: .8rem; + } + + .anniversary-page .user-steam-card .user-info .image { + height: 6rem; + border-radius: 50%; + } + + .anniversary-page .user-steam-card .user-info .name { + font-size: large; + font-weight: bold; + } + + .anniversary-page .user-steam-card .goal .key { + font-size: large; + } + + .anniversary-page .user-steam-card .goal .value { + font-size: xxx-large; + font-weight: bold; + } diff --git a/CnGalWebSite/CnGalWebSite.Server/wwwroot/styles/bundle-css.min.css b/CnGalWebSite/CnGalWebSite.Server/wwwroot/styles/bundle-css.min.css index 17a5a24d9..efc1f2298 100644 --- a/CnGalWebSite/CnGalWebSite.Server/wwwroot/styles/bundle-css.min.css +++ b/CnGalWebSite/CnGalWebSite.Server/wwwroot/styles/bundle-css.min.css @@ -1 +1 @@ -#web_bg{position:fixed;top:0;left:0;width:100%;height:100%;z-index:-10;zoom:1;background-color:transparent;background-repeat:no-repeat;background-size:cover;-webkit-background-size:cover;-o-background-size:cover}.bg-opacity{background-color:#fff!important}.bg-theme{background-color:#fff!important}.word-warp-break{word-wrap:break-word;word-break:break-all}.article-infor-text{font-size:13px}.comment-tag{width:fit-content;color:#fff;border-radius:5px;padding:0 5px;word-break:keep-all;height:fit-content}.comment-layout-child{width:100%;background-color:rgba(255,253,241,.7)!important}.comment-layout{width:100%}.no-margin{margin-left:0;margin-right:0}.no-padding{padding-left:0;padding-right:0}.comment-username{cursor:pointer}.comment-tx-div{margin-left:10px;display:flex;flex-direction:column;justify-content:space-between}.comment-reply{margin-top:0;margin-left:10px;padding:0 10px;border:1px solid #00a4ff;border-radius:2px;box-shadow:none;color:#808080;text-align:center;text-decoration:none;font-size:13px;-webkit-transition:all .3s ease;transition:all .3s ease}.comment-reply-color{border-color:#d979a2;color:#fff;background-color:#d979a2}.comment-reply-color:hover{border-color:#d979a2;color:#d979a2;background-color:transparent}.comment-reply-layout-btn{padding:0 10px;height:35px;width:100%;border:1px solid #00a4ff;border-radius:2px;box-shadow:none;color:#00a4ff;text-align:center;text-decoration:none;font-size:15px;-webkit-transition:all .3s ease;transition:all .3s ease}.message-link{margin:0 0;padding:0 10px;height:23px;border:1px solid #808080;border-radius:2px;box-shadow:none;color:#808080;text-align:center;text-decoration:none;font-size:13px;-webkit-transition:all .3s ease;transition:all .3s ease}.comment-rely-textarea{height:120px;font-size:19px;font-weight:300}.message-link{padding:0 5px;border:1px solid #e87461;border-radius:0;box-shadow:none;color:#e87461;text-align:center;text-decoration:none;font-size:13px;height:23px;-webkit-transition:all .3s ease;transition:all .3s ease;margin-top:5px}.aticle-home-layout{transition:all .6s ease}.article-home-username{font-size:22px;margin-left:10px;font-weight:600}.article-home-text{font-size:15px;margin-left:0;padding:0;font-weight:100}.article-home-tag{color:#fff;border-radius:4px;padding-right:8px;padding-left:8px;margin-right:8px;word-break:keep-all}.article-home-infor-text{font-size:13px}.article-home-layout-center{margin-left:auto;margin-right:auto;max-width:1140px}@media(min-width:576px){.d-sm-inline{display:inline!important}.d-sm-flex{display:flex!important}}@media(max-width:576px){.bg-d-lg-block{display:block!important}}.comment-layout-transition{transition:all .6s ease}.div-shadow{transition:all .6s ease;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important;cursor:pointer}.div-shadow:hover{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.new-row-warp{display:flex;flex-wrap:wrap;align-items:center}.real-time-p{color:#808080}.largeimage-bg{width:100%;height:calc(100vh);background-color:rgba(0,0,0,.7);position:fixed;z-index:1050}.largeimage-layout{display:flex;flex-direction:column;justify-content:flex-end;height:100%}.largeimage-btn-close{font-size:50px;position:fixed;right:0;color:#fff;top:0}.largeimage-layout-in{height:100%;width:100%;justify-content:space-between;align-items:center}.largeimage-btn-left{font-size:50px;color:#fff}.largeimage-img{max-height:100%;max-width:100%;width:auto;align-self:center}.largeimage-a{max-height:100%;display:flex;align-content:center;justify-content:center}.largeimage-layout-img{height:100%;display:flex;flex-direction:column;justify-content:center}.a-font-color{color:var(--bs-body-color)!important}.a-font-color:hover{color:var(--bs-body-color)!important}.home-card-name-text{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:16px}@media(max-width:789px){.home-listview-small{display:block}.home-listview-normal{display:none}.home-listview-large{display:none}}@media(min-width:789px){.home-listview-small{display:none}.home-listview-normal{display:block}.home-listview-large{display:none}}@media(min-width:1517px){.home-listview-small{display:none}.home-listview-normal{display:none}.home-listview-large{display:block}}.components-reconnect-show{top:0;display:flex!important;left:0;padding:.6rem 1.25rem .7rem 1.25rem;position:fixed;width:100%;height:100%;z-index:1080;background-color:rgba(0,0,0,.4);flex-direction:column;align-content:center;justify-content:center;flex-wrap:wrap}#components-reconnect-modal{display:none}.text-truncate-1{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;word-break:break-all}.text-truncate-2{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-all}.text-truncate-3{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;word-break:break-all}.text-truncate-4{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;word-break:break-all}.outline-button-title{margin-top:0;margin-bottom:5px;height:25px;font-size:small!important;padding-top:6px;font-weight:normal}.outline-button-null-url{transition:all .6s ease;word-break:keep-all;margin-top:0;height:25px;margin-bottom:5px;font-size:small!important;padding-top:2px;font-weight:normal}.outline-button-normal{transition:all .6s ease;word-break:keep-all;margin-top:0;height:25px;margin-bottom:5px;font-size:small!important;padding-top:2px;font-weight:normal}.load-footer a:hover{color:var(--hover-color)!important}.load-footer a{color:#808080!important}.pointer{cursor:pointer!important}.login-h1-text{font-family:Roboto!important;font-style:normal!important;font-weight:bold!important;font-size:1.5rem!important;line-height:2.25rem!important}.image-overlays{opacity:.4;height:100%;background-size:contain;background-position:50%;background-position-x:50%;background-position-y:center}.image-overlays.active{opacity:1!important}.image-overlays:hover{opacity:1}.image-contain{height:100%;background-position:center top;background-size:cover}.app-card-tag{background-color:var(--main-color);color:#fff;border-radius:5px;padding-left:8px;padding-right:8px;display:inline-block}body{background-color:#f5f6f7}::-webkit-scrollbar-track{border-radius:15px;margin:5px 0}::-webkit-scrollbar{width:5px;height:5px;margin:5px 0}::-webkit-scrollbar-thumb{margin:5px 0;border-radius:15px;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(.44,#aaa8a8),color-stop(.72,#aaa8a8),color-stop(.86,#aaa8a8))}a:focus-visible{outline:thin dotted}code{white-space:pre-wrap!important;word-wrap:break-word!important}.loading-progress{position:relative;display:block;width:5rem;height:5rem}.loading-progress circle{fill:none;stroke:#e0e0e0;stroke-width:.3rem;transform-origin:50% 50%;transform:rotate(-90deg)}.loading-progress circle:last-child{stroke:#f06292;stroke-dasharray:calc(3.141*var(--blazor-load-percentage,0%)*.8),500%;transition:stroke-dasharray .05s ease-in-out}.loading-progress-text{position:absolute;font-weight:bold;color:#f06292}.loading-progress-text:after{content:var(--blazor-load-percentage-text,"Loading")}img+strong{display:flex;justify-content:center;font-weight:inherit!important;margin-top:.66667em;color:#999;text-align:center;font-size:.9em}a img+strong{color:var(--main-color)!important}.aspect-ratio+p>strong{display:flex;justify-content:center;font-weight:inherit!important;margin-top:.66667em;color:#999;font-size:.9em}a .aspect-ratio+p>strong{color:var(--main-color)!important}.aspect-ratio{position:relative;width:100%;height:0;padding-bottom:56%}.aspect-ratio iframe{position:absolute;width:100%;height:100%;left:0;top:0}@-webkit-keyframes rotation{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}.icon-rotate{-webkit-transform:rotate(360deg);animation:rotation 1s linear infinite;-moz-animation:rotation 1s linear infinite;-webkit-animation:rotation 1s linear infinite;-o-animation:rotation 1s linear infinite}.ContributionCalendar-day{margin:.15rem;height:.7rem;width:.7rem;border-radius:2px}.ContributionCalendar-color-x{background-color:transparent}.ContributionCalendar-color-0{background-color:#ecedef}.ContributionCalendar-color-1{background-color:#c7e293}.ContributionCalendar-color-2{background-color:#75cc6b}.ContributionCalendar-color-3{background-color:#209a3b}.ContributionCalendar-color-4{background-color:#1f5b21}.ContributionCalendar-font{font-size:12px;align-content:center;margin-bottom:.1rem;color:#666}.ContributionCalendar-tip-font{font-size:11px;color:#666}#blazor-error-ui{background:#ffffe0;bottom:0;box-shadow:0 -1px 2px rgba(0,0,0,.2);display:none;left:0;padding:.6rem 1.25rem .7rem 1.25rem;position:fixed;width:100%;z-index:1080}#blazor-error-ui .dismiss{cursor:pointer;position:absolute;right:.75rem;top:.5rem}.page-layout-demo-footer-link{color:#ebeef5}.page-layout-demo-footer-link:hover{color:#fff}.page-layout-demo-option{margin-top:1.5rem;border:1px solid rgba(0,0,0,.125);border-radius:4px;padding:1.5rem 1rem 1rem 1rem;position:relative}.page-layout-demo-option>p{position:absolute;top:-10px;padding:0 .5rem;background:#fff}.page-layout-demo-option .page-layout-demo-option-height{display:flex;align-items:center;justify-content:space-between}.page-layout-demo-option .tabs-body-content{margin:0 -1rem -2rem -1rem}.layout-drawer{padding:13px;margin-right:-1rem;cursor:pointer}.layout-drawer:hover{background-color:#1893a7}.layout-drawer-body{padding:1rem}.layout-item{cursor:pointer;border:2px solid #e9ecef;padding:4px;border-radius:4px;height:80px;width:120px;transition:border .3s linear}.layout-item:hover,.layout-item.active{border:2px solid #28a745}.layout-item .layout-left{width:30%}.layout-item .layout-left .layout-left-header{height:16px;background-color:#367fa9}.layout-item .layout-left .layout-left-body,.layout-item .layout-body .layout-left{background-color:#2f4050}.layout-item .layout-right .layout-right-header,.layout-item .layout-top{background-color:#17a2b8;height:16px}.layout-item .layout-right .layout-right-footer,.layout-item .layout-footer{background-color:#5b6e84;height:12px}.layout-item .layout-top,.layout-item .layout-body,.layout-item .layout-footer{width:100%}.layout.is-page .layout-right,.layout.is-page .layout-main{background-color:#fff}.color{width:1.5rem;height:1.5rem;display:block;cursor:pointer;border:2px solid #e9ecef;border-radius:4px;transition:border .3s linear}.color:hover{border:2px solid #28a745}.color1,.layout.is-page.color1 .layout-header{background-color:#409eff}.layout.is-page.color1 .layout-side .layout-banner{background-color:#3e84d0}.layout.is-page.color1 .layout-side{background-color:#212529;color:#ebeef5}.layout.is-page.color1 .layout-footer{background-color:#343a40}.layout.is-page.color1 .layout-header-bar{background-color:#2b7cd0;border-color:#014186}.layout.is-page.color1 .layout-drawer:hover{background-color:#3184dc}.color2,.layout.is-page.color2 .layout-header{background-color:#28a745}.layout.is-page.color2 .layout-side .layout-banner{background-color:#24903d}.layout.is-page.color2 .layout-side{background-color:#212529;color:#ebeef5}.layout.is-page.color2 .layout-footer{background-color:#343a40}.layout.is-page.color2 .layout-header-bar{background-color:#258c3c;border-color:#014186}.layout.is-page.color2 .layout-drawer:hover{background-color:#24903d}.color3,.layout.is-page.color3 .layout-header{background-color:#e83e8c}.layout.is-page.color3 .layout-side .layout-banner{background-color:#c5417e}.layout.is-page.color3 .layout-side{background-color:#212529;color:#ebeef5}.layout.is-page.color3 .layout-footer{background-color:#343a40}.layout.is-page.color3 .layout-header-bar{background-color:#c73477;border-color:#014186}.layout.is-page.color3 .layout-drawer:hover{background-color:#c5417e}.color4,.layout.is-page.color4 .layout-header{background-color:#ffc107}.layout.is-page.color4 .layout-side .layout-banner{background-color:#e4af10}.layout.is-page.color4 .layout-side{background-color:#212529;color:#ebeef5}.layout.is-page.color4 .layout-footer{background-color:#343a40}.layout.is-page.color4 .layout-header-bar{background-color:#e2b221;border-color:#014186}.layout.is-page.color4 .layout-drawer:hover{background-color:#e4af10}.color5,.layout.is-page.color5 .layout-header{background-color:#17a2b8}.color6,.layout.is-page.color6 .layout-header{background-color:#6610f2}.layout.is-page.color6 .layout-side .layout-banner{background-color:#4b0cb3}.layout.is-page.color6 .layout-side{background-color:#212529;color:#ebeef5}.layout.is-page.color6 .layout-footer{background-color:#343a40}.layout.is-page.color6 .layout-header-bar{background-color:#4b0ab5;border-color:#014186}.layout.is-page.color6 .layout-drawer:hover{background-color:#4b0cb3}.widget .dropdown-body h3{color:#666;font-size:14px;margin-bottom:10px}.widget .dropdown-body h4{color:#444;font-size:15px;margin:0}.widget .dropdown-body small{color:#999;font-size:10px;position:absolute;top:0;right:0}.widget .dropdown-item>div:not(.progress):last-child{width:calc(100% - 40px)}.widget .dropdown-item{padding:.5rem 1rem}.widget .progress{height:7px}.widget .dropdown-item.active,.widget .dropdown-item:active{color:inherit}.widget .dropdown-item:not(:nth-of-type(odd)):active{background-color:inherit}#top{position:relative;height:calc(100vh - 64px);min-height:calc(100vw*.5);max-height:calc(100vw*.7);background-size:cover;background-position:center 70%;color:#fff;overflow:hidden;transition:all .6s ease}@media screen and (max-width:768px){#top{max-height:none;height:calc(100vh - 48px)}}#top .copy{position:absolute;left:8%;top:20%;font-size:1.5rem;line-height:3rem;letter-spacing:.3rem}#top .infor{position:fixed;z-index:1;width:100%}#top .logo-area .lead{text-align:center;font-size:1.8rem;letter-spacing:.4rem;padding:0 30px}#top .logo-area{position:absolute;left:0;right:0;bottom:15%;margin:0 auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4vh}@media screen and (max-width:768px){#top .logo-area{bottom:18%}#top .logo-area .lead{font-size:1rem}#top .copy{font-size:1rem}}#top .logo-area h1{color:#fff;width:100%;display:flex;justify-content:center}#top .logo-area h1 img{color:#fff;width:50%;min-width:300px}#top .logo-area h1 span{font-size:7rem;display:flex;text-align:center;justify-content:center;font-family:华文行楷;width:70%;min-width:300px}.official-website{background-color:rgba(255,255,255,.8);display:flex;flex-direction:column;letter-spacing:.05rem!important;line-height:1.8rem!important}.official-website section h2::before{display:block;content:" ";height:2px;width:calc((100% - 1200px)/2 - 20px);min-width:20px;background:var(--main-color);margin-right:20px}.official-website section h2{display:flex;align-items:center;padding:0 0 6rem;letter-spacing:.5rem;font-weight:bold;color:var(--main-color)}.official-website section{margin:0 0 10rem}@media screen and (max-width:768px){.official-website section{margin:0 0 4rem}#top .logo-area h1 span{font-size:4rem}}@media screen and (max-width:768px){.official-website section h2{padding-bottom:3rem}}.official-website .markdown-body h2{padding:0 0 .3rem}.character-card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;align-items:center;padding:30px 80px 0 80px;gap:10px 3%}@media screen and (max-width:768px){.character-card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:0 20px}}.character-card img{align-self:center;height:45%;max-height:666px}.character-card .caption{max-width:460px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-line-pack:center;align-content:center;border-left:2px solid var(--main-color);padding-left:20px;letter-spacing:.05rem!important;line-height:1.8rem!important;font-size:1rem!important}@media screen and (max-width:768px){.character-card .caption{max-width:450px;width:100%;padding:20px 0 0;border-left:0;border-top:2px solid var(--main-color);line-height:1.25rem!important;font-size:.875rem!important}}.character-card .caption .name{font-size:2.5rem;color:var(--main-color);letter-spacing:.2rem;line-height:3rem;font-weight:bold}.character-card .caption .cv{letter-spacing:.1rem;margin-top:15px}.character-card .caption .audio{margin-top:15px}.character-card .caption .audio+.infor{margin-top:15px}.character-card .caption .infor{margin-top:35px}.character-card .caption .infor div{letter-spacing:.1rem;margin-top:5px;font-weight:bold}.character-card .caption .description{margin-top:40px;white-space:pre-line}.character-icon{width:100px;height:100px;border-radius:50%}.character-list .m-card{border-radius:50%;margin:16px}@media screen and (max-width:768px){.character-card .caption .name{font-size:1.5rem}.character-card .caption .cv{margin-top:0}.character-card .caption .audio{margin-top:10px}.character-card .caption .infor div{margin-top:0;letter-spacing:0}.character-card .caption .audio+.infor{margin-top:10px}.character-card .caption .infor{margin-top:20px}.character-card .caption .description{margin-top:20px}.character-icon{width:50px;height:50px}.character-list .m-card{margin:6px}}.character-icon.active{background-color:var(--main-color)}.official-website .m-slide-group__content{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.staff-card{display:flex;flex-wrap:wrap;font-size:1rem;justify-content:space-between}.staff-card .group{margin:2rem}.staff-card .group>.name{background-color:var(--main-color);color:#fff;display:flex;justify-content:center;font-weight:bold;margin:0 .5rem 1.5rem .5rem;padding:0 1rem}.staff-card .posts{display:flex}.staff-card .posts>.name{margin-right:1rem;width:84px;font-weight:bold}.staff-card .group-no{width:100%}.staff-card .group-no>.items{display:flex;justify-content:space-between;flex-wrap:wrap}.staff-card .group-no>.items>.posts{margin:0 2rem}.staff-card .staff-name{width:84px}.official-website .information{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:start;-ms-flex-align:start;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:30px}.information .jacket{width:40%;max-width:450px}@media screen and (max-width:768px){.information .jacket{width:100%;max-width:350px}.information .description{width:100%;max-width:350px}}.information .description .detail{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:.6rem;margin-bottom:0;border-left:2px solid var(--main-color);font-size:1rem}.information .description .detail>div.title{margin-bottom:20px;color:var(--main-color)}.information .description .detail>div{display:-webkit-box;display:-ms-flexbox;display:flex;gap:20px;padding-left:20px;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.information .description .detail>div dt{width:4.5rem}.information .description .detail>div.title dd{font-size:2rem;line-height:2.5rem}.information .description .detail>div dd{font-weight:bold;margin-bottom:0}#top .button-area{position:absolute;left:0;right:0;bottom:7%;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:row;-webkit-box-align:center;gap:4vh;justify-content:center}#top .button-area>div{min-width:200px}@media screen and (max-width:768px){#top .button-area>div{min-width:100px}}.official-website .introduce{white-space:pre-line;font-size:1rem}.pre-img{width:0;height:0}.article-introduce{gap:2rem;display:flex;flex-direction:column;font-size:16px;letter-spacing:.05rem}.article-introduce #title .main-img{max-width:500px}.article-introduce #title .no-limit{height:500px;width:fit-content}.article-introduce #title .thum-img{height:200px;border-radius:50%;width:fit-content}.article-introduce>section{gap:1rem;display:flex;flex-direction:column}.article-introduce #title h1{font-weight:bold}.article-introduce #title .description{white-space:pre-line}.article-introduce section>h2{font-size:1.5rem;font-weight:bold;margin:0}.article-introduce dl{margin:0}.article-introduce dd{margin:0}.article-introduce dt{font-weight:inherit}.article-introduce dl div{display:flex;flex-wrap:wrap}.article-introduce dt::after{content:":"}.article-introduce dd+dd::before{content:"、"}.article-introduce a:hover{text-decoration:underline}.article-introduce #gallery img{max-width:100%;cursor:pointer}.article-introduce #gallery .row{row-gap:24px}.article-introduce #character img{height:500px;width:fit-content}.article-introduce #character>div{gap:.5rem;display:flex;cursor:pointer;flex-direction:column}.article-introduce #character .name{font-size:1rem;font-weight:bold}.article-introduce #character .description{white-space:pre-line}.article-introduce #staff .group>.name{font-size:1.2rem;font-weight:bold}.article-introduce #relevance h3{font-size:1.2rem;font-weight:bold}.article-introduce ol,.article-introduce ul{padding-left:24px}.article-introduce ol,.article-introduce ul{margin:0}.article-introduce #relevance>ul{display:flex;flex-direction:column;gap:.5rem}.article-introduce #operation{flex-direction:row;gap:2rem}.article-introduce #release h3{font-size:1.2rem;font-weight:bold}:root{--home-bg-color:#f8fafd;--home-text-color:#1f1f1f;--home-subtle-color:#808080;--home-border-radius:12px;--home-active-border-radius:24px}#home-page{padding-left:5rem;padding-right:5rem}#home-page .m-slide-group__content{gap:1rem;padding:.5rem 0}#home-page .card-title{display:flex;justify-content:space-between;align-items:center}#home-page{letter-spacing:.05rem;font-family:"Google Sans Text",sans-serif;color:var(--home-text-color)}#home-page .left-content,#home-page{display:flex;flex-direction:column;gap:6rem}#home-page .right-content{display:flex;flex-direction:column;gap:2rem}#home-page h2{font-size:3rem;font-weight:bold;letter-spacing:.4rem;margin-left:5rem}#home-page section{display:flex;flex-direction:column;gap:1rem}#home-page .item{display:flex;border-radius:var(--home-border-radius);background-color:var(--home-bg-color);color:var(--home-text-color);transition:.3s;cursor:pointer;white-space:normal}#home-page .item:hover{background-color:var(--hover-color)}#home-page .item:active{border-radius:var(--home-active-border-radius)}#home-page .item>img,#home-page .item .image{transition:.3s;border-radius:var(--home-border-radius);width:100%}#home-page .item:active>img,#home-page .item:active .image{border-radius:var(--home-active-border-radius)}#home-page .item .m-chip{transition:.3s}#home-page .item:hover .m-chip{background-color:var(--active-color)!important;border-color:var(--active-color)!important}#home-page .item:hover .m-chip--outlined{background-color:transparent!important;color:var(--active-color)!important;caret-color:var(--active-color)!important}.item.more-link{flex-direction:column!important;gap:1rem;align-items:center;justify-content:center;width:10rem!important}.item.more-link:hover i{color:var(--active-color)}.carousels-card{border-radius:24px!important;box-shadow:0 .125rem .25rem rgba(0,0,0,.01)!important}.carousels-card .carousel-inner{border-radius:24px!important;cursor:pointer}.published-games-card .item,.upcoming-games-card .item,.free-games-card .item,.discount-games-card .item{display:flex;flex-direction:column}.published-games-card .item .content,.upcoming-games-card .item .content,.free-games-card .item .content,.discount-games-card .item .content{margin:1rem;display:flex;flex-direction:column;gap:.5rem;justify-content:space-between;height:100%}.published-games-card .item .name,.upcoming-games-card .item .name,.free-games-card .item .name,.discount-games-card .item .name{font-size:1.5rem}.published-games-card .item{width:17rem}.upcoming-games-card .item{width:17rem}.free-games-card .item{width:17rem}.discount-games-card .item{width:20rem}.news-card .item{display:flex;width:28rem;gap:1rem;padding:.7rem;cursor:pointer}.news-card .group{display:flex;flex-direction:column;gap:1rem}.news-card img{width:3rem;border-radius:50%}.news-card .content{display:flex;flex-direction:column;justify-content:space-between}.news-card .head{display:flex;gap:.5rem}.news-card .name{color:var(--home-text-color);font-weight:bold}.news-card .time{color:var(--home-subtle-color)}.news-card .text{color:var(--home-text-color)}.latest-articles-card .row{margin-left:3rem}.latest-articles-card .item{margin-bottom:1rem;display:flex;flex-direction:column;width:20rem}.latest-articles-card .content{display:flex;flex-direction:column;gap:1rem}.latest-articles-card .content .name{color:var(--home-text-color);font-size:1.5rem}.latest-articles-card .content .brief{color:var(--home-text-color)}.latest-articles-card .addinfo{display:flex;justify-content:space-between;align-items:center;gap:.5rem}.latest-articles-card .addinfo .m-chip{min-width:4rem}.latest-articles-card .author{display:flex;align-items:center;gap:.5rem}.latest-articles-card .user-image{width:1.5rem;border-radius:50%}.latest-articles-card .author .name{color:var(--home-text-color)}.latest-articles-card .time{color:var(--home-subtle-color);word-break:keep-all}.latest-articles-card .head{padding:1rem;display:flex;gap:1rem;flex-direction:column;height:100%;justify-content:space-between}#home-page .right-content h2{font-size:2rem!important;margin-left:1rem!important;margin-top:1rem}.community-card .group{display:flex;flex-direction:column;gap:1rem}.community-card .item{display:flex;gap:1rem;flex-direction:row;padding:.5rem 1rem}.community-card .content{display:flex;flex-direction:column}.community-card .content .name{font-weight:bold}.community-card .item:hover i{color:var(--active-color)}.recently-edited-games-card .group{display:flex;flex-direction:column;gap:1rem}.recently-edited-games-card img{width:8rem!important}.recently-edited-games-card .name{font-size:1rem}.recently-edited-games-card .time{color:var(--home-subtle-color)}.recently-edited-games-card .content{display:flex;flex-direction:column;justify-content:space-between;padding:.4rem 1rem}.latest-videoes-card .group{display:flex;flex-direction:column;gap:1rem}.latest-videoes-card .item{flex-direction:row;width:30rem}.latest-videoes-card .image{width:15rem!important}.latest-videoes-card .content{display:flex;flex-direction:column;gap:1rem}.latest-videoes-card .content .name{color:var(--home-text-color);font-weight:bold;font-size:1rem}.latest-videoes-card .content .brief{color:var(--home-text-color)}.latest-videoes-card .addinfo{display:flex;justify-content:space-between}.latest-videoes-card .author{display:flex;align-items:center;gap:.5rem}.latest-videoes-card .author .name{color:var(--home-text-color)}.latest-videoes-card .time{color:var(--home-subtle-color);word-break:keep-all}.latest-videoes-card .head{padding:.5rem 1rem;display:flex;flex-direction:column;height:100%;justify-content:space-between}.announcements-card .content{display:flex;flex-direction:column}.announcements-card .group{display:flex;flex-direction:column;gap:1rem}.announcements-card .item{display:flex;justify-content:flex-start;padding:.5rem 1rem;gap:.5rem}.announcements-card .item:hover i{color:var(--active-color)!important}.announcements-card .name.active{font-weight:bold}.friend-links-card .group{display:flex;flex-wrap:wrap;justify-content:space-around;margin-left:3.5rem;margin-right:3rem;gap:1rem}.friend-links-card .item{display:flex;flex-direction:column;width:11rem}.friend-links-card .content{padding:1rem}.friend-links-card .name{font-size:1rem}.about-card{padding:0 2rem;display:flex;flex-direction:column;align-content:center;flex-wrap:wrap}.about-card .head{display:flex;gap:6rem;flex-wrap:wrap}.about-card .links-groups{display:flex;gap:4rem;margin-top:3rem}.about-card .links-item{display:flex;gap:1rem;flex-direction:column}.links-group{display:flex;flex-direction:column;gap:1rem}.about-card .quote-card{max-width:68rem}.links-group h3{font-size:inherit}.links-item a{font-size:1rem;font-weight:bold}.about-card .introduce img{height:50px;aspect-ratio:23/5}.about-card .introduce{display:flex;flex-direction:column;align-items:flex-start;max-width:40rem;gap:1rem}.about-card .text{line-height:1.3rem}.about-card .addinfo{display:flex;justify-content:flex-start;gap:2rem;align-items:center}.about-card .addinfo div{font-size:1.2rem;font-weight:bold}.about-card .addinfo a{color:var(--home-text-color)!important}.about-card a:hover{text-decoration:underline}.recommends-group{display:flex;gap:5rem;flex-direction:column}.recommends .container{display:flex;flex-direction:column;gap:2rem}.recommends h2{margin-left:3rem!important}.recommends .completed-card .content{display:flex;justify-content:center;padding:2rem;font-size:1rem}.plain-text-card.item{display:flex;flex-direction:row;gap:1rem}.plain-text-card.item img{min-width:25rem!important;width:25rem!important;height:fit-content}.plain-text-card.item .content{padding:1rem;display:flex;flex-direction:column;gap:.5rem}.plain-text-card.item .name{font-size:2rem}.masa-image .m-image__image{border-radius:var(--home-border-radius);transition:.3s}.masa-image .item-image:active .m-image__image{border-radius:var(--home-active-border-radius)}.sub-group>.row{row-gap:1.5rem}.masa-image .image-name{display:none;transition:.3s}.masa-image .item-image:hover .image-name{display:flex;-webkit-animation-name:fadeIn;-webkit-animation-duration:.3s;-webkit-animation-iteration-count:1;-webkit-animation-delay:0s}.masa-image .item-image:active .image-name{border-radius:var(--home-active-border-radius)}.masa-image .image-name{background:linear-gradient(to bottom,rgba(0,0,0,0) 70%,rgba(0,0,0,.7));height:100%;width:100%;align-items:flex-end;color:#fff;font-size:1.5rem;padding:1rem;border-radius:var(--home-border-radius)}@-webkit-keyframes fadeIn{0%{opacity:0}20%{opacity:.2}50%{opacity:.5}70%{opacity:.7}100%{opacity:1}}.gallery-card{display:flex;flex-direction:column}.gallery-card{display:flex;border-radius:var(--home-border-radius);background-color:var(--home-bg-color);color:var(--home-text-color);transition:.3s;white-space:normal}.gallery-card .head{display:flex;gap:1rem;align-items:flex-end}.gallery-card .head img{width:13rem;height:fit-content;border-radius:12px}.gallery-card .content{display:flex;flex-direction:column;justify-content:space-around;padding:1rem 1.5rem;gap:.5rem}.gallery-card .name{font-size:2rem}.gallery-card .gallery img{height:20rem;width:fit-content}.gallery-card .actions{display:flex;justify-content:space-around;padding:1rem}.gallery-card button{transition:.3s}.gallery-card button:hover{background-color:var(--main-color)!important;border-color:var(--main-color)!important;color:#fff!important}.gallery-card .m-image{border-radius:12px;cursor:pointer}.weekly-news-card .content{display:flex;flex-direction:column}.weekly-news-card .group{display:flex;flex-direction:column;gap:1rem}.weekly-news-card .item{display:flex;justify-content:flex-start;padding:.5rem 1rem;gap:.5rem}.weekly-news-card .item:hover i{color:var(--active-color)!important}.weekly-news-card .name.active{font-weight:bold}.birthday-card .default.item{padding:1rem;gap:1rem}.birthday-card .default .content{font-size:1rem;display:flex;flex-direction:column;justify-content:space-evenly}.birthday-card .default .head{font-size:3rem}.birthday-card .group .item{padding:.5rem 1rem;gap:1rem;align-items:center}.birthday-card .group .item img{width:5rem!important;height:5rem;border-radius:50%!important}.birthday-card .group .item .content{display:flex;flex-direction:column;gap:.5rem;justify-content:center}.birthday-card .group .item .head{display:flex;gap:.5rem;align-items:flex-end}.birthday-card .group .item .name{font-size:1.5rem}.birthday-card .group .item .debut-game{color:var(--home-subtle-color)}.birthday-card .group{gap:1rem;display:flex;flex-direction:column}.quote-card .quote-content{margin-left:0!important;font-size:2rem!important;font-weight:bold;letter-spacing:.1rem}.quote-card{display:flex;flex-direction:column;gap:1rem}.quote-card .quote-by{font-size:.8rem;letter-spacing:.05rem;display:flex;justify-content:flex-end;gap:.5rem}.kanban-card{display:flex;align-items:center;gap:3rem!important}.kanban-card .quote-card+img{transform:rotateY(180deg)}.kanban-card .quote-card{max-width:70rem}.kanban-card img{width:12rem}.kanban-card .content{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap}.evaluations-group{margin-left:2.5rem;row-gap:2rem;padding-right:2rem}.evaluations-card .articles-group img{width:10rem!important}.evaluations-card .head{display:flex;flex-direction:column;width:100%;padding:.5rem 1rem;justify-content:space-between}.evaluations-card .content{font-size:1rem;font-weight:bold}.evaluations-card .addinfo{display:flex;justify-content:space-between;align-items:flex-end}.articles-group{gap:1rem;display:flex;flex-direction:column}.evaluations-card .type{color:var(--home-subtle-color)}.evaluations-card .evaluations-item{display:flex;flex-direction:column;gap:1rem}.latast-comments-card .item{display:flex;padding:1rem;gap:1rem;flex-direction:row}.latast-comments-card .user-image{width:3rem!important;border-radius:50%!important;height:3rem!important}.latast-comments-card .content{display:flex;flex-direction:column;gap:.5rem;word-break:break-word;width:100%}.latast-comments-card .name{font-size:1rem;font-weight:bold}.latast-comments-card .time{text-align:end;color:#808080}.latast-comments-card .group{gap:1rem;display:flex;flex-direction:column}.hot-tags-card .group{display:flex;flex-wrap:wrap;gap:.75rem}.hot-tags-card .item{padding:.25rem .5rem;gap:.5rem}.hot-tags-card .content{display:flex;align-items:center}.hot-tags-card .item:hover i{color:var(--active-color)} \ No newline at end of file +#web_bg{position:fixed;top:0;left:0;width:100%;height:100%;z-index:-10;zoom:1;background-color:transparent;background-repeat:no-repeat;background-size:cover;-webkit-background-size:cover;-o-background-size:cover}.bg-opacity{background-color:#fff!important}.bg-theme{background-color:#fff!important}.word-warp-break{word-wrap:break-word;word-break:break-all}.article-infor-text{font-size:13px}.comment-tag{width:fit-content;color:#fff;border-radius:5px;padding:0 5px;word-break:keep-all;height:fit-content}.comment-layout-child{width:100%;background-color:rgba(255,253,241,.7)!important}.comment-layout{width:100%}.no-margin{margin-left:0;margin-right:0}.no-padding{padding-left:0;padding-right:0}.comment-username{cursor:pointer}.comment-tx-div{margin-left:10px;display:flex;flex-direction:column;justify-content:space-between}.comment-reply{margin-top:0;margin-left:10px;padding:0 10px;border:1px solid #00a4ff;border-radius:2px;box-shadow:none;color:#808080;text-align:center;text-decoration:none;font-size:13px;-webkit-transition:all .3s ease;transition:all .3s ease}.comment-reply-color{border-color:#d979a2;color:#fff;background-color:#d979a2}.comment-reply-color:hover{border-color:#d979a2;color:#d979a2;background-color:transparent}.comment-reply-layout-btn{padding:0 10px;height:35px;width:100%;border:1px solid #00a4ff;border-radius:2px;box-shadow:none;color:#00a4ff;text-align:center;text-decoration:none;font-size:15px;-webkit-transition:all .3s ease;transition:all .3s ease}.message-link{margin:0 0;padding:0 10px;height:23px;border:1px solid #808080;border-radius:2px;box-shadow:none;color:#808080;text-align:center;text-decoration:none;font-size:13px;-webkit-transition:all .3s ease;transition:all .3s ease}.comment-rely-textarea{height:120px;font-size:19px;font-weight:300}.message-link{padding:0 5px;border:1px solid #e87461;border-radius:0;box-shadow:none;color:#e87461;text-align:center;text-decoration:none;font-size:13px;height:23px;-webkit-transition:all .3s ease;transition:all .3s ease;margin-top:5px}.aticle-home-layout{transition:all .6s ease}.article-home-username{font-size:22px;margin-left:10px;font-weight:600}.article-home-text{font-size:15px;margin-left:0;padding:0;font-weight:100}.article-home-tag{color:#fff;border-radius:4px;padding-right:8px;padding-left:8px;margin-right:8px;word-break:keep-all}.article-home-infor-text{font-size:13px}.article-home-layout-center{margin-left:auto;margin-right:auto;max-width:1140px}@media(min-width:576px){.d-sm-inline{display:inline!important}.d-sm-flex{display:flex!important}}@media(max-width:576px){.bg-d-lg-block{display:block!important}}.comment-layout-transition{transition:all .6s ease}.div-shadow{transition:all .6s ease;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important;cursor:pointer}.div-shadow:hover{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.new-row-warp{display:flex;flex-wrap:wrap;align-items:center}.real-time-p{color:#808080}.largeimage-bg{width:100%;height:calc(100vh);background-color:rgba(0,0,0,.7);position:fixed;z-index:1050}.largeimage-layout{display:flex;flex-direction:column;justify-content:flex-end;height:100%}.largeimage-btn-close{font-size:50px;position:fixed;right:0;color:#fff;top:0}.largeimage-layout-in{height:100%;width:100%;justify-content:space-between;align-items:center}.largeimage-btn-left{font-size:50px;color:#fff}.largeimage-img{max-height:100%;max-width:100%;width:auto;align-self:center}.largeimage-a{max-height:100%;display:flex;align-content:center;justify-content:center}.largeimage-layout-img{height:100%;display:flex;flex-direction:column;justify-content:center}.a-font-color{color:var(--bs-body-color)!important}.a-font-color:hover{color:var(--bs-body-color)!important}.home-card-name-text{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:16px}@media(max-width:789px){.home-listview-small{display:block}.home-listview-normal{display:none}.home-listview-large{display:none}}@media(min-width:789px){.home-listview-small{display:none}.home-listview-normal{display:block}.home-listview-large{display:none}}@media(min-width:1517px){.home-listview-small{display:none}.home-listview-normal{display:none}.home-listview-large{display:block}}.components-reconnect-show{top:0;display:flex!important;left:0;padding:.6rem 1.25rem .7rem 1.25rem;position:fixed;width:100%;height:100%;z-index:1080;background-color:rgba(0,0,0,.4);flex-direction:column;align-content:center;justify-content:center;flex-wrap:wrap}#components-reconnect-modal{display:none}.text-truncate-1{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;word-break:break-all}.text-truncate-2{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-all}.text-truncate-3{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;word-break:break-all}.text-truncate-4{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;word-break:break-all}.outline-button-title{margin-top:0;margin-bottom:5px;height:25px;font-size:small!important;padding-top:6px;font-weight:normal}.outline-button-null-url{transition:all .6s ease;word-break:keep-all;margin-top:0;height:25px;margin-bottom:5px;font-size:small!important;padding-top:2px;font-weight:normal}.outline-button-normal{transition:all .6s ease;word-break:keep-all;margin-top:0;height:25px;margin-bottom:5px;font-size:small!important;padding-top:2px;font-weight:normal}.load-footer a:hover{color:var(--hover-color)!important}.load-footer a{color:#808080!important}.pointer{cursor:pointer!important}.login-h1-text{font-family:Roboto!important;font-style:normal!important;font-weight:bold!important;font-size:1.5rem!important;line-height:2.25rem!important}.image-overlays{opacity:.4;height:100%;background-size:contain;background-position:50%;background-position-x:50%;background-position-y:center}.image-overlays.active{opacity:1!important}.image-overlays:hover{opacity:1}.image-contain{height:100%;background-position:center top;background-size:cover}.app-card-tag{background-color:var(--main-color);color:#fff;border-radius:5px;padding-left:8px;padding-right:8px;display:inline-block}body{background-color:#f5f6f7}::-webkit-scrollbar-track{border-radius:15px;margin:5px 0}::-webkit-scrollbar{width:5px;height:5px;margin:5px 0}::-webkit-scrollbar-thumb{margin:5px 0;border-radius:15px;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(.44,#aaa8a8),color-stop(.72,#aaa8a8),color-stop(.86,#aaa8a8))}a:focus-visible{outline:thin dotted}code{white-space:pre-wrap!important;word-wrap:break-word!important}.loading-progress{position:relative;display:block;width:5rem;height:5rem}.loading-progress circle{fill:none;stroke:#e0e0e0;stroke-width:.3rem;transform-origin:50% 50%;transform:rotate(-90deg)}.loading-progress circle:last-child{stroke:#f06292;stroke-dasharray:calc(3.141*var(--blazor-load-percentage,0%)*.8),500%;transition:stroke-dasharray .05s ease-in-out}.loading-progress-text{position:absolute;font-weight:bold;color:#f06292}.loading-progress-text:after{content:var(--blazor-load-percentage-text,"Loading")}img+strong{display:flex;justify-content:center;font-weight:inherit!important;margin-top:.66667em;color:#999;text-align:center;font-size:.9em}a img+strong{color:var(--main-color)!important}.aspect-ratio+p>strong{display:flex;justify-content:center;font-weight:inherit!important;margin-top:.66667em;color:#999;font-size:.9em}a .aspect-ratio+p>strong{color:var(--main-color)!important}.aspect-ratio{position:relative;width:100%;height:0;padding-bottom:56%}.aspect-ratio iframe{position:absolute;width:100%;height:100%;left:0;top:0}@-webkit-keyframes rotation{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}.icon-rotate{-webkit-transform:rotate(360deg);animation:rotation 1s linear infinite;-moz-animation:rotation 1s linear infinite;-webkit-animation:rotation 1s linear infinite;-o-animation:rotation 1s linear infinite}.ContributionCalendar-day{margin:.15rem;height:.7rem;width:.7rem;border-radius:2px}.ContributionCalendar-color-x{background-color:transparent}.ContributionCalendar-color-0{background-color:#ecedef}.ContributionCalendar-color-1{background-color:#c7e293}.ContributionCalendar-color-2{background-color:#75cc6b}.ContributionCalendar-color-3{background-color:#209a3b}.ContributionCalendar-color-4{background-color:#1f5b21}.ContributionCalendar-font{font-size:12px;align-content:center;margin-bottom:.1rem;color:#666}.ContributionCalendar-tip-font{font-size:11px;color:#666}#blazor-error-ui{background:#ffffe0;bottom:0;box-shadow:0 -1px 2px rgba(0,0,0,.2);display:none;left:0;padding:.6rem 1.25rem .7rem 1.25rem;position:fixed;width:100%;z-index:1080}#blazor-error-ui .dismiss{cursor:pointer;position:absolute;right:.75rem;top:.5rem}.page-layout-demo-footer-link{color:#ebeef5}.page-layout-demo-footer-link:hover{color:#fff}.page-layout-demo-option{margin-top:1.5rem;border:1px solid rgba(0,0,0,.125);border-radius:4px;padding:1.5rem 1rem 1rem 1rem;position:relative}.page-layout-demo-option>p{position:absolute;top:-10px;padding:0 .5rem;background:#fff}.page-layout-demo-option .page-layout-demo-option-height{display:flex;align-items:center;justify-content:space-between}.page-layout-demo-option .tabs-body-content{margin:0 -1rem -2rem -1rem}.layout-drawer{padding:13px;margin-right:-1rem;cursor:pointer}.layout-drawer:hover{background-color:#1893a7}.layout-drawer-body{padding:1rem}.layout-item{cursor:pointer;border:2px solid #e9ecef;padding:4px;border-radius:4px;height:80px;width:120px;transition:border .3s linear}.layout-item:hover,.layout-item.active{border:2px solid #28a745}.layout-item .layout-left{width:30%}.layout-item .layout-left .layout-left-header{height:16px;background-color:#367fa9}.layout-item .layout-left .layout-left-body,.layout-item .layout-body .layout-left{background-color:#2f4050}.layout-item .layout-right .layout-right-header,.layout-item .layout-top{background-color:#17a2b8;height:16px}.layout-item .layout-right .layout-right-footer,.layout-item .layout-footer{background-color:#5b6e84;height:12px}.layout-item .layout-top,.layout-item .layout-body,.layout-item .layout-footer{width:100%}.layout.is-page .layout-right,.layout.is-page .layout-main{background-color:#fff}.color{width:1.5rem;height:1.5rem;display:block;cursor:pointer;border:2px solid #e9ecef;border-radius:4px;transition:border .3s linear}.color:hover{border:2px solid #28a745}.color1,.layout.is-page.color1 .layout-header{background-color:#409eff}.layout.is-page.color1 .layout-side .layout-banner{background-color:#3e84d0}.layout.is-page.color1 .layout-side{background-color:#212529;color:#ebeef5}.layout.is-page.color1 .layout-footer{background-color:#343a40}.layout.is-page.color1 .layout-header-bar{background-color:#2b7cd0;border-color:#014186}.layout.is-page.color1 .layout-drawer:hover{background-color:#3184dc}.color2,.layout.is-page.color2 .layout-header{background-color:#28a745}.layout.is-page.color2 .layout-side .layout-banner{background-color:#24903d}.layout.is-page.color2 .layout-side{background-color:#212529;color:#ebeef5}.layout.is-page.color2 .layout-footer{background-color:#343a40}.layout.is-page.color2 .layout-header-bar{background-color:#258c3c;border-color:#014186}.layout.is-page.color2 .layout-drawer:hover{background-color:#24903d}.color3,.layout.is-page.color3 .layout-header{background-color:#e83e8c}.layout.is-page.color3 .layout-side .layout-banner{background-color:#c5417e}.layout.is-page.color3 .layout-side{background-color:#212529;color:#ebeef5}.layout.is-page.color3 .layout-footer{background-color:#343a40}.layout.is-page.color3 .layout-header-bar{background-color:#c73477;border-color:#014186}.layout.is-page.color3 .layout-drawer:hover{background-color:#c5417e}.color4,.layout.is-page.color4 .layout-header{background-color:#ffc107}.layout.is-page.color4 .layout-side .layout-banner{background-color:#e4af10}.layout.is-page.color4 .layout-side{background-color:#212529;color:#ebeef5}.layout.is-page.color4 .layout-footer{background-color:#343a40}.layout.is-page.color4 .layout-header-bar{background-color:#e2b221;border-color:#014186}.layout.is-page.color4 .layout-drawer:hover{background-color:#e4af10}.color5,.layout.is-page.color5 .layout-header{background-color:#17a2b8}.color6,.layout.is-page.color6 .layout-header{background-color:#6610f2}.layout.is-page.color6 .layout-side .layout-banner{background-color:#4b0cb3}.layout.is-page.color6 .layout-side{background-color:#212529;color:#ebeef5}.layout.is-page.color6 .layout-footer{background-color:#343a40}.layout.is-page.color6 .layout-header-bar{background-color:#4b0ab5;border-color:#014186}.layout.is-page.color6 .layout-drawer:hover{background-color:#4b0cb3}.widget .dropdown-body h3{color:#666;font-size:14px;margin-bottom:10px}.widget .dropdown-body h4{color:#444;font-size:15px;margin:0}.widget .dropdown-body small{color:#999;font-size:10px;position:absolute;top:0;right:0}.widget .dropdown-item>div:not(.progress):last-child{width:calc(100% - 40px)}.widget .dropdown-item{padding:.5rem 1rem}.widget .progress{height:7px}.widget .dropdown-item.active,.widget .dropdown-item:active{color:inherit}.widget .dropdown-item:not(:nth-of-type(odd)):active{background-color:inherit}#top{position:relative;height:calc(100vh - 64px);min-height:calc(100vw*.5);max-height:calc(100vw*.7);background-size:cover;background-position:center 70%;color:#fff;overflow:hidden;transition:all .6s ease}@media screen and (max-width:768px){#top{max-height:none;height:calc(100vh - 48px)}}#top .copy{position:absolute;left:8%;top:20%;font-size:1.5rem;line-height:3rem;letter-spacing:.3rem}#top .infor{position:fixed;z-index:1;width:100%}#top .logo-area .lead{text-align:center;font-size:1.8rem;letter-spacing:.4rem;padding:0 30px}#top .logo-area{position:absolute;left:0;right:0;bottom:15%;margin:0 auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4vh}@media screen and (max-width:768px){#top .logo-area{bottom:18%}#top .logo-area .lead{font-size:1rem}#top .copy{font-size:1rem}}#top .logo-area h1{color:#fff;width:100%;display:flex;justify-content:center}#top .logo-area h1 img{color:#fff;width:50%;min-width:300px}#top .logo-area h1 span{font-size:7rem;display:flex;text-align:center;justify-content:center;font-family:华文行楷;width:70%;min-width:300px}.official-website{background-color:rgba(255,255,255,.8);display:flex;flex-direction:column;letter-spacing:.05rem!important;line-height:1.8rem!important}.official-website section h2::before{display:block;content:" ";height:2px;width:calc((100% - 1200px)/2 - 20px);min-width:20px;background:var(--main-color);margin-right:20px}.official-website section h2{display:flex;align-items:center;padding:0 0 6rem;letter-spacing:.5rem;font-weight:bold;color:var(--main-color)}.official-website section{margin:0 0 10rem}@media screen and (max-width:768px){.official-website section{margin:0 0 4rem}#top .logo-area h1 span{font-size:4rem}}@media screen and (max-width:768px){.official-website section h2{padding-bottom:3rem}}.official-website .markdown-body h2{padding:0 0 .3rem}.character-card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;align-items:center;padding:30px 80px 0 80px;gap:10px 3%}@media screen and (max-width:768px){.character-card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:0 20px}}.character-card img{align-self:center;height:45%;max-height:666px}.character-card .caption{max-width:460px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-line-pack:center;align-content:center;border-left:2px solid var(--main-color);padding-left:20px;letter-spacing:.05rem!important;line-height:1.8rem!important;font-size:1rem!important}@media screen and (max-width:768px){.character-card .caption{max-width:450px;width:100%;padding:20px 0 0;border-left:0;border-top:2px solid var(--main-color);line-height:1.25rem!important;font-size:.875rem!important}}.character-card .caption .name{font-size:2.5rem;color:var(--main-color);letter-spacing:.2rem;line-height:3rem;font-weight:bold}.character-card .caption .cv{letter-spacing:.1rem;margin-top:15px}.character-card .caption .audio{margin-top:15px}.character-card .caption .audio+.infor{margin-top:15px}.character-card .caption .infor{margin-top:35px}.character-card .caption .infor div{letter-spacing:.1rem;margin-top:5px;font-weight:bold}.character-card .caption .description{margin-top:40px;white-space:pre-line}.character-icon{width:100px;height:100px;border-radius:50%}.character-list .m-card{border-radius:50%;margin:16px}@media screen and (max-width:768px){.character-card .caption .name{font-size:1.5rem}.character-card .caption .cv{margin-top:0}.character-card .caption .audio{margin-top:10px}.character-card .caption .infor div{margin-top:0;letter-spacing:0}.character-card .caption .audio+.infor{margin-top:10px}.character-card .caption .infor{margin-top:20px}.character-card .caption .description{margin-top:20px}.character-icon{width:50px;height:50px}.character-list .m-card{margin:6px}}.character-icon.active{background-color:var(--main-color)}.official-website .m-slide-group__content{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.staff-card{display:flex;flex-wrap:wrap;font-size:1rem;justify-content:space-between}.staff-card .group{margin:2rem}.staff-card .group>.name{background-color:var(--main-color);color:#fff;display:flex;justify-content:center;font-weight:bold;margin:0 .5rem 1.5rem .5rem;padding:0 1rem}.staff-card .posts{display:flex}.staff-card .posts>.name{margin-right:1rem;width:84px;font-weight:bold}.staff-card .group-no{width:100%}.staff-card .group-no>.items{display:flex;justify-content:space-between;flex-wrap:wrap}.staff-card .group-no>.items>.posts{margin:0 2rem}.staff-card .staff-name{width:84px}.official-website .information{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:start;-ms-flex-align:start;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:30px}.information .jacket{width:40%;max-width:450px}@media screen and (max-width:768px){.information .jacket{width:100%;max-width:350px}.information .description{width:100%;max-width:350px}}.information .description .detail{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:.6rem;margin-bottom:0;border-left:2px solid var(--main-color);font-size:1rem}.information .description .detail>div.title{margin-bottom:20px;color:var(--main-color)}.information .description .detail>div{display:-webkit-box;display:-ms-flexbox;display:flex;gap:20px;padding-left:20px;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.information .description .detail>div dt{width:4.5rem}.information .description .detail>div.title dd{font-size:2rem;line-height:2.5rem}.information .description .detail>div dd{font-weight:bold;margin-bottom:0}#top .button-area{position:absolute;left:0;right:0;bottom:7%;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:row;-webkit-box-align:center;gap:4vh;justify-content:center}#top .button-area>div{min-width:200px}@media screen and (max-width:768px){#top .button-area>div{min-width:100px}}.official-website .introduce{white-space:pre-line;font-size:1rem}.pre-img{width:0;height:0}.article-introduce{gap:2rem;display:flex;flex-direction:column;font-size:16px;letter-spacing:.05rem}.article-introduce #title .main-img{max-width:500px}.article-introduce #title .no-limit{height:500px;width:fit-content}.article-introduce #title .thum-img{height:200px;border-radius:50%;width:fit-content}.article-introduce>section{gap:1rem;display:flex;flex-direction:column}.article-introduce #title h1{font-weight:bold}.article-introduce #title .description{white-space:pre-line}.article-introduce section>h2{font-size:1.5rem;font-weight:bold;margin:0}.article-introduce dl{margin:0}.article-introduce dd{margin:0}.article-introduce dt{font-weight:inherit}.article-introduce dl div{display:flex;flex-wrap:wrap}.article-introduce dt::after{content:":"}.article-introduce dd+dd::before{content:"、"}.article-introduce a:hover{text-decoration:underline}.article-introduce #gallery img{max-width:100%;cursor:pointer}.article-introduce #gallery .row{row-gap:24px}.article-introduce #character img{height:500px;width:fit-content}.article-introduce #character>div{gap:.5rem;display:flex;cursor:pointer;flex-direction:column}.article-introduce #character .name{font-size:1rem;font-weight:bold}.article-introduce #character .description{white-space:pre-line}.article-introduce #staff .group>.name{font-size:1.2rem;font-weight:bold}.article-introduce #relevance h3{font-size:1.2rem;font-weight:bold}.article-introduce ol,.article-introduce ul{padding-left:24px}.article-introduce ol,.article-introduce ul{margin:0}.article-introduce #relevance>ul{display:flex;flex-direction:column;gap:.5rem}.article-introduce #operation{flex-direction:row;gap:2rem}.article-introduce #release h3{font-size:1.2rem;font-weight:bold}:root{--home-bg-color:#f8fafd;--home-text-color:#1f1f1f;--home-subtle-color:#808080;--home-border-radius:12px;--home-active-border-radius:24px}#home-page{padding-left:5rem;padding-right:5rem}#home-page .m-slide-group__content{gap:1rem;padding:.5rem 0}#home-page .card-title{display:flex;justify-content:space-between;align-items:center}#home-page{letter-spacing:.05rem;font-family:"Google Sans Text",sans-serif;color:var(--home-text-color)}#home-page .left-content,#home-page{display:flex;flex-direction:column;gap:6rem}#home-page .right-content{display:flex;flex-direction:column;gap:2rem}#home-page h2{font-size:3rem;font-weight:bold;letter-spacing:.4rem;margin-left:5rem}#home-page section{display:flex;flex-direction:column;gap:1rem}#home-page .item{display:flex;border-radius:var(--home-border-radius);background-color:var(--home-bg-color);color:var(--home-text-color);transition:.3s;cursor:pointer;white-space:normal}#home-page .item:hover{background-color:var(--hover-color)}#home-page .item:active{border-radius:var(--home-active-border-radius)}#home-page .item>img,#home-page .item .image{transition:.3s;border-radius:var(--home-border-radius);width:100%}#home-page .item:active>img,#home-page .item:active .image{border-radius:var(--home-active-border-radius)}#home-page .item .m-chip{transition:.3s}#home-page .item:hover .m-chip{background-color:var(--active-color)!important;border-color:var(--active-color)!important}#home-page .item:hover .m-chip--outlined{background-color:transparent!important;color:var(--active-color)!important;caret-color:var(--active-color)!important}.item.more-link{flex-direction:column!important;gap:1rem;align-items:center;justify-content:center;width:10rem!important}.item.more-link:hover i{color:var(--active-color)}.carousels-card{border-radius:24px!important;box-shadow:0 .125rem .25rem rgba(0,0,0,.01)!important}.carousels-card .carousel-inner{border-radius:24px!important;cursor:pointer}.published-games-card .item,.upcoming-games-card .item,.free-games-card .item,.discount-games-card .item{display:flex;flex-direction:column}.published-games-card .item .content,.upcoming-games-card .item .content,.free-games-card .item .content,.discount-games-card .item .content{margin:1rem;display:flex;flex-direction:column;gap:.5rem;justify-content:space-between;height:100%}.published-games-card .item .name,.upcoming-games-card .item .name,.free-games-card .item .name,.discount-games-card .item .name{font-size:1.5rem}.published-games-card .item{width:17rem}.upcoming-games-card .item{width:17rem}.free-games-card .item{width:17rem}.discount-games-card .item{width:20rem}.news-card .item{display:flex;width:28rem;gap:1rem;padding:.7rem;cursor:pointer}.news-card .group{display:flex;flex-direction:column;gap:1rem}.news-card img{width:3rem;border-radius:50%}.news-card .content{display:flex;flex-direction:column;justify-content:space-between}.news-card .head{display:flex;gap:.5rem}.news-card .name{color:var(--home-text-color);font-weight:bold}.news-card .time{color:var(--home-subtle-color)}.news-card .text{color:var(--home-text-color)}.latest-articles-card .row{margin-left:3rem}.latest-articles-card .item{margin-bottom:1rem;display:flex;flex-direction:column;width:20rem}.latest-articles-card .content{display:flex;flex-direction:column;gap:1rem}.latest-articles-card .content .name{color:var(--home-text-color);font-size:1.5rem}.latest-articles-card .content .brief{color:var(--home-text-color)}.latest-articles-card .addinfo{display:flex;justify-content:space-between;align-items:center;gap:.5rem}.latest-articles-card .addinfo .m-chip{min-width:4rem}.latest-articles-card .author{display:flex;align-items:center;gap:.5rem}.latest-articles-card .user-image{width:1.5rem;border-radius:50%}.latest-articles-card .author .name{color:var(--home-text-color)}.latest-articles-card .time{color:var(--home-subtle-color);word-break:keep-all}.latest-articles-card .head{padding:1rem;display:flex;gap:1rem;flex-direction:column;height:100%;justify-content:space-between}#home-page .right-content h2{font-size:2rem!important;margin-left:1rem!important;margin-top:1rem}.community-card .group{display:flex;flex-direction:column;gap:1rem}.community-card .item{display:flex;gap:1rem;flex-direction:row;padding:.5rem 1rem}.community-card .content{display:flex;flex-direction:column}.community-card .content .name{font-weight:bold}.community-card .item:hover i{color:var(--active-color)}.recently-edited-games-card .group{display:flex;flex-direction:column;gap:1rem}.recently-edited-games-card img{width:8rem!important}.recently-edited-games-card .name{font-size:1rem}.recently-edited-games-card .time{color:var(--home-subtle-color)}.recently-edited-games-card .content{display:flex;flex-direction:column;justify-content:space-between;padding:.4rem 1rem}.latest-videoes-card .group{display:flex;flex-direction:column;gap:1rem}.latest-videoes-card .item{flex-direction:row;width:30rem}.latest-videoes-card .image{width:15rem!important}.latest-videoes-card .content{display:flex;flex-direction:column;gap:1rem}.latest-videoes-card .content .name{color:var(--home-text-color);font-weight:bold;font-size:1rem}.latest-videoes-card .content .brief{color:var(--home-text-color)}.latest-videoes-card .addinfo{display:flex;justify-content:space-between}.latest-videoes-card .author{display:flex;align-items:center;gap:.5rem}.latest-videoes-card .author .name{color:var(--home-text-color)}.latest-videoes-card .time{color:var(--home-subtle-color);word-break:keep-all}.latest-videoes-card .head{padding:.5rem 1rem;display:flex;flex-direction:column;height:100%;justify-content:space-between}.announcements-card .content{display:flex;flex-direction:column}.announcements-card .group{display:flex;flex-direction:column;gap:1rem}.announcements-card .item{display:flex;justify-content:flex-start;padding:.5rem 1rem;gap:.5rem}.announcements-card .item:hover i{color:var(--active-color)!important}.announcements-card .name.active{font-weight:bold}.friend-links-card .group{display:flex;flex-wrap:wrap;justify-content:space-around;margin-left:3.5rem;margin-right:3rem;gap:1rem}.friend-links-card .item{display:flex;flex-direction:column;width:11rem}.friend-links-card .content{padding:1rem}.friend-links-card .name{font-size:1rem}.about-card{padding:0 2rem;display:flex;flex-direction:column;align-content:center;flex-wrap:wrap}.about-card .head{display:flex;gap:6rem;flex-wrap:wrap}.about-card .links-groups{display:flex;gap:4rem;margin-top:3rem}.about-card .links-item{display:flex;gap:1rem;flex-direction:column}.links-group{display:flex;flex-direction:column;gap:1rem}.about-card .quote-card{max-width:68rem}.links-group h3{font-size:inherit}.links-item a{font-size:1rem;font-weight:bold}.about-card .introduce img{height:50px;aspect-ratio:23/5}.about-card .introduce{display:flex;flex-direction:column;align-items:flex-start;max-width:40rem;gap:1rem}.about-card .text{line-height:1.3rem}.about-card .addinfo{display:flex;justify-content:flex-start;gap:2rem;align-items:center}.about-card .addinfo div{font-size:1.2rem;font-weight:bold}.about-card .addinfo a{color:var(--home-text-color)!important}.about-card a:hover{text-decoration:underline}.recommends-group{display:flex;gap:5rem;flex-direction:column}.recommends .container{display:flex;flex-direction:column;gap:2rem}.recommends h2{margin-left:3rem!important}.recommends .completed-card .content{display:flex;justify-content:center;padding:2rem;font-size:1rem}.plain-text-card.item{display:flex;flex-direction:row;gap:1rem}.plain-text-card.item img{min-width:25rem!important;width:25rem!important;height:fit-content}.plain-text-card.item .content{padding:1rem;display:flex;flex-direction:column;gap:.5rem}.plain-text-card.item .name{font-size:2rem}.masa-image .m-image__image{border-radius:var(--home-border-radius);transition:.3s}.masa-image .item-image:active .m-image__image{border-radius:var(--home-active-border-radius)}.sub-group>.row{row-gap:1.5rem}.masa-image .image-name{display:none;transition:.3s}.masa-image .item-image:hover .image-name{display:flex;-webkit-animation-name:fadeIn;-webkit-animation-duration:.3s;-webkit-animation-iteration-count:1;-webkit-animation-delay:0s}.masa-image .item-image:active .image-name{border-radius:var(--home-active-border-radius)}.masa-image .image-name{background:linear-gradient(to bottom,rgba(0,0,0,0) 70%,rgba(0,0,0,.7));height:100%;width:100%;align-items:flex-end;color:#fff;font-size:1.5rem;padding:1rem;border-radius:var(--home-border-radius)}@-webkit-keyframes fadeIn{0%{opacity:0}20%{opacity:.2}50%{opacity:.5}70%{opacity:.7}100%{opacity:1}}.gallery-card{display:flex;flex-direction:column}.gallery-card{display:flex;border-radius:var(--home-border-radius);background-color:var(--home-bg-color);color:var(--home-text-color);transition:.3s;white-space:normal}.gallery-card .head{display:flex;gap:1rem;align-items:flex-end}.gallery-card .head img{width:13rem;height:fit-content;border-radius:12px}.gallery-card .content{display:flex;flex-direction:column;justify-content:space-around;padding:1rem 1.5rem;gap:.5rem}.gallery-card .name{font-size:2rem}.gallery-card .gallery img{height:20rem;width:fit-content}.gallery-card .actions{display:flex;justify-content:space-around;padding:1rem}.gallery-card button{transition:.3s}.gallery-card button:hover{background-color:var(--main-color)!important;border-color:var(--main-color)!important;color:#fff!important}.gallery-card .m-image{border-radius:12px;cursor:pointer}.weekly-news-card .content{display:flex;flex-direction:column}.weekly-news-card .group{display:flex;flex-direction:column;gap:1rem}.weekly-news-card .item{display:flex;justify-content:flex-start;padding:.5rem 1rem;gap:.5rem}.weekly-news-card .item:hover i{color:var(--active-color)!important}.weekly-news-card .name.active{font-weight:bold}.birthday-card .default.item{padding:1rem;gap:1rem}.birthday-card .default .content{font-size:1rem;display:flex;flex-direction:column;justify-content:space-evenly}.birthday-card .default .head{font-size:3rem}.birthday-card .group .item{padding:.5rem 1rem;gap:1rem;align-items:center}.birthday-card .group .item img{width:5rem!important;height:5rem;border-radius:50%!important}.birthday-card .group .item .content{display:flex;flex-direction:column;gap:.5rem;justify-content:center}.birthday-card .group .item .head{display:flex;gap:.5rem;align-items:flex-end}.birthday-card .group .item .name{font-size:1.5rem}.birthday-card .group .item .debut-game{color:var(--home-subtle-color)}.birthday-card .group{gap:1rem;display:flex;flex-direction:column}.quote-card .quote-content{margin-left:0!important;font-size:2rem!important;font-weight:bold;letter-spacing:.1rem}.quote-card{display:flex;flex-direction:column;gap:1rem}.quote-card .quote-by{font-size:.8rem;letter-spacing:.05rem;display:flex;justify-content:flex-end;gap:.5rem}.kanban-card{display:flex;align-items:center;gap:3rem!important}.kanban-card .quote-card+img{transform:rotateY(180deg)}.kanban-card .quote-card{max-width:70rem}.kanban-card img{width:12rem}.kanban-card .content{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap}.evaluations-group{margin-left:2.5rem;row-gap:2rem;padding-right:2rem}.evaluations-card .articles-group img{width:10rem!important}.evaluations-card .head{display:flex;flex-direction:column;width:100%;padding:.5rem 1rem;justify-content:space-between}.evaluations-card .content{font-size:1rem;font-weight:bold}.evaluations-card .addinfo{display:flex;justify-content:space-between;align-items:flex-end}.articles-group{gap:1rem;display:flex;flex-direction:column}.evaluations-card .type{color:var(--home-subtle-color)}.evaluations-card .evaluations-item{display:flex;flex-direction:column;gap:1rem}.latast-comments-card .item{display:flex;padding:1rem;gap:1rem;flex-direction:row}.latast-comments-card .user-image{width:3rem!important;border-radius:50%!important;height:3rem!important}.latast-comments-card .content{display:flex;flex-direction:column;gap:.5rem;word-break:break-word;width:100%}.latast-comments-card .name{font-size:1rem;font-weight:bold}.latast-comments-card .time{text-align:end;color:#808080}.latast-comments-card .group{gap:1rem;display:flex;flex-direction:column}.hot-tags-card .group{display:flex;flex-wrap:wrap;gap:.75rem}.hot-tags-card .item{padding:.25rem .5rem;gap:.5rem}.hot-tags-card .content{display:flex;align-items:center}.hot-tags-card .item:hover i{color:var(--active-color)}.anniversary-page .user-steam-card{display:flex;flex-direction:row;justify-content:space-around;align-items:center;flex-wrap:wrap;gap:1rem}.anniversary-page .user-steam-card .user-info{display:flex;flex-direction:column;align-items:center;gap:.8rem}.anniversary-page .user-steam-card .user-info .image{height:6rem;border-radius:50%}.anniversary-page .user-steam-card .user-info .name{font-size:large;font-weight:bold}.anniversary-page .user-steam-card .goal .key{font-size:large}.anniversary-page .user-steam-card .goal .value{font-size:xxx-large;font-weight:bold} \ No newline at end of file diff --git a/CnGalWebSite/CnGalWebSite.Shared/Component/PlayedGames/ListGameRecordCard.razor b/CnGalWebSite/CnGalWebSite.Shared/Component/PlayedGames/ListGameRecordCard.razor index a28212062..53e1944f7 100644 --- a/CnGalWebSite/CnGalWebSite.Shared/Component/PlayedGames/ListGameRecordCard.razor +++ b/CnGalWebSite/CnGalWebSite.Shared/Component/PlayedGames/ListGameRecordCard.razor @@ -1,15 +1,44 @@ - +@inject IHttpService _httpService +@inject NavigationManager NavigationManager +@inject IDataCacheService _dataCacheService +@inject IEventService _eventService + + +
+
+ +
+ +
+
+ +
+
+ +
+
+
+
- @foreach (var item in Model.Where(s => s.IsHidden == false && (s.ShowPublicly || IsCurrentUser))) + @foreach (var item in Model.Where(s => s.IsHidden == false && (s.ShowPublicly || IsCurrentUser)).Skip((_dataCacheService.ThemeSetting.AnniversariesSetting.PlayedGameSetting.CurrentPage - 1) * _dataCacheService.ThemeSetting.AnniversariesSetting.PlayedGameSetting.MaxCount).Take(_dataCacheService.ThemeSetting.AnniversariesSetting.PlayedGameSetting.MaxCount)) {
}
+ +@if (_dataCacheService.ThemeSetting.AnniversariesSetting.JudgableGamesSetting.TotalPages > 1) +{ + +} @if (Model.Any(s => s.IsHidden) && IsCurrentUser) { @@ -30,20 +59,21 @@ @code { [Parameter] - public List Model { get; set; } + public IEnumerable Model { get; set; } [Parameter] public bool IsCurrentUser { get; set; } EditGameRecordTip editGameRecordTip; GameRecordViewTip gameRecordViewTip; + IEnumerable Items { get; set; } public bool IsCollapsed { get; set; } = true; public void OnChanged() { StateHasChanged(); - + } public async Task OnShow(GameRecordViewModel model) @@ -61,4 +91,70 @@ await editGameRecordTip.Refresh(true, model.GameId, model); } } + + public void Refresh() + { + Items = Model.Where(s => s.IsHidden == false && (s.ShowPublicly || IsCurrentUser)); + + var searchString = _dataCacheService.ThemeSetting.AnniversariesSetting.PlayedGameSetting.SearchString; + if (string.IsNullOrWhiteSpace(searchString)) + { + Items = Items; + } + else + { + Items = Items.Where(s => (s.GameName?.Contains(searchString) ?? false) || (string.IsNullOrWhiteSpace(s.GameName) == false && (searchString?.Contains(s.GameName) ?? false)) || + (s.GameBriefIntroduction?.Contains(searchString) ?? false) || (string.IsNullOrWhiteSpace(s.GameBriefIntroduction) == false && (searchString?.Contains(s.GameBriefIntroduction) ?? false))) + .ToList(); + } + + + Items = _dataCacheService.ThemeSetting.AnniversariesSetting.PlayedGameSetting.SortType switch + { + PlayedGamesSortType.Score => Items.OrderByDescending(s => s.TotalSocre).ToList(), + PlayedGamesSortType.Name => Items.OrderByDescending(s => s.GameName).ToList(), + PlayedGamesSortType.Type => Items.OrderByDescending(s => s.Type).ToList(), + PlayedGamesSortType.Time => Items.OrderByDescending(s => s.PlayDuration).ToList(), + _ => Items + }; + + _dataCacheService.ThemeSetting.AnniversariesSetting.PlayedGameSetting.Count = Items.Count(); + } + + public void SortValueChanged(PlayedGamesSortType type) + { + _dataCacheService.ThemeSetting.AnniversariesSetting.PlayedGameSetting.SortType = type; + _eventService.OnSavaTheme(); + Refresh(); + } + public void DisplayValueChanged(PlayedGamesDisplayType type) + { + _dataCacheService.ThemeSetting.AnniversariesSetting.PlayedGameSetting.DisplayType = type; + _eventService.OnSavaTheme(); + Refresh(); + } + + + public void SearchValueChanged(string str) + { + _dataCacheService.ThemeSetting.AnniversariesSetting.PlayedGameSetting.SearchString = str; + _eventService.OnSavaTheme(); + Refresh(); + } + + private void OnKeyDown(KeyboardEventArgs e) + { + if (e.Code == "Enter" || e.Code == "NumpadEnter") + { + Refresh(); + } + } + + private void OnPageClick(int pageIndex) + { + _dataCacheService.ThemeSetting.AnniversariesSetting.PlayedGameSetting.CurrentPage = pageIndex; + _eventService.OnSavaTheme(); + StateHasChanged(); + + } } diff --git a/CnGalWebSite/CnGalWebSite.Shared/Component/PlayedGames/SteamUserInforCard.razor b/CnGalWebSite/CnGalWebSite.Shared/Component/PlayedGames/SteamUserInforCard.razor index 637bcdfe9..cbad936a2 100644 --- a/CnGalWebSite/CnGalWebSite.Shared/Component/PlayedGames/SteamUserInforCard.razor +++ b/CnGalWebSite/CnGalWebSite.Shared/Component/PlayedGames/SteamUserInforCard.razor @@ -1,123 +1,174 @@ -@if (SteamUserInfors.Count == 1&&IsSmallScreen==false) +@inject IPageModelCatche _pageModelCatche + +@if (IsAnniversary) { var item = SteamUserInfors[0]; - -
- @item.Name -
-
- @item.Name -
-
- - - @("总时长:"+(GameRecords.Sum(s=>s.PlayDuration)/60.0).ToString("0.0")+" 小时") - - - - @("总计:"+GameRecords.Count) - - - - - @("想玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.WantToPlay)) - - - - - @("正在玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.Playing)) - - - - - @("已玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.Played)) - - - - - @("未玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.UnPlayed)) - - - - - @("不感兴趣:"+GameRecords.Count(s=>s.Type== PlayedGameType.Uninterested)) - - -
-
+
+ - - +
+
@(GameRecords.Count)
+
总库存
+
+
+
@((GameRecords.Count*100.0/ Model.Count).ToString("0.0")+" %")
+
@($"收集率(站内总计 {Model.Count})")
+
+
+
@((GameRecords.Sum(s=>s.PlayDuration)/60.0).ToString("0.0")+" h")
+
总时长
+
+
+
@(item.Price.ToString("0")+ " ¥")
+
总价格
+
+
} else { -
- @foreach (var item in SteamUserInfors) - { -
- -
- @item.Name -
- - @item.Name - -
+ @if (SteamUserInfors.Count == 1 && IsSmallScreen == false) + { + var item = SteamUserInfors[0]; +
+
+ @item.Name +
+
+ @item.Name
-
+
+ + + @("总时长:"+(GameRecords.Sum(s=>s.PlayDuration)/60.0).ToString("0.0")+" 小时") + + + + @("总计:"+GameRecords.Count) + + + + + @("想玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.WantToPlay)) + + + + @("正在玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.Playing)) + + + + + @("已玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.Played)) + + + + + @("未玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.UnPlayed)) + + + + + @("不感兴趣:"+GameRecords.Count(s=>s.Type== PlayedGameType.Uninterested)) + + +
+
+ + + } + else + { +
+ @foreach (var item in SteamUserInfors) + { + - } -
+ } +
-
-
- - - @("总时长:"+(GameRecords.Sum(s=>s.PlayDuration)/60.0).ToString("0.0")+" 小时") - - - - @("总计:"+GameRecords.Count) - - - - - @("想玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.WantToPlay)) - - - - - @("正在玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.Playing)) - - - - - @("已玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.Played)) - - - - - @("未玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.UnPlayed)) - - - - - @("不感兴趣:"+GameRecords.Count(s=>s.Type== PlayedGameType.Uninterested)) - - +
+
+ + + @("总时长:"+(GameRecords.Sum(s=>s.PlayDuration)/60.0).ToString("0.0")+" 小时") + + + + @("总计:"+GameRecords.Count) + + + + + @("想玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.WantToPlay)) + + + + + @("正在玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.Playing)) + + + + + @("已玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.Played)) + + + + + @("未玩:"+GameRecords.Count(s=>s.Type== PlayedGameType.UnPlayed)) + + + + + @("不感兴趣:"+GameRecords.Count(s=>s.Type== PlayedGameType.Uninterested)) + + +
-
+ } } + @code { [Parameter] public List GameRecords { get; set; } [Parameter] - public List SteamUserInfors { get; set; } + public List SteamUserInfors { get; set; } [Parameter] public bool IsSmallScreen { get; set; } + [Parameter] + public bool IsAnniversary { get; set; } + + SteamGamesOverviewModel Model = new SteamGamesOverviewModel(); + [CascadingParameter] + public ErrorHandler ErrorHandler { get; set; } + + protected override async Task OnInitializedAsync() + { + try + { + //获取主页信息 + Model = await _pageModelCatche.GetCache("api/steam/GetSteamGamesOverview"); + StateHasChanged(); + } + catch (Exception ex) + { + ErrorHandler.ProcessError(ex, "获取所有Steam游戏数量失败"); + } + } } diff --git a/CnGalWebSite/CnGalWebSite.Shared/Component/Space/UserPlayedGameListView.razor b/CnGalWebSite/CnGalWebSite.Shared/Component/Space/UserPlayedGameListView.razor index 3dd4f567b..9f55befc2 100644 --- a/CnGalWebSite/CnGalWebSite.Shared/Component/Space/UserPlayedGameListView.razor +++ b/CnGalWebSite/CnGalWebSite.Shared/Component/Space/UserPlayedGameListView.razor @@ -4,9 +4,10 @@ @inject NavigationManager NavigationManager @inject DialogService DialogService @inject IDataCacheService _dataCacheService +@inject IEventService _eventService
- + @if (IsCurrentUser) { @@ -29,7 +30,7 @@ @if (isReady) { - + @if (GameRecords.Count == 0) {
@@ -38,7 +39,7 @@ } else { - + } } else @@ -48,21 +49,22 @@
}
- + @code { [Parameter] public string SteamId { get; set; } [Parameter] public string UserId { get; set; } + [Parameter] + public bool IsAnniversary { get; set; } [CascadingParameter] public ErrorHandler ErrorHandler { get; set; } public List GameRecords = new List(); - public List SteamUserInfors = new List(); + public List SteamUserInfors = new List(); - CnGalWebSite.Shared.Component.PlayedGames.EditUserSteamInforTip editUserSteamInforTip; [Parameter] public bool IsCurrentUser { get; set; } @@ -87,13 +89,9 @@ } } - public void OnEditSteam() + public async void OnEditSteam() { - if(editUserSteamInforTip!=null) - { - editUserSteamInforTip.Refresh(true); - } - + await _eventService.OpenNewPage("https://oauth2.cngal.org/External/Challenge?scheme=Steam"); } public async Task OnChanged(string steamId) diff --git a/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/PC/Home/Anniversaries/PlayedGames/MainCard.razor b/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/PC/Home/Anniversaries/PlayedGames/MainCard.razor index 79862b1f1..7cbb3bc7c 100644 --- a/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/PC/Home/Anniversaries/PlayedGames/MainCard.razor +++ b/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/PC/Home/Anniversaries/PlayedGames/MainCard.razor @@ -6,7 +6,7 @@ @if (Model != null) { - + } diff --git a/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/PC/Home/Anniversaries/Ratings/GameCard.razor b/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/PC/Home/Anniversaries/Ratings/GameCard.razor index 26e99fc79..b7f811c87 100644 --- a/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/PC/Home/Anniversaries/Ratings/GameCard.razor +++ b/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/PC/Home/Anniversaries/Ratings/GameCard.razor @@ -131,7 +131,5 @@ [Parameter] public JudgableGameViewModel Model { get; set; } [Parameter] - public string Class { get; set; } - [Parameter] public JudgableGamesDisplayType Type { get; set; } } diff --git a/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/PC/Home/Anniversaries/Ratings/GameGroup.razor b/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/PC/Home/Anniversaries/Ratings/GameGroup.razor index f0337c83f..f67a53351 100644 --- a/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/PC/Home/Anniversaries/Ratings/GameGroup.razor +++ b/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/PC/Home/Anniversaries/Ratings/GameGroup.razor @@ -13,32 +13,32 @@
- +
- +
- +
- @foreach (var item in Items.Skip((_dataCacheService.ThemeSetting.AnniversariesSetting.CurrentPage - 1) * _dataCacheService.ThemeSetting.AnniversariesSetting.MaxCount).Take(_dataCacheService.ThemeSetting.AnniversariesSetting.MaxCount)) + @foreach (var item in Items.Skip((_dataCacheService.ThemeSetting.AnniversariesSetting.JudgableGamesSetting.CurrentPage - 1) * _dataCacheService.ThemeSetting.AnniversariesSetting.JudgableGamesSetting.MaxCount).Take(_dataCacheService.ThemeSetting.AnniversariesSetting.JudgableGamesSetting.MaxCount)) { - + }
-@if (_dataCacheService.ThemeSetting.AnniversariesSetting.TotalPages > 1) +@if (_dataCacheService.ThemeSetting.AnniversariesSetting.JudgableGamesSetting.TotalPages > 1) { - + } @if (Items.Any() == false && isReady) { - + } @@ -74,7 +74,7 @@ _dataCacheService.JudgableGamesCatche = await _httpService.GetAsync>("api/anniversaries/GetAllJudgableGames"); } - var searchString = _dataCacheService.ThemeSetting.AnniversariesSetting.SearchString; + var searchString = _dataCacheService.ThemeSetting.AnniversariesSetting.JudgableGamesSetting.SearchString; if (string.IsNullOrWhiteSpace(searchString)) { Items = _dataCacheService.JudgableGamesCatche; @@ -87,7 +87,7 @@ } - Items = _dataCacheService.ThemeSetting.AnniversariesSetting.SortType switch + Items = _dataCacheService.ThemeSetting.AnniversariesSetting.JudgableGamesSetting.SortType switch { JudgableGamesSortType.LastScoreTime => Items.OrderByDescending(s => s.LastScoreTime).ToList(), JudgableGamesSortType.PublishTime => Items.OrderByDescending(s => s.PublishTime).ToList(), @@ -98,7 +98,7 @@ _ => Items }; - _dataCacheService.ThemeSetting.AnniversariesSetting.Count = Items.Count; + _dataCacheService.ThemeSetting.AnniversariesSetting.JudgableGamesSetting.Count = Items.Count; } catch (Exception ex) { @@ -109,13 +109,13 @@ public async Task SortValueChanged(JudgableGamesSortType type) { - _dataCacheService.ThemeSetting.AnniversariesSetting.SortType = type; + _dataCacheService.ThemeSetting.AnniversariesSetting.JudgableGamesSetting.SortType = type; _eventService.OnSavaTheme(); await Refresh(); } public async Task DisplayValueChanged(JudgableGamesDisplayType type) { - _dataCacheService.ThemeSetting.AnniversariesSetting.DisplayType = type; + _dataCacheService.ThemeSetting.AnniversariesSetting.JudgableGamesSetting.DisplayType = type; _eventService.OnSavaTheme(); await Refresh(); } @@ -123,7 +123,7 @@ public async Task SearchValueChanged(string str) { - _dataCacheService.ThemeSetting.AnniversariesSetting.SearchString = str; + _dataCacheService.ThemeSetting.AnniversariesSetting.JudgableGamesSetting.SearchString = str; _eventService.OnSavaTheme(); await Refresh(); } @@ -136,6 +136,14 @@ } } + private void OnPageClick(int pageIndex) + { + _dataCacheService.ThemeSetting.AnniversariesSetting.JudgableGamesSetting.CurrentPage = pageIndex; + _eventService.OnSavaTheme(); + StateHasChanged(); + + } + public async Task OnClickMore(JudgableGameViewModel model) { currentGame = model; @@ -156,12 +164,4 @@ } } - private void OnPageClick(int pageIndex) - { - _dataCacheService.ThemeSetting.AnniversariesSetting.CurrentPage = pageIndex; - _eventService.OnSavaTheme(); - StateHasChanged(); - - } - } diff --git a/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/Shared/Editors/Users/MainCard.razor b/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/Shared/Editors/Users/MainCard.razor index 759ec25a4..a89514ca9 100644 --- a/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/Shared/Editors/Users/MainCard.razor +++ b/CnGalWebSite/CnGalWebSite.Shared/MasaComponent/Shared/Editors/Users/MainCard.razor @@ -6,32 +6,31 @@
- +
- +
- +
-
- +
- +
展示的头衔
@foreach (var item in Model.Ranks) { - + }
- +
diff --git a/CnGalWebSite/CnGalWebSite.Shared/Pages/Normal/Home/Anniversaries.razor b/CnGalWebSite/CnGalWebSite.Shared/Pages/Normal/Home/Anniversaries.razor index e93140355..fadf303ca 100644 --- a/CnGalWebSite/CnGalWebSite.Shared/Pages/Normal/Home/Anniversaries.razor +++ b/CnGalWebSite/CnGalWebSite.Shared/Pages/Normal/Home/Anniversaries.razor @@ -7,45 +7,48 @@ @inject NavigationManager NavigationManager @implements IDisposable -" - 评选","Vote"=> " - 投票","Lottery" =>" - 抽奖","Introduction"=>"介绍",_=>""})"/> -
- - - 主页mdi-home - - - 评选mdi-star - - - 晒出你的游戏库@IconType.Game.ToIconString() - - - 抽奖mdi-wallet-giftcard - - - 活动介绍mdi-av-timer - - +
+ " - 评选","Vote"=> " - 投票","Lottery" =>" - 抽奖","Introduction"=>"介绍",_=>""})" /> +
+ + + 主页mdi-home + + + 评选mdi-star + + + 晒出你的游戏库@IconType.Game.ToIconString() + + + 抽奖mdi-wallet-giftcard + + + 活动介绍mdi-av-timer + + +
+ + + + + + + + + + + + + + + + + + + +
- - - - - - - - - - - - - - - - - - - @code { diff --git a/CnGalWebSite/CnGalWebSite.Shared/Service/DataCatcheService.cs b/CnGalWebSite/CnGalWebSite.Shared/Service/DataCatcheService.cs index 62820aeec..22dfb9175 100644 --- a/CnGalWebSite/CnGalWebSite.Shared/Service/DataCatcheService.cs +++ b/CnGalWebSite/CnGalWebSite.Shared/Service/DataCatcheService.cs @@ -150,7 +150,7 @@ public class DataCatcheService : IDataCacheService /// /// 用户Steam信息缓存 /// - public IPageModelCatche> UserSteamInforDataCatche { get; set; } + public IPageModelCatche> UserSteamInforDataCatche { get; set; } /// /// 用户文章列表缓存 /// @@ -272,7 +272,7 @@ public class DataCatcheService : IDataCacheService IPageModelCatche commentDataCatche, IPageModelCatche personalSpaceDataCatche, IPageModelCatche> userGameRecordDataCatche, - IPageModelCatche> userSteamInforDataCatche, + IPageModelCatche> userSteamInforDataCatche, IPageModelCatche userArticleListDataCatche, IPageModelCatche userVideoListDataCatche, IPageModelCatche> userExaminesDataCatche, diff --git a/CnGalWebSite/CnGalWebSite.Shared/Service/IDataCacheService.cs b/CnGalWebSite/CnGalWebSite.Shared/Service/IDataCacheService.cs index cfbcdcf2e..61d1aa444 100644 --- a/CnGalWebSite/CnGalWebSite.Shared/Service/IDataCacheService.cs +++ b/CnGalWebSite/CnGalWebSite.Shared/Service/IDataCacheService.cs @@ -88,7 +88,7 @@ public interface IDataCacheService IPageModelCatche> UserGameRecordDataCatche { get; set; } - IPageModelCatche> UserSteamInforDataCatche { get; set; } + IPageModelCatche> UserSteamInforDataCatche { get; set; } IPageModelCatche UserVideoListDataCatche { get; set; }