mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2025-11-09 02:44:44 +08:00
修正因合并多对多映射造成的BUG
This commit is contained in:
@@ -1,10 +1,10 @@
|
|||||||
|
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 System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Infrastructure;
|
|
||||||
|
|
||||||
namespace OpenAuth.App
|
namespace OpenAuth.App
|
||||||
{
|
{
|
||||||
@@ -51,13 +51,7 @@ namespace OpenAuth.App
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public List<Module> LoadForTree()
|
public List<Module> LoadForTree()
|
||||||
{
|
{
|
||||||
return _repository.Find(null).ToList();
|
return _repository.Find(null).ToList();
|
||||||
}
|
|
||||||
public List<Module> LoadForUser(int userId)
|
|
||||||
{
|
|
||||||
var moduleIds = _relevanceRepository.Find(u => u.FirstId == userId).Select(u => u.SecondId).ToList();
|
|
||||||
if(!moduleIds.Any()) return null;
|
|
||||||
return _repository.Find(u => moduleIds.Contains(u.Id)).ToList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Module> LoadForNav()
|
public List<Module> LoadForNav()
|
||||||
@@ -114,12 +108,60 @@ namespace OpenAuth.App
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AccessModules(int userId, int[] ids)
|
#region 用户/角色分配模块
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载特定用户的模块
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="userId">The user unique identifier.</param>
|
||||||
|
public List<Module> LoadForUser(int userId)
|
||||||
{
|
{
|
||||||
_relevanceRepository.DeleteBy("UserModule",userId);
|
var moduleIds =
|
||||||
_relevanceRepository.AddRelevance("UserModule",ids.ToDictionary(u =>userId));
|
_relevanceRepository.Find(u => u.FirstId == userId && u.Key == "UserModule")
|
||||||
|
.Select(u => u.SecondId)
|
||||||
|
.ToList();
|
||||||
|
if (!moduleIds.Any()) return null;
|
||||||
|
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>
|
||||||
|
/// <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 null;
|
||||||
|
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 用户/角色分配模块
|
||||||
|
|
||||||
#region 私有方法
|
#region 私有方法
|
||||||
|
|
||||||
//根据同一级中最大的语义ID
|
//根据同一级中最大的语义ID
|
||||||
@@ -166,7 +208,5 @@ namespace OpenAuth.App
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion 私有方法
|
#endregion 私有方法
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,6 @@ using OpenAuth.Domain.Interface;
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Web.Security;
|
|
||||||
|
|
||||||
namespace OpenAuth.App
|
namespace OpenAuth.App
|
||||||
{
|
{
|
||||||
@@ -53,7 +52,6 @@ namespace OpenAuth.App
|
|||||||
total = _repository.GetRoleCntInOrgs(orgId);
|
total = _repository.GetRoleCntInOrgs(orgId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return new
|
return new
|
||||||
{
|
{
|
||||||
total = total,
|
total = total,
|
||||||
@@ -77,7 +75,6 @@ namespace OpenAuth.App
|
|||||||
var role = _repository.FindSingle(u => u.Id == id);
|
var role = _repository.FindSingle(u => u.Id == id);
|
||||||
if (role == null) role = new Role();
|
if (role == null) role = new Role();
|
||||||
return role;
|
return role;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Delete(int id)
|
public void Delete(int id)
|
||||||
@@ -96,10 +93,8 @@ namespace OpenAuth.App
|
|||||||
{
|
{
|
||||||
_repository.Update(role);
|
_repository.Update(role);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public List<RoleVM> LoadWithUser(int userId)
|
public List<RoleVM> LoadWithUser(int userId)
|
||||||
{
|
{
|
||||||
var roleIds = _repository.Find(null).ToList();
|
var roleIds = _repository.Find(null).ToList();
|
||||||
@@ -109,8 +104,8 @@ namespace OpenAuth.App
|
|||||||
RoleVM rolevm = role;
|
RoleVM rolevm = role;
|
||||||
rolevm.IsBelongUser = (_relevanceRepository.FindSingle(u => u.SecondId == role.Id
|
rolevm.IsBelongUser = (_relevanceRepository.FindSingle(u => u.SecondId == role.Id
|
||||||
&& u.FirstId == userId
|
&& u.FirstId == userId
|
||||||
&& u.Key =="UserRole")
|
&& u.Key == "UserRole")
|
||||||
!=null);
|
!= null);
|
||||||
rolevms.Add(rolevm);
|
rolevms.Add(rolevm);
|
||||||
}
|
}
|
||||||
return rolevms;
|
return rolevms;
|
||||||
@@ -120,7 +115,7 @@ namespace OpenAuth.App
|
|||||||
{
|
{
|
||||||
_relevanceRepository.DeleteBy("UserRole", userId);
|
_relevanceRepository.DeleteBy("UserRole", userId);
|
||||||
|
|
||||||
_relevanceRepository.AddRelevance("UserRole",roleIds.ToDictionary(roleId => userId));
|
_relevanceRepository.AddRelevance("UserRole", roleIds.ToLookup(roleId => userId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -116,7 +116,7 @@ namespace OpenAuth.App
|
|||||||
int[] orgIds = view.OrganizationIds.Split(',').Select(id => int.Parse(id)).ToArray();
|
int[] orgIds = view.OrganizationIds.Split(',').Select(id => int.Parse(id)).ToArray();
|
||||||
|
|
||||||
_relevanceRepository.DeleteBy("UserOrg", user.Id);
|
_relevanceRepository.DeleteBy("UserOrg", user.Id);
|
||||||
_relevanceRepository.AddRelevance("UserOrg", orgIds.ToDictionary(u =>user.Id));
|
_relevanceRepository.AddRelevance("UserOrg", orgIds.ToLookup(u =>user.Id));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,12 +24,19 @@ namespace OpenAuth.Mvc.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
//用于选择模块时使用
|
//用于选择模块时使用
|
||||||
public ActionResult LookUpMulti(int userId)
|
public ActionResult LookUpMultiForUser(int userId)
|
||||||
{
|
{
|
||||||
ViewBag.UserId = userId;
|
ViewBag.UserId = userId;
|
||||||
return View();
|
return View();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//为角色分配模块
|
||||||
|
public ActionResult LookupMultiForRole(int roleId)
|
||||||
|
{
|
||||||
|
ViewBag.RoleId = roleId;
|
||||||
|
return View();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 加载模块下面的所有模块
|
/// 加载模块下面的所有模块
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -87,12 +94,42 @@ namespace OpenAuth.Mvc.Controllers
|
|||||||
return JsonHelper.Instance.Serialize(orgs);
|
return JsonHelper.Instance.Serialize(orgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string AccessModule(int userId, string moduleIds)
|
public string LoadForRole(int roleId)
|
||||||
|
{
|
||||||
|
var orgs = _app.LoadForRole(roleId);
|
||||||
|
//添加根节点
|
||||||
|
orgs.Add(new Module
|
||||||
|
{
|
||||||
|
Id = 0,
|
||||||
|
ParentId = -1,
|
||||||
|
Name = "已为角色分配的模块",
|
||||||
|
CascadeId = "0"
|
||||||
|
});
|
||||||
|
return JsonHelper.Instance.Serialize(orgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string AssignModuleForRole(int roleId, string moduleIds)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var ids = moduleIds.Split(',').Select(id => int.Parse(id)).ToArray();
|
var ids = moduleIds.Split(',').Select(id => int.Parse(id)).ToArray();
|
||||||
_app.AccessModules(userId, ids);
|
_app.AssignModuleForRole(roleId, ids);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
BjuiResponse.message = e.Message;
|
||||||
|
BjuiResponse.statusCode = "300";
|
||||||
|
}
|
||||||
|
|
||||||
|
return JsonHelper.Instance.Serialize(BjuiResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string AssignModuleForUser(int userId, string moduleIds)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var ids = moduleIds.Split(',').Select(id => int.Parse(id)).ToArray();
|
||||||
|
_app.AssignModuleForUser(userId, ids);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -617,7 +617,8 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Include="Views\ModuleManager\Index.cshtml" />
|
<Content Include="Views\ModuleManager\Index.cshtml" />
|
||||||
<Content Include="Views\ModuleManager\Add.cshtml" />
|
<Content Include="Views\ModuleManager\Add.cshtml" />
|
||||||
<Content Include="Views\ModuleManager\LookupMulti.cshtml" />
|
<Content Include="Views\ModuleManager\LookupMultiForUser.cshtml" />
|
||||||
|
<Content Include="Views\ModuleManager\LookupMultiForRole.cshtml" />
|
||||||
<None Include="Views\OrgManager\AddOrg.cshtml" />
|
<None Include="Views\OrgManager\AddOrg.cshtml" />
|
||||||
<Content Include="Views\OrgManager\LookupParent.cshtml" />
|
<Content Include="Views\OrgManager\LookupParent.cshtml" />
|
||||||
<Content Include="Views\UserManager\Index.cshtml" />
|
<Content Include="Views\UserManager\Index.cshtml" />
|
||||||
|
|||||||
@@ -8,9 +8,7 @@
|
|||||||
<form action="/ModuleManager/Add" class="pageForm" data-toggle="validate">
|
<form action="/ModuleManager/Add" class="pageForm" data-toggle="validate">
|
||||||
<table class="table table-condensed table-hover">
|
<table class="table table-condensed table-hover">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
|
||||||
<td align="center"><h3>* 添加</h3></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
@Html.HiddenFor(m => m.Id)
|
@Html.HiddenFor(m => m.Id)
|
||||||
|
|||||||
@@ -89,7 +89,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function save() {
|
function save() {
|
||||||
$.post('ModuleManager/AccessModule', { userId: $('#userId').val(), moduleIds: moduleIds },
|
$.post('ModuleManager/AssignModuleForUser', { userId: $('#userId').val(), moduleIds: moduleIds },
|
||||||
function (json) {
|
function (json) {
|
||||||
var rel = $.parseJSON(json);
|
var rel = $.parseJSON(json);
|
||||||
if (rel.statusCode == "200") {
|
if (rel.statusCode == "200") {
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
|
@{
|
||||||
@{
|
|
||||||
ViewBag.Title = "title";
|
ViewBag.Title = "title";
|
||||||
Layout = null;
|
Layout = null;
|
||||||
}
|
}
|
||||||
@@ -8,26 +7,21 @@
|
|||||||
<form action="/OrgManager/AddOrg" class="pageForm" data-toggle="validate">
|
<form action="/OrgManager/AddOrg" class="pageForm" data-toggle="validate">
|
||||||
<table class="table table-condensed table-hover">
|
<table class="table table-condensed table-hover">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
|
||||||
<td align="center"><h3>* 添加</h3></td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<label for="Name" class="control-label x90">机构名称:</label>
|
<label for="Name" class="control-label x90">机构名称:</label>
|
||||||
<input type="text" name="Name" id="Name" value=""
|
<input type="text" name="Name" id="Name" value=""
|
||||||
data-rule="required" size="20">
|
data-rule="required" size="20">
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<input id="ParentId" name="ParentId" type="hidden">
|
<input id="ParentId" name="ParentId" type="hidden">
|
||||||
<label for="ParentName" class="control-label x90">上级机构:</label>
|
<label for="ParentName" class="control-label x90">上级机构:</label>
|
||||||
<input type="text" name="ParentName" id="ParentName" data-toggle="selectztree" size="20" data-tree="#j_select_tree1">
|
<input type="text" name="ParentName" id="ParentName" data-toggle="selectztree" size="20" data-tree="#j_select_tree1">
|
||||||
<ul id="j_select_tree1" class="ztree hide" data-toggle="ztree"></ul>
|
<ul id="j_select_tree1" class="ztree hide" data-toggle="ztree"></ul>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
@@ -37,7 +31,6 @@
|
|||||||
<option value="0">正常</option>
|
<option value="0">正常</option>
|
||||||
<option value="1">禁用</option>
|
<option value="1">禁用</option>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -51,7 +44,6 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
Init();
|
Init();
|
||||||
|
|||||||
@@ -8,9 +8,7 @@
|
|||||||
<form action="/RoleManager/Add" class="pageForm" data-toggle="validate">
|
<form action="/RoleManager/Add" class="pageForm" data-toggle="validate">
|
||||||
<table class="table table-condensed table-hover">
|
<table class="table table-condensed table-hover">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
|
||||||
<td align="center"><h3>* 添加</h3></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
@Html.HiddenFor(m => m.Id)
|
@Html.HiddenFor(m => m.Id)
|
||||||
|
|||||||
@@ -36,7 +36,8 @@
|
|||||||
toolbarItem: 'refresh, |, del',
|
toolbarItem: 'refresh, |, del',
|
||||||
toolbarCustom: '<a href="/RoleManager/Add" class="btn btn-green" data-icon ="plus" ' +
|
toolbarCustom: '<a href="/RoleManager/Add" class="btn btn-green" data-icon ="plus" ' +
|
||||||
'data-toggle="dialog" data-id="dialog-mask" data-mask="true" data-on-close="refreshGrid">添加</a>' +
|
'data-toggle="dialog" data-id="dialog-mask" data-mask="true" data-on-close="refreshGrid">添加</a>' +
|
||||||
'<button class=" btn-green" onclick="editRole()" data-icon="pencil" type="button">编辑</button>',
|
'<button class=" btn-green" onclick="editRole()" data-icon="pencil" type="button">编辑</button>'+
|
||||||
|
'<button type="button" class="btn btn-green" onclick="openModuleAccess(this)">角色模块</button>',
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
name: 'Id',
|
name: 'Id',
|
||||||
@@ -174,5 +175,22 @@
|
|||||||
$('#@_gridId').datagrid('refresh');
|
$('#@_gridId').datagrid('refresh');
|
||||||
// loadDataGrid();
|
// loadDataGrid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//用户模块授权按钮
|
||||||
|
function openModuleAccess(obj) {
|
||||||
|
|
||||||
|
var selected = getSelected(2);
|
||||||
|
if (selected == null) return;
|
||||||
|
|
||||||
|
$(obj).dialog({
|
||||||
|
id: 'accessRoleModule',
|
||||||
|
url: '/ModuleManager/LookupMultiForRole',
|
||||||
|
title: '为角色分配模块',
|
||||||
|
data: {
|
||||||
|
roleid: selected
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
//@@ sourceURL=RoleManagerIndex.js
|
//@@ sourceURL=RoleManagerIndex.js
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -8,9 +8,7 @@
|
|||||||
<form action="/UserManager/Add" class="pageForm" data-toggle="validate">
|
<form action="/UserManager/Add" class="pageForm" data-toggle="validate">
|
||||||
<table class="table table-condensed table-hover">
|
<table class="table table-condensed table-hover">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
|
||||||
<td align="center"><h3>* 添加</h3></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
@Html.HiddenFor(m =>m.CreateTime)
|
@Html.HiddenFor(m =>m.CreateTime)
|
||||||
|
|||||||
@@ -185,7 +185,7 @@
|
|||||||
|
|
||||||
$(obj).dialog({
|
$(obj).dialog({
|
||||||
id: 'accessUserModule',
|
id: 'accessUserModule',
|
||||||
url: '/ModuleManager/LookupMulti',
|
url: '/ModuleManager/LookupMultiForUser',
|
||||||
title: '为用户分配模块',
|
title: '为用户分配模块',
|
||||||
data: {
|
data: {
|
||||||
userId: selected
|
userId: selected
|
||||||
|
|||||||
@@ -1,32 +1,31 @@
|
|||||||
using System;
|
using OpenAuth.Domain;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using OpenAuth.Domain;
|
|
||||||
using OpenAuth.Domain.Interface;
|
using OpenAuth.Domain.Interface;
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace OpenAuth.Repository
|
namespace OpenAuth.Repository
|
||||||
{
|
{
|
||||||
public class RelevanceRepository :BaseRepository<Relevance>, IRelevanceRepository
|
public class RelevanceRepository : BaseRepository<Relevance>, IRelevanceRepository
|
||||||
{
|
{
|
||||||
|
public void DeleteBy(string key, params int[] firstIds)
|
||||||
public void DeleteBy(string key,params int[] firstIds)
|
|
||||||
{
|
{
|
||||||
Delete(u => firstIds.Contains(u.FirstId) && u.Key == key);
|
Delete(u => firstIds.Contains(u.FirstId) && u.Key == key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddRelevance(string key, Dictionary<int, int> ids)
|
public void AddRelevance(string key, ILookup<int, int> idMaps)
|
||||||
{
|
{
|
||||||
foreach (var roleid in ids)
|
foreach (var sameVals in idMaps)
|
||||||
{
|
{
|
||||||
Add(new Relevance
|
foreach (var value in sameVals)
|
||||||
{
|
{
|
||||||
Key = key,
|
Add(new Relevance
|
||||||
FirstId = roleid.Key,
|
{
|
||||||
SecondId = roleid.Value,
|
Key = key,
|
||||||
OperateTime = DateTime.Now
|
FirstId = sameVals.Key,
|
||||||
});
|
SecondId = value,
|
||||||
|
OperateTime = DateTime.Now
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Save();
|
Save();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user