😎调整按钮权限分配与接口黑名单模式

This commit is contained in:
zuohuaijun 2024-08-13 00:22:16 +08:00
parent 10e0f65fb4
commit 30b3f27e07
28 changed files with 203 additions and 136 deletions

View File

@ -214,7 +214,7 @@ public class AppAuthService : IDynamicApiController, ITransient
// 角色集合
var roleIds = await _sysUserRep.ChangeRepository<SqlSugarRepository<SysUserRole>>().AsQueryable().Where(u => u.UserId == user.Id).Select(u => u.RoleId).ToListAsync();
// 接口集合
var apis = await _sysRoleService.GetUserApiList();
var apis = (await _sysRoleService.GetUserApiList())[0];
return new LoginUserOutput
{

View File

@ -35,11 +35,11 @@
<PackageReference Include="SixLabors.ImageSharp.Web" Version="3.1.2" />
<PackageReference Include="SkiaSharp.NativeAssets.Linux.NoDependencies" Version="2.88.8" />
<PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="3.4.0" />
<PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.6.0" />
<PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.7.0" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.166" />
<PackageReference Include="SSH.NET" Version="2024.1.0" />
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.4.4" />
<PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1065" />
<PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1066" />
<PackageReference Include="UAParser" Version="3.1.47" />
<PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
</ItemGroup>

View File

@ -34,7 +34,6 @@ public partial class SysConfig : EntityBase
/// </summary>
[SugarColumn(ColumnDescription = "属性值", Length = 64)]
[MaxLength(64)]
//[IgnoreUpdateSeedColumn]
public string? Value { get; set; }
/// <summary>

View File

@ -7,9 +7,9 @@
namespace Admin.NET.Core;
/// <summary>
/// 系统角色接口
/// 系统角色接口黑名单
/// </summary>
[SugarTable(null, "系统角色接口表")]
[SugarTable(null, "系统角色接口黑名单表")]
[SysTable]
public class SysRoleApi : EntityBaseId
{

View File

@ -1,11 +1,8 @@
// 麻省理工学院许可证
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 版权所有 (c) 2021-2023 zuohuaijun大名科技天津有限公司 联系电话/微信18020030720 QQ515096995
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
//
// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core;

View File

@ -175,20 +175,21 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
new SysMenu{ Id=1310000000446, Pid=1310000000441, Title="退款申请", Permission="sysWechatPay/refundDomestic", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000501, Pid=0, Title="日志管理", Path="/log", Name="log", Component="Layout", Icon="ele-DocumentCopy", Type=MenuTypeEnum.Dir, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=12000 },
new SysMenu{ Id=1310000000511, Pid=1310000000501, Title="访问日志", Path="/log/vislog", Name="sysVisLog", Component="/system/log/vislog/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000512, Pid=1310000000511, Title="查询", Permission="sysVislog/page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000513, Pid=1310000000511, Title="清空", Permission="sysVislog/clear", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000521, Pid=1310000000501, Title="操作日志", Path="/log/oplog", Name="sysOpLog", Component="/system/log/oplog/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=110 },
new SysMenu{ Id=1310000000522, Pid=1310000000521, Title="查询", Permission="sysOplog/page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000523, Pid=1310000000521, Title="清空", Permission="sysOplog/clear", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000524, Pid=1310000000521, Title="导出", Permission="sysOplog/export", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000531, Pid=1310000000501, Title="异常日志", Path="/log/exlog", Name="sysExLog", Component="/system/log/exlog/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=120 },
new SysMenu{ Id=1310000000532, Pid=1310000000531, Title="查询", Permission="sysExlog/page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000533, Pid=1310000000531, Title="清空", Permission="sysExlog/clear", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000534, Pid=1310000000531, Title="导出", Permission="sysExlog/export", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000541, Pid=1310000000501, Title="差异日志", Path="/log/difflog", Name="sysDiffLog", Component="/system/log/difflog/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=130 },
new SysMenu{ Id=1310000000542, Pid=1310000000541, Title="查询", Permission="sysDifflog/page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000543, Pid=1310000000541, Title="清空", Permission="sysDifflog/clear", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000511, Pid=1310000000501, Title="访问日志", Path="/log/logvis", Name="sysLogVis", Component="/system/log/logvis/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000512, Pid=1310000000511, Title="查询", Permission="sysLogVis/page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000513, Pid=1310000000511, Title="清空", Permission="sysLogVis/clear", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000514, Pid=1310000000511, Title="热力图", Permission="sysLogVis/visMap", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000521, Pid=1310000000501, Title="操作日志", Path="/log/logop", Name="sysLogOp", Component="/system/log/logop/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=110 },
new SysMenu{ Id=1310000000522, Pid=1310000000521, Title="查询", Permission="sysLogOp/page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000523, Pid=1310000000521, Title="清空", Permission="sysLogOp/clear", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000524, Pid=1310000000521, Title="导出", Permission="sysLogOp/export", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000531, Pid=1310000000501, Title="异常日志", Path="/log/logex", Name="sysLogEx", Component="/system/log/logex/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=120 },
new SysMenu{ Id=1310000000532, Pid=1310000000531, Title="查询", Permission="sysLogEx/page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000533, Pid=1310000000531, Title="清空", Permission="sysLogEx/clear", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000534, Pid=1310000000531, Title="导出", Permission="sysLogEx/export", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000541, Pid=1310000000501, Title="差异日志", Path="/log/logdiff", Name="sysLogDiff", Component="/system/log/logdiff/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=130 },
new SysMenu{ Id=1310000000542, Pid=1310000000541, Title="查询", Permission="sysLogDiff/page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000543, Pid=1310000000541, Title="清空", Permission="sysLogDiff/clear", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000601, Pid=0, Title="开发工具", Path="/develop", Name="develop", Component="Layout", Icon="ele-Cpu", Type=MenuTypeEnum.Dir, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=13000 },
new SysMenu{ Id=1310000000611, Pid=1310000000601, Title="库表管理", Path="/develop/database", Name="sysDatabase", Component="/system/database/index",Icon="ele-Coin", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },

View File

@ -19,12 +19,11 @@ public class SysRoleMenuSeedData : ISqlSugarEntitySeedData<SysRoleMenu>
{
return new[]
{
// 数据面板【admin/1300000000101】
////// 数据面板【admin/1300000000101】
new SysRoleMenu{ Id=1300000000101, RoleId=1300000000101, MenuId=1300000000101 },
new SysRoleMenu{ Id=1300000000102, RoleId=1300000000101, MenuId=1300000000111 },
new SysRoleMenu{ Id=1300000000103, RoleId=1300000000101, MenuId=1300000000121 },
// 系统管理
////// 系统管理
new SysRoleMenu{ Id=1300000000111, RoleId=1300000000101, MenuId=1310000000101 },
// 账号管理
new SysRoleMenu{ Id=1300000000121, RoleId=1300000000101, MenuId=1310000000111 },
@ -37,6 +36,7 @@ public class SysRoleMenuSeedData : ISqlSugarEntitySeedData<SysRoleMenu>
new SysRoleMenu{ Id=1300000000128, RoleId=1300000000101, MenuId=1310000000118 },
new SysRoleMenu{ Id=1300000000129, RoleId=1300000000101, MenuId=1310000000119 },
new SysRoleMenu{ Id=1300000000130, RoleId=1300000000101, MenuId=1310000000120 },
new SysRoleMenu{ Id=1300000000131, RoleId=1300000000101, MenuId=1310000000121 },
// 角色管理
new SysRoleMenu{ Id=1300000000141, RoleId=1300000000101, MenuId=1310000000131 },
new SysRoleMenu{ Id=1300000000142, RoleId=1300000000101, MenuId=1310000000132 },
@ -46,6 +46,7 @@ public class SysRoleMenuSeedData : ISqlSugarEntitySeedData<SysRoleMenu>
new SysRoleMenu{ Id=1300000000146, RoleId=1300000000101, MenuId=1310000000136 },
new SysRoleMenu{ Id=1300000000147, RoleId=1300000000101, MenuId=1310000000137 },
new SysRoleMenu{ Id=1300000000148, RoleId=1300000000101, MenuId=1310000000138 },
new SysRoleMenu{ Id=1300000000149, RoleId=1300000000101, MenuId=1310000000139 },
// 机构管理
new SysRoleMenu{ Id=1300000000151, RoleId=1300000000101, MenuId=1310000000141 },
new SysRoleMenu{ Id=1300000000152, RoleId=1300000000101, MenuId=1310000000142 },
@ -58,6 +59,7 @@ public class SysRoleMenuSeedData : ISqlSugarEntitySeedData<SysRoleMenu>
new SysRoleMenu{ Id=1300000000163, RoleId=1300000000101, MenuId=1310000000153 },
new SysRoleMenu{ Id=1300000000164, RoleId=1300000000101, MenuId=1310000000154 },
new SysRoleMenu{ Id=1300000000165, RoleId=1300000000101, MenuId=1310000000155 },
new SysRoleMenu{ Id=1300000000166, RoleId=1300000000101, MenuId=1310000000156 },
// 个人中心
new SysRoleMenu{ Id=1300000000171, RoleId=1300000000101, MenuId=1310000000161 },
new SysRoleMenu{ Id=1300000000172, RoleId=1300000000101, MenuId=1310000000162 },
@ -78,9 +80,29 @@ public class SysRoleMenuSeedData : ISqlSugarEntitySeedData<SysRoleMenu>
new SysRoleMenu{ Id=1300000000193, RoleId=1300000000101, MenuId=1310000000183 },
new SysRoleMenu{ Id=1300000000194, RoleId=1300000000101, MenuId=1310000000184 },
new SysRoleMenu{ Id=1300000000195, RoleId=1300000000101, MenuId=1310000000185 },
//// 平台管理
//new SysRoleMenu{ Id=1300000000201, RoleId=1300000000101, MenuId=1310000000301 },
// AD域配置
new SysRoleMenu{ Id=1300000001201, RoleId=1300000000101, MenuId=1310000000191 },
new SysRoleMenu{ Id=1300000001202, RoleId=1300000000101, MenuId=1310000000192 },
new SysRoleMenu{ Id=1300000001203, RoleId=1300000000101, MenuId=1310000000193 },
new SysRoleMenu{ Id=1300000001204, RoleId=1300000000101, MenuId=1310000000194 },
new SysRoleMenu{ Id=1300000001205, RoleId=1300000000101, MenuId=1310000000195 },
new SysRoleMenu{ Id=1300000001206, RoleId=1300000000101, MenuId=1310000000196 },
new SysRoleMenu{ Id=1300000001207, RoleId=1300000000101, MenuId=1310000000197 },
new SysRoleMenu{ Id=1300000001208, RoleId=1300000000101, MenuId=1310000000198 },
////// 平台管理
new SysRoleMenu{ Id=1300000000201, RoleId=1300000000101, MenuId=1310000000301 },
// 字典管理
new SysRoleMenu{ Id=1300000000231, RoleId=1300000000101, MenuId=1310000000331 },
new SysRoleMenu{ Id=1300000000232, RoleId=1300000000101, MenuId=1310000000332 },
new SysRoleMenu{ Id=1300000000233, RoleId=1300000000101, MenuId=1310000000333 },
new SysRoleMenu{ Id=1300000000234, RoleId=1300000000101, MenuId=1310000000334 },
new SysRoleMenu{ Id=1300000000235, RoleId=1300000000101, MenuId=1310000000335 },
// 字典管理
new SysRoleMenu{ Id=1300000000241, RoleId=1300000000101, MenuId=1310000000341 },
new SysRoleMenu{ Id=1300000000242, RoleId=1300000000101, MenuId=1310000000342 },
new SysRoleMenu{ Id=1300000000243, RoleId=1300000000101, MenuId=1310000000343 },
new SysRoleMenu{ Id=1300000000244, RoleId=1300000000101, MenuId=1310000000344 },
new SysRoleMenu{ Id=1300000000245, RoleId=1300000000101, MenuId=1310000000345 },
// 任务调度
new SysRoleMenu{ Id=1300000000251, RoleId=1300000000101, MenuId=1310000000351 },
new SysRoleMenu{ Id=1300000000252, RoleId=1300000000101, MenuId=1310000000352 },
@ -107,27 +129,60 @@ public class SysRoleMenuSeedData : ISqlSugarEntitySeedData<SysRoleMenu>
new SysRoleMenu{ Id=1300000000294, RoleId=1300000000101, MenuId=1310000000394 },
new SysRoleMenu{ Id=1300000000295, RoleId=1300000000101, MenuId=1310000000395 },
new SysRoleMenu{ Id=1300000000296, RoleId=1300000000101, MenuId=1310000000396 },
//// 日志管理
//new SysRoleMenu{ Id=1300000000301, RoleId=1300000000101, MenuId=1310000000501 },
// 打印模板
new SysRoleMenu{ Id=1300000001401, RoleId=1300000000101, MenuId=1310000000401 },
new SysRoleMenu{ Id=1300000001402, RoleId=1300000000101, MenuId=1310000000402 },
new SysRoleMenu{ Id=1300000001403, RoleId=1300000000101, MenuId=1310000000403 },
new SysRoleMenu{ Id=1300000001404, RoleId=1300000000101, MenuId=1310000000404 },
new SysRoleMenu{ Id=1300000001405, RoleId=1300000000101, MenuId=1310000000405 },
// 动态插件
new SysRoleMenu{ Id=1300000001411, RoleId=1300000000101, MenuId=1310000000411 },
new SysRoleMenu{ Id=1300000001412, RoleId=1300000000101, MenuId=1310000000412 },
new SysRoleMenu{ Id=1300000001413, RoleId=1300000000101, MenuId=1310000000413 },
new SysRoleMenu{ Id=1300000001414, RoleId=1300000000101, MenuId=1310000000414 },
new SysRoleMenu{ Id=1300000001415, RoleId=1300000000101, MenuId=1310000000415 },
// 开放接口
new SysRoleMenu{ Id=1300000001421, RoleId=1300000000101, MenuId=1310000000421 },
new SysRoleMenu{ Id=1300000001422, RoleId=1300000000101, MenuId=1310000000422 },
new SysRoleMenu{ Id=1300000001423, RoleId=1300000000101, MenuId=1310000000423 },
new SysRoleMenu{ Id=1300000001424, RoleId=1300000000101, MenuId=1310000000424 },
new SysRoleMenu{ Id=1300000001425, RoleId=1300000000101, MenuId=1310000000425 },
// 系统配置
new SysRoleMenu{ Id=1300000001431, RoleId=1300000000101, MenuId=1310000000431 },
// 微信支付
new SysRoleMenu{ Id=1300000001441, RoleId=1300000000101, MenuId=1310000000441 },
new SysRoleMenu{ Id=1300000001442, RoleId=1300000000101, MenuId=1310000000442 },
new SysRoleMenu{ Id=1300000001443, RoleId=1300000000101, MenuId=1310000000443 },
new SysRoleMenu{ Id=1300000001444, RoleId=1300000000101, MenuId=1310000000444 },
new SysRoleMenu{ Id=1300000001445, RoleId=1300000000101, MenuId=1310000000445 },
new SysRoleMenu{ Id=1300000001446, RoleId=1300000000101, MenuId=1310000000446 },
////// 日志管理
new SysRoleMenu{ Id=1300000000301, RoleId=1300000000101, MenuId=1310000000501 },
new SysRoleMenu{ Id=1300000000311, RoleId=1300000000101, MenuId=1310000000511 },
new SysRoleMenu{ Id=1300000000312, RoleId=1300000000101, MenuId=1310000000512 },
new SysRoleMenu{ Id=1300000000313, RoleId=1300000000101, MenuId=1310000000513 },
new SysRoleMenu{ Id=1300000000314, RoleId=1300000000101, MenuId=1310000000514 },
new SysRoleMenu{ Id=1300000000321, RoleId=1300000000101, MenuId=1310000000521 },
new SysRoleMenu{ Id=1300000000322, RoleId=1300000000101, MenuId=1310000000522 },
new SysRoleMenu{ Id=1300000000323, RoleId=1300000000101, MenuId=1310000000523 },
new SysRoleMenu{ Id=1300000000324, RoleId=1300000000101, MenuId=1310000000524 },
new SysRoleMenu{ Id=1300000000331, RoleId=1300000000101, MenuId=1310000000531 },
new SysRoleMenu{ Id=1300000000332, RoleId=1300000000101, MenuId=1310000000532 },
new SysRoleMenu{ Id=1300000000333, RoleId=1300000000101, MenuId=1310000000543 },
// 帮助文档
new SysRoleMenu{ Id=1300000000333, RoleId=1300000000101, MenuId=1310000000533 },
new SysRoleMenu{ Id=1300000000334, RoleId=1300000000101, MenuId=1310000000534 },
new SysRoleMenu{ Id=1300000000341, RoleId=1300000000101, MenuId=1310000000541 },
new SysRoleMenu{ Id=1300000000342, RoleId=1300000000101, MenuId=1310000000542 },
new SysRoleMenu{ Id=1300000000343, RoleId=1300000000101, MenuId=1310000000543 },
////// 帮助文档
new SysRoleMenu{ Id=1300000000401, RoleId=1300000000101, MenuId=1310000000701 },
new SysRoleMenu{ Id=1300000000402, RoleId=1300000000101, MenuId=1310000000711 },
new SysRoleMenu{ Id=1300000000403, RoleId=1300000000101, MenuId=1310000000712 },
new SysRoleMenu{ Id=1300000000404, RoleId=1300000000101, MenuId=1310000000713 },
new SysRoleMenu{ Id=1300000000405, RoleId=1300000000101, MenuId=1310000000714 },
new SysRoleMenu{ Id=1300000000455, RoleId=1300000000101, MenuId=1310000000801 },
// 其他角色默认菜单
// 数据面板【1300000000102】
////// 数据面板【1300000000102】
new SysRoleMenu{ Id=1300000000501, RoleId=1300000000102, MenuId=1300000000101 },
new SysRoleMenu{ Id=1300000000502, RoleId=1300000000102, MenuId=1300000000111 },
new SysRoleMenu{ Id=1300000000503, RoleId=1300000000102, MenuId=1300000000121 },
@ -140,7 +195,7 @@ public class SysRoleMenuSeedData : ISqlSugarEntitySeedData<SysRoleMenu>
new SysRoleMenu{ Id=1300000000524, RoleId=1300000000102, MenuId=1310000000164 },
new SysRoleMenu{ Id=1300000000525, RoleId=1300000000102, MenuId=1310000000165 },
// 数据面板【1300000000103】
////// 数据面板【1300000000103】
new SysRoleMenu{ Id=1300000000601, RoleId=1300000000103, MenuId=1300000000101 },
new SysRoleMenu{ Id=1300000000602, RoleId=1300000000103, MenuId=1300000000111 },
new SysRoleMenu{ Id=1300000000603, RoleId=1300000000103, MenuId=1300000000121 },
@ -153,7 +208,7 @@ public class SysRoleMenuSeedData : ISqlSugarEntitySeedData<SysRoleMenu>
new SysRoleMenu{ Id=1300000000624, RoleId=1300000000103, MenuId=1310000000164 },
new SysRoleMenu{ Id=1300000000625, RoleId=1300000000103, MenuId=1310000000165 },
// 数据面板【1300000000104】
////// 数据面板【1300000000104】
new SysRoleMenu{ Id=1300000000701, RoleId=1300000000104, MenuId=1300000000101 },
new SysRoleMenu{ Id=1300000000702, RoleId=1300000000104, MenuId=1300000000111 },
new SysRoleMenu{ Id=1300000000703, RoleId=1300000000104, MenuId=1300000000121 },
@ -166,7 +221,7 @@ public class SysRoleMenuSeedData : ISqlSugarEntitySeedData<SysRoleMenu>
new SysRoleMenu{ Id=1300000000724, RoleId=1300000000104, MenuId=1310000000164 },
new SysRoleMenu{ Id=1300000000725, RoleId=1300000000104, MenuId=1310000000165 },
// 数据面板【1300000000105】
////// 数据面板【1300000000105】
new SysRoleMenu{ Id=1300000000801, RoleId=1300000000105, MenuId=1300000000101 },
new SysRoleMenu{ Id=1300000000802, RoleId=1300000000105, MenuId=1300000000111 },
new SysRoleMenu{ Id=1300000000803, RoleId=1300000000105, MenuId=1300000000121 },

View File

@ -198,7 +198,7 @@ public class SysAuthService : IDynamicApiController, ITransient
throw Oops.Oh("验证码错误!");
// 账号是否存在
var user = await _sysUserRep.AsQueryable().Includes(t => t.SysOrg).ClearFilter().FirstAsync(u => u.Phone.Equals(input.Phone));
var user = await _sysUserRep.AsQueryable().Includes(u => u.SysOrg).ClearFilter().FirstAsync(u => u.Phone.Equals(input.Phone));
_ = user ?? throw Oops.Oh(ErrorCodeEnum.D0009);
return await CreateToken(user, input.LoginMode);
@ -280,7 +280,7 @@ public class SysAuthService : IDynamicApiController, ITransient
// 角色集合
var roleIds = await _sysUserRep.ChangeRepository<SqlSugarRepository<SysUserRole>>().AsQueryable().Where(u => u.UserId == user.Id).Select(u => u.RoleId).ToListAsync();
// 接口集合
var apis = await _sysRoleService.GetUserApiList();
var apis = (await _sysRoleService.GetUserApiList())[0];
// 水印文字(若系统水印为空则禁止显示)
var watermarkText = await _sysConfigService.GetConfigValue<string>(ConfigConst.SysWebWatermark);
if (!string.IsNullOrWhiteSpace(watermarkText))

View File

@ -1,18 +0,0 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core.Service;
/// <summary>
/// 设置基础接口资源
/// </summary>
public class BaseApiInput : BaseIdInput
{
/// <summary>
/// 接口路由集合
/// </summary>
public List<string> ApiList { get; set; }
}

View File

@ -7,7 +7,7 @@
namespace Admin.NET.Core.Service;
/// <summary>
/// 授权角色接口资源
/// 授权角色接口黑名单
/// </summary>
public class RoleApiInput : BaseIdInput
{

View File

@ -7,7 +7,7 @@
namespace Admin.NET.Core.Service;
/// <summary>
/// 系统角色接口资源服务
/// 系统角色接口黑名单服务
/// </summary>
public class SysRoleApiService : ITransient
{
@ -19,7 +19,7 @@ public class SysRoleApiService : ITransient
}
/// <summary>
/// 授权角色接口资源
/// 授权角色接口
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
@ -36,7 +36,7 @@ public class SysRoleApiService : ITransient
}
/// <summary>
/// 根据角色Id集合获取接口资源集合
/// 根据角色Id集合获取接口集合
/// </summary>
/// <param name="roleIdList"></param>
/// <returns></returns>
@ -48,7 +48,7 @@ public class SysRoleApiService : ITransient
}
/// <summary>
/// 根据角色Id删除接口资源
/// 根据角色Id删除接口
/// </summary>
/// <param name="roleId"></param>
/// <returns></returns>

View File

@ -120,6 +120,8 @@ public class SysRoleService : IDynamicApiController, ITransient
Id = input.Id,
MenuIdList = menuIds.ToList()
});
await ClearUserApiCache(input.Id);
}
/// <summary>
@ -270,92 +272,106 @@ public class SysRoleService : IDynamicApiController, ITransient
}
/// <summary>
/// 授权角色接口资源 🔖
/// 授权角色接口 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
[DisplayName("授权角色接口资源")]
[DisplayName("授权角色接口")]
public async Task GrantApi(RoleApiInput input)
{
// 删除与该角色相关的用户接口资源缓存
var userIdList = await _sysUserRoleService.GetUserIdList(input.Id);
foreach (var userId in userIdList)
{
_sysCacheService.Remove(CacheConst.KeyUserApi + userId);
}
await ClearUserApiCache(input.Id);
await _sysRoleApiService.GrantRoleApi(input);
}
/// <summary>
/// 获取角色接口资源集合 🔖
/// 删除与该角色相关的用户接口缓存
/// </summary>
/// <param name="input"></param>
/// <param name="roleId"></param>
/// <returns></returns>
[DisplayName("获取角色接口资源集合")]
public async Task<List<string>> GetRoleApiList([FromQuery] RoleInput input)
private async Task ClearUserApiCache(long roleId)
{
var roleApis = await _sysRoleApiService.GetRoleApiList(new List<long> { input.Id });
var roleButtons = await GetRoleButtonList(new List<long> { input.Id });
return roleApis.Union(roleButtons).ToList();
var userIdList = await _sysUserRoleService.GetUserIdList(roleId);
foreach (var userId in userIdList)
{
_sysCacheService.Remove(CacheConst.KeyUserApi + userId);
}
}
/// <summary>
/// 获取用户接口资源集合 🔖
/// 获取角色接口黑名单集合 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("获取角色接口黑名单集合")]
public async Task<List<string>> GetRoleApiList([FromQuery] RoleInput input)
{
var roleApis = await _sysRoleApiService.GetRoleApiList(new List<long> { input.Id });
return roleApis;
//var roleButtons = await GetRoleButtonList(new List<long> { input.Id });
//return roleApis.Union(roleButtons).ToList();
}
/// <summary>
/// 获取用户接口集合 🔖
/// </summary>
/// <returns></returns>
[DisplayName("获取用户接口资源集合")]
public async Task<List<string>> GetUserApiList()
[DisplayName("获取用户接口集合")]
public async Task<List<List<string>>> GetUserApiList()
{
var userId = _userManager.UserId;
var apiList = _sysCacheService.Get<List<string>>(CacheConst.KeyUserApi + userId);
var apiList = _sysCacheService.Get<List<List<string>>>(CacheConst.KeyUserApi + userId);
if (apiList == null)
{
// 超管账号获取所有接口资源
apiList = new List<List<string>>() { new(), new() };
// 超管账号获取所有接口
if (_userManager.SuperAdmin)
{
var allApiList = _sysCommonService.GetApiList();
apiList = new List<string>();
foreach (var apiOutput in allApiList)
{
foreach (var controller in apiOutput.Children)
{
apiList.AddRange(controller.Children.Select(u => u.Route));
}
apiList[0].AddRange(controller.Children.Select(u => u.Route));
}
}
else
{
// 当前账号所有角色集合
var roleIds = await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId);
apiList = await _sysRoleApiService.GetRoleApiList(roleIds);
var roleButtons = await GetRoleButtonList(roleIds);
apiList = apiList.Union(roleButtons).ToList();
// 已有按钮权限集合
apiList[0] = await GetRoleButtonList(roleIds);
// 未有按钮权限集合
var allButtonList = await GetButtonList(new());
apiList[1] = allButtonList.Except(apiList[0]).ToList(); // 差集
// 接口黑名单集合
var roleApis = await _sysRoleApiService.GetRoleApiList(roleIds);
apiList[1].AddRange(roleApis);
}
_sysCacheService.Set(CacheConst.KeyUserApi + userId, apiList, TimeSpan.FromDays(7));
}
return apiList;
}
/// <summary>
/// 获取用户按钮权限集合
/// </summary>
/// <returns></returns>
[NonAction]
public async Task<List<string>> GetUserButtonList()
{
var menuIdList = new List<long>();
if (!_userManager.SuperAdmin)
{
var roleIdList = await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId);
menuIdList = await _sysRoleMenuService.GetRoleMenuIdList(roleIdList);
}
return await _sysRoleRep.ChangeRepository<SqlSugarRepository<SysMenu>>().AsQueryable()
.Where(u => u.Type == MenuTypeEnum.Btn)
.WhereIF(menuIdList.Count > 0, u => menuIdList.Contains(u.Id))
.Select(u => u.Permission).ToListAsync();
}
///// <summary>
///// 获取用户按钮权限集合
///// </summary>
///// <returns></returns>
//[NonAction]
//public async Task<List<string>> GetUserButtonList()
//{
// var menuIdList = new List<long>();
// if (!_userManager.SuperAdmin)
// {
// var roleIdList = await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId);
// menuIdList = await _sysRoleMenuService.GetRoleMenuIdList(roleIdList);
// }
// return await GetButtonList(menuIdList);
//}
/// <summary>
/// 获取角色按钮权限集合
@ -366,9 +382,19 @@ public class SysRoleService : IDynamicApiController, ITransient
public async Task<List<string>> GetRoleButtonList(List<long> roleIds)
{
var menuIdList = await _sysRoleMenuService.GetRoleMenuIdList(roleIds);
return await GetButtonList(menuIdList);
}
/// <summary>
/// 根据菜单Id集合获取按钮集合
/// </summary>
/// <param name="menuIds"></param>
/// <returns></returns>
private async Task<List<string>> GetButtonList(List<long> menuIds)
{
return await _sysRoleRep.ChangeRepository<SqlSugarRepository<SysMenu>>().AsQueryable()
.Where(u => u.Type == MenuTypeEnum.Btn)
.WhereIF(menuIdList.Count > 0, u => menuIdList.Contains(u.Id))
.WhereIF(menuIds.Count > 0, u => menuIds.Contains(u.Id))
.Select(u => u.Permission).ToListAsync();
}
}

