Merge pull request 'features/area_data_scope 添加根据区域授权用户数据' (#1) from features/area_data_scope into master
Reviewed-on: http://home.bobandjuly.cyou:5100/ewide/ewide_core/pulls/1 ok
This commit is contained in:
@@ -40,5 +40,28 @@ namespace Ewide.Core.Entity
|
|||||||
|
|
||||||
[Comment("排序")]
|
[Comment("排序")]
|
||||||
public int Sort { get; set; }
|
public int Sort { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 多个区域有多个用户绑定自定义数据
|
||||||
|
/// </summary>
|
||||||
|
public ICollection<SysUser> SysUsers { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 中间表
|
||||||
|
/// </summary>
|
||||||
|
public List<SysUserArea> SysUserAreas { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 多个区域有多个角色绑定权限数据
|
||||||
|
/// </summary>
|
||||||
|
public ICollection<SysRole> SysRoles { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 中间表
|
||||||
|
/// </summary>
|
||||||
|
public List<SysRoleArea> SysRoleAreas { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 一个区域有多个组织
|
||||||
|
/// </summary>
|
||||||
|
public ICollection<SysOrg> SysOrgs { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Furion.DatabaseAccessor;
|
using Ewide.Core.Entity;
|
||||||
|
using Furion.DatabaseAccessor;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||||
using System;
|
using System;
|
||||||
@@ -70,6 +71,10 @@ namespace Ewide.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public List<SysRoleDataScope> SysRoleDataScopes { get; set; }
|
public List<SysRoleDataScope> SysRoleDataScopes { get; set; }
|
||||||
|
|
||||||
|
public ICollection<AreaNumber> AreaNumbers { get; set; }
|
||||||
|
|
||||||
|
public List<SysRoleArea> SysRoleAreas { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 多对多(菜单)
|
/// 多对多(菜单)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -97,7 +102,15 @@ namespace Ewide.Core
|
|||||||
{
|
{
|
||||||
u.HasKey(c => new { c.SysRoleId, c.SysOrgId });
|
u.HasKey(c => new { c.SysRoleId, c.SysOrgId });
|
||||||
});
|
});
|
||||||
|
entityBuilder.HasMany(p => p.AreaNumbers)
|
||||||
|
.WithMany(p => p.SysRoles)
|
||||||
|
.UsingEntity<SysRoleArea>(
|
||||||
|
u => u.HasOne(c => c.AreaNumber).WithMany(c => c.SysRoleAreas).HasForeignKey(c => c.AreaNumberCode),
|
||||||
|
u => u.HasOne(c => c.SysRole).WithMany(c => c.SysRoleAreas).HasForeignKey(c => c.SysRoleId),
|
||||||
|
u =>
|
||||||
|
{
|
||||||
|
u.HasKey(c => new { c.SysRoleId, c.AreaNumberCode });
|
||||||
|
});
|
||||||
entityBuilder.HasMany(p => p.SysMenus)
|
entityBuilder.HasMany(p => p.SysMenus)
|
||||||
.WithMany(p => p.SysRoles)
|
.WithMany(p => p.SysRoles)
|
||||||
.UsingEntity<SysRoleMenu>(
|
.UsingEntity<SysRoleMenu>(
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Furion.DatabaseAccessor;
|
using Ewide.Core.Entity;
|
||||||
|
using Furion.DatabaseAccessor;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||||
using System;
|
using System;
|
||||||
@@ -127,6 +128,11 @@ namespace Ewide.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public List<SysUserDataScope> SysUserDataScopes { get; set; }
|
public List<SysUserDataScope> SysUserDataScopes { get; set; }
|
||||||
|
|
||||||
|
public ICollection<AreaNumber> AreaNumbers { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 多对多中间表(用户-区域 数据范围)
|
||||||
|
/// </summary>
|
||||||
|
public List<SysUserArea> SysUserAreas { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 配置多对多关系
|
/// 配置多对多关系
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -150,6 +156,13 @@ namespace Ewide.Core
|
|||||||
{
|
{
|
||||||
u.HasKey(c => new { c.SysUserId, c.SysOrgId });
|
u.HasKey(c => new { c.SysUserId, c.SysOrgId });
|
||||||
});
|
});
|
||||||
|
entityBuilder.HasMany(p => p.AreaNumbers).WithMany(p => p.SysUsers).UsingEntity<SysUserArea>(
|
||||||
|
u => u.HasOne(c => c.AreaNumber).WithMany(c => c.SysUserAreas).HasForeignKey(c => c.AreaNumberCode),
|
||||||
|
u => u.HasOne(c => c.SysUser).WithMany(c => c.SysUserAreas).HasForeignKey(c => c.SysUserId),
|
||||||
|
u =>
|
||||||
|
{
|
||||||
|
u.HasKey(c => new { c.SysUserId, c.AreaNumberCode });
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -303,6 +303,41 @@
|
|||||||
验证码缓存
|
验证码缓存
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:Ewide.Core.Entity.AreaNumber.SysUsers">
|
||||||
|
<summary>
|
||||||
|
多个区域有多个用户绑定自定义数据
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Ewide.Core.Entity.AreaNumber.SysUserAreas">
|
||||||
|
<summary>
|
||||||
|
中间表
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Ewide.Core.Entity.AreaNumber.SysRoles">
|
||||||
|
<summary>
|
||||||
|
多个区域有多个角色绑定权限数据
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Ewide.Core.Entity.AreaNumber.SysRoleAreas">
|
||||||
|
<summary>
|
||||||
|
中间表
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Ewide.Core.Entity.AreaNumber.SysOrgs">
|
||||||
|
<summary>
|
||||||
|
一个区域有多个组织
|
||||||
|
</summary>
|
||||||
|
</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 +1092,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 +1307,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>
|
||||||
多对多(用户)
|
多对多(用户)
|
||||||
@@ -1663,6 +1708,11 @@
|
|||||||
多对多中间表(用户-机构 数据范围)
|
多对多中间表(用户-机构 数据范围)
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:Ewide.Core.SysUser.SysUserAreas">
|
||||||
|
<summary>
|
||||||
|
多对多中间表(用户-区域 数据范围)
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="M:Ewide.Core.SysUser.Configure(Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder{Ewide.Core.SysUser},Microsoft.EntityFrameworkCore.DbContext,System.Type)">
|
<member name="M:Ewide.Core.SysUser.Configure(Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder{Ewide.Core.SysUser},Microsoft.EntityFrameworkCore.DbContext,System.Type)">
|
||||||
<summary>
|
<summary>
|
||||||
配置多对多关系
|
配置多对多关系
|
||||||
@@ -1781,6 +1831,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 +2462,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 +4914,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 +5543,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>
|
||||||
组织机构服务
|
组织机构服务
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
52
Api/Ewide.Core/Service/Area/AreaNumberService.cs
Normal file
52
Api/Ewide.Core/Service/Area/AreaNumberService.cs
Normal 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>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
24
Api/Ewide.Core/Service/Area/Dto/AreaNumberInput.cs
Normal file
24
Api/Ewide.Core/Service/Area/Dto/AreaNumberInput.cs
Normal 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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
19
Api/Ewide.Core/Service/Area/IAreaNumberService.cs
Normal file
19
Api/Ewide.Core/Service/Area/IAreaNumberService.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
16
Api/Ewide.Core/Service/Role/ISysRoleAreaService.cs
Normal file
16
Api/Ewide.Core/Service/Role/ISysRoleAreaService.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
66
Api/Ewide.Core/Service/Role/SysRoleAreaService.cs
Normal file
66
Api/Ewide.Core/Service/Role/SysRoleAreaService.cs
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
using Ewide.Core.Entity;
|
||||||
|
using Ewide.Core.Service.User;
|
||||||
|
using Furion.DatabaseAccessor;
|
||||||
|
using Furion.DatabaseAccessor.Extensions;
|
||||||
|
using Furion.DependencyInjection;
|
||||||
|
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 SysRoleAreaService : ISysRoleAreaService,ITransient
|
||||||
|
{
|
||||||
|
public readonly IRepository<SysRoleArea> _sysRoleAreaRep;
|
||||||
|
|
||||||
|
public SysRoleAreaService(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();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
|
|||||||
16
Api/Ewide.Core/Service/User/ISysUserAreaService.cs
Normal file
16
Api/Ewide.Core/Service/User/ISysUserAreaService.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
65
Api/Ewide.Core/Service/User/SysUserAreaService.cs
Normal file
65
Api/Ewide.Core/Service/User/SysUserAreaService.cs
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
using Ewide.Core.Entity;
|
||||||
|
using Ewide.Core.Service.Role;
|
||||||
|
using Furion.DatabaseAccessor;
|
||||||
|
using Furion.DatabaseAccessor.Extensions;
|
||||||
|
using Furion.DependencyInjection;
|
||||||
|
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,ITransient
|
||||||
|
{
|
||||||
|
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();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 IRepository<SysOrg> _sysOrgRep;
|
||||||
|
public SysUserDataScopeService(IRepository<SysUserDataScope> sysUserDataScopeRep, IRepository<SysUserArea> sysUserAreaRep, IRepository<SysOrg> sysOrgRep)
|
||||||
{
|
{
|
||||||
_sysUserDataScopeRep = sysUserDataScopeRep;
|
_sysUserDataScopeRep = sysUserDataScopeRep;
|
||||||
|
_sysUserAreaRep = sysUserAreaRep;
|
||||||
|
_sysOrgRep = sysOrgRep;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <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 _sysOrgRep.DetachedEntities.Where(p => p.AreaNumberCode == areaNumberCode).Select(p => p.Id).ToListAsync());
|
||||||
|
}
|
||||||
|
//用户自定义的组织权限
|
||||||
|
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>
|
||||||
|
|||||||
6725
Api/Ewide.Database.Migrations/Migrations/20210425081820_areaNumber.Designer.cs
generated
Normal file
6725
Api/Ewide.Database.Migrations/Migrations/20210425081820_areaNumber.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
6896
Api/Ewide.Database.Migrations/Migrations/20210426050618_addAreaNumberRelation.Designer.cs
generated
Normal file
6896
Api/Ewide.Database.Migrations/Migrations/20210426050618_addAreaNumberRelation.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
6991
Api/Ewide.Database.Migrations/Migrations/20210427031943_areaCodemanytomany.Designer.cs
generated
Normal file
6991
Api/Ewide.Database.Migrations/Migrations/20210427031943_areaCodemanytomany.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,79 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
namespace Ewide.Database.Migrations.Migrations
|
||||||
|
{
|
||||||
|
public partial class areaCodemanytomany : Migration
|
||||||
|
{
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "sys_role_area",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
SysRoleId = table.Column<string>(type: "varchar(36)", nullable: false, comment: "角色Id"),
|
||||||
|
AreaNumberCode = table.Column<string>(type: "varchar(10) CHARACTER SET utf8mb4", maxLength: 10, nullable: false, comment: "系统使用的区域代码")
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_sys_role_area", x => new { x.SysRoleId, x.AreaNumberCode });
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_sys_role_area_ewide_area_number_AreaNumberCode",
|
||||||
|
column: x => x.AreaNumberCode,
|
||||||
|
principalTable: "ewide_area_number",
|
||||||
|
principalColumn: "Code",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_sys_role_area_sys_role_SysRoleId",
|
||||||
|
column: x => x.SysRoleId,
|
||||||
|
principalTable: "sys_role",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
},
|
||||||
|
comment: "角色区域自定义数据");
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "sys_user_area",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
SysUserId = table.Column<string>(type: "varchar(36)", nullable: false, comment: "用户Id"),
|
||||||
|
AreaNumberCode = table.Column<string>(type: "varchar(10) CHARACTER SET utf8mb4", maxLength: 10, nullable: false, comment: "系统使用的区域代码")
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_sys_user_area", x => new { x.SysUserId, x.AreaNumberCode });
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_sys_user_area_ewide_area_number_AreaNumberCode",
|
||||||
|
column: x => x.AreaNumberCode,
|
||||||
|
principalTable: "ewide_area_number",
|
||||||
|
principalColumn: "Code",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_sys_user_area_sys_user_SysUserId",
|
||||||
|
column: x => x.SysUserId,
|
||||||
|
principalTable: "sys_user",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
},
|
||||||
|
comment: "用户授权区域信息");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_sys_role_area_AreaNumberCode",
|
||||||
|
table: "sys_role_area",
|
||||||
|
column: "AreaNumberCode");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_sys_user_area_AreaNumberCode",
|
||||||
|
table: "sys_user_area",
|
||||||
|
column: "AreaNumberCode");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "sys_role_area");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "sys_user_area");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user