using System.Security.Claims; using AdminService.System.Param; using AdminService.System.Response; using AutoMapper; using Common; using Common.Utils; using CommonInfrastructure.Response; using Domain.Admin.Admin; using Domain.Admin.Admin.ENum; using JWTHelper; using Microsoft.Extensions.Logging; using MongoDB.Driver; using MongoRepository; using RedisHelper; namespace AdminService.System { public class SystemService: ISystemService { private readonly IMongoBaseRepository _systemUserRepository; private readonly IMongoBaseRepository _systemRoleRepository; private readonly IMongoBaseRepository _navigationRepository; private readonly IMongoBaseRepository _dicRepository; private readonly ICache _cache; private readonly IMapper _mapper; private readonly JwtTools _jwtTools; public SystemService(IMongoBaseRepository systemUserRepository, IMongoBaseRepository systemRoleRepository, IMongoBaseRepository navigationRepository, IMongoBaseRepository dicRepository, ICache cache, IMapper mapper, JwtTools jwtTools) { _systemUserRepository = systemUserRepository; _systemRoleRepository = systemRoleRepository; _navigationRepository = navigationRepository; _dicRepository = dicRepository; _cache = cache; _mapper = mapper; _jwtTools = jwtTools; } public async Task<(bool isok, string msg)> AddUser(AddUserParam param) { var model = await _systemUserRepository.FindOneAsync(c => (c.UserName == param.UserName || c.DisplayName == param.DisplayName) && c.IsDelete==false); if (model != null) return (false, "用户名已存在"); model = _mapper.Map(param); model.Init(); model.Password = Md5Helper.GetMD5(model.Password); return await _systemUserRepository.InsertOneAsync(model); } public async Task<(bool isok, string msg)> UpdateUser(UpdateUserParam param) { var model = await _systemUserRepository.FindOneAsync(c => (c.UserName == param.UserName || c.DisplayName == param.DisplayName) && c.Id!= param.Id && c.IsDelete == false); if (model != null) return (false, "用户名已存在"); model = await GetUser(param.Id); if (model == null) return (false, "要修改的用户不存在"); model.UserName = param.UserName; model.DisplayName = param.DisplayName; model.SystemRole = param.SystemRole; if (!string.IsNullOrWhiteSpace(param.Icon)) model.Icon = param.Icon; if (!string.IsNullOrWhiteSpace(param.Password) && model.Password != param.Password) model.Password = Md5Helper.GetMD5(param.Password); return await _systemUserRepository.ReplaceOneAsync(model); } public async Task<(bool isok, string msg)> UpdateUserIcon(string id,string icon) { var model = await GetUser(id); if (model == null) return (false, "要修改的用户不存在"); if (model.Icon == icon) return (true, "修改成功"); model.Icon = icon; return await _systemUserRepository.ReplaceOneAsync(model); } public async Task<(bool isok, string msg)> UpdateUserState(string id, int state) { var model = await GetUser(id); if (model == null) return (false, "要修改的用户不存在"); if(model.State==state) return (true, "修改成功"); model.State= state; return await _systemUserRepository.ReplaceOneAsync(model); } public async Task GetUser(string id) { var model = await _systemUserRepository.FindByIdAsync(id); if (model == null) return null; if (model.IsDelete) return null; return model; } public async Task GetUserByName(string userName) { var model = await _systemUserRepository.FindOneAsync(c=>c.UserName==userName && c.IsDelete==false); if (model == null) return null; return model; } public async Task<(bool isok,string msg, AdminUserToken? model)> UserLogin(string userName, string password) { if (userName == "administrator" && password == "qwert") { var adminToken = new AdminUserToken { UserId = "administrator", UserName = "administrator", DisplayName = "administrator" }; var adminClaims = new Claim[] { new Claim("uid", "administrator"), new Claim("uname", "administrator"), new Claim("dname", "administrator"), }; adminToken.Token = _jwtTools.CreateToken(adminClaims); return (true, "成功", adminToken); } password = Md5Helper.GetMD5(password); var model = await _systemUserRepository.FindOneAsync(c => c.UserName == userName && c.Password==password && c.IsDelete == false); if (model == null) return (false,"用户不存在",null); if(model.State!=1) return (false, "用户已被禁用", null); var res = _mapper.Map(model); res.UserId = model.Id; var claims = new Claim[] { new Claim("uid", model.Id), new Claim("uname", model.UserName), new Claim("dname", model.DisplayName), }; res.Token = _jwtTools.CreateToken(claims); return (true,"成功",res); } public async Task<(List list, long count)> GetUserList(GetUserListParam param) { var where = LinqExtensions.True().And(e => e.IsDelete == false) .And(e => e.UserName != "administrator"); if (!string.IsNullOrWhiteSpace(param.KeyWord)) where = where.And(e => e.UserName.Contains(param.KeyWord) || e.DisplayName.Contains(param.KeyWord)); if (param.State > -1) { where = where.And(e => e.State == param.State); } var result = await _systemUserRepository.QueryPageAsync(where,c=>c.RegisterTime,true, param.PageSize??0, param.PageIndex??0); return (result.list,result.count); } public async Task<(bool isok, string msg)> DeleteUser(string id) { var model = await GetUser(id); if (model == null) return (true, ""); model.IsDelete = true; return await _systemUserRepository.ReplaceOneAsync(model); } public async Task> GetUserNav(LoginUser loginUser) { if (string.IsNullOrEmpty(loginUser?.UserId)) return null; if (loginUser.UserId == "administrator") { var allNavList = await _navigationRepository.FilterByAsync(c => c.IsDelete == false); if (!allNavList.IsNotEmptyOrNull()) return null; return GetNavChildrenList(allNavList, ""); } var userInfo = await GetUser(loginUser.UserId); if (userInfo == null) return null; if (userInfo.SystemRole == null || string.IsNullOrEmpty(userInfo.SystemRole.Id)) return null; var role = await _systemRoleRepository.FindOneAsync(c => c.Id == userInfo.SystemRole.Id && c.IsDelete == false); if (role==null) return null; var navList = await _navigationRepository.FilterByAsync(c => c.IsDelete == false); if (!navList.IsNotEmptyOrNull()) return null; var res= GetUserNavList(navList,"", role.NavIds); if(!res.isCheck) return null; return (res.list); } public async Task<(bool isok, string msg)> AddRole(AddRoleParam param) { var model = await _systemRoleRepository.FindOneAsync(c => c.RoleName == param.RoleName && c.IsDelete == false); if (model != null) return (false, "角色名已存在"); model = _mapper.Map(param); model.Init(); return await _systemRoleRepository.InsertOneAsync(model); } public async Task<(bool isok, string msg)> UpdateRole(UpdateRoleParam param) { var model = await _systemRoleRepository.FindOneAsync(c => c.RoleName == param.RoleName && c.Id != param.Id && c.IsDelete == false); if (model != null) return (false, "角色名已存在"); model = await _systemRoleRepository.FindByIdAsync(param.Id); if (model == null) return (false, "要修改的角色不存在"); model.RoleName = param.RoleName; model.Description = param.Description; return await _systemRoleRepository.ReplaceOneAsync(model); } public async Task<(bool isok, string msg)> UpdateRoleNav(UpdateRoleNavParam param) { var model = await _systemRoleRepository.FindByIdAsync(param.Id); if (model == null) return (false, "要修改的角色不存在"); if (model.IsDelete) return (false, "要修改的角色不存在"); model.NavIds = param.NavIds; return await _systemRoleRepository.ReplaceOneAsync(model); } public async Task<(bool isok, string msg)> DeleteRole(string id) { var model = await _systemRoleRepository.FindByIdAsync(id); if (model == null) return (true, ""); if (model.IsDelete) return (true, ""); model.IsDelete=true; return await _systemRoleRepository.ReplaceOneAsync(model); } public async Task> GetRoleList() { var result = await _systemRoleRepository.FilterByAsync(c=>c.IsDelete==false); return result; } public async Task GetUserRole(string id) { var model = await _systemRoleRepository.FindByIdAsync(id); if (model == null) return null; if (model.IsDelete) return null; return model; } public async Task<(bool isok, string msg)> AddNav(AddNavParam param) { if (!string.IsNullOrWhiteSpace(param.ParentId)) { var parentModel = await _navigationRepository.FindByIdAsync(param.ParentId); if (parentModel == null) return (false, "未获取到父级对象"); } var model = _mapper.Map(param); model.Init(); return await _navigationRepository.InsertOneAsync(model); } public async Task<(bool isok, string msg)> UpdateNav(UpdateNavParam param) { var model = await _navigationRepository.FindByIdAsync(param.Id); if (model == null) return (false, "要修改的菜单不存在"); if (model.IsDelete) return (false, "要修改的菜单不存在"); model.ParentId = param.ParentId; model.Name = param.Name; model.Order = param.Order; model.Icon = param.Icon; model.Url = param.Url; model.Category = (EnumNavigationCategory)param.Category; model.Target = param.Target; model.IsResource = (EnumResource)param.IsResource; return await _navigationRepository.ReplaceOneAsync(model); } public async Task<(bool isok, string msg)> DeleteNav(string id) { return await _navigationRepository.DeleteByIdAsync(id); } public async Task> GetNavList(string navId) { var navList = await _navigationRepository.FilterByAsync(c => c.IsDelete == false); if (!navList.IsNotEmptyOrNull()) return null; List result = new List(); return GetNavChildrenList(navList, navId); } private List GetNavChildrenList(List navList, string id) { List result = new List(); var list = navList.Where(c => c.ParentId == id).OrderBy(c=>c.Order); if (!list.IsNotEmptyOrNull()) return result; foreach (var item in list) { var model = _mapper.Map(item); model.Children = GetNavChildrenList(navList, item.Id); result.Add(model); } return result; } private (List list, bool isCheck) GetUserNavList(List navList, string id, List navIds) { List result = new List(); var list = navList.Where(c => c.ParentId == id && c.IsResource == 0).OrderBy(c => c.Order); if (!list.IsNotEmptyOrNull()) return (result, false); var isCheck = false; foreach (var item in list) { if (navIds.Contains(item.Id)) isCheck = true; var model = _mapper.Map(item); var res = GetUserNavList(navList, item.Id, navIds); model.Children = res.list; if (res.isCheck) isCheck = true; if(isCheck) result.Add(model); } return (result,isCheck); } public async Task<(bool isok, string msg)> AddDic(AddDicParam param) { if (!string.IsNullOrWhiteSpace(param.ParentId)) { var parentModel = await _dicRepository.FindByIdAsync(param.ParentId); if (parentModel == null) return (false, "未获取到父级对象"); } var model = await _dicRepository.FindOneAsync(c => c.Code == param.Code); if (model != null) return (false, "Code已存在"); model = _mapper.Map(param); model.Init(); return await _dicRepository.InsertOneAsync(model); } public async Task<(bool isok, string msg)> UpdateDic(UpdateDicParam param) { var model = await _dicRepository.FindOneAsync(c => c.Code == param.Code && c.Id!=param.Id); if (model != null) return (false, "Code已存在"); model = await _dicRepository.FindByIdAsync(param.Id); if (model == null) return (false, "要修改的字典不存在"); if (model.IsDelete) return (false, "要修改的字典不存在"); model.ParentId = param.ParentId; model.Name = param.Name; model.Order = param.Order; model.Icon = param.Icon; model.Value = param.Value; model.Code = param.Code; model.Remark = param.Remark; model.Remark1 = param.Remark1; return await _dicRepository.ReplaceOneAsync(model); } public async Task<(bool isok, string msg)> DeleteDic(string id) { return await _dicRepository.DeleteByIdAsync(id); } public async Task> GetDicList(string dicId) { var dicList = await _dicRepository.FilterByAsync(c => c.IsDelete == false); if (!dicList.IsNotEmptyOrNull()) return null; List result = new List(); return GetDicChildrenList(dicList, dicId); } public async Task> GetDicListByCode(string code) { var dicList = await _dicRepository.FilterByAsync(c => c.IsDelete == false); if (!dicList.IsNotEmptyOrNull()) return null; List result = new List(); var model = dicList.FirstOrDefault(c => c.Code == code); if (model == null) return null; return GetDicChildrenList(dicList, model.Id); } public async Task GetDictByCode(string code) { var model = await _dicRepository.FindOneAsync(c => c.IsDelete == false&&c.Code==code); return model; } private List GetDicChildrenList(List navList, string id) { List result = new List(); var list = navList.Where(c => c.ParentId == id).OrderBy(c => c.Order); if (!list.IsNotEmptyOrNull()) return result; foreach (var item in list) { var model = _mapper.Map(item); model.Children = GetDicChildrenList(navList, item.Id); result.Add(model); } return result; } } }