mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2025-08-23 13:06:48 +08:00
修复模块菜单不受分级控制的BUG
This commit is contained in:
parent
fbdd6163a2
commit
38eec363d7
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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 私有方法
|
||||
}
|
||||
}
|
@ -65,6 +65,8 @@
|
||||
<Compile Include="Resource.cs" />
|
||||
<Compile Include="Role.cs" />
|
||||
<Compile Include="Service\AuthoriseService.cs" />
|
||||
<Compile Include="Service\ModuleEleManService.cs" />
|
||||
<Compile Include="Service\ModuleManService.cs" />
|
||||
<Compile Include="Service\ResManagerService.cs" />
|
||||
<Compile Include="Service\StockManagerService.cs" />
|
||||
<Compile Include="Stock.cs" />
|
||||
|
@ -1,4 +1,4 @@
|
||||
@charset "utf-8";
|
||||
@charset "utf-8";
|
||||
html, body, div, span, applet, object, iframe,
|
||||
p, blockquote, pre,
|
||||
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 > .taskbarLeft.disabled:hover,
|
||||
#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 */
|
||||
.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;}
|
||||
|
@ -16,11 +16,6 @@ namespace OpenAuth.Mvc.Controllers
|
||||
_app = AutofacExt.GetFromFac<ModuleManagerApp>();
|
||||
}
|
||||
|
||||
public string GetModules(int parentId = 0)
|
||||
{
|
||||
return JsonHelper.Instance.Serialize(_app.LoadByParent(parentId));
|
||||
}
|
||||
|
||||
public ActionResult Index()
|
||||
{
|
||||
var user = AutofacExt.GetFromFac<LoginApp>().GetLoginUser();
|
||||
|
@ -149,7 +149,7 @@
|
||||
<li><a href="https://git.oschina.net/yubaolee/OpenAuth.Net" target="_blank">关于OpenAuth.Net</a></li>
|
||||
<li class="divider"></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>
|
||||
</li>
|
||||
</ul>
|
||||
|
@ -1,27 +1,14 @@
|
||||
|
||||
@{
|
||||
@{
|
||||
Layout = null;
|
||||
}
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
</script>
|
||||
<div class="bjui-pageHeader" style="background:#FFF;">
|
||||
<div style="padding: 0 15px;">
|
||||
<h4 style="margin-bottom: 20px;">
|
||||
基于经典DDD架构的权限管理系统
|
||||
基于经典DDD架构的权限管理系统
|
||||
</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 class="bjui-pageContent">
|
||||
@ -29,7 +16,47 @@
|
||||
<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-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">
|
||||
<iframe width="100%" height="300" class="share_self" frameborder="0" scrolling="no" src="/Home/Git"></iframe>
|
||||
</div>
|
||||
|
Loading…
Reference in New Issue
Block a user