using Volo.Abp.Caching; using Volo.Abp.Domain.Services; using Yi.Framework.Bbs.Domain.Entities; using Yi.Framework.Bbs.Domain.Shared.Caches; using Yi.Framework.Bbs.Domain.Shared.Consts; using Yi.Framework.Bbs.Domain.Shared.Enums; using Yi.Framework.Rbac.Domain.Entities; using Yi.Framework.Rbac.Domain.Shared.Enums; using Yi.Framework.SqlSugarCore.Abstractions; namespace Yi.Framework.Bbs.Domain.Managers { public class BbsUserManager : DomainService { public ISqlSugarRepository _userRepository; private readonly LevelManager _levelManager; public BbsUserManager(ISqlSugarRepository userRepository, ISqlSugarRepository bbsUserInfoRepository, LevelManager levelManager ) { _userRepository = userRepository; _levelManager = levelManager; } /// /// 校验用户限制 /// /// /// public async Task VerifyUserLimitAsync(Guid userId) { var userInfo = await GetBbsUserInfoAsync(userId); if (userInfo.UserLimit == UserLimitEnum.Ban) { throw new UserFriendlyException("你已被禁用,如存疑虑,请联系管理员进行申诉"); } if (userInfo.UserLimit == UserLimitEnum.Dangerous) { throw new UserFriendlyException("您的账号被标记为危险状态,请遵规守法,等待后续解除"); } } /// /// 获取等级关系 /// /// public async Task> GetLevelCacheMapAsync() { return await _levelManager.GetCacheMapAsync(); } /// /// 获取bbs用户信息 /// /// /// public async Task GetBbsUserInfoAsync(Guid userId) { var userInfo = await _userRepository._DbQueryable .LeftJoin((user, info) => user.Id == info.UserId) .Select((user, info) => new BbsUserInfoDto { Id = user.Id, Icon = user.Icon, Level = info.Level, UserLimit = info.UserLimit, Money = info.Money, Experience = info.Experience, AgreeNumber = info.AgreeNumber, CommentNumber = info.CommentNumber, DiscussNumber = info.DiscussNumber }, true) .FirstAsync(user => user.Id == userId); var levelCacheDic = await GetLevelCacheMapAsync(); userInfo.LevelName = levelCacheDic[userInfo.Level].Name; return userInfo; } public async Task> GetBbsUserInfoAsync(List userIds) { var userInfos = await _userRepository._DbQueryable .Where(user => userIds.Contains(user.Id)) .LeftJoin((user, info) => user.Id == info.UserId) .Select((user, info) => new BbsUserInfoDto { Id = user.Id, Icon = user.Icon, Level = info.Level, UserLimit = info.UserLimit, Money = info.Money, Experience = info.Experience, AgreeNumber = info.AgreeNumber, CommentNumber = info.CommentNumber, DiscussNumber = info.DiscussNumber }, true) .ToListAsync(); var levelCacheDic = await GetLevelCacheMapAsync(); userInfos?.ForEach(userInfo => userInfo.LevelName = levelCacheDic[userInfo.Level].Name); return userInfos ?? new List(); } } public class BbsUserInfoDto { public Guid Id { get; set; } public string? Name { get; set; } public int? Age { get; set; } public string UserName { get; set; } = string.Empty; public string? Icon { get; set; } public string? Nick { get; set; } public string? Email { get; set; } public string? Ip { get; set; } public string? Address { get; set; } public long? Phone { get; set; } public string? Introduction { get; set; } public string? Remark { get; set; } public SexEnum Sex { get; set; } = SexEnum.Unknown; public bool State { get; set; } public DateTime CreationTime { get; set; } /// /// 用户等级 /// public int Level { get; set; } /// /// 用户等级名称 /// public string LevelName { get; set; } /// /// 用户限制 /// public UserLimitEnum UserLimit { get; set; } /// /// 钱钱 /// public decimal Money { get; set; } /// /// 经验 /// public long Experience { get; set; } public int DiscussNumber { get; set; } /// /// 发表主题数 /// public int CommentNumber { get; set; } /// /// 被点赞数 /// public int AgreeNumber { get; set; } } }