修复模块菜单不受分级控制的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.Collections.Generic;
using System.Linq; using System.Linq;
using System.Web;
using Infrastructure; using Infrastructure;
using OpenAuth.App.ViewModel; using OpenAuth.App.ViewModel;
using OpenAuth.Domain; using OpenAuth.Domain;
using OpenAuth.Domain.Interface; using OpenAuth.Domain.Interface;
using OpenAuth.Domain.Service;
namespace OpenAuth.App namespace OpenAuth.App
{ {
public class ModuleElementManagerApp public class ModuleElementManagerApp
{ {
private readonly IRepository<ModuleElement> _repository; private ModuleEleManService _moduleEleManService;
private IModuleRepository _moduleRepository;
private IRelevanceRepository _relevanceRepository;
public ModuleElementManagerApp(IRepository<ModuleElement> repository, public ModuleElementManagerApp(ModuleEleManService moduleEleManService)
IRelevanceRepository relevanceRepository,
IModuleRepository moduleRepository )
{ {
_repository = repository; _moduleEleManService = moduleEleManService;
_moduleRepository = moduleRepository;
_relevanceRepository = relevanceRepository;
} }
public void AddOrUpdate(ModuleElement model) public void AddOrUpdate(ModuleElement model)
{ {
var newbtn = new ModuleElement(); var newbtn = new ModuleElement();
model.CopyTo(newbtn); model.CopyTo(newbtn);
if (model.Id == 0) _moduleEleManService.AddOrUpdate(newbtn);
{
_repository.Add(newbtn);
}
else
{
_repository.Update(newbtn);
}
} }
public IEnumerable<ModuleElement> LoadByModuleId(int id) public IEnumerable<ModuleElement> LoadByModuleId(int id)
{ {
var modules = _repository.Find(u => u.ModuleId == id).OrderBy(u =>u.Sort); string username = HttpContext.Current.User.Identity.Name;
return modules; return _moduleEleManService.LoadByModuleId(username, id);
} }
/// <summary> /// <summary>
@ -65,56 +54,15 @@ namespace OpenAuth.App
/// 当为UserElement时表示UserId /// 当为UserElement时表示UserId
/// </param> /// </param>
/// <param name="moduleId">模块ID</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处理 string username = HttpContext.Current.User.Identity.Name;
return _moduleEleManService.LoadWithAccess(username, accessType, firstId, moduleId);
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;
} }
public void Delete(ModuleElement[] objs) public void Delete(ModuleElement[] objs)
{ {
var delIds = objs.Select(u => u.Id).ToList(); _moduleEleManService.Delete(objs);
_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);
} }
} }
} }

View File

@ -1,23 +1,18 @@
using Infrastructure; using Infrastructure;
using OpenAuth.App.ViewModel;
using OpenAuth.Domain; using OpenAuth.Domain;
using OpenAuth.Domain.Interface;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Web;
using OpenAuth.Domain.Service;
namespace OpenAuth.App namespace OpenAuth.App
{ {
public class ModuleManagerApp public class ModuleManagerApp
{ {
private IModuleRepository _repository; private ModuleManService _moduleManService;
private IRelevanceRepository _relevanceRepository;
public ModuleManagerApp(IModuleRepository repository, public ModuleManagerApp(ModuleManService moduleManService)
IRelevanceRepository relevanceRepository)
{ {
_repository = repository; _moduleManService = moduleManService;
_relevanceRepository = relevanceRepository;
} }
/// <summary> /// <summary>
@ -25,83 +20,20 @@ namespace OpenAuth.App
/// </summary> /// </summary>
public dynamic Load(int parentId, int pageindex, int pagesize) public dynamic Load(int parentId, int pageindex, int pagesize)
{ {
IEnumerable<Module> Modules; string loginuser = HttpContext.Current.User.Identity.Name;
int total = 0; return _moduleManService.Load(loginuser, parentId, pageindex, pagesize);
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;
} }
public void Delete(int id) public void Delete(int id)
{ {
var del = _repository.FindSingle(u => u.Id == id); _moduleManService.Delete(id);
if (del == null) return;
_repository.Delete(u => u.CascadeId.Contains(del.CascadeId));
} }
public void AddOrUpdate(Module vm) public void AddOrUpdate(Module vm)
{ {
Module model = new Module(); Module model = new Module();
vm.CopyTo(model); //copy一次防止成员为null的情况 vm.CopyTo(model); //copy一次防止成员为null的情况
ChangeModuleCascade(model); _moduleManService.AddOrUpdate(model);
if (model.Id == 0)
{
_repository.Add(model);
}
else
{
_repository.Update(model);
}
} }
#region / #region /
@ -113,34 +45,7 @@ namespace OpenAuth.App
/// <param name="userId">The user unique identifier.</param> /// <param name="userId">The user unique identifier.</param>
public List<Module> LoadForUser(int userId) public List<Module> LoadForUser(int userId)
{ {
//用户角色 return _moduleManService.LoadForUser(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));
} }
/// <summary> /// <summary>
@ -149,72 +54,10 @@ namespace OpenAuth.App
/// <param name="roleId">The role unique identifier.</param> /// <param name="roleId">The role unique identifier.</param>
public List<Module> LoadForRole(int roleId) public List<Module> LoadForRole(int roleId)
{ {
var moduleIds = return _moduleManService.LoadForRole(roleId);
_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));
} }
#endregion / #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
} }
} }

