修复模块菜单不受分级控制的BUG

This commit is contained in:
yubaolee
2016-05-27 12:39:14 +08:00
parent fbdd6163a2
commit 38eec363d7
7 changed files with 91 additions and 258 deletions

View File

@@ -14,46 +14,35 @@
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Infrastructure;
using OpenAuth.App.ViewModel;
using OpenAuth.Domain;
using OpenAuth.Domain.Interface;
using OpenAuth.Domain.Service;
namespace OpenAuth.App
{
public class ModuleElementManagerApp
{
private readonly IRepository<ModuleElement> _repository;
private IModuleRepository _moduleRepository;
private IRelevanceRepository _relevanceRepository;
private ModuleEleManService _moduleEleManService;
public ModuleElementManagerApp(IRepository<ModuleElement> repository,
IRelevanceRepository relevanceRepository,
IModuleRepository moduleRepository )
public ModuleElementManagerApp(ModuleEleManService moduleEleManService)
{
_repository = repository;
_moduleRepository = moduleRepository;
_relevanceRepository = relevanceRepository;
_moduleEleManService = moduleEleManService;
}
public void AddOrUpdate(ModuleElement model)
{
var newbtn = new ModuleElement();
model.CopyTo(newbtn);
if (model.Id == 0)
{
_repository.Add(newbtn);
}
else
{
_repository.Update(newbtn);
}
_moduleEleManService.AddOrUpdate(newbtn);
}
public IEnumerable<ModuleElement> LoadByModuleId(int id)
{
var modules = _repository.Find(u => u.ModuleId == id).OrderBy(u =>u.Sort);
return modules;
string username = HttpContext.Current.User.Identity.Name;
return _moduleEleManService.LoadByModuleId(username, id);
}
/// <summary>
@@ -65,56 +54,15 @@ namespace OpenAuth.App
/// 当为UserElement时表示UserId
/// </param>
/// <param name="moduleId">模块ID</param>
public List<ModuleElementVM> LoadWithAccess(string accessType, int firstId, int moduleId)
public List<dynamic> LoadWithAccess(string accessType, int firstId, int moduleId)
{
//TODO:多个Repository使用的是不同的Context不能进行联表查询要用UnitOfWork处理
var listVms = new List<ModuleElementVM>();
if (moduleId == 0) return listVms;
string modulename = _moduleRepository.FindSingle(u => u.Id == moduleId).Name;
foreach (var element in LoadByModuleId(moduleId))
{
var accessed = _relevanceRepository.FindSingle(u =>u.Key == accessType
&& u.FirstId == firstId && u.SecondId == element.Id);
ModuleElementVM vm = new ModuleElementVM
{
Id = element.Id,
Name = element.Name,
ModuleId = element.ModuleId,
DomId = element.DomId,
ModuleName = modulename,
Accessed = accessed != null
};
listVms.Add(vm);
}
return listVms;
string username = HttpContext.Current.User.Identity.Name;
return _moduleEleManService.LoadWithAccess(username, accessType, firstId, moduleId);
}
public void Delete(ModuleElement[] objs)
{
var delIds = objs.Select(u => u.Id).ToList();
_repository.Delete(u =>delIds.Contains(u.Id));
}
public void AssignForRole(int roleId, int[] menuIds)
{
_relevanceRepository.AddRelevance("RoleElement", menuIds.ToLookup(u => roleId));
}
public void CancelForRole(int roleId, int[] ids)
{
_relevanceRepository.Delete(u => ids.Contains(u.SecondId) && u.Key == "RoleElement" && u.FirstId == roleId);
}
public void AssignForUser(int userId, int[] ids)
{
_relevanceRepository.AddRelevance("UserElement", ids.ToLookup(u => userId));
}
public void CancelForUser(int userId, int[] ids)
{
_relevanceRepository.Delete(u => ids.Contains(u.SecondId) && u.Key == "UserElement" && u.FirstId == userId);
_moduleEleManService.Delete(objs);
}
}
}

View File