View File

@ -85,12 +85,18 @@ namespace Admin.NET.Web.Core
// 当前接口路由
var path = httpContext.Request.Path.ToString();
var serviceScope = httpContext.RequestServices.CreateScope();
// 若当前路由在已有角色接口资源里面则放行
// 获取当前用户按钮权限集合和接口黑名单
var serviceScope = httpContext.RequestServices.CreateScope();
var sysRoleService = serviceScope.ServiceProvider.GetRequiredService<SysRoleService>();
var roleApis = await sysRoleService.GetUserApiList();
return roleApis.Exists(u => path.Equals(u, StringComparison.CurrentCultureIgnoreCase));
// 若当前路由在按钮权限集合里面则放行
if (roleApis[0].Exists(u => path.Contains(u, StringComparison.CurrentCultureIgnoreCase)))
return true;
// 若当前路由在已接口黑名单里面则禁止
return roleApis[1].TrueForAll(u => !path.Contains(u, StringComparison.CurrentCultureIgnoreCase));
}
}
}

View File

@ -1,3 +1,9 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
using Microsoft.AspNetCore.Http;
namespace Admin.NET.Plugin.ApprovalFlow.Service;

View File

@ -46,7 +46,7 @@
"js-table2excel": "^1.1.2",
"jsplumb": "^2.15.6",
"lodash-es": "^4.17.21",
"md-editor-v3": "^4.18.0",
"md-editor-v3": "^4.18.1",
"mitt": "^3.0.1",
"monaco-editor": "^0.50.0",
"mqtt": "^4.3.8",
@ -104,7 +104,7 @@
"sass": "^1.77.8",
"terser": "^5.31.5",
"typescript": "^5.5.4",
"unocss": "^0.61.9",
"unocss": "^0.62.1",
"vite": "^5.4.0",
"vite-plugin-cdn-import": "^1.0.1",
"vite-plugin-compression2": "^1.1.3",

