feature:根据区域获取授权数据

This commit is contained in:
2021-04-27 10:21:25 +08:00
parent d62ca5759b
commit d93ca8b235
18 changed files with 15248 additions and 55 deletions

View File

@@ -303,6 +303,16 @@
验证码缓存 验证码缓存
</summary> </summary>
</member> </member>
<member name="P:Ewide.Core.Entity.SysRoleArea.SysRoleId">
<summary>
角色Id
</summary>
</member>
<member name="P:Ewide.Core.Entity.SysUserArea.SysUserId">
<summary>
用户Id
</summary>
</member>
<member name="T:Ewide.Core.DEntityBase"> <member name="T:Ewide.Core.DEntityBase">
<summary> <summary>
自定义实体基类 自定义实体基类
@@ -1057,6 +1067,11 @@
备注 备注
</summary> </summary>
</member> </member>
<member name="P:Ewide.Core.SysMenu.UnbindParent">
<summary>
不关联上级菜单显示 0标识关联 1表示不需要关联菜单 仅按钮有效
</summary>
</member>
<member name="P:Ewide.Core.SysMenu.Status"> <member name="P:Ewide.Core.SysMenu.Status">
<summary> <summary>
状态(字典 0正常 1停用 2删除 状态(字典 0正常 1停用 2删除
@@ -1267,6 +1282,11 @@
状态(字典 0正常 1停用 2删除 状态(字典 0正常 1停用 2删除
</summary> </summary>
</member> </member>
<member name="P:Ewide.Core.SysOrg.AreaNumber">
<summary>
一对一 一个组织对应一个区域代码
</summary>
</member>
<member name="P:Ewide.Core.SysOrg.SysUsers"> <member name="P:Ewide.Core.SysOrg.SysUsers">
<summary> <summary>
多对多(用户) 多对多(用户)
@@ -1781,6 +1801,16 @@
自定义数据 自定义数据
</summary> </summary>
</member> </member>
<member name="F:Ewide.Core.DataScopeType.AREA_WITH_CHILD">
<summary>
本部门所在区域及以下区域
</summary>
</member>
<member name="F:Ewide.Core.DataScopeType.AREA">
<summary>
本部门所在区域数据 不包括下面区域
</summary>
</member>
<member name="T:Ewide.Core.ErrorCode"> <member name="T:Ewide.Core.ErrorCode">
<summary> <summary>
系统错误码 系统错误码
@@ -2402,6 +2432,11 @@
授权数据 授权数据
</summary> </summary>
</member> </member>
<member name="P:Ewide.Core.XnInputBase.GrantAreaCodeList">
<summary>
授权区域
</summary>
</member>
<member name="T:Ewide.Core.PageInputBase"> <member name="T:Ewide.Core.PageInputBase">
<summary> <summary>
通用分页输入参数 通用分页输入参数
@@ -4849,6 +4884,11 @@
备注 备注
</summary> </summary>
</member> </member>
<member name="P:Ewide.Core.Service.MenuInput.UnbindParent">
<summary>
不绑定上级菜单
</summary>
</member>
<member name="P:Ewide.Core.Service.AddMenuInput.Type"> <member name="P:Ewide.Core.Service.AddMenuInput.Type">
<summary> <summary>
菜单类型(字典 0目录 1菜单 2按钮 菜单类型(字典 0目录 1菜单 2按钮
@@ -5473,6 +5513,21 @@
上一级Id 上一级Id
</summary> </summary>
</member> </member>
<member name="M:Ewide.Core.Service.ISysOrgService.GetAreaDataScopeIdList(System.Int32,System.String)">
<summary>
根据区域信息获取单位id
</summary>
<param name="dataScopeType">代表区域范围的类型</param>
<param name="areaNumberCode">区域代码</param>
<returns></returns>
</member>
<member name="M:Ewide.Core.Service.ISysOrgService.GetAreaDataScopeIdListWithoutChildrenArea(System.String)">
<summary>
当前区域信息不包括子区域
</summary>
<param name="areaNumberCode">区域代码</param>
<returns></returns>
</member>
<member name="T:Ewide.Core.Service.SysOrgService"> <member name="T:Ewide.Core.Service.SysOrgService">
<summary> <summary>
组织机构服务 组织机构服务

View File

@@ -21,6 +21,10 @@ namespace Ewide.Core
/// 授权数据 /// 授权数据
/// </summary> /// </summary>
public virtual List<string> GrantOrgIdList { get; set; } = new List<string>(); public virtual List<string> GrantOrgIdList { get; set; } = new List<string>();
/// <summary>
/// 授权区域
/// </summary>
public virtual List<string> GrantAreaCodeList { get; set; } = new List<string>();
} }
/// <summary> /// <summary>

View File

@@ -0,0 +1,52 @@
using Ewide.Core.Entity;
using Ewide.Core.Service.Area.Dto;
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Mapster;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.Area
{
public class AreaNumberService : IAreaNumberService, ITransient
{
private readonly IRepository<AreaNumber> _areaNumberRep;
private readonly ISysCacheService _sysCacheService;
public AreaNumberService(IRepository<AreaNumber> areaNumberRep, ISysCacheService sysCacheService)
{
_areaNumberRep = areaNumberRep;
_sysCacheService = sysCacheService;
}
public async Task AddAreaNumber(AreaNumberInput input)
{
await _areaNumberRep.InsertAsync(input.Adapt<AreaNumber>());
}
public async Task DeleteAreaNumber(DeleteAreaNumberInput input)
{
var areaNumber= await _areaNumberRep.FirstOrDefaultAsync(p=>p.Code==input.Code);
await areaNumber.DeleteAsync();
}
public async Task<AreaNumber> GetAreaNumber(string code)
{
return await _areaNumberRep.DetachedEntities.FirstOrDefaultAsync(a => a.Code == code);
}
public async Task<List<AreaNumber>> GetAreaNumberWithChildren(string code)
{
return await _areaNumberRep.DetachedEntities.Where(a => a.Code.StartsWith(code)).ToListAsync();
}
public async Task UpdateAreaNumber(AreaNumberInput input)
{
await _areaNumberRep.UpdateAsync(input.Adapt<AreaNumber>());
}
}
}

View File

@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.Area.Dto
{
public class AreaNumberInput
{
public string Code { get; set; }
public string ShowCode { get; set; }
public string Name { get; set; }
public int LevelType { get; set; }
public string Note { get; set; }
public int Sort { get; set; }
}
public class DeleteAreaNumberInput
{
[Required(ErrorMessage ="区域代码不可为空")]
public string Code { get; set; }
}
}

View File

@@ -0,0 +1,19 @@
using Ewide.Core.Entity;
using Ewide.Core.Service.Area.Dto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.Area
{
public interface IAreaNumberService
{
Task AddAreaNumber(AreaNumberInput input);
Task DeleteAreaNumber(DeleteAreaNumberInput input);
Task UpdateAreaNumber(AreaNumberInput input);
Task<AreaNumber> GetAreaNumber(string code);
Task<List<AreaNumber>> GetAreaNumberWithChildren(string code);
}
}

View File

@@ -18,9 +18,10 @@ namespace Ewide.Core.Service
/// <summary> /// <summary>
/// 根据区域信息获取单位id /// 根据区域信息获取单位id
/// </summary> /// </summary>
/// <param name="dataScopeType">代表区域范围的类型</param>
/// <param name="areaNumberCode">区域代码</param> /// <param name="areaNumberCode">区域代码</param>
/// <returns></returns> /// <returns></returns>
Task<List<string>> GetAreaDataScopeIdList(string areaNumberCode); Task<List<string>> GetAreaDataScopeIdList(int dataScopeType,string areaNumberCode);
/// <summary> /// <summary>
/// 当前区域信息不包括子区域 /// 当前区域信息不包括子区域
/// </summary> /// </summary>

View File

@@ -346,11 +346,15 @@ namespace Ewide.Core.Service
return await App.GetService<ISysUserService>().GetUserDataScopeIdList(); return await App.GetService<ISysUserService>().GetUserDataScopeIdList();
} }
public async Task<List<string>> GetAreaDataScopeIdList(string areaNumberCode) public async Task<List<string>> GetAreaDataScopeIdList(int dataScopeType, string orgId)
{ {
return await _sysOrgRep.DetachedEntities.Where(p => p.AreaNumberCode.StartsWith(areaNumberCode)).Select(p=>p.Id).ToListAsync(); var org = await _sysOrgRep.FirstOrDefaultAsync(o => o.Id == orgId);
if (dataScopeType == (int)DataScopeType.AREA_WITH_CHILD)
return await _sysOrgRep.DetachedEntities.Where(p => p.AreaNumberCode.StartsWith(org.Code)).Select(p => p.Id).ToListAsync();
if (dataScopeType == (int)DataScopeType.AREA)
return await _sysOrgRep.DetachedEntities.Where(p => p.AreaNumberCode == org.Code).Select(p => p.Id).ToListAsync();
return new List<string>();
} }
public async Task<List<string>> GetAreaDataScopeIdListWithoutChildrenArea(string areaNumberCode) public async Task<List<string>> GetAreaDataScopeIdListWithoutChildrenArea(string areaNumberCode)
{ {
return await _sysOrgRep.DetachedEntities.Where(p => p.AreaNumberCode == areaNumberCode).Select(p => p.Id).ToListAsync(); return await _sysOrgRep.DetachedEntities.Where(p => p.AreaNumberCode == areaNumberCode).Select(p => p.Id).ToListAsync();

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.Role
{
public interface ISysRoleAreaService
{
Task DeleteRoleAreaListByAreaCodeList(List<string> areaCodeList);
Task DeleteRoleAreaListByRoleId(string roleId);
Task<List<string>> GetRoleAreaCodeList(List<string> roleIdList);
Task GrantArea(UpdateRoleInput input);
}
}

View File

@@ -0,0 +1,65 @@
using Ewide.Core.Entity;
using Ewide.Core.Service.User;
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.Role
{
public class SysRoleAreaServic : ISysRoleAreaService
{
public readonly IRepository<SysRoleArea> _sysRoleAreaRep;
public SysRoleAreaServic(IRepository<SysRoleArea> sysRolleAreaRep)
{
_sysRoleAreaRep = sysRolleAreaRep;
}
public async Task DeleteRoleAreaListByAreaCodeList(List<string> areaCodeList)
{
var dataScopes = await _sysRoleAreaRep.DetachedEntities.Where(u => areaCodeList.Contains(u.AreaNumberCode)).ToListAsync();
dataScopes.ForEach(u =>
{
u.Delete();
});
}
public async Task DeleteRoleAreaListByRoleId(string roleId)
{
var dataScopes = await _sysRoleAreaRep.DetachedEntities.Where(u => roleId==u.SysRoleId).ToListAsync();
dataScopes.ForEach(u =>
{
u.Delete();
});
}
public async Task<List<string>> GetRoleAreaCodeList(List<string> roleIdList)
{
return await _sysRoleAreaRep.DetachedEntities.Where(u => roleIdList.Contains(u.SysRoleId)).Select(u=>u.AreaNumberCode).Distinct().ToListAsync();
}
public async Task GrantArea(UpdateRoleInput input)
{
var dataScopes = await _sysRoleAreaRep.Where(u => u.SysRoleId == input.Id).ToListAsync();
dataScopes.ForEach(u =>
{
u.Delete();
});
input.GrantAreaCodeList.ForEach(u =>
{
new SysRoleArea
{
SysRoleId = input.Id,
AreaNumberCode = u
}.Insert();
});
}
}
}

View File

@@ -243,6 +243,7 @@ namespace Ewide.Core.Service
{ {
// 定义角色中最大数据范围的类型目前按最大范围策略来如果你同时拥有ALL和SELF的权限最后按ALL返回 // 定义角色中最大数据范围的类型目前按最大范围策略来如果你同时拥有ALL和SELF的权限最后按ALL返回
int strongerDataScopeType = (int)DataScopeType.SELF; int strongerDataScopeType = (int)DataScopeType.SELF;
int strongerAreaType = (int)DataScopeType.SELF;
var customDataScopeRoleIdList = new List<string>(); var customDataScopeRoleIdList = new List<string>();
if (roleIdList != null && roleIdList.Count > 0) if (roleIdList != null && roleIdList.Count > 0)
@@ -252,6 +253,10 @@ namespace Ewide.Core.Service
{ {
if (u.DataScopeType == (int)DataScopeType.DEFINE) if (u.DataScopeType == (int)DataScopeType.DEFINE)
customDataScopeRoleIdList.Add(u.Id); customDataScopeRoleIdList.Add(u.Id);
if ((u.DataScopeType == (int)DataScopeType.AREA || u.DataScopeType == (int)DataScopeType.AREA_WITH_CHILD) && strongerAreaType < u.DataScopeType)
{
strongerDataScopeType = u.DataScopeType;
}
else if (u.DataScopeType <= strongerDataScopeType) else if (u.DataScopeType <= strongerDataScopeType)
strongerDataScopeType = u.DataScopeType; strongerDataScopeType = u.DataScopeType;
}); });
@@ -262,8 +267,9 @@ namespace Ewide.Core.Service
// 角色中拥有最大数据范围类型的数据范围 // 角色中拥有最大数据范围类型的数据范围
var dataScopeIdList = await _sysOrgService.GetDataScopeListByDataScopeType(strongerDataScopeType, orgId); var dataScopeIdList = await _sysOrgService.GetDataScopeListByDataScopeType(strongerDataScopeType, orgId);
//角色区域数据范围
return roleDataScopeIdList.Concat(dataScopeIdList).Distinct().ToList(); //并集 var areaOrgIdList = await _sysOrgService.GetAreaDataScopeIdList(strongerAreaType, orgId);
return roleDataScopeIdList.Concat(dataScopeIdList).Concat(areaOrgIdList).Distinct().ToList(); //并集
} }
/// <summary> /// <summary>

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.Role
{
public interface ISysUserAreaService
{
Task DeleteUserAreaListByAreaCodeList(List<string> areaCodeList);
Task DeleteUserAreaListByUserId(string userId);
Task<List<string>> GetUserAreaIdList(string userId);
Task GrantData(UpdateUserInput input);
}
}

View File

@@ -0,0 +1,64 @@
using Ewide.Core.Entity;
using Ewide.Core.Service.Role;
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.User
{
public class SysUserAreaService : ISysUserAreaService
{
public readonly IRepository<SysUserArea> _sysUserAreaRep;
public SysUserAreaService(IRepository<SysUserArea> sysUserAreaRep)
{
_sysUserAreaRep = sysUserAreaRep;
}
public async Task DeleteUserAreaListByAreaCodeList(List<string> areaCodeList)
{
var areaList = await _sysUserAreaRep.DetachedEntities.Where(ua => areaCodeList.Contains(ua.AreaNumberCode)).ToListAsync();
foreach (var area in areaList)
{
area.Delete();
}
}
public async Task DeleteUserAreaListByUserId(string userId)
{
var areaList = await _sysUserAreaRep.DetachedEntities.Where(ua => ua.SysUserId == userId).ToListAsync();
foreach (var area in areaList)
{
area.Delete();
}
}
public async Task<List<string>> GetUserAreaIdList(string userId)
{
return await _sysUserAreaRep.DetachedEntities.Where(ua => ua.SysUserId == userId).Select(ua => ua.AreaNumberCode).ToListAsync();
}
public async Task GrantData(UpdateUserInput input)
{
var dataScopes = await _sysUserAreaRep.Where(u => u.SysUserId == input.Id).ToListAsync();
dataScopes.ForEach(u =>
{
u.Delete();
});
input.GrantAreaCodeList.ForEach(u =>
{
new SysUserArea
{
SysUserId = input.Id,
AreaNumberCode = u
}.Insert();
});
}
}
}

View File

@@ -1,4 +1,5 @@
using Furion.DatabaseAccessor; using Ewide.Core.Entity;
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions; using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection; using Furion.DependencyInjection;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@@ -14,10 +15,13 @@ namespace Ewide.Core.Service
public class SysUserDataScopeService : ISysUserDataScopeService, ITransient public class SysUserDataScopeService : ISysUserDataScopeService, ITransient
{ {
private readonly IRepository<SysUserDataScope> _sysUserDataScopeRep; // 用户数据范围表仓储 private readonly IRepository<SysUserDataScope> _sysUserDataScopeRep; // 用户数据范围表仓储
private readonly IRepository<SysUserArea> _sysUserAreaRep;
public SysUserDataScopeService(IRepository<SysUserDataScope> sysUserDataScopeRep) private readonly ISysOrgService _sysOrgService;
public SysUserDataScopeService(IRepository<SysUserDataScope> sysUserDataScopeRep, IRepository<SysUserArea> sysUserAreaRep, ISysOrgService sysOrgService)
{ {
_sysUserDataScopeRep = sysUserDataScopeRep; _sysUserDataScopeRep = sysUserDataScopeRep;
_sysUserAreaRep = sysUserAreaRep;
_sysOrgService = sysOrgService;
} }
/// <summary> /// <summary>
@@ -51,9 +55,18 @@ namespace Ewide.Core.Service
/// <returns></returns> /// <returns></returns>
public async Task<List<string>> GetUserDataScopeIdList(string userId) public async Task<List<string>> GetUserDataScopeIdList(string userId)
{ {
return await _sysUserDataScopeRep.DetachedEntities var areaList = await _sysUserAreaRep.DetachedEntities.Where(u => u.SysUserId == userId).Select(u => u.AreaNumberCode).ToListAsync();
//用户自定义的区域权限所对应的全部组织机构id
List<string> areaDataScopeIdList = new List<string>();
foreach (var areaNumberCode in areaList)
{
areaDataScopeIdList.AddRange(await _sysOrgService.GetAreaDataScopeIdListWithoutChildrenArea(areaNumberCode));
}
//用户自定义的组织权限
var orgIdList = await _sysUserDataScopeRep.DetachedEntities
.Where(u => u.SysUserId == userId) .Where(u => u.SysUserId == userId)
.Select(u => u.SysOrgId).ToListAsync(); .Select(u => u.SysOrgId).ToListAsync();
return areaDataScopeIdList.Concat(orgIdList).Distinct().ToList();
} }
/// <summary> /// <summary>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,57 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Ewide.Database.Migrations.Migrations
{
public partial class addAreaNumberRelation : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "AreaNumberCode",
table: "sys_org",
type: "varchar(10) CHARACTER SET utf8mb4",
nullable: true,
comment: "组织所在区域代码");
migrationBuilder.AddColumn<int>(
name: "UnbindParent",
table: "sys_menu",
type: "int",
nullable: false,
defaultValue: 0,
comment: "不关联菜单显示");
migrationBuilder.CreateIndex(
name: "IX_sys_org_AreaNumberCode",
table: "sys_org",
column: "AreaNumberCode");
migrationBuilder.AddForeignKey(
name: "FK_sys_org_ewide_area_number_AreaNumberCode",
table: "sys_org",
column: "AreaNumberCode",
principalTable: "ewide_area_number",
principalColumn: "Code",
onDelete: ReferentialAction.Restrict);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_sys_org_ewide_area_number_AreaNumberCode",
table: "sys_org");
migrationBuilder.DropIndex(
name: "IX_sys_org_AreaNumberCode",
table: "sys_org");
migrationBuilder.DropColumn(
name: "AreaNumberCode",
table: "sys_org");
migrationBuilder.DropColumn(
name: "UnbindParent",
table: "sys_menu");
}
}
}