diff --git a/OpenAuth.Domain/Service/ModuleEleManService.cs b/OpenAuth.Domain/Service/ModuleEleManService.cs new file mode 100644 index 00000000..ba38eb09 --- /dev/null +++ b/OpenAuth.Domain/Service/ModuleEleManService.cs @@ -0,0 +1,104 @@ +// *********************************************************************** +// Assembly : OpenAuth.Domain +// Author : yubaolee +// Created : 05-27-2016 +// +// Last Modified By : yubaolee +// Last Modified On : 05-27-2016 +// Contact : Microsoft +// File: ModuleEleManService.cs +// *********************************************************************** + + +using System.Collections.Generic; +using System.Linq; +using OpenAuth.Domain.Interface; + +namespace OpenAuth.Domain.Service +{ + /// + /// 领域服务 + /// 模块菜单管理服务 + /// + public class ModuleEleManService + { + private readonly IUnitWork _unitWork; + private readonly AuthoriseService _authoriseService; + + public ModuleEleManService(IUnitWork unitWork, AuthoriseService authoriseService) + { + _unitWork = unitWork; + _authoriseService = authoriseService; + } + + public void AddOrUpdate(ModuleElement model) + { + if (model.Id == 0) + { + _unitWork.Add(model); + } + else + { + _unitWork.Update(model); + } + } + + public IEnumerable LoadByModuleId(string loginuser, int id) + { + _authoriseService.GetUserAccessed(loginuser); + if (_authoriseService.ModuleElements.Count == 0) //用户没有任何资源 + { + return new List(); + } + + var modules = _authoriseService.ModuleElements.Where(u => u.ModuleId == id).OrderBy(u =>u.Sort); + return modules; + } + + /// + /// 获取带有授权状态的菜单列表 + /// + /// 当前登录的操作人 + /// 授权类型,当前有RoleElement/UserElement + /// + /// 当为RoleElement时,表示RoleId + /// 当为UserElement时,表示UserId + /// + /// 模块ID + public List LoadWithAccess(string username, string accessType, int firstId, int moduleId) + { + var listVms = new List(); + _authoriseService.GetUserAccessed(username); + if (_authoriseService.ModuleElements.Count == 0) //用户没有任何资源 + { + return listVms; + } + + if (moduleId == 0) return listVms; + string modulename = _authoriseService.Modules.SingleOrDefault(u => u.Id == moduleId).Name; + + foreach (var element in _authoriseService.ModuleElements.Where(u =>u.ModuleId ==moduleId)) + { + var accessed = _unitWork.FindSingle(u =>u.Key == accessType + && u.FirstId == firstId && u.SecondId == element.Id); + var vm = new + { + Id = element.Id, + Name = element.Name, + ModuleId = element.ModuleId, + DomId = element.DomId, + ModuleName = modulename, + Accessed = accessed != null + }; + listVms.Add(vm); + } + return listVms; + } + + public void Delete(ModuleElement[] objs) + { + var delIds = objs.Select(u => u.Id).ToList(); + _unitWork.Delete(u =>delIds.Contains(u.Id)); + } + } +} diff --git a/OpenAuth.Domain/Service/ModuleManService.cs b/OpenAuth.Domain/Service/ModuleManService.cs new file mode 100644 index 00000000..86f63d06 --- /dev/null +++ b/OpenAuth.Domain/Service/ModuleManService.cs @@ -0,0 +1,179 @@ +// *********************************************************************** +// Assembly : OpenAuth.Domain +// Author : yubaolee +// Created : 05-27-2016 +// +// Last Modified By : yubaolee +// Last Modified On : 05-27-2016 +// Contact : Microsoft +// File: ModuleManService.cs +// *********************************************************************** + +using System; +using System.Collections.Generic; +using System.Linq; +using OpenAuth.Domain.Interface; + +namespace OpenAuth.Domain.Service +{ + /// + /// 领域服务 + /// 模块领域服务 + /// + public class ModuleManService + { + private readonly IModuleRepository _repository; + private readonly IRelevanceRepository _relevanceRepository; + private readonly AuthoriseService _authoriseService; + + public ModuleManService(IModuleRepository repository, + IRelevanceRepository relevanceRepository, AuthoriseService authoriseService) + { + _repository = repository; + _relevanceRepository = relevanceRepository; + _authoriseService = authoriseService; + } + + /// + /// 加载一个节点下面的所有 + /// + public dynamic Load(string loginuser, int parentId, int pageindex, int pagesize) + { + + _authoriseService.GetUserAccessed(loginuser); + if (_authoriseService.Modules.Count == 0) //用户不能访问任何模块 + { + return new + { + total = 0, + list = new List(), + pageCurrent = pageindex + }; + } + var ids = GetSubIds(parentId); + var query = _authoriseService.Modules.Where(u => parentId == 0 || ids.Contains(u.ParentId)); + + int total = query.Count(); + var modules = query.OrderBy(u=>u.CascadeId).Skip((pageindex - 1)*pagesize).Take(pagesize); + + return new + { + total = total, + list = modules, + pageCurrent = pageindex + }; + } + + public void Delete(int id) + { + var del = _repository.FindSingle(u => u.Id == id); + if (del == null) return; + + _repository.Delete(u => u.CascadeId.Contains(del.CascadeId)); + } + + public void AddOrUpdate(Module model) + { + ChangeModuleCascade(model); + if (model.Id == 0) + { + _repository.Add(model); + } + else + { + _repository.Update(model); + } + } + + #region 用户/角色分配模块 + + /// + /// 加载特定用户的模块 + /// + /// The user unique identifier. + public List LoadForUser(int userId) + { + //用户角色 + var userRoleIds = + _relevanceRepository.Find(u => u.FirstId == userId && u.Key == "UserRole").Select(u => u.SecondId).ToList(); + + //用户角色与自己分配到的模块ID + var moduleIds = + _relevanceRepository.Find( + u => + (u.FirstId == userId && u.Key == "UserModule") || + (u.Key == "RoleModule" && userRoleIds.Contains(u.FirstId))).Select(u => u.SecondId).ToList(); + + //var moduleIds = + // _relevanceRepository.Find(u => u.FirstId == userId && u.Key == "UserModule") + // .Select(u => u.SecondId) + // .ToList(); + if (!moduleIds.Any()) return new List(); + return _repository.Find(u => moduleIds.Contains(u.Id)).ToList(); + } + + /// + /// 加载特定角色的模块 + /// + /// The role unique identifier. + public List LoadForRole(int roleId) + { + var moduleIds = + _relevanceRepository.Find(u => u.FirstId == roleId && u.Key == "RoleModule") + .Select(u => u.SecondId) + .ToList(); + if (!moduleIds.Any()) return new List(); + return _repository.Find(u => moduleIds.Contains(u.Id)).ToList(); + } + + #endregion 用户/角色分配模块 + + #region 私有方法 + + //根据同一级中最大的语义ID + + private int[] GetSubIds(int parentId) + { + if (parentId == 0) return _repository.Find(null).Select(u => u.Id).ToArray(); + var parent = _repository.FindSingle(u => u.Id == parentId); + var orgs = _repository.Find(u => u.CascadeId.Contains(parent.CascadeId)).Select(u => u.Id).ToArray(); + return orgs; + } + + //修改对象的级联ID + private void ChangeModuleCascade(Module module) + { + string cascadeId; + int currentCascadeId = 1; //当前结点的级联节点最后一位 + var sameLevels = _repository.Find(o => o.ParentId == module.ParentId && o.Id != module.Id); + foreach (var obj in sameLevels) + { + int objCascadeId = int.Parse(obj.CascadeId.Split('.').Last()); + if (currentCascadeId <= objCascadeId) currentCascadeId = objCascadeId + 1; + } + + if (module.ParentId != 0) + { + var parentOrg = _repository.FindSingle(o => o.Id == module.ParentId); + if (parentOrg != null) + { + cascadeId = parentOrg.CascadeId + "." + currentCascadeId; + module.ParentName = parentOrg.Name; + } + else + { + throw new Exception("未能找到该组织的父节点信息"); + } + } + else + { + cascadeId = "0." + currentCascadeId; + module.ParentName = "根节点"; + } + + module.CascadeId = cascadeId; + } + + #endregion 私有方法 + } +} \ No newline at end of file