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