#region copyright //------------------------------------------------------------------------------ // 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充 // 此代码版权(除特别声明外的代码)归作者本人Diego所有 // 源代码使用协议遵循本仓库的开源协议及附加协议 // Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway // Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway // 使用文档:https://diego2098.gitee.io/thingsgateway-docs/ // QQ群:605534569 //------------------------------------------------------------------------------ #endregion using Furion.DataEncryption; using Furion.DependencyInjection; using Furion.FriendlyException; using Mapster; using ThingsGateway.Foundation.Extension.String; namespace ThingsGateway.Admin.Application; /// [Injection(Proxy = typeof(OperDispatchProxy))] public class UserCenterService : DbRepository, IUserCenterService { private readonly IRelationService _relationService; private readonly IResourceService _resourceService; private readonly ISysUserService _userService; private readonly IVerificatService _verificatService; /// public UserCenterService(ISysUserService userService, IRelationService relationService, IResourceService resourceService, IVerificatService verificatService ) { _userService = userService; _relationService = relationService; _resourceService = resourceService; _verificatService = verificatService; } /// [OperDesc("修改密码")] public async Task EditPasswordAsync(PasswordInfoInput input) { var password = DESCEncryption.Encrypt(input.ConfirmPassword, DESCKeyConst.DESCKey); var user = await _userService.GetUserByIdAsync(input.Id); if (user.Password != input.OldPassword) throw Oops.Bah("旧密码不正确"); if (await UpdateAsync(it => new SysUser { Password = password }, it => it.Id == input.Id)) { //从列表中删除 await _verificatService.SetVerificatIdAsync(input.Id, new()); _userService.DeleteUserFromCache(input.Id);//从cache删除用户信息 } } /// public async Task> GetLoginWorkbenchAsync() { //获取个人工作台信息 var sysRelation = await _relationService.GetWorkbenchAsync(UserManager.UserId); if (sysRelation != null) { //如果有数据直接返回个人工作台 return sysRelation.ExtJson.FromJsonString>(); } else { return new(); } } /// public async Task GetLoginDefaultRazorAsync(long userId) { var sysRelations = await _relationService.GetRelationByCategoryAsync(CateGoryConst.Relation_SYS_USER_DEFAULTRAZOR); var result = sysRelations.FirstOrDefault(it => it.ObjectId == userId);//获取个人工作台 if (result != null) return result.ExtJson.FromJsonString(); else return 0; } /// public async Task UpdateUserDefaultRazorAsync(long userId, long defaultRazor) { await _relationService.SaveRelationAsync(CateGoryConst.Relation_SYS_USER_DEFAULTRAZOR, userId, null, defaultRazor.ToJsonString(), true); } /// public async Task> GetOwnMenuAsync(string UserAccount = null) { var result = new List(); //获取用户信息 var userInfo = await _userService.GetUserByAccountAsync(UserAccount ?? UserManager.UserAccount); if (userInfo != null) { //获取所有的菜单和模块和菜单目录以及单页面列表,并按分类和排序码排序 var allMenuAndSpaList = await _resourceService.GetaMenuAndSpaListAsync(); List allMenuList = new();//菜单列表 List allSpaList = new();//单页列表 //遍历菜单集合 allMenuAndSpaList.ForEach(it => { switch (it.Category) { case ResourceCategoryEnum.MENU://菜单 allMenuList.Add(it);//添加到菜单列表 break; case ResourceCategoryEnum.SPA://单页 allSpaList.Add(it);//添加到单页列表 break; } }); //输出的用户权限菜单 List myMenus = new(); //管理员拥有全部权限 if (UserManager.IsSuperAdmin) { myMenus = allMenuList; } else { //获取角色所拥有的资源集合 var resourceList = await _relationService.GetRelationListByObjectIdListAndCategoryAsync(userInfo.RoleIdList, CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE); //定义菜单ID列表 HashSet rolesMenuIdList = new(); //获取拥有权限的菜单Id集合 rolesMenuIdList.AddRange(resourceList.Select(r => r.TargetId.ToLong()).ToList()); //获取我的菜单列表 myMenus = allMenuList.Where(it => rolesMenuIdList.Contains(it.Id)).ToList(); } // 对获取到的角色对应的菜单列表进行处理,获取父列表 var parentList = GetMyParentMenus(allMenuList, myMenus); myMenus.AddRange(parentList);//合并列表 myMenus.Add(allSpaList.OrderBy(it => it.SortCode).FirstOrDefault());//第一个SPA会添加到菜单作为首页 //构建菜单树 result = _resourceService.ResourceListToTree(myMenus); } return result; } /// [OperDesc("用户更新个人信息")] public async Task UpdateUserInfoAsync(UpdateInfoInput input) { var newInput = input.Adapt(); //如果手机号不是空 if (!string.IsNullOrEmpty(newInput.Phone)) { if (!newInput.Phone.MatchPhoneNumber())//判断是否是手机号格式 throw Oops.Bah($"手机号码格式错误"); newInput.Phone = DESCEncryption.Encrypt(newInput.Phone, DESCKeyConst.DESCKey); var any = await IsAnyAsync(it => it.Phone == newInput.Phone && it.Id != UserManager.UserId);//判断是否有重复的 if (any) throw Oops.Bah($"系统已存在该手机号"); } if (!string.IsNullOrEmpty(newInput.Email)) { var match = newInput.Email.MatchEmail(); if (!match) throw Oops.Bah($"邮箱格式错误"); } //更新指定字段 var result = await UpdateAsync(it => new SysUser { Email = newInput.Email, Phone = newInput.Phone, }, it => it.Id == UserManager.UserId); if (result) _userService.DeleteUserFromCache(UserManager.UserId);//cache删除用户数据 } /// [OperDesc("用户更新工作台信息")] public async Task UpdateWorkbenchAsync(List input) { //关系表保存个人工作台 await _relationService.SaveRelationAsync(CateGoryConst.Relation_SYS_USER_WORKBENCH_DATA, UserManager.UserId, null, input.ToJsonString(), true); } #region 方法 /// /// 获取父菜单集合,已过滤掉同时存在的父节点 /// /// 所有菜单列表 /// 我的菜单列表 /// private List GetMyParentMenus(List allMenuList, List myMenus) { var parentList = new List(); myMenus.ForEach(it => { //找到父ID对应的菜单 var parent = allMenuList.Where(r => r.Id == it.ParentId).FirstOrDefault(); if (parent != null && !parentList.Contains(parent) && !myMenus.Contains(parent))//如果不为空且夫列表里没有 { parentList.Add(parent);//添加到父列表 } }); return parentList; } #endregion 方法 }