View File

@ -65,6 +65,8 @@
<Compile Include="Resource.cs" /> <Compile Include="Resource.cs" />
<Compile Include="Role.cs" /> <Compile Include="Role.cs" />
<Compile Include="Service\AuthoriseService.cs" /> <Compile Include="Service\AuthoriseService.cs" />
<Compile Include="Service\ModuleEleManService.cs" />
<Compile Include="Service\ModuleManService.cs" />
<Compile Include="Service\ResManagerService.cs" /> <Compile Include="Service\ResManagerService.cs" />
<Compile Include="Service\StockManagerService.cs" /> <Compile Include="Service\StockManagerService.cs" />
<Compile Include="Stock.cs" /> <Compile Include="Stock.cs" />

View File

@ -1,4 +1,4 @@
@charset "utf-8"; @charset "utf-8";
html, body, div, span, applet, object, iframe, html, body, div, span, applet, object, iframe,
p, blockquote, pre, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code, a, abbr, acronym, address, big, cite, code,
@ -341,6 +341,24 @@ td[align=right] input{text-align:right;}
#bjui-taskbar > .taskbarRight:hover{cursor:pointer;} #bjui-taskbar > .taskbarRight:hover{cursor:pointer;}
#bjui-taskbar > .taskbarLeft.disabled:hover, #bjui-taskbar > .taskbarLeft.disabled:hover,
#bjui-taskbar > .taskbarRight.disabled:hover{cursor:default;} #bjui-taskbar > .taskbarRight.disabled:hover{cursor:default;}
/*doc */
.bjui-doc{margin:10px;}
.bjui-doc .page-header{margin-top:0; border-bottom-color:#CCC;}
.bjui-doc ul, ol{margin-left:22px; margin-top:0; margin-bottom:10px;}
.bjui-doc ul{list-style:disc;}
.bjui-doc ol{list-style:decimal;}
.bjui-doc p,
.bjui-doc li,
.bjui-doc code,
.bjui-doc blockquote *{line-height:1.7; font-size:14px;}
.bjui-doc blockquote.point{border-left-color:#FF6600;}
.bjui-doc blockquote {padding:5px 15px; border-top:1px #EEE solid; border-right:1px #EEE solid; border-bottom:1px #EEE solid; border-radius:5px;}
.bjui-doc code.h4{margin:10px 0; font-size:18px; font-weight:500; color:#c7254e;}
.bjui-doc .table{margin-bottom:15px;}
.bjui-doc td{line-height:1.7;}
.bjui-doc .syntaxhighlighter *{font-size:12px !important; line-height:1.5 !important;}
.bjui-doc .bjui-tablefixed .table{margin-bottom:0;}
/* datagrid */ /* datagrid */
.bjui-datagrid{position:relative; overflow:hidden; border-width:1px; border-style:solid; border-color:#ddd; border-radius:5px;} .bjui-datagrid{position:relative; overflow:hidden; border-width:1px; border-style:solid; border-color:#ddd; border-radius:5px;}
.bjui-datagrid .datagrid-title{height:30px; line-height:30px; text-indent:5px; font-weight:bold; border-bottom:1px #ddd solid;} .bjui-datagrid .datagrid-title{height:30px; line-height:30px; text-indent:5px; font-weight:bold; border-bottom:1px #ddd solid;}

View File

@ -16,11 +16,6 @@ namespace OpenAuth.Mvc.Controllers
_app = AutofacExt.GetFromFac<ModuleManagerApp>(); _app = AutofacExt.GetFromFac<ModuleManagerApp>();
} }
public string GetModules(int parentId = 0)
{
return JsonHelper.Instance.Serialize(_app.LoadByParent(parentId));
}
public ActionResult Index() public ActionResult Index()
{ {
var user = AutofacExt.GetFromFac<LoginApp>().GetLoginUser(); var user = AutofacExt.GetFromFac<LoginApp>().GetLoginUser();

View File

@ -149,7 +149,7 @@
<li><a href="https://git.oschina.net/yubaolee/OpenAuth.Net" target="_blank">关于OpenAuth.Net</a></li> <li><a href="https://git.oschina.net/yubaolee/OpenAuth.Net" target="_blank">关于OpenAuth.Net</a></li>
<li class="divider"></li> <li class="divider"></li>
<li><a href="http://www.cnblogs.com/yubaolee" target="_blank">官方博客</a></li> <li><a href="http://www.cnblogs.com/yubaolee" target="_blank">官方博客</a></li>
<li><a href="http://b-jui.com/index_tree.html" target="_blank">友情链接</a></li> <li><a href="http://b-jui.com" target="_blank">友情链接</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>

View File

@ -1,27 +1,14 @@
 @{
@{
Layout = null; Layout = null;
} }
<script type="text/javascript"> <script type="text/javascript">
</script> </script>
<div class="bjui-pageHeader" style="background:#FFF;"> <div class="bjui-pageHeader" style="background:#FFF;">
<div style="padding: 0 15px;"> <div style="padding: 0 15px;">
<h4 style="margin-bottom: 20px;"> <h4 style="margin-bottom: 20px;">
基于经典DDD架构的权限管理系统  基于经典DDD架构的权限管理系统
</h4> </h4>
<div style="margin-top: 22px; padding-left: 6px;">
<div class="alert alert-danger">QQ群484498493</div>
<span style="padding-left: 30px;">官方博客:</span>
<a href="http://www.cnblogs.com/yubaolee/" target="_blank">http://www.cnblogs.com/yubaolee/</a>
</div>
<div class="row" style=" margin-top:10px;">
<div class="col-md-6" style="padding:5px;">
</div>
</div>
</div> </div>
</div> </div>
<div class="bjui-pageContent"> <div class="bjui-pageContent">
@ -29,7 +16,47 @@
<div class="row" style="padding: 0 8px;"> <div class="row" style="padding: 0 8px;">
<div class="col-md-12"> <div class="col-md-12">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"><h3 class="panel-title">项目最新动态>></h3></div> <div class="panel-heading">
<h3 class="panel-title">
社区信息>>
</h3>
</div>
<div class="panel-body bjui-doc" style="padding: 0;">
<ul>
<li>QQ群484498493</li>
<li>官方博客:<a href="http://www.cnblogs.com/yubaolee/" target="_blank">http://www.cnblogs.com/yubaolee/</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div style="margin-top: 5px; margin-right: 300px; overflow: hidden;">
<div class="row" style="padding: 0 8px;">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
本在线演示说明>>
</h3>
</div>
<div class="panel-body bjui-doc" style="padding: 0;">
<ul>
<li>为安全起见,关闭了所有修改请求,如想体验完整功能可搭建本地环境</li>
<li>admin/test两个账号只分配了部分模块/部门,系统完整模块/部门情况请直接在登录界面点击“以开发者账号登陆”</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div style="margin-top: 5px; margin-right: 300px; overflow: hidden;">
<div class="row" style="padding: 0 8px;">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">项目最新动态>></h3>
</div>
<div class="panel-body"> <div class="panel-body">
<iframe width="100%" height="300" class="share_self" frameborder="0" scrolling="no" src="/Home/Git"></iframe> <iframe width="100%" height="300" class="share_self" frameborder="0" scrolling="no" src="/Home/Git"></iframe>
</div> </div>