@@ -1,23 +1,18 @@
using Infrastructure;
using OpenAuth.App.ViewModel;
using OpenAuth.Domain;
using OpenAuth.Domain.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using OpenAuth.Domain.Service;
namespace OpenAuth.App
{
public class ModuleManagerApp
{
private IModuleRepository _repository;
private IRelevanceRepository _relevanceRepository;
private ModuleManService _moduleManService;
public ModuleManagerApp(IModuleRepository repository,
IRelevanceRepository relevanceRepository)
public ModuleManagerApp(ModuleManService moduleManService)
{
_repository = repository;
_relevanceRepository = relevanceRepository;
_moduleManService = moduleManService;
}
/// <summary>
@@ -25,83 +20,20 @@ namespace OpenAuth.App
/// </summary>
public dynamic Load(int parentId, int pageindex, int pagesize)
{
IEnumerable<Module> Modules;
int total = 0;
if (parentId == 0)
{
Modules = _repository.LoadModules(pageindex, pagesize);
total = _repository.GetCount();
}
else
{
var ids = GetSubOrgIds(parentId);
Modules = _repository.LoadInOrgs(pageindex, pagesize, ids);
total = _repository.GetModuleCntInOrgs(ids);
}
return new
{
total = total,
list = Modules,
pageCurrent = pageindex
};
}
/// <summary>
/// 为树型结构提供数据
/// </summary>
public List<Module> LoadForTree()
{
return _repository.Find(null).ToList();
}
/// <summary>
/// 以组合的方式显示所有的模块信息
/// </summary>
/// <param name="parentId">The parent unique identifier.</param>
/// <returns>List{ModuleView}.</returns>
public List<ModuleView> LoadByParent(int parentId)
{
var modules = new List<ModuleView>();
var roots = _repository.Find(u => u.ParentId == parentId);
foreach (var module in roots)
{
ModuleView mv = module;
mv.Childern = LoadByParent(module.Id);
modules.Add(mv);
}
return modules;
}
public Module Find(int id)
{
var module = _repository.FindSingle(u => u.Id == id);
if (module == null) return new Module();
return module;
string loginuser = HttpContext.Current.User.Identity.Name;
return _moduleManService.Load(loginuser, parentId, pageindex, pagesize);
}
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));
_moduleManService.Delete(id);
}
public void AddOrUpdate(Module vm)
{
Module model = new Module();
vm.CopyTo(model); //copy一次防止成员为null的情况
ChangeModuleCascade(model);
if (model.Id == 0)
{
_repository.Add(model);
}
else
{
_repository.Update(model);
}
_moduleManService.AddOrUpdate(model);
}
#region /
@@ -113,34 +45,7 @@ namespace OpenAuth.App
/// <param name="userId">The user unique identifier.</param>
public List<Module> 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<Module>();
return _repository.Find(u => moduleIds.Contains(u.Id)).ToList();
}
/// <summary>
/// 为特定的用户分配模块
/// </summary>
/// <param name="userId">The user unique identifier.</param>
/// <param name="ids">模块ID</param>
public void AssignModuleForUser(int userId, int[] ids)
{
_relevanceRepository.DeleteBy("UserModule", userId);
_relevanceRepository.AddRelevance("UserModule", ids.ToLookup(u => userId));
return _moduleManService.LoadForUser(userId);
}
/// <summary>
@@ -149,72 +54,10 @@ namespace OpenAuth.App
/// <param name="roleId">The role unique identifier.</param>
public List<Module> 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<Module>();
return _repository.Find(u => moduleIds.Contains(u.Id)).ToList();
}
/// <summary>
/// 为特定的角色分配模块
/// </summary>
/// <param name="roleId">The user unique identifier.</param>
/// <param name="ids">模块ID</param>
public void AssignModuleForRole(int roleId, int[] ids)
{
_relevanceRepository.DeleteBy("RoleModule", roleId);
_relevanceRepository.AddRelevance("RoleModule", ids.ToLookup(u => roleId));
return _moduleManService.LoadForRole(roleId);
}
#endregion /
#region
//根据同一级中最大的语义ID
private int[] GetSubOrgIds(int parentId)
{
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
}
}