View File

@ -1,5 +1,5 @@
<template>
<div class="sys-difflog-container">
<div class="syslogdiff-container">
<el-card shadow="hover" :body-style="{ padding: '5px 5px 0 5px', display: 'flex', width: '100%', height: '100%', alignItems: 'start' }">
<el-form :model="state.queryParams" ref="queryForm" :show-message="false" :inlineMessage="true" label-width="auto" style="flex: 1 1 0%">
<el-row :gutter="10">
@ -83,11 +83,10 @@
</div>
</template>
<script lang="ts" setup name="sysDiffLog">
<script lang="ts" setup name="sysLogDiff">
import { onMounted, reactive, ref } from 'vue';
import { ElMessage } from 'element-plus';
import { useDateTimeShortCust } from '/@/hooks/dateTimeShortCust';
import { auth } from '/@/utils/authFunction';
import { VxeGridInstance, VxeGridListeners, VxeGridPropTypes } from 'vxe-table';
import { useVxeTable } from '/@/hooks/useVxeTableOptionsHook';
@ -159,9 +158,8 @@ const options = useVxeTable<SysLogDiff>(
);
//
onMounted(async () => {
onMounted(() => {
state.localPageParam = Local.get(localPageParamKey) || state.localPageParam;
await handleQuery();
});
// api

View File

@ -1,5 +1,5 @@
<template>
<div class="sys-exlog-container">
<div class="syslogex-container">
<el-card shadow="hover" :body-style="{ padding: '5px 5px 0 5px', display: 'flex', width: '100%', height: '100%', alignItems: 'start' }">
<el-form :model="state.queryParams" ref="queryForm" :show-message="false" :inlineMessage="true" label-width="auto" style="flex: 1 1 0%">
<el-row :gutter="10">
@ -116,11 +116,10 @@
</div>
</template>
<script lang="ts" setup name="sysExLog">
<script lang="ts" setup name="sysLogEx">
import { onMounted, reactive, ref } from 'vue';
import { ElMessage } from 'element-plus';
import { useDateTimeShortCust } from '/@/hooks/dateTimeShortCust';
import { auth } from '/@/utils/authFunction';
import { VxeGridInstance, VxeGridListeners, VxeGridPropTypes } from 'vxe-table';
import { useVxeTable } from '/@/hooks/useVxeTableOptionsHook';
import { Local } from '/@/utils/storage';

View File

@ -1,5 +1,5 @@
<template>
<div class="sys-oplog-container">
<div class="syslogop-container">
<el-card shadow="hover" :body-style="{ padding: '5px 5px 0 5px', display: 'flex', width: '100%', height: '100%', alignItems: 'start' }">
<el-form :model="state.queryParams" ref="queryForm" :show-message="false" :inlineMessage="true" label-width="auto" style="flex: 1 1 0%">
<el-row :gutter="10">
@ -108,11 +108,10 @@
</div>
</template>
<script lang="ts" setup name="sysOpLog">
<script lang="ts" setup name="sysLogOp">
import { onMounted, reactive, ref } from 'vue';
import { ElMessage } from 'element-plus';
import { useDateTimeShortCust } from '/@/hooks/dateTimeShortCust';
import { auth } from '/@/utils/authFunction';
import { VxeGridInstance, VxeGridListeners, VxeGridPropTypes } from 'vxe-table';
import { useVxeTable } from '/@/hooks/useVxeTableOptionsHook';
import { Local } from '/@/utils/storage';

View File

@ -1,5 +1,5 @@
<template>
<div class="sys-vislog-container">
<div class="syslogvis-container">
<el-card shadow="hover" :body-style="{ padding: '5px 5px 0 5px', display: 'flex', width: '100%', height: '100%', alignItems: 'start' }">
<el-form :model="state.queryParams" ref="queryForm" :show-message="false" :inlineMessage="true" label-width="auto" style="flex: 1 1 0%">
<el-row :gutter="10">
@ -59,7 +59,7 @@
<el-card class="full-table" shadow="hover" style="margin-top: 5px">
<vxe-grid ref="xGrid" class="xGrid-style" v-bind="options" v-on="gridEvents">
<template #toolbar_buttons>
<el-button icon="ele-MapLocation" type="primary" @click="handleMap" v-auth="'sysLogVis/list'"> 热力图 </el-button>
<el-button icon="ele-MapLocation" type="primary" @click="handleMap" v-auth="'sysLogVis/visMap'"> 热力图 </el-button>
<el-button icon="ele-DeleteFilled" type="danger" @click="handleClear" v-auth="'sysLogVis/clear'"> 清空 </el-button>
</template>
<template #toolbar_tools> </template>
@ -77,11 +77,10 @@
</div>
</template>
<script lang="ts" setup name="sysVisLog">
<script lang="ts" setup name="sysLogVis">
import { onMounted, reactive, ref, defineAsyncComponent } from 'vue';
import { ElMessage } from 'element-plus';
import { useDateTimeShortCust } from '/@/hooks/dateTimeShortCust';
import { auth } from '/@/utils/authFunction';
import { VxeGridInstance, VxeGridListeners, VxeGridPropTypes } from 'vxe-table';
import { useVxeTable } from '/@/hooks/useVxeTableOptionsHook';
import { Local } from '/@/utils/storage';

View File

@ -58,8 +58,8 @@
<el-tooltip content="删除" placement="top">
<el-button icon="ele-Delete" size="small" text type="danger" @click="handleDelete(row)" v-auth="'sysRole/delete'"></el-button>
</el-tooltip>
<el-button icon="ele-Link" size="small" text type="primary" @click="openGrantApi(row)" v-auth="'sysRole/grantApi'"> 接口资源 </el-button>
<el-button icon="ele-OfficeBuilding" size="small" text type="primary" @click="openGrantData(row)" v-auth="'sysRole/grantDataScope'">数据范围</el-button>
<el-button icon="ele-Link" size="small" text type="primary" @click="openGrantApi(row)" v-auth="'sysRole/grantApi'"> 接口黑名单 </el-button>
</template>
</vxe-grid>
</el-card>