Browse Source

Merge branch 'org'

pull/43/head 5.2.1.1
王军 4 years ago
parent
commit
9d50b3e5cf
  1. 20
      aspnet-core/Delete-BIN-OBJ-Folders.bat
  2. 25
      aspnet-core/frameworks/Extensions/src/Lion.AbpPro.Extension/System/DateTimeExtensions.cs
  3. 13
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaries/DataDictionaryDomainException.cs
  4. 5
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementConsts.cs
  5. 4
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementDomainSharedModule.cs
  6. 5
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementErrorCodes.cs
  7. 8
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/en.json
  8. 7
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/zh-Hans.json
  9. 113
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs
  10. 7
      aspnet-core/modules/FileManagement/host/Lion.AbpPro.FileManagement.HttpApi.Host/appsettings.json
  11. 2
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Application/Notifications/NotificationAppService.cs
  12. 6
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/en.json
  13. 7
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/zh-Hans.json
  14. 9
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementConsts.cs
  15. 4
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementDomainSharedModule.cs
  16. 5
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementErrorCodes.cs
  17. 13
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/NotificationManagementDomainException.cs
  18. 6
      aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/NotificationManager.cs
  19. 3
      aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/AbpProHttpApiHostModule.cs
  20. 66
      aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.Staging.json
  21. 5
      aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json
  22. 11
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/AddRoleToOrganizationUnitInput.cs
  23. 11
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/AddUserToOrganizationUnitInput.cs
  24. 11
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/CreateOrganizationUnitInput.cs
  25. 10
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetOrganizationUnitRoleInput.cs
  26. 11
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetOrganizationUnitRoleOutput.cs
  27. 11
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetOrganizationUnitUserInput.cs
  28. 13
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetOrganizationUnitUserOutput.cs
  29. 11
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetUnAddRoleInput.cs
  30. 10
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetUnAddRoleOutput.cs
  31. 11
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetUnAddUserInput.cs
  32. 12
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetUnAddUserOutput.cs
  33. 16
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/OrganizationUnitDto.cs
  34. 10
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/RemoveRoleToOrganizationUnitInput.cs
  35. 10
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/RemoveUserToOrganizationUnitInput.cs
  36. 13
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/TreeOutput.cs
  37. 11
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/UpdateOrganizationUnitInput.cs
  38. 73
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/IOrganizationUnitAppService.cs
  39. 158
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissionDefinitionProvider.cs
  40. 8
      aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissions.cs
  41. 6
      aspnet-core/services/src/Lion.AbpPro.Application/AbpProApplicationAutoMapperProfile.cs
  42. 74
      aspnet-core/services/src/Lion.AbpPro.Application/ElasticSearchs/LionAbpProLogAppService.cs
  43. 210
      aspnet-core/services/src/Lion.AbpPro.Application/OrganizationUnits/OrganizationUnitAppService.cs
  44. 17
      aspnet-core/services/src/Lion.AbpPro.Application/Users/AccountAppService.cs
  45. 5
      aspnet-core/services/src/Lion.AbpPro.Application/Users/UserAppService.cs
  46. 23
      aspnet-core/services/src/Lion.AbpPro.DbMigrator/DbMigratorHostedService.cs
  47. 14
      aspnet-core/services/src/Lion.AbpPro.DbMigrator/Lion.AbpPro.DbMigrator.csproj
  48. 2
      aspnet-core/services/src/Lion.AbpPro.DbMigrator/Program.cs
  49. 2
      aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.json
  50. 12
      aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainErrorCodes.cs
  51. 9
      aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedConsts.cs
  52. 6
      aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedModule.cs
  53. 16
      aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/en.json
  54. 15
      aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/zh-Hans.json
  55. 2
      aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpProResource.cs
  56. 6
      aspnet-core/services/src/Lion.AbpPro.Domain/AbpProDomainModule.cs
  57. 50
      aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiResourceManager.cs
  58. 46
      aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiScopeManager.cs
  59. 20
      aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerClientManager.cs
  60. 4
      aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdentityResourceManager.cs
  61. 3
      aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProEntityFrameworkCoreModule.cs
  62. 18
      aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProMigrationsDbContextFactory.cs
  63. 3
      aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreAbpProDbSchemaMigrator.cs
  64. 105
      aspnet-core/services/src/Lion.AbpPro.HttpApi/Controllers/Systems/OrganizationUnitController.cs
  65. 4
      aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiResourceManager_Tests.cs
  66. 4
      aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiScopeManager_Tests.cs
  67. 4
      aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerClientManager_Tests.cs
  68. 4
      aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdentityResourceManager_Tests.cs
  69. 4
      aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swaggers/HiddenAbpDefaultApiFilter.cs
  70. 9
      vben271/src/locales/lang/en/routes/admin.ts
  71. 10
      vben271/src/locales/lang/zh-CN/routes/admin.ts
  72. 2
      vben271/src/router/index.ts
  73. 10
      vben271/src/router/routes/modules/admin.ts
  74. 7529
      vben271/src/services/ServiceProxies.ts
  75. 4
      vben271/src/services/ServiceProxyBase.ts
  76. 106
      vben271/src/views/admin/auditLog/AuditLog.ts
  77. 89
      vben271/src/views/admin/auditLog/AuditLog.vue
  78. 35
      vben271/src/views/admin/dictionary/AbpDictionary.ts
  79. 353
      vben271/src/views/admin/dictionary/AbpDictionary.vue
  80. 104
      vben271/src/views/admin/dictionary/CreateAbpDictionary.vue
  81. 95
      vben271/src/views/admin/dictionary/CreateAbpDictionaryType.vue
  82. 100
      vben271/src/views/admin/dictionary/EditAbpDictionary.vue
  83. 99
      vben271/src/views/admin/dictionary/EditAbpDictionaryType.vue
  84. 54
      vben271/src/views/admin/elasticSearch/ElasticSearch.ts
  85. 119
      vben271/src/views/admin/elasticSearch/ElasticSearch.vue
  86. 35
      vben271/src/views/admin/files/File.ts
  87. 146
      vben271/src/views/admin/files/File.vue
  88. 36
      vben271/src/views/admin/files/UploadOss.ts
  89. 104
      vben271/src/views/admin/organizationUnits/AddRoleToOrganizationUnit.vue
  90. 111
      vben271/src/views/admin/organizationUnits/AddUserToOrganizationUnit.vue
  91. 89
      vben271/src/views/admin/organizationUnits/CreateOrganizationUnit.vue
  92. 75
      vben271/src/views/admin/organizationUnits/EditOrganizationUnit.vue
  93. 236
      vben271/src/views/admin/organizationUnits/OrganizationUnit.ts
  94. 375
      vben271/src/views/admin/organizationUnits/OrganizationUnit.vue
  95. 113
      vben271/src/views/admin/roles/AbpRole.ts
  96. 183
      vben271/src/views/admin/roles/AbpRole.vue
  97. 94
      vben271/src/views/admin/roles/CreateAbpRole.vue
  98. 118
      vben271/src/views/admin/roles/EditAbpRole.vue
  99. 2
      vben271/src/views/admin/settings/Setting.ts
  100. 227
      vben271/src/views/admin/users/AbpUser.ts

20
aspnet-core/Delete-BIN-OBJ-Folders.bat

@ -0,0 +1,20 @@
@ECHO off
cls
ECHO Deleting all BIN and OBJ folders...
ECHO.
FOR /d /r . %%d in (bin,obj) DO (
IF EXIST "%%d" (
ECHO %%d | FIND /I "\node_modules\" > Nul && (
ECHO.Skipping: %%d
) || (
ECHO.Deleting: %%d
rd /s/q "%%d"
)
)
)
ECHO.
ECHO.BIN and OBJ folders have been successfully deleted. Press any key to exit.
pause > nul

25
aspnet-core/frameworks/Extensions/src/Lion.AbpPro.Extension/System/DateTimeExtensions.cs

@ -75,5 +75,30 @@ namespace Lion.AbpPro.Extension.System
var result = length == 10 ? start.AddSeconds(jsTime) : start.AddMilliseconds(jsTime);
return result.ToUniversalTime();
}
/// <summary>
/// 获取指定日期 当天的最大时间
/// 例如 2021-09-10 11:22:33.123456 转换后 2021-09-10 23:59:59.9999999
/// </summary>
public static DateTime? ToCurrentDateMaxDateTime(this DateTime? dateTime)
{
return dateTime?.Date.AddDays(1).AddTicks(-1);
}
/// <summary>
/// 获取指定时间的下一秒
/// 例如 2021-09-10 11:11:11.1234567 转换后 2021-09-10 11:11:12.0000000
/// </summary>
public static DateTime? ToNextSecondDateTime(this DateTime? dateTime)
{
if (!dateTime.HasValue)
{
return null;
}
return new DateTime(dateTime.Value.Year, dateTime.Value.Month, dateTime.Value.Day, dateTime.Value.Hour,
dateTime.Value.Minute, dateTime.Value.Second)
.AddSeconds(1);
}
}
}

13
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaries/DataDictionaryDomainException.cs

@ -5,16 +5,17 @@ using Volo.Abp;
namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{
public class DataDictionaryDomainException : UserFriendlyException
public class DataDictionaryDomainException : BusinessException
{
public DataDictionaryDomainException(string message, string code = null, string details = null,
Exception innerException = null, LogLevel logLevel = LogLevel.Warning) : base(message, code, details,
innerException, logLevel)
public DataDictionaryDomainException(string code = null, string message = null, string details = null, Exception innerException = null,
LogLevel logLevel = LogLevel.Warning) : base(code, message, details,
innerException,
logLevel
)
{
}
public DataDictionaryDomainException(SerializationInfo serializationInfo, StreamingContext context) : base(
serializationInfo, context)
public DataDictionaryDomainException(SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context)
{
}
}

5
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementConsts.cs

@ -5,5 +5,10 @@ namespace Lion.AbpPro.DataDictionaryManagement
public class DataDictionaryManagementConsts
{
public static Guid SeedDataDictionaryId = new Guid("39fdb236-a90e-e4b5-02a0-2866a8cf9821");
/// <summary>名称空间</summary>
public const string NameSpace = "Lion.AbpPro.DataDictionaryManagement";
/// <summary>默认语言</summary>
public const string DefaultCultureName = "zh-Hans";
}
}

4
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementDomainSharedModule.cs

@ -23,14 +23,14 @@ namespace Lion.AbpPro.DataDictionaryManagement
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<DataDictionaryManagementResource>("en")
.Add<DataDictionaryManagementResource>(DataDictionaryManagementConsts.DefaultCultureName)
.AddBaseTypes(typeof(AbpValidationResource))
.AddVirtualJson("/Localization/DataDictionaryManagement");
});
Configure<AbpExceptionLocalizationOptions>(options =>
{
options.MapCodeNamespace("DataDictionaryManagement", typeof(DataDictionaryManagementResource));
options.MapCodeNamespace(DataDictionaryManagementConsts.NameSpace, typeof(DataDictionaryManagementResource));
});
}
}

5
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementErrorCodes.cs

@ -2,6 +2,9 @@ namespace Lion.AbpPro.DataDictionaryManagement
{
public static class DataDictionaryManagementErrorCodes
{
//Add your business exception error codes here...
public const string DataDictionaryExist =DataDictionaryManagementConsts.NameSpace+ ":100001";
public const string DataDictionaryNotExist =DataDictionaryManagementConsts.NameSpace+ ":100002";
public const string DataDictionaryDetailExist =DataDictionaryManagementConsts.NameSpace+ ":100003";
public const string DataDictionaryDetailNotExist =DataDictionaryManagementConsts.NameSpace+ ":100004";
}
}

8
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/en.json

@ -6,6 +6,12 @@
"Permission:DataDictionaryManagement": "DataDictionaryManagement",
"Permission:Create": "Create",
"Permission:Update": "Update",
"Permission:Delete": "Delete"
"Permission:Delete": "Delete",
"Lion.AbpPro.DataDictionaryManagement:100001": "DataDictionary Exist",
"Lion.AbpPro.DataDictionaryManagement:100002": "DataDictionary Not Exist",
"Lion.AbpPro.DataDictionaryManagement:100003": "DataDictionaryDetail Exist",
"Lion.AbpPro.DataDictionaryManagement:100004": "DataDictionaryDetail Not Exist"
}
}

7
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/zh-Hans.json

@ -6,6 +6,11 @@
"Permission:DataDictionaryManagement": "数据字典",
"Permission:Create": "创建",
"Permission:Update": "编辑",
"Permission:Delete": "删除"
"Permission:Delete": "删除",
"Lion.AbpPro.DataDictionaryManagement:100001": "数据字典已存在",
"Lion.AbpPro.DataDictionaryManagement:100002": "数据字典不存在",
"Lion.AbpPro.DataDictionaryManagement:100003": "数据字典明细已存在",
"Lion.AbpPro.DataDictionaryManagement:100004": "数据字典明细不存在"
}
}

113
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs

@ -4,8 +4,8 @@ using System.Threading;
using System.Threading.Tasks;
using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Aggregates;
using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Dto;
using Volo.Abp;
using Volo.Abp.Caching;
using Volo.Abp.Domain.Services;
namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{
@ -22,22 +22,28 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
_cache = cache;
}
public async Task<DataDictionaryDto> FindByIdAsync(
Guid id,
CancellationToken cancellationToken = default)
{
var cacheKey = DataDictionaryDto.CalculateCacheKey(id, null);
return await _cache.GetOrAddAsync(cacheKey,
return await _cache.GetOrAddAsync
(
cacheKey,
async () =>
{
var entity =
await _dataDictionaryRepository.FindByIdAsync(id, true,
cancellationToken);
await _dataDictionaryRepository.FindByIdAsync
(
id,
true,
cancellationToken
);
return ObjectMapper.Map<DataDictionary, DataDictionaryDto>(entity);
}, token: cancellationToken);
},
token: cancellationToken
);
}
public async Task<DataDictionaryDto> FindByCodeAsync(
@ -45,14 +51,22 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
CancellationToken cancellationToken = default)
{
var cacheKey = DataDictionaryDto.CalculateCacheKey(null, code);
return await _cache.GetOrAddAsync(cacheKey,
return await _cache.GetOrAddAsync
(
cacheKey,
async () =>
{
var entity =
await _dataDictionaryRepository.FindByCodeAsync(code, true,
cancellationToken);
await _dataDictionaryRepository.FindByCodeAsync
(
code,
true,
cancellationToken
);
return ObjectMapper.Map<DataDictionary, DataDictionaryDto>(entity);
}, token: cancellationToken);
},
token: cancellationToken
);
}
@ -62,10 +76,21 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
/// <param name="code"></param>
/// <param name="displayText"></param>
/// <param name="description"></param>
public Task<DataDictionary> CreateAsync(string code, string displayText, string description)
public async Task<DataDictionary> CreateAsync(string code, string displayText, string description)
{
var entity = new DataDictionary(GuidGenerator.Create(), code, displayText, description);
return _dataDictionaryRepository.InsertAsync(entity);
Check.NotNullOrWhiteSpace(code, nameof(code));
var entity = await _dataDictionaryRepository.FindByCodeAsync(code);
if (entity != null) throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryExist);
entity = new DataDictionary
(
GuidGenerator.Create(),
code,
displayText,
description
);
return await _dataDictionaryRepository.InsertAsync(entity);
}
/// <summary>
@ -77,36 +102,47 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
/// <param name="description"></param>
/// <param name="order"></param>
/// <exception cref="DataDictionaryDomainException"></exception>
public async Task<DataDictionary> CreateDetailAsync(Guid dataDictionaryId, string code,
public async Task<DataDictionary> CreateDetailAsync(
Guid dataDictionaryId,
string code,
string displayText,
string description,
int order)
{
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
if (entity.Details.Any(e => e.Code == code.Trim()))
{
throw new DataDictionaryDomainException(message: $"字典项{code}已存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailExist);
}
entity.AddDetail(GuidGenerator.Create(), code, displayText, order, description);
entity.AddDetail
(
GuidGenerator.Create(),
code,
displayText,
order,
description
);
return await _dataDictionaryRepository.UpdateAsync(entity);
}
/// <summary>
/// 设置字典明细状态
/// </summary>
public async Task<DataDictionary> SetStatus(Guid dataDictionaryId,
Guid dataDictionayDetailId, bool isEnabled)
public async Task<DataDictionary> SetStatus(
Guid dataDictionaryId,
Guid dataDictionayDetailId,
bool isEnabled)
{
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId);
if (null == detail)
{
throw new DataDictionaryDomainException(message: $"字典项不存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailExist);
}
detail.SetIsEnabled(isEnabled);
@ -125,14 +161,20 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId);
if (null == detail)
{
throw new DataDictionaryDomainException(message: $"字典项不存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailNotExist);
}
detail.UpdateDetail(dataDictionayDetailId, displayText, description, order);
detail.UpdateDetail
(
dataDictionayDetailId,
displayText,
description,
order
);
return await _dataDictionaryRepository.UpdateAsync(entity);
}
@ -140,27 +182,29 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId);
if (null == detail)
{
throw new DataDictionaryDomainException(message: $"字典项不存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailNotExist);
}
entity.Details.Remove(detail);
await _dataDictionaryRepository.UpdateAsync(entity);
}
public async Task<DataDictionary> UpdateAsync(Guid dataDictionaryId,
public async Task<DataDictionary> UpdateAsync(
Guid dataDictionaryId,
string displayText,
string description)
{
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在");
entity.Update(dataDictionaryId,displayText,description);
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
entity.Update(dataDictionaryId, displayText, description);
return await _dataDictionaryRepository.UpdateAsync(entity);
}
/// <summary>
/// 删除字典类型
/// </summary>
@ -170,13 +214,14 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{
var entity = await _dataDictionaryRepository.FindByIdAsync(id);
if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在");
throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.DataDictionaryId == id);
if (detail !=null )
if (detail != null)
{
entity.Details.Remove(detail);
await _dataDictionaryRepository.UpdateAsync(entity);
}
await _dataDictionaryRepository.DeleteAsync(id);
}
}

7
aspnet-core/modules/FileManagement/host/Lion.AbpPro.FileManagement.HttpApi.Host/appsettings.json

@ -18,9 +18,4 @@
"RoleArn": "acs:ram::1846393972471789:role/ramosstest"
}
}
}
//用户登录名称 lion.abp@1846393972471789.onaliyun.com
//AccessKey ID LTAI5tLkt3vvScGPVZ5qKJDc
//AccessKey Secret BixV8vP5uPrbsdwjYzzsEXOPjkxPST
//acs:ram::1846393972471789:role/ramosstest
}

2
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Application/Notifications/NotificationAppService.cs

@ -55,7 +55,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
await SendMessageToAllClientAsync(new SendNotificationDto(title, content, messageType));
break;
default:
throw new UserFriendlyException("未知的消息类型");
throw new BusinessException(NotificationManagementErrorCodes.MessageTypeUnknown);
}
}

6
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/en.json

@ -2,6 +2,10 @@
"culture": "en",
"texts": {
"ManageYourProfile": "Manage your profile",
"SamplePageMessage": "A sample page for the NotificationManagement module"
"SamplePageMessage": "A sample page for the NotificationManagement module",
"Lion.AbpPro.NotificationManagement:100001": "ReceiverNotNull",
"Lion.AbpPro.NotificationManagement:100002": "MessageNotExist",
"Lion.AbpPro.NotificationManagement:100003": "MessageTypeUnknown",
"Lion.AbpPro.NotificationManagement:100004": "UserUnSubscription"
}
}

7
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/zh-Hans.json

@ -2,6 +2,11 @@
"culture": "zh-Hans",
"texts": {
"ManageYourProfile": "管理个人资料",
"SamplePageMessage": "NotificationManagement模块的示例页面"
"SamplePageMessage": "NotificationManagement模块的示例页面",
"Lion.AbpPro.NotificationManagement:100001": "接收人不能为空",
"Lion.AbpPro.NotificationManagement:100002": "消息不存在",
"Lion.AbpPro.NotificationManagement:100003": "未知的消息类型",
"Lion.AbpPro.NotificationManagement:100004": "当前用户未订阅消息"
}
}

9
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementConsts.cs

@ -0,0 +1,9 @@
namespace Lion.AbpPro.NotificationManagement;
public class NotificationManagementConsts
{
/// <summary>名称空间</summary>
public const string NameSpace = "Lion.AbpPro.NotificationManagementConsts";
/// <summary>默认语言</summary>
public const string DefaultCultureName = "zh-Hans";
}

4
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementDomainSharedModule.cs

@ -23,14 +23,14 @@ namespace Lion.AbpPro.NotificationManagement
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<NotificationManagementResource>("en")
.Add<NotificationManagementResource>(NotificationManagementConsts.DefaultCultureName)
.AddBaseTypes(typeof(AbpValidationResource))
.AddVirtualJson("/Localization/NotificationManagement");
});
Configure<AbpExceptionLocalizationOptions>(options =>
{
options.MapCodeNamespace("NotificationManagement", typeof(NotificationManagementResource));
options.MapCodeNamespace(NotificationManagementConsts.NameSpace, typeof(NotificationManagementResource));
});
}
}

5
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementErrorCodes.cs

@ -2,6 +2,9 @@ namespace Lion.AbpPro.NotificationManagement
{
public static class NotificationManagementErrorCodes
{
//Add your business exception error codes here...
public const string ReceiverNotNull =NotificationManagementConsts.NameSpace+ ":100001";
public const string MessageNotExist =NotificationManagementConsts.NameSpace+ ":100002";
public const string MessageTypeUnknown =NotificationManagementConsts.NameSpace+ ":100003";
public const string UserUnSubscription =NotificationManagementConsts.NameSpace+ ":100004";
}
}

13
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/NotificationManagementDomainException.cs

@ -5,16 +5,17 @@ using Volo.Abp;
namespace Lion.AbpPro.NotificationManagement
{
public class NotificationManagementDomainException : UserFriendlyException
public class NotificationManagementDomainException : BusinessException
{
public NotificationManagementDomainException(string message, string code = null, string details = null,
Exception innerException = null, LogLevel logLevel = LogLevel.Warning) : base(message, code, details,
innerException, logLevel)
public NotificationManagementDomainException(string code = null, string message = null, string details = null, Exception innerException = null,
LogLevel logLevel = LogLevel.Warning) : base(code, message, details,
innerException,
logLevel
)
{
}
public NotificationManagementDomainException(SerializationInfo serializationInfo, StreamingContext context) :
base(serializationInfo, context)
public NotificationManagementDomainException(SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context)
{
}
}

6
aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/NotificationManager.cs

@ -32,7 +32,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
{
if (receiveIds is {Count: 0})
{
throw new NotificationManagementDomainException("消息接收人不能为空");
throw new NotificationManagementDomainException(NotificationManagementErrorCodes.ReceiverNotNull);
}
var senderId = Guid.Empty;
@ -113,7 +113,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
public async Task SetReadAsync(Guid id, Guid receiveId)
{
var notification = await _notificationRepository.FindByIdAsync(id);
if (notification == null) throw new NotificationManagementDomainException(message: "消息不存在");
if (notification == null) throw new NotificationManagementDomainException(NotificationManagementErrorCodes.MessageNotExist);
if (notification.MessageType == MessageType.BroadCast)
{
// 如果类型是广播消息,用户设置为已读,在插入一条数据
@ -124,7 +124,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
var notificationSubscription =
notification.NotificationSubscriptions.FirstOrDefault(e => e.ReceiveId == receiveId);
if (notificationSubscription == null)
throw new NotificationManagementDomainException(message: "当前用户未订阅该消息");
throw new NotificationManagementDomainException(NotificationManagementErrorCodes.UserUnSubscription);
notificationSubscription.SetRead();
}

3
aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/AbpProHttpApiHostModule.cs

@ -135,9 +135,6 @@ namespace Lion.AbpPro
/// <param name="context"></param>
private void ConfigureAbpExceptions(ServiceConfigurationContext context)
{
//开启后通过ErrorCode抛本地化异常,message不会显示本地化词条
var SendExceptionsDetails = context.Services.GetHostingEnvironment().IsDevelopment();
context.Services.Configure<AbpExceptionHandlingOptions>(options => { options.SendExceptionsDetailsToClients = SendExceptionsDetails; });
context.Services.AddMvc(options => { options.Filters.Add(typeof(ResultExceptionFilter)); });
}

66
aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.Staging.json

@ -0,0 +1,66 @@
{
"App": {
"SelfUrl": "http://localhost:44315",
"CorsOrigins": "https://*.AbpPro.com,http://localhost:4200,http://localhost:3100"
},
"ConnectionStrings": {
"Default": "Data Source=120.24.194.14;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
},
"Redis": {
"Configuration": "localhost,password=mypassword,defaultdatabase=1"
},
"Jwt": {
"Audience": "http://localhost:5010",
"SecurityKey": "dzehzRz9a8asdfasfdadfasdfasdfafsdadfasbasdf=",
"Issuer": "YHWmsOperationApiGateway",
"ExpirationTime": 30
},
"Cap": {
"Enabled": "true",
"RabbitMq": {
"HostName": "localhost",
"UserName": "admin",
"Password": "admin"
}
},
"ElasticSearch": {
"Enabled": "false",
"Url": "http://es.cn",
"IndexFormat": "Lion.AbpPro.development.{0:yyyy.MM.dd}",
"UserName": "elastic",
"Password": "aVVhjQ95RP7nbwNy",
"SearchIndexFormat": "Lion.AbpPro.development*"
},
"HttpClient": {
"Sts": {
"Name": "Sts",
"Url": "http://localhost:44354"
},
"Github": {
"Name": "Github",
"Url": "https://github.com",
"ClientId": "127fc528f611879fba03",
"ClientSecret": "fd0914e9e8e28b51dd5efe381121429279e43973"
},
"GithubApi": {
"Name": "GithubApi",
"Url": "https://api.github.com",
"ClientName": "AbpPro"
}
},
"Consul": {
"Enabled": false,
"Host": "http://localhost:8500",
"Service": "Project-Service"
},
"AliYun": {
"OSS": {
"AccessKeyId": "LTAI5tLkt3vvScGPVZ5qKJDc1S",
"AccessKeySecret": "BixV8vP5uPrbsdwjYzzsEXOPjkxPST2S",
"Endpoint": "oss-cn-shenzhen.aliyuncs.com",
"ContainerName": "lion-abp-pro",
"RegionId": "oss-cn-shenzhen",
"RoleArn": "acs:ram::1846393972471789:role/ramosstestst"
}
}
}

5
aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json

@ -1,4 +1,5 @@
{
"Serilog1": "12",
"Serilog": {
"Using": [
"Serilog.Sinks.Console",
@ -12,7 +13,7 @@
"Hangfire": "Information",
"DotNetCore.CAP": "Information",
"Serilog.AspNetCore": "Information",
"Microsoft.EntityFrameworkCore": "Information"
"Microsoft.EntityFrameworkCore": "Warning"
}
},
"WriteTo": [
@ -33,7 +34,7 @@
"CorsOrigins": "https://*.AbpPro.com,http://localhost:4200,http://localhost:3100"
},
"ConnectionStrings": {
"Default": "Data Source=localhost;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
"Default": "Data Source=localhost;Port=3306;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
},
"Redis": {
"Configuration": "localhost,password=mypassword,defaultdatabase=1"

11
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/AddRoleToOrganizationUnitInput.cs

@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class AddRoleToOrganizationUnitInput
{
public List<Guid> RoleId { get; set; }
public Guid OrganizationUnitId { get; set; }
}

11
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/AddUserToOrganizationUnitInput.cs

@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class AddUserToOrganizationUnitInput
{
public List<Guid> UserId { get; set; }
public Guid OrganizationUnitId { get; set; }
}

11
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/CreateOrganizationUnitInput.cs

@ -0,0 +1,11 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class CreateOrganizationUnitInput
{
[Required] public string DisplayName { get; set; }
public Guid? ParentId { get; set; }
}

10
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetOrganizationUnitRoleInput.cs

@ -0,0 +1,10 @@
using System;
using Lion.AbpPro.Extension.Customs.Dtos;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class GetOrganizationUnitRoleInput : PagingBase
{
public Guid OrganizationUnitId { get; set; }
}

11
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetOrganizationUnitRoleOutput.cs

@ -0,0 +1,11 @@
using System;
using Lion.AbpPro.Extension.Customs.Dtos;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class GetOrganizationUnitRoleOutput
{
public Guid Id { get; set; }
public string Name { get; set; }
}

11
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetOrganizationUnitUserInput.cs

@ -0,0 +1,11 @@
using System;
using Lion.AbpPro.Extension.Customs.Dtos;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class GetOrganizationUnitUserInput : PagingBase
{
public Guid OrganizationUnitId { get; set; }
public string Filter { get; set; }
}

13
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetOrganizationUnitUserOutput.cs

@ -0,0 +1,13 @@
using System;
using Lion.AbpPro.Extension.Customs.Dtos;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class GetOrganizationUnitUserOutput
{
public Guid Id { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
}

11
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetUnAddRoleInput.cs

@ -0,0 +1,11 @@
using System;
using Lion.AbpPro.Extension.Customs.Dtos;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class GetUnAddRoleInput : PagingBase
{
public Guid OrganizationUnitId { get; set; }
public string Filter { get; set; }
}

10
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetUnAddRoleOutput.cs

@ -0,0 +1,10 @@
using System;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class GetUnAddRoleOutput
{
public Guid Id { get; set; }
public string Name { get; set; }
}

11
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetUnAddUserInput.cs

@ -0,0 +1,11 @@
using System;
using Lion.AbpPro.Extension.Customs.Dtos;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class GetUnAddUserInput : PagingBase
{
public Guid OrganizationUnitId { get; set; }
public string Filter { get; set; }
}

12
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/GetUnAddUserOutput.cs

@ -0,0 +1,12 @@
using System;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class GetUnAddUserOutput
{
public Guid Id { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
}

16
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/OrganizationUnitDto.cs

@ -0,0 +1,16 @@
using System;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class OrganizationUnitDto
{
public Guid Id { get; set; }
public Guid? TenantId { get; set; }
public string Code { get; set; }
public string DisplayName { get; set; }
public Guid? ParentId { get; set; }
}

10
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/RemoveRoleToOrganizationUnitInput.cs

@ -0,0 +1,10 @@
using System;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class RemoveRoleToOrganizationUnitInput
{
public Guid RoleId { get; set; }
public Guid OrganizationUnitId { get; set; }
}

10
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/RemoveUserToOrganizationUnitInput.cs

@ -0,0 +1,10 @@
using System;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class RemoveUserToOrganizationUnitInput
{
public Guid UserId { get; set; }
public Guid OrganizationUnitId { get; set; }
}

13
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/TreeOutput.cs

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class TreeOutput
{
public string Title { get; set; }
public Guid Key { get; set; }
public List<TreeOutput> Children { get; set; }
}

11
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/Dto/UpdateOrganizationUnitInput.cs

@ -0,0 +1,11 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace Lion.AbpPro.OrganizationUnits.Dto;
public class UpdateOrganizationUnitInput
{
[Required] public string DisplayName { get; set; }
public Guid Id { get; set; }
}

73
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/OrganizationUnits/IOrganizationUnitAppService.cs

@ -0,0 +1,73 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Lion.AbpPro.Extension.Customs.Dtos;
using Lion.AbpPro.OrganizationUnits.Dto;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace Lion.AbpPro.OrganizationUnits;
public interface IOrganizationUnitAppService : IApplicationService
{
/// <summary>
/// 获取组织机构树结构
/// </summary>
/// <returns></returns>
Task<List<TreeOutput>> GetTreeAsync();
/// <summary>
/// 创建组织机构
/// </summary>
Task CreateAsync(CreateOrganizationUnitInput input);
/// <summary>
/// 删除组织机构
/// </summary>
Task DeleteAsync(IdInput input);
/// <summary>
/// 编辑组织机构
/// </summary>
Task UpdateAsync(UpdateOrganizationUnitInput input);
/// <summary>
/// 向组织机构添加角色
/// </summary>
Task AddRoleToOrganizationUnitAsync(AddRoleToOrganizationUnitInput input);
/// <summary>
/// 向组织机构删除角色
/// </summary>
Task RemoveRoleFromOrganizationUnitAsync(RemoveRoleToOrganizationUnitInput input);
/// <summary>
/// 向组织机构添加用户
/// </summary>
Task AddUserToOrganizationUnitAsync(AddUserToOrganizationUnitInput input);
/// <summary>
/// 向组织机构删除用户
/// </summary>
Task RemoveUserFromOrganizationUnitAsync(RemoveUserToOrganizationUnitInput input);
/// <summary>
/// 分页获取组织机构下用户
/// </summary>
Task<PagedResultDto<GetOrganizationUnitUserOutput>> GetUsersAsync(GetOrganizationUnitUserInput input);
/// <summary>
/// 分页获取组织机构下角色
/// </summary>
Task<PagedResultDto<GetOrganizationUnitRoleOutput>> GetRolesAsync(GetOrganizationUnitRoleInput input);
/// <summary>
/// 获取不在组织机构的用户
/// </summary>
Task<PagedResultDto<GetUnAddUserOutput>> GetUnAddUsersAsync(GetUnAddUserInput input);
/// <summary>
/// 获取不在组织机构的角色
/// </summary>
Task<PagedResultDto<GetUnAddRoleOutput>> GetUnAddRolessAsync(GetUnAddRoleInput input);
}

158
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissionDefinitionProvider.cs

@ -19,55 +19,141 @@ namespace Lion.AbpPro.Permissions
abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.AuditLog, L("Permission:AuditLogManagement"));
var esManagement = abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.ES, L("Permission:ESManagement"));
var settingManagement = abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.Setting, L("Permission:SettingManagement"));
var organizationUnitManagement = abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.OrganizationUnit, L("Permission:OrganizationUnitManagement"));
organizationUnitManagement.AddChild
(
AbpProPermissions.SystemManagement.OrganizationUnitManagement.Create,
L("Permission:Create")
);
organizationUnitManagement.AddChild
(
AbpProPermissions.SystemManagement.OrganizationUnitManagement.Update,
L("Permission:Update")
);
organizationUnitManagement.AddChild
(
AbpProPermissions.SystemManagement.OrganizationUnitManagement.Delete,
L("Permission:Delete")
);
#region IdentityServer
// multiTenancySide: MultiTenancySides.Host 只有host租户才有权限
var identityServerManagementGroup =
context.AddGroup(AbpProPermissions.IdentityServer.IdentityServerManagement, L("Permission:IdentityServerManagement"),
multiTenancySide: MultiTenancySides.Host);
context.AddGroup
(
AbpProPermissions.IdentityServer.IdentityServerManagement,
L("Permission:IdentityServerManagement"),
multiTenancySide: MultiTenancySides.Host
);
var clientManagment = identityServerManagementGroup.AddPermission(AbpProPermissions.IdentityServer.Client.Default,
L("Permission:IdentityServerManagement:Client"),multiTenancySide: MultiTenancySides.Host);
clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Create,
L("Permission:Create"),multiTenancySide: MultiTenancySides.Host);
clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Update,
L("Permission:Update"),multiTenancySide: MultiTenancySides.Host);
clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Delete,
L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host);
clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Enable,
L("Permission:Enable"),multiTenancySide: MultiTenancySides.Host);
var clientManagment = identityServerManagementGroup.AddPermission
(
AbpProPermissions.IdentityServer.Client.Default,
L("Permission:IdentityServerManagement:Client"),
multiTenancySide: MultiTenancySides.Host
);
clientManagment.AddChild
(
AbpProPermissions.IdentityServer.Client.Create,
L("Permission:Create"),
multiTenancySide: MultiTenancySides.Host
);
clientManagment.AddChild
(
AbpProPermissions.IdentityServer.Client.Update,
L("Permission:Update"),
multiTenancySide: MultiTenancySides.Host
);
clientManagment.AddChild
(
AbpProPermissions.IdentityServer.Client.Delete,
L("Permission:Delete"),
multiTenancySide: MultiTenancySides.Host
);
clientManagment.AddChild
(
AbpProPermissions.IdentityServer.Client.Enable,
L("Permission:Enable"),
multiTenancySide: MultiTenancySides.Host
);
var apiResourceManagment = identityServerManagementGroup.AddPermission(
var apiResourceManagment = identityServerManagementGroup.AddPermission
(
AbpProPermissions.IdentityServer.ApiResource.Default,
L("Permission:IdentityServerManagement:ApiResource"),multiTenancySide: MultiTenancySides.Host);
apiResourceManagment.AddChild(AbpProPermissions.IdentityServer.ApiResource.Create,
L("Permission:Create"),multiTenancySide: MultiTenancySides.Host);
apiResourceManagment.AddChild(AbpProPermissions.IdentityServer.ApiResource.Update,
L("Permission:Update"),multiTenancySide: MultiTenancySides.Host);
apiResourceManagment.AddChild(AbpProPermissions.IdentityServer.ApiResource.Delete,
L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host);
L("Permission:IdentityServerManagement:ApiResource"),
multiTenancySide: MultiTenancySides.Host
);
apiResourceManagment.AddChild
(
AbpProPermissions.IdentityServer.ApiResource.Create,
L("Permission:Create"),
multiTenancySide: MultiTenancySides.Host
);
apiResourceManagment.AddChild
(
AbpProPermissions.IdentityServer.ApiResource.Update,
L("Permission:Update"),
multiTenancySide: MultiTenancySides.Host
);
apiResourceManagment.AddChild
(
AbpProPermissions.IdentityServer.ApiResource.Delete,
L("Permission:Delete"),
multiTenancySide: MultiTenancySides.Host
);
var apiScopeManagment = identityServerManagementGroup.AddPermission(AbpProPermissions.IdentityServer.ApiScope.Default,
L("Permission:IdentityServerManagement:ApiScope"),multiTenancySide: MultiTenancySides.Host);
apiScopeManagment.AddChild(AbpProPermissions.IdentityServer.ApiScope.Create,
L("Permission:Create"),multiTenancySide: MultiTenancySides.Host);
apiScopeManagment.AddChild(AbpProPermissions.IdentityServer.ApiScope.Update,
L("Permission:Update"),multiTenancySide: MultiTenancySides.Host);
apiScopeManagment.AddChild(AbpProPermissions.IdentityServer.ApiScope.Delete,
L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host);
var apiScopeManagment = identityServerManagementGroup.AddPermission
(
AbpProPermissions.IdentityServer.ApiScope.Default,
L("Permission:IdentityServerManagement:ApiScope"),
multiTenancySide: MultiTenancySides.Host
);
apiScopeManagment.AddChild
(
AbpProPermissions.IdentityServer.ApiScope.Create,
L("Permission:Create"),
multiTenancySide: MultiTenancySides.Host
);
apiScopeManagment.AddChild
(
AbpProPermissions.IdentityServer.ApiScope.Update,
L("Permission:Update"),
multiTenancySide: MultiTenancySides.Host
);
apiScopeManagment.AddChild
(
AbpProPermissions.IdentityServer.ApiScope.Delete,
L("Permission:Delete"),
multiTenancySide: MultiTenancySides.Host
);
var identityResourcesManagment = identityServerManagementGroup.AddPermission(
var identityResourcesManagment = identityServerManagementGroup.AddPermission
(
AbpProPermissions.IdentityServer.IdentityResources.Default,
L("Permission:IdentityServerManagement:IdentityResources"),multiTenancySide: MultiTenancySides.Host);
identityResourcesManagment.AddChild(AbpProPermissions.IdentityServer.IdentityResources.Create,
L("Permission:Create"),multiTenancySide: MultiTenancySides.Host);
identityResourcesManagment.AddChild(AbpProPermissions.IdentityServer.IdentityResources.Update,
L("Permission:Update"),multiTenancySide: MultiTenancySides.Host);
identityResourcesManagment.AddChild(AbpProPermissions.IdentityServer.IdentityResources.Delete,
L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host);
L("Permission:IdentityServerManagement:IdentityResources"),
multiTenancySide: MultiTenancySides.Host
);
identityResourcesManagment.AddChild
(
AbpProPermissions.IdentityServer.IdentityResources.Create,
L("Permission:Create"),
multiTenancySide: MultiTenancySides.Host
);
identityResourcesManagment.AddChild
(
AbpProPermissions.IdentityServer.IdentityResources.Update,
L("Permission:Update"),
multiTenancySide: MultiTenancySides.Host
);
identityResourcesManagment.AddChild
(
AbpProPermissions.IdentityServer.IdentityResources.Delete,
L("Permission:Delete"),
multiTenancySide: MultiTenancySides.Host
);
#endregion
}

8
aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissions.cs

@ -15,6 +15,14 @@ namespace Lion.AbpPro.Permissions
public const string AuditLog = Default + ".AuditLog";
public const string ES = Default + ".ES";
public const string Setting = Default + ".Setting";
public const string OrganizationUnit = Default + ".OrganizationUnitManagement";
public static class OrganizationUnitManagement
{
public const string Default = SystemManagement.Default + ".OrganizationUnitManagement";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
}

6
aspnet-core/services/src/Lion.AbpPro.Application/AbpProApplicationAutoMapperProfile.cs

@ -1,4 +1,5 @@
using AutoMapper;
using Lion.AbpPro.OrganizationUnits.Dto;
using Lion.AbpPro.Users.Dtos;
using Volo.Abp.Identity;
@ -14,6 +15,11 @@ namespace Lion.AbpPro
CreateMap<IdentityUser, ExportIdentityUserOutput>()
.ForMember(e => e.CreationTimeFormat, opt => opt.Ignore())
.ForMember(e => e.Status, opt => opt.Ignore());
CreateMap<OrganizationUnit, OrganizationUnitDto>();
CreateMap<IdentityUser, GetOrganizationUnitUserOutput>();
CreateMap<IdentityUser, GetUnAddUserOutput>();
CreateMap<IdentityRole, GetOrganizationUnitRoleOutput>();
CreateMap<IdentityRole, GetUnAddRoleOutput>();
}
}
}

74
aspnet-core/services/src/Lion.AbpPro.Application/ElasticSearchs/LionAbpProLogAppService.cs

@ -5,6 +5,7 @@ using System.Threading.Tasks;
using Lion.AbpPro.ElasticSearchs.Dto;
using Lion.AbpPro.ElasticSearchs.Providers;
using Lion.AbpPro.Extension.Customs.Dtos;
using Lion.AbpPro.Extension.System;
using Lion.AbpPro.Permissions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Configuration;
@ -13,11 +14,11 @@ using Nest;
namespace Lion.AbpPro.ElasticSearchs
{
[Authorize(Policy = AbpProPermissions.SystemManagement.ES)]
public class LionAbpProLogAppService : ElasticsearchBasicService,
ILionAbpProLogAppService
public class LionAbpProLogAppService : ElasticsearchBasicService,ILionAbpProLogAppService
{
private readonly IConfiguration _configuration;
// 时区
private const string TimeZone = "Asia/Shanghai";
public LionAbpProLogAppService(
IElasticsearchProvider elasticsearchProvider,
IConfiguration configuration) : base(elasticsearchProvider)
@ -25,49 +26,54 @@ namespace Lion.AbpPro.ElasticSearchs
_configuration = configuration;
}
public async Task<CustomePagedResultDto<PagingElasticSearchLogOutput>> PaingAsync(
PagingElasticSearchLogInput input)
public async Task<CustomePagedResultDto<PagingElasticSearchLogOutput>> PaingAsync(PagingElasticSearchLogInput input)
{
var IndexName =
_configuration.GetValue<string>("ElasticSearch:SearchIndexFormat");
var IndexName = _configuration.GetValue<string>("ElasticSearch:SearchIndexFormat");
// 默认查询当天
input.StartCreationTime = input.StartCreationTime?.AddMilliseconds(-1) ??
DateTime.Now.Date.AddMilliseconds(-1);
input.EndCreationTime =
input.EndCreationTime?.AddDays(1).AddMilliseconds(-1) ??
DateTime.Now.Date.AddDays(1).AddMilliseconds(-1);
var mustFilters =
new List<Func<QueryContainerDescriptor<PagingElasticSearchLogDto>,
QueryContainer>>
{
t => t.DateRange(f =>
f.Field(fd => fd.CreationTime).TimeZone("Asia/Shanghai")
.GreaterThanOrEquals(input.StartCreationTime.Value)),
t => t.DateRange(
f => f.Field(fd => fd.CreationTime).TimeZone("Asia/Shanghai")
.LessThanOrEquals(input.EndCreationTime.Value))
};
input.StartCreationTime = input.StartCreationTime?.AddMilliseconds(-1) ??DateTime.Now.Date.AddMilliseconds(-1);
input.EndCreationTime =input.EndCreationTime?.AddDays(1).AddMilliseconds(-1) ??DateTime.Now.Date.AddDays(1).AddMilliseconds(-1);
var mustFilters = new List<Func<QueryContainerDescriptor<PagingElasticSearchLogDto>, QueryContainer>>();
if (input.StartCreationTime.HasValue)
{
input.StartCreationTime = input.StartCreationTime.ToCurrentDateMaxDateTime();
mustFilters.Add(e => e.DateRange(f => f.Field(fd => fd.CreationTime).TimeZone(TimeZone).GreaterThanOrEquals(input.StartCreationTime)));
}
if (input.EndCreationTime.HasValue)
{
input.EndCreationTime = input.EndCreationTime.ToNextSecondDateTime();
mustFilters.Add(e => e.DateRange(f => f.Field(fd => fd.CreationTime).TimeZone(TimeZone).LessThanOrEquals(input.EndCreationTime)));
}
if (!string.IsNullOrWhiteSpace(input.Filter))
{
mustFilters.Add(t =>
t.MatchPhrase(f => f.Field(fd => fd.Message).Query(input.Filter.Trim())));
mustFilters.Add
(
t =>t.MatchPhrase(f => f.Field(fd => fd.Message).Query(input.Filter.Trim()))
);
}
var result = await Client.SearchAsync<PagingElasticSearchLogDto>(e => e
.Index(IndexName)
.From(input.SkipCount)
.Size(input.PageSize)
.Sort(s => s.Descending(sd => sd.CreationTime))
.Query(q => q.Bool(qb => qb.Filter(mustFilters))));
var result = await Client.SearchAsync<PagingElasticSearchLogDto>
(
e => e
.Index(IndexName)
.From(input.SkipCount)
.Size(input.PageSize)
.Sort(s => s.Descending(sd => sd.CreationTime))
.Query(q => q.Bool(qb => qb.Filter(mustFilters)))
);
if (result.HitsMetadata != null)
{
return new CustomePagedResultDto<PagingElasticSearchLogOutput>(
return new CustomePagedResultDto<PagingElasticSearchLogOutput>
(
result.HitsMetadata.Total.Value,
ObjectMapper
.Map<List<PagingElasticSearchLogDto>, List<PagingElasticSearchLogOutput>>(
result.Documents.ToList()));
.Map<List<PagingElasticSearchLogDto>, List<PagingElasticSearchLogOutput>>
(
result.Documents.ToList()
)
);
}
return null;

210
aspnet-core/services/src/Lion.AbpPro.Application/OrganizationUnits/OrganizationUnitAppService.cs

@ -0,0 +1,210 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Lion.AbpPro.Extension.Customs.Dtos;
using Lion.AbpPro.OrganizationUnits.Dto;
using Lion.AbpPro.Permissions;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Identity;
namespace Lion.AbpPro.OrganizationUnits;
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Default)]
public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitAppService
{
private readonly OrganizationUnitManager _organizationUnitManager;
private readonly IdentityUserManager _identityUserManager;
private readonly IOrganizationUnitRepository _organizationUnitRepository;
public OrganizationUnitAppService(
OrganizationUnitManager OrganizationUnitManager,
IdentityUserManager identityUserManager,
IOrganizationUnitRepository organizationUnitRepository)
{
_organizationUnitManager = OrganizationUnitManager;
_identityUserManager = identityUserManager;
_organizationUnitRepository = organizationUnitRepository;
}
public async Task<List<TreeOutput>> GetTreeAsync()
{
var organizationUnits = await _organizationUnitRepository.GetListAsync();
var organizationUnitDtos = ObjectMapper.Map<List<OrganizationUnit>, List<OrganizationUnitDto>>(organizationUnits);
return ConvertToTree(organizationUnitDtos);
}
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Create)]
public async Task CreateAsync(CreateOrganizationUnitInput input)
{
var entity = new OrganizationUnit
(
GuidGenerator.Create(),
input.DisplayName,
input.ParentId,
CurrentTenant.Id
);
await _organizationUnitManager.CreateAsync(entity);
}
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Delete)]
public Task DeleteAsync(IdInput input)
{
return _organizationUnitManager.DeleteAsync(input.Id);
}
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Update)]
public async Task UpdateAsync(UpdateOrganizationUnitInput input)
{
var entity = await _organizationUnitRepository.FindAsync(input.Id);
if (entity != null)
{
entity.DisplayName = input.DisplayName;
await _organizationUnitManager.UpdateAsync(entity);
}
}
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Create)]
public async Task AddRoleToOrganizationUnitAsync(AddRoleToOrganizationUnitInput input)
{
foreach (var roleId in input.RoleId)
{
await _organizationUnitManager.AddRoleToOrganizationUnitAsync(roleId, input.OrganizationUnitId);
}
}
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Delete)]
public async Task RemoveRoleFromOrganizationUnitAsync(RemoveRoleToOrganizationUnitInput input)
{
await _organizationUnitManager.RemoveRoleFromOrganizationUnitAsync(input.RoleId, input.OrganizationUnitId);
}
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Create)]
public async Task AddUserToOrganizationUnitAsync(AddUserToOrganizationUnitInput input)
{
foreach (var userId in input.UserId)
{
await _identityUserManager.AddToOrganizationUnitAsync(userId, input.OrganizationUnitId);
}
}
[Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Delete)]
public async Task RemoveUserFromOrganizationUnitAsync(RemoveUserToOrganizationUnitInput input)
{
await _identityUserManager.RemoveFromOrganizationUnitAsync(input.UserId, input.OrganizationUnitId);
}
public async Task<PagedResultDto<GetOrganizationUnitUserOutput>> GetUsersAsync(GetOrganizationUnitUserInput input)
{
var listResult = new List<GetOrganizationUnitUserOutput>();
var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId);
if (organizationUnit == null) throw new BusinessException(AbpProDomainErrorCodes.OrganizationUnitNotExist);
var count = await _organizationUnitRepository.GetMembersCountAsync(organizationUnit, filter: input.Filter);
if (count > 0)
{
var list = await _organizationUnitRepository.GetMembersAsync
(
organizationUnit,
maxResultCount: input.PageSize,
skipCount: input.SkipCount,
filter: input.Filter
);
listResult = ObjectMapper.Map<List<IdentityUser>, List<GetOrganizationUnitUserOutput>>(list);
}
return new PagedResultDto<GetOrganizationUnitUserOutput>(count, listResult);
}
public async Task<PagedResultDto<GetUnAddUserOutput>> GetUnAddUsersAsync(GetUnAddUserInput input)
{
var listResult = new List<GetUnAddUserOutput>();
var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId);
if (organizationUnit == null) throw new BusinessException(AbpProDomainErrorCodes.OrganizationUnitNotExist);
var count = await _organizationUnitRepository.GetUnaddedUsersCountAsync(organizationUnit, input.Filter);
if (count > 0)
{
var users = await _organizationUnitRepository.GetUnaddedUsersAsync
(
organizationUnit,
maxResultCount: input.PageSize,
skipCount: input.SkipCount,
filter: input.Filter
);
listResult = ObjectMapper.Map<List<IdentityUser>, List<GetUnAddUserOutput>>(users);
}
return new PagedResultDto<GetUnAddUserOutput>(count, listResult);
}
public async Task<PagedResultDto<GetOrganizationUnitRoleOutput>> GetRolesAsync(GetOrganizationUnitRoleInput input)
{
var listResult = new List<GetOrganizationUnitRoleOutput>();
var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId);
if (organizationUnit == null) throw new BusinessException(AbpProDomainErrorCodes.OrganizationUnitNotExist);
var count = await _organizationUnitRepository.GetRolesCountAsync(organizationUnit);
if (count > 0)
{
var list = await _organizationUnitRepository.GetRolesAsync(organizationUnit, maxResultCount: input.PageSize, skipCount: input.SkipCount);
listResult = ObjectMapper.Map<List<IdentityRole>, List<GetOrganizationUnitRoleOutput>>(list);
}
return new PagedResultDto<GetOrganizationUnitRoleOutput>(count, listResult);
}
public async Task<PagedResultDto<GetUnAddRoleOutput>> GetUnAddRolessAsync(GetUnAddRoleInput input)
{
var listResult = new List<GetUnAddRoleOutput>();
var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId);
if (organizationUnit == null) throw new BusinessException(AbpProDomainErrorCodes.OrganizationUnitNotExist);
var count = await _organizationUnitRepository.GetUnaddedRolesCountAsync(organizationUnit, input.Filter);
if (count > 0)
{
var roles = await _organizationUnitRepository.GetUnaddedRolesAsync
(
organizationUnit,
maxResultCount: input.PageSize,
skipCount: input.SkipCount,
filter: input.Filter
);
listResult = ObjectMapper.Map<List<IdentityRole>, List<GetUnAddRoleOutput>>(roles);
}
return new PagedResultDto<GetUnAddRoleOutput>(count, listResult);
}
#region 私有方法
private List<TreeOutput> ConvertToTree(
List<OrganizationUnitDto> list,
Guid? Id = null)
{
var result = new List<TreeOutput>();
var childList = Children(list, Id);
foreach (var item in childList)
{
var tree = new TreeOutput
{
Key = item.Id,
Title = item.DisplayName,
Children = ConvertToTree(list, item.Id)
};
result.Add(tree);
}
return result;
}
private List<OrganizationUnitDto> Children(
List<OrganizationUnitDto> list,
Guid? Id)
{
var childList = list.Where(x => x.ParentId == Id).ToList();
return childList;
}
#endregion
}

17
aspnet-core/services/src/Lion.AbpPro.Application/Users/AccountAppService.cs

@ -10,10 +10,12 @@ using Lion.AbpPro.ConfigurationOptions;
using Lion.AbpPro.Users.Dtos;
using IdentityModel;
using Lion.AbpPro.Extension.Customs.Http;
using Lion.AbpPro.NotificationManagement.Notifications;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using Volo.Abp;
using Volo.Abp.Authorization;
using Volo.Abp.Identity;
using Volo.Abp.Security.Claims;
@ -27,9 +29,8 @@ namespace Lion.AbpPro.Users
private readonly Microsoft.AspNetCore.Identity.SignInManager<IdentityUser> _signInManager;
private readonly IHttpClientFactory _httpClientFactory;
private readonly IConfiguration _configuretion;
private readonly Volo.Abp.Domain.Repositories.IRepository<IdentityRole> _identityRoleRepository;
public AccountAppService(
IdentityUserManager userManager,
IOptionsSnapshot<JwtOptions> jwtOptions,
@ -52,12 +53,12 @@ namespace Lion.AbpPro.Users
var result = await _signInManager.PasswordSignInAsync(input.Name, input.Password, false, true);
if (result.IsNotAllowed)
{
throw new UserFriendlyException("当前用户已锁定");
throw new BusinessException(AbpProDomainErrorCodes.UserLockedOut);
}
if (!result.Succeeded)
{
throw new UserFriendlyException("用户名或者密码错误");
throw new BusinessException(AbpProDomainErrorCodes.UserOrPasswordMismatch);
}
var user = await _userManager.FindByNameAsync(input.Name);
@ -77,7 +78,7 @@ namespace Lion.AbpPro.Users
var user = await _userManager.FindByNameAsync(response.name);
if (!user.IsActive)
{
throw new UserFriendlyException("当前用户已锁定");
throw new BusinessException(AbpProDomainErrorCodes.UserLockedOut);
}
return await BuildResult(user);
@ -116,7 +117,7 @@ namespace Lion.AbpPro.Users
{
var result = new LoginOutput();
var roles = await _identityRoleRepository.GetListAsync(e => e.IsDefault);
if (roles == null || roles.Count == 0) throw new UserFriendlyException("系统未配置默认角色");
if (roles == null || roles.Count == 0) throw new AbpAuthorizationException();
var userId = GuidGenerator.Create();
var user = new IdentityUser(userId, userName, email)
@ -139,9 +140,9 @@ namespace Lion.AbpPro.Users
private async Task<LoginOutput> BuildResult(IdentityUser user)
{
if (!user.IsActive) throw new UserFriendlyException("当前用户已被锁定");
if (!user.IsActive) throw new BusinessException(AbpProDomainErrorCodes.UserLockedOut);
var roles = await _userManager.GetRolesAsync(user);
if (roles == null || roles.Count == 0) throw new UserFriendlyException("当前用户未分配角色");
if (roles == null || roles.Count == 0) throw new AbpAuthorizationException();
var token = GenerateJwt(user.Id, user.UserName, user.Name, user.Email,
user.TenantId.ToString(), roles.ToList());
var loginOutput = ObjectMapper.Map<IdentityUser, LoginOutput>(user);

5
aspnet-core/services/src/Lion.AbpPro.Application/Users/UserAppService.cs

@ -4,6 +4,7 @@ using System.Linq;
using System.Threading.Tasks;
using Lion.AbpPro.Users.Dtos;
using Lion.AbpPro.Extension.Customs.Dtos;
using Lion.AbpPro.NotificationManagement.Notifications;
using Lion.AbpPro.Permissions;
using Magicodes.ExporterAndImporter.Excel;
using Magicodes.ExporterAndImporter.Excel.AspNetCore;
@ -27,13 +28,13 @@ namespace Lion.AbpPro.Users
private readonly IIdentityUserRepository _identityUserRepository;
private readonly IExcelExporter _excelExporter;
private readonly IOptions<IdentityOptions> _options;
public UserAppService(
IIdentityUserAppService identityUserAppService,
IdentityUserManager userManager,
IIdentityUserRepository userRepository,
IExcelExporter excelExporter,
IOptions<IdentityOptions> options)
IOptions<IdentityOptions> options,
NotificationManager notificationManager)
{
_identityUserAppService = identityUserAppService;
_userManager = userManager;

23
aspnet-core/services/src/Lion.AbpPro.DbMigrator/DbMigratorHostedService.cs

@ -1,8 +1,10 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Lion.AbpPro.Data;
using Microsoft.Extensions.Configuration;
using Serilog;
using Volo.Abp;
@ -11,28 +13,31 @@ namespace Lion.AbpPro.DbMigrator
public class DbMigratorHostedService : IHostedService
{
private readonly IHostApplicationLifetime _hostApplicationLifetime;
public DbMigratorHostedService(IHostApplicationLifetime hostApplicationLifetime)
private readonly IConfiguration _configuration;
public DbMigratorHostedService(IHostApplicationLifetime hostApplicationLifetime,
IConfiguration configuration)
{
_hostApplicationLifetime = hostApplicationLifetime;
_configuration = configuration;
}
public async Task StartAsync(CancellationToken cancellationToken)
{
using (var application = AbpApplicationFactory.Create<AbpProDbMigratorModule>(options =>
{
options.UseAutofac();
options.Services.AddLogging(c => c.AddSerilog());
}))
using (var application = await AbpApplicationFactory.CreateAsync<AbpProDbMigratorModule>(options =>
{
options.Services.ReplaceConfiguration(_configuration);
options.UseAutofac();
options.Services.AddLogging(c => c.AddSerilog());
}))
{
application.Initialize();
await application.InitializeAsync();
await application
.ServiceProvider
.GetRequiredService<AbpProDbMigrationService>()
.MigrateAsync();
application.Shutdown();
await application.ShutdownAsync();
_hostApplicationLifetime.StopApplication();
}

14
aspnet-core/services/src/Lion.AbpPro.DbMigrator/Lion.AbpPro.DbMigrator.csproj

@ -7,17 +7,6 @@
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<None Remove="appsettings.json" />
</ItemGroup>
<ItemGroup>
<Content Include="appsettings.json">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Serilog.Extensions.Logging" Version="$(SerilogExtensionsLoggingVersion)" />
<PackageReference Include="Serilog.Sinks.Async" Version="$(SerilogSinksAsyncVersion)" />
@ -37,6 +26,9 @@
<Content Remove="Logs\**" />
<EmbeddedResource Remove="Logs\**" />
<None Remove="Logs\**" />
<None Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

2
aspnet-core/services/src/Lion.AbpPro.DbMigrator/Program.cs

@ -1,5 +1,7 @@
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

2
aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.json

@ -1,5 +1,5 @@
{
"ConnectionStrings": {
"Default": "Data Source=localhost;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
"Default": "Data Source=localhost;Port=3306;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
}
}

12
aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainErrorCodes.cs

@ -2,6 +2,16 @@ namespace Lion.AbpPro
{
public static class AbpProDomainErrorCodes
{
/* You can add your business exception error codes here, as constants */
public const string OrganizationUnitNotExist =AbpProDomainSharedConsts.NameSpace+ ":100001";
public const string UserLockedOut =AbpProDomainSharedConsts.NameSpace+ ":100002";
public const string UserOrPasswordMismatch =AbpProDomainSharedConsts.NameSpace+ ":100003";
public const string ApiResourceNotExist =AbpProDomainSharedConsts.NameSpace+ ":100004";
public const string ApiResourceExist =AbpProDomainSharedConsts.NameSpace+ ":100005";
public const string ApiScopeNotExist =AbpProDomainSharedConsts.NameSpace+ ":100006";
public const string ApiScopeExist =AbpProDomainSharedConsts.NameSpace+ ":100007";
public const string ApiClientNotExist =AbpProDomainSharedConsts.NameSpace+ ":100008";
public const string ApiClientExist =AbpProDomainSharedConsts.NameSpace+ ":100009";
public const string IdentityResourceNotExist =AbpProDomainSharedConsts.NameSpace+ ":100010";
public const string IdentityResourceExist =AbpProDomainSharedConsts.NameSpace+ ":100011";
}
}

9
aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedConsts.cs

@ -0,0 +1,9 @@
namespace Lion.AbpPro;
public class AbpProDomainSharedConsts
{
/// <summary>名称空间</summary>
public const string NameSpace = "Lion.AbpPro";
/// <summary>默认语言</summary>
public const string DefaultCultureName = "zh-Hans";
}

6
aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedModule.cs

@ -51,13 +51,13 @@ namespace Lion.AbpPro
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpProDomainSharedModule>("Lion.AbpPro");
options.FileSets.AddEmbedded<AbpProDomainSharedModule>(AbpProDomainSharedConsts.NameSpace);
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<AbpProResource>("zh-Hans")
.Add<AbpProResource>(AbpProDomainSharedConsts.DefaultCultureName)
.AddVirtualJson("/Localization/AbpPro")
.AddBaseTypes(typeof(IdentityResource))
.AddBaseTypes(typeof(AbpValidationResource))
@ -70,7 +70,7 @@ namespace Lion.AbpPro
Configure<AbpExceptionLocalizationOptions>(options =>
{
options.MapCodeNamespace("AbpPro", typeof(AbpProResource));
options.MapCodeNamespace(AbpProDomainSharedConsts.NameSpace, typeof(AbpProResource));
});
}

16
aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/en.json

@ -17,6 +17,7 @@
"Permission:CapManagement": "IntegratedEvent",
"Permission:ESManagement": "ESManagement",
"Permission:SettingManagement": "SettingManagement",
"Permission:OrganizationUnitManagement": "OrganizationUnitManagement",
"Permission:IdentityServerManagement": "IdentityServer",
"Permission:IdentityServerManagement:Client": "Client",
"Permission:IdentityServerManagement:ApiResource": "ApiResource",
@ -28,6 +29,19 @@
"Description:Setting.Group.Other.Github": "Github",
"Enum:TestType:Created:1":"Created",
"Enum:TestType:Cancel:1":"Cancel",
"Enum:TestType:Delete:1":"Delete"
"Enum:TestType:Delete:1":"Delete",
"Lion.AbpPro:100001": "OrganizationUnit Not Exist",
"Lion.AbpPro:100002": "UserLockedOut",
"Lion.AbpPro:100003": "UserOrPasswordMismatch",
"Lion.AbpPro:100004": "ApiResource Not Exist",
"Lion.AbpPro:100005": "ApiResource Exist",
"Lion.AbpPro:100006": "ApiScope Not Exist",
"Lion.AbpPro:100007": "ApiScope Exist",
"Lion.AbpPro:100008": "ApiClient Not Exist",
"Lion.AbpPro:100009": "ApiClient Exist",
"Lion.AbpPro:100010": "IdentityResource Not Exist",
"Lion.AbpPro:100011": "IdentityResource Exist"
}
}

15
aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/zh-Hans.json

@ -17,6 +17,7 @@
"Permission:CapManagement": "集成事件",
"Permission:ESManagement": "ES日志",
"Permission:SettingManagement": "设置管理",
"Permission:OrganizationUnitManagement": "组织结构管理",
"Permission:IdentityServerManagement": "IdentityServer",
"Permission:IdentityServerManagement:Client": "客户端",
"Permission:IdentityServerManagement:ApiResource": "Api资源",
@ -28,6 +29,18 @@
"Description:Setting.Group.Other.Github": "Github",
"Enum:TestType:Created:1":"创建",
"Enum:TestType:Cancel:1":"取消",
"Enum:TestType:Delete:1":"删除"
"Enum:TestType:Delete:1":"删除",
"Lion.AbpPro:100001": "组织机构不存在",
"Lion.AbpPro:100002": "用户被锁定",
"Lion.AbpPro:100003": "用户名或者密码错误",
"Lion.AbpPro:100004": "ApiResource不存在",
"Lion.AbpPro:100005": "ApiResource 已存在",
"Lion.AbpPro:100006": "ApiScope 不存在",
"Lion.AbpPro:100007": "ApiScope 已存在",
"Lion.AbpPro:100008": "ApiClient 不存在",
"Lion.AbpPro:100009": "ApiClient 已存在",
"Lion.AbpPro:100010": "IdentityResource 不存在",
"Lion.AbpPro:100011": "IdentityResource 已存在"
}
}

2
aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpProResource.cs

@ -1,6 +1,6 @@
using Volo.Abp.Localization;
namespace Lion.AbpPro.Localization
namespace Lion.AbpPro
{
[LocalizationResourceName("AbpPro")]
public class AbpProResource

6
aspnet-core/services/src/Lion.AbpPro.Domain/AbpProDomainModule.cs

@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions;
using Lion.AbpPro.MultiTenancy;
using Lion.AbpPro.NotificationManagement;
using Volo.Abp.AuditLogging;
using Volo.Abp.AutoMapper;
using Volo.Abp.BackgroundJobs;
using Volo.Abp.Emailing;
using Volo.Abp.FeatureManagement;
@ -43,7 +44,10 @@ namespace Lion.AbpPro
{
options.IsEnabled = MultiTenancyConsts.IsEnabled;
});
Configure<AbpAutoMapperOptions>(options =>
{
options.AddMaps<AbpProDomainModule>();
});
#if DEBUG
context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>());
#endif

50
aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiResourceManager.cs

@ -26,17 +26,26 @@ namespace Lion.AbpPro.IdentityServer
bool includeDetails = false,
CancellationToken cancellationToken = default)
{
return _apiResourceRepository.GetListAsync("CreationTime desc", skipCount,
maxResultCount, filter,
return _apiResourceRepository.GetListAsync
(
"CreationTime desc",
skipCount,
maxResultCount,
filter,
includeDetails,
cancellationToken);
cancellationToken
);
}
public Task<long> GetCountAsync(string filter = null,
public Task<long> GetCountAsync(
string filter = null,
CancellationToken cancellationToken = default)
{
return _apiResourceRepository.GetCountAsync(filter,
cancellationToken);
return _apiResourceRepository.GetCountAsync
(
filter,
cancellationToken
);
}
/// <summary>
@ -65,10 +74,16 @@ namespace Lion.AbpPro.IdentityServer
await _apiResourceRepository.FindByNameAsync(name.Trim(), false, cancellationToken);
if (null != apiResource)
{
throw new UserFriendlyException(message: "ApiResource已存在");
throw new BusinessException(AbpProDomainErrorCodes.ApiResourceExist);
}
apiResource = new ApiResource(id, name, displayName, description)
apiResource = new ApiResource
(
id,
name,
displayName,
description
)
{
AllowedAccessTokenSigningAlgorithms = allowedAccessTokenSigningAlgorithms,
ShowInDiscoveryDocument = showInDiscoveryDocument,
@ -83,8 +98,11 @@ namespace Lion.AbpPro.IdentityServer
//
// properties?.Distinct().ToList().ForEach(item => { apiResource.AddProperty(item.Key, item.Value); });
return await _apiResourceRepository.InsertAsync(apiResource,
cancellationToken: cancellationToken);
return await _apiResourceRepository.InsertAsync
(
apiResource,
cancellationToken: cancellationToken
);
}
public async Task DeleteAsync(
@ -104,14 +122,13 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument,
string secret,
List<string> scopes,
CancellationToken cancellationToken = default
)
CancellationToken cancellationToken = default)
{
var apiResource =
await _apiResourceRepository.FindByNameAsync(name.Trim(), true, cancellationToken);
if (null == apiResource)
{
throw new UserFriendlyException(message: "ApiResource不存在");
throw new BusinessException(AbpProDomainErrorCodes.ApiResourceNotExist);
}
apiResource.DisplayName = displayName;
@ -148,8 +165,11 @@ namespace Lion.AbpPro.IdentityServer
}
return await _apiResourceRepository.UpdateAsync(apiResource,
cancellationToken: cancellationToken);
return await _apiResourceRepository.UpdateAsync
(
apiResource,
cancellationToken: cancellationToken
);
}
}
}

46
aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiScopeManager.cs

@ -23,16 +23,19 @@ namespace Lion.AbpPro.IdentityServer
bool includeDetails = false,
CancellationToken cancellationToken = default)
{
return _apiScopeRepository.GetListAsync(
return _apiScopeRepository.GetListAsync
(
"CreationTime desc",
skipCount,
maxResultCount,
filter,
includeDetails,
cancellationToken);
cancellationToken
);
}
public Task<long> GetCountAsync(string filter = null,
public Task<long> GetCountAsync(
string filter = null,
CancellationToken cancellationToken = default)
{
return _apiScopeRepository.GetCountAsync(filter, cancellationToken);
@ -48,11 +51,19 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument)
{
var apiScopes = await _apiScopeRepository.GetListByNameAsync(new[] { name }, false);
if (apiScopes.Count > 0) throw new UserFriendlyException(message: $"{name}已存在");
if (apiScopes.Count > 0) throw new BusinessException(AbpProDomainErrorCodes.ApiScopeExist);
var scope = new ApiScope(GuidGenerator.Create(), name, displayName, description,
required, emphasize,
showInDiscoveryDocument, enabled);
var scope = new ApiScope
(
GuidGenerator.Create(),
name,
displayName,
description,
required,
emphasize,
showInDiscoveryDocument,
enabled
);
return await _apiScopeRepository.InsertAsync(scope);
}
@ -67,7 +78,7 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument)
{
var apiScope = await _apiScopeRepository.FindAsync(id, false);
if (null == apiScope) throw new UserFriendlyException(message: $"{name}不存在");
if (null == apiScope) throw new BusinessException(AbpProDomainErrorCodes.ApiScopeNotExist);
apiScope.DisplayName = displayName;
apiScope.Description = description;
apiScope.Enabled = enabled;
@ -77,18 +88,25 @@ namespace Lion.AbpPro.IdentityServer
return await _apiScopeRepository.UpdateAsync(apiScope);
}
public Task DeleteAsync(Guid id, bool autoSave = false,
public Task DeleteAsync(
Guid id,
bool autoSave = false,
CancellationToken cancellationToken = default)
{
return _apiScopeRepository.DeleteAsync(id, autoSave, cancellationToken);
}
public async Task<List<ApiScope>> FindAllAsync(
CancellationToken cancellationToken = default)
public async Task<List<ApiScope>> FindAllAsync(CancellationToken cancellationToken = default)
{
return await _apiScopeRepository.GetListAsync("CreationTime desc", 0, Int32.MaxValue,
null, false,
cancellationToken);
return await _apiScopeRepository.GetListAsync
(
"CreationTime desc",
0,
Int32.MaxValue,
null,
false,
cancellationToken
);
}
}
}

20
aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerClientManager.cs

@ -50,7 +50,7 @@ namespace Lion.AbpPro.IdentityServer
string description, string allowedGrantTypes)
{
var entity = await _clientRepository.FindByClientIdAsync(clientId);
if (null != entity) throw new UserFriendlyException(message: "当前ClientId已存在");
if (null != entity) throw new BusinessException(AbpProDomainErrorCodes.ApiClientExist);
entity = new Client(GuidGenerator.Create(), clientId)
{
ClientName = clientName, Description = description,
@ -108,7 +108,7 @@ namespace Lion.AbpPro.IdentityServer
var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null)
{
throw new UserFriendlyException(message: $"{clientId}不存在");
throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
}
client.ClientName = clientName;
@ -180,7 +180,7 @@ namespace Lion.AbpPro.IdentityServer
public async Task<Client> UpdateScopesAsync(string clientId, List<string> scopes)
{
var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在");
if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
client.RemoveAllScopes();
foreach (var item in scopes.Distinct())
@ -201,7 +201,7 @@ namespace Lion.AbpPro.IdentityServer
{
uri = uri.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在");
if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
if (client.RedirectUris.Any(e => e.RedirectUri == uri.Trim()))
{
return client;
@ -220,7 +220,7 @@ namespace Lion.AbpPro.IdentityServer
{
uri = uri.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在");
if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
if (client.RedirectUris.Any(e => e.RedirectUri == uri.Trim()))
{
client.RemoveRedirectUri(uri);
@ -239,7 +239,7 @@ namespace Lion.AbpPro.IdentityServer
{
uri = uri.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在");
if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
if (client.PostLogoutRedirectUris.Any(e => e.PostLogoutRedirectUri == uri))
{
return client;
@ -256,7 +256,7 @@ namespace Lion.AbpPro.IdentityServer
{
uri = uri.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在");
if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
if (client.PostLogoutRedirectUris.Any(e => e.PostLogoutRedirectUri == uri))
{
client.RemovePostLogoutRedirectUri(uri);
@ -273,7 +273,7 @@ namespace Lion.AbpPro.IdentityServer
{
origin = origin.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在");
if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
if (client.AllowedCorsOrigins.Any(e => e.Origin == origin))
{
return client;
@ -292,7 +292,7 @@ namespace Lion.AbpPro.IdentityServer
{
origin = origin.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在");
if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
if (client.AllowedCorsOrigins.Any(e => e.Origin == origin))
{
client.RemoveCorsOrigin(origin);
@ -305,7 +305,7 @@ namespace Lion.AbpPro.IdentityServer
public async Task<Client> EnabledAsync(string clientId, bool enabled)
{
var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在");
if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
client.Enabled = enabled;
return await _clientRepository.UpdateAsync(client);
}

4
aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdentityResourceManager.cs

@ -56,7 +56,7 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument)
{
var identityResource = await _identityResourceRepository.FindByNameAsync(name, false);
if (null != identityResource) throw new UserFriendlyException(message: $"{name}已存在");
if (null != identityResource) throw new BusinessException(AbpProDomainErrorCodes.IdentityResourceExist);
identityResource = new IdentityResource(GuidGenerator.Create(), name, displayName,
description, enabled,
required,
@ -74,7 +74,7 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument)
{
var identityResource = await _identityResourceRepository.FindByNameAsync(name, false);
if (null == identityResource) throw new UserFriendlyException(message: $"{name}不存在");
if (null == identityResource) throw new BusinessException(AbpProDomainErrorCodes.IdentityResourceNotExist);
identityResource.DisplayName = displayName;
identityResource.Description = description;
identityResource.Enabled = enabled;

3
aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProEntityFrameworkCoreModule.cs

@ -52,11 +52,12 @@ namespace Lion.AbpPro.EntityFrameworkCore
{
/* The main point to change your DBMS.
* See also AbpProMigrationsDbContextFactory for EF Core tooling. */
options.UseMySQL();
options.PreConfigure<AbpProDbContext>(options =>
{
options.DbContextOptions.UseBatchEF_MySQLPomelo();
});
options.UseMySQL();
});
}
}

18
aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProMigrationsDbContextFactory.cs

@ -1,3 +1,4 @@
using System;
using System.IO;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
@ -24,10 +25,21 @@ namespace Lion.AbpPro.EntityFrameworkCore
private static IConfigurationRoot BuildConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../Lion.AbpPro.DbMigrator/"))
.AddJsonFile("appsettings.json", optional: false);
.SetBasePath
(
Path.Combine
(
Directory.GetCurrentDirectory(),
"../Lion.AbpPro.DbMigrator/"
)
)
.AddJsonFile
(
"appsettings.json",
false
);
return builder.Build();
}
}
}
}

3
aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreAbpProDbSchemaMigrator.cs

@ -12,8 +12,7 @@ namespace Lion.AbpPro.EntityFrameworkCore
{
private readonly IServiceProvider _serviceProvider;
public EntityFrameworkCoreAbpProDbSchemaMigrator(
IServiceProvider serviceProvider)
public EntityFrameworkCoreAbpProDbSchemaMigrator(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}

105
aspnet-core/services/src/Lion.AbpPro.HttpApi/Controllers/Systems/OrganizationUnitController.cs

@ -0,0 +1,105 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Lion.AbpPro.Extension.Customs.Dtos;
using Lion.AbpPro.OrganizationUnits;
using Lion.AbpPro.OrganizationUnits.Dto;
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;
using Volo.Abp.Application.Dtos;
namespace Lion.AbpPro.Controllers.Systems;
[Route("OrganizationUnits")]
public class OrganizationUnitController : AbpProController, IOrganizationUnitAppService
{
private readonly IOrganizationUnitAppService _organizationUnitAppService;
public OrganizationUnitController(IOrganizationUnitAppService organizationUnitAppService)
{
_organizationUnitAppService = organizationUnitAppService;
}
[HttpPost("tree")]
[SwaggerOperation(summary: "获取组织机构树", Tags = new[] { "OrganizationUnits" })]
public Task<List<TreeOutput>> GetTreeAsync()
{
return _organizationUnitAppService.GetTreeAsync();
}
[HttpPost("create")]
[SwaggerOperation(summary: "创建组织机构", Tags = new[] { "OrganizationUnits" })]
public Task CreateAsync(CreateOrganizationUnitInput input)
{
return _organizationUnitAppService.CreateAsync(input);
}
[HttpPost("delete")]
[SwaggerOperation(summary: "删除组织机构", Tags = new[] { "OrganizationUnits" })]
public Task DeleteAsync(IdInput input)
{
return _organizationUnitAppService.DeleteAsync(input);
}
[HttpPost("update")]
[SwaggerOperation(summary: "编辑组织机构", Tags = new[] { "OrganizationUnits" })]
public Task UpdateAsync(UpdateOrganizationUnitInput input)
{
return _organizationUnitAppService.UpdateAsync(input);
}
[HttpPost("addRoleToOrganizationUnitAsync")]
[SwaggerOperation(summary: "向组织机构添加角色", Tags = new[] { "OrganizationUnits" })]
public Task AddRoleToOrganizationUnitAsync(AddRoleToOrganizationUnitInput input)
{
return _organizationUnitAppService.AddRoleToOrganizationUnitAsync(input);
}
[HttpPost("removeRoleFromOrganizationUnitAsync")]
[SwaggerOperation(summary: "向组织机构删除角色", Tags = new[] { "OrganizationUnits" })]
public Task RemoveRoleFromOrganizationUnitAsync(RemoveRoleToOrganizationUnitInput input)
{
return _organizationUnitAppService.RemoveRoleFromOrganizationUnitAsync(input);
}
[HttpPost("addUserToOrganizationUnit")]
[SwaggerOperation(summary: "向组织机构添加用户", Tags = new[] { "OrganizationUnits" })]
public Task AddUserToOrganizationUnitAsync(AddUserToOrganizationUnitInput input)
{
return _organizationUnitAppService.AddUserToOrganizationUnitAsync(input);
}
[HttpPost("removeUserFromOrganizationUnit")]
[SwaggerOperation(summary: "向组织机构删除用户", Tags = new[] { "OrganizationUnits" })]
public Task RemoveUserFromOrganizationUnitAsync(RemoveUserToOrganizationUnitInput input)
{
return _organizationUnitAppService.RemoveUserFromOrganizationUnitAsync(input);
}
[HttpPost("getUsers")]
[SwaggerOperation(summary: "分页获取组织机构下用户", Tags = new[] { "OrganizationUnits" })]
public Task<PagedResultDto<GetOrganizationUnitUserOutput>> GetUsersAsync(GetOrganizationUnitUserInput input)
{
return _organizationUnitAppService.GetUsersAsync(input);
}
[HttpPost("getRoles")]
[SwaggerOperation(summary: "分页获取组织机构下角色", Tags = new[] { "OrganizationUnits" })]
public Task<PagedResultDto<GetOrganizationUnitRoleOutput>> GetRolesAsync(GetOrganizationUnitRoleInput input)
{
return _organizationUnitAppService.GetRolesAsync(input);
}
[HttpPost("getUnAddUsers")]
[SwaggerOperation(summary: "获取不在组织机构的用户", Tags = new[] { "OrganizationUnits" })]
public Task<PagedResultDto<GetUnAddUserOutput>> GetUnAddUsersAsync(GetUnAddUserInput input)
{
return _organizationUnitAppService.GetUnAddUsersAsync(input);
}
[HttpPost("getUnAddRoles")]
[SwaggerOperation(summary: "获取不在组织机构的角色", Tags = new[] { "OrganizationUnits" })]
public Task<PagedResultDto<GetUnAddRoleOutput>> GetUnAddRolessAsync(GetUnAddRoleInput input)
{
return _organizationUnitAppService.GetUnAddRolessAsync(input);
}
}

4
aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiResourceManager_Tests.cs

@ -61,11 +61,11 @@ namespace Lion.AbpPro.IdentityServer
[Fact]
public async Task Shuold_CreateAsync_Name_Repetition_Exception()
{
(await Should.ThrowAsync<UserFriendlyException>(async () =>
(await Should.ThrowAsync<BusinessException>(async () =>
{
var result = await _idenityServerApiResourceManager.CreateAsync(Guid.NewGuid(),
"ApiResource_Test", "单元测试创建", "Xunit", true, "", false, "1q2w3E*");
})).Message.ShouldBe("ApiResource已存在");
})).Code.ShouldBe(AbpProDomainErrorCodes.ApiResourceExist);
}

4
aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiScopeManager_Tests.cs

@ -59,11 +59,11 @@ namespace Lion.AbpPro.IdentityServer
[Fact]
public async Task Shuold_CreateAsync_Name_Repetition_Exception()
{
(await Should.ThrowAsync<UserFriendlyException>(async () =>
(await Should.ThrowAsync<BusinessException>(async () =>
{
var result = await _idenityServerApiScopeManager.CreateAsync(
"ApiScope_Test", "单元测试创建", "Xunit", true, false, false, true);
})).Message.ShouldBe("ApiScope_Test已存在");
})).Code.ShouldBe(AbpProDomainErrorCodes.ApiScopeExist);
}
// [Fact]

4
aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerClientManager_Tests.cs

@ -60,12 +60,12 @@ namespace Lion.AbpPro.IdentityServer
[Fact]
public async Task Shuold_CreateAsync_Name_Repetition_Exception()
{
(await Should.ThrowAsync<UserFriendlyException>(async () =>
(await Should.ThrowAsync<BusinessException>(async () =>
{
var result =
await _idenityServerClientManager.CreateAsync("Test_Client", "XunitName",
"desc", "test");
})).Message.ShouldBe("当前ClientId已存在");
})).Code.ShouldBe(AbpProDomainErrorCodes.ApiClientExist);
}
[Fact]

4
aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdentityResourceManager_Tests.cs

@ -63,13 +63,13 @@ namespace Lion.AbpPro.IdentityServer
[Fact]
public async Task Shuold_CreateAsync_Name_Repetition_Exception()
{
(await Should.ThrowAsync<UserFriendlyException>(async () =>
(await Should.ThrowAsync<BusinessException>(async () =>
{
var result = await _identityResourceManager.CreateAsync("openid", "单元测试",
"desc", true, false,
false,
false);
})).Message.ShouldBe("openid已存在");
})).Code.ShouldBe(AbpProDomainErrorCodes.IdentityResourceExist);
}

4
aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swaggers/HiddenAbpDefaultApiFilter.cs

@ -46,7 +46,9 @@ namespace Lion.AbpPro.Shared.Hosting.Microservices.Swaggers
"/api/identity/my-profile",
"/api/identity",
"/api/multi-tenancy/tenants",
"/api/setting-management/emailing"
"/api/setting-management/emailing",
"/configuration",
"/outputcache"
};
}
}

9
vben271/src/locales/lang/en/routes/admin.ts

@ -29,7 +29,7 @@ export default {
audit_httpMethod: 'HttpMethod',
audit_httpStatusCode: 'HttpStatusCode',
audit_httpRequest: 'HttpRequest',
audit_ipAdrress: 'IP Address',
audit_ipAddress: 'IP Address',
audit_time: 'Time',
audit_duration: 'Execution Duration(ms)',
audit_url: 'URL',
@ -68,4 +68,11 @@ export default {
editPasswordMessage: 'The passwords entered twice are inconsistent. Procedure',
executionTime: 'ExecutionTime',
executionDuration: 'ExecutionDuration(Millisecond)',
organizationUnitName: 'Name',
parentOrganizationUnitName: 'ParentOrganizationUnit',
organizationUnitManagement: 'OrganizationUnitManagement',
createRootOrganizationUnit: 'CreateRootOrganizationUnit',
organizationUnit: 'OrganizationUnit',
member: 'Member',
role: 'Role',
};

10
vben271/src/locales/lang/zh-CN/routes/admin.ts

@ -26,7 +26,7 @@ export default {
audit_httpMethod: 'Http方法',
audit_httpStatusCode: 'Http状态码',
audit_httpRequest: 'Http请求',
audit_ipAdrress: 'IP地址',
audit_ipAddress: 'IP地址',
audit_time: '时间',
audit_duration: '持续时间(ms)',
audit_url: 'Url地址',
@ -67,5 +67,11 @@ export default {
editPasswordMessage: '输入的2次密码不一致',
executionTime: '执行时间',
executionDuration: '响应时间(毫秒)',
organizationUnitName: '名称',
parentOrganizationUnitName: '上级组织机构',
organizationUnitManagement: '组织机构管理',
createRootOrganizationUnit: '新增根机构',
organizationUnit: '组织机构',
member: '成员',
role: '角色',
};

2
vben271/src/router/index.ts

@ -1,7 +1,7 @@
import { createWebHistory, RouteRecordRaw } from "vue-router";
import type { App } from "vue";
import { createRouter, createWebHashHistory } from "vue-router";
import { createRouter } from "vue-router";
import { basicRoutes } from "./routes";
// 白名单应该包含基本静态路由

10
vben271/src/router/routes/modules/admin.ts

@ -33,6 +33,16 @@ const admin: AppRouteModule = {
icon: 'ant-design:lock-outlined',
},
},
{
path: 'organizationUnit',
name: 'organizationUnit',
component: () => import('/@/views/admin/organizationUnits/OrganizationUnit.vue'),
meta: {
title: t('routes.admin.organizationUnitManagement'),
icon: 'ant-design:gold-outlined',
policy: 'System.OrganizationUnitManagement',
},
},
{
path: 'settings',
name: 'Settings',

7529
vben271/src/services/ServiceProxies.ts

File diff suppressed because it is too large

4
vben271/src/services/ServiceProxyBase.ts

@ -11,13 +11,12 @@ export class ServiceProxyBase {
options.baseURL = import.meta.env.VITE_API_URL as string;
const guard: boolean = this.urlGuard(options.url as string);
const userStore = useUserStoreWithOut();
const { token, language } = this.buildRequestMessage();
if (!guard) {
if (userStore.checkUserLoginExpire) {
router.replace(PageEnum.BASE_LOGIN);
return;
}
const { token, language } = this.buildRequestMessage();
// 添加header
options.headers = {
'accept-language': language,
@ -29,6 +28,7 @@ export class ServiceProxyBase {
options.headers = {
'Content-Type': 'application/json',
__tenant: userStore.tenantId,
'accept-language': language,
};
}

106
vben271/src/views/admin/auditLog/AuditLog.ts

@ -1,25 +1,26 @@
import { FormSchema } from '/@/components/Table';
import { BasicColumn } from '/@/components/Table';
import { useI18n } from '/@/hooks/web/useI18n';
import { FormSchema } from "/@/components/Table";
import { BasicColumn } from "/@/components/Table";
import { useI18n } from "/@/hooks/web/useI18n";
const { t } = useI18n();
import moment from 'moment';
import { AuditLogsServiceProxy, PagingAuditLogListInput } from '/@/services/ServiceProxies';
import moment from "moment";
import { AuditLogsServiceProxy, PagingAuditLogListInput } from "/@/services/ServiceProxies";
export const searchFormSchema: FormSchema[] = [
{
field: 'userName',
label: t('routes.admin.userManagement_userName'),
component: 'Input',
colProps: { span: 8 },
field: "userName",
label: t("routes.admin.userManagement_userName"),
component: "Input",
colProps: { span: 8 }
},
{
field: 'time',
component: 'RangePicker',
label: t('routes.admin.audit_executeTime'),
field: "time",
component: "RangePicker",
label: t("routes.admin.audit_executeTime"),
colProps: {
span: 6,
},
},
span: 6
}
}
];
export const tableColumns: BasicColumn[] = [
@ -29,37 +30,38 @@ export const tableColumns: BasicColumn[] = [
// width: 100,
// },
{
title: 'Url',
dataIndex: 'url',
title: "Url",
dataIndex: "url",
width: 350,
slots: {
customRender: 'url',
customRender: "url"
},
align: 'left',
align: "left"
},
{
title: t('routes.admin.userManagement_userName'),
dataIndex: 'userName',
width: 100,
title: t("routes.admin.userManagement_userName"),
dataIndex: "userName",
width: 100
},
{
title: t('routes.admin.executionTime'),
dataIndex: 'executionTime',
title: t("routes.admin.executionTime"),
dataIndex: "executionTime",
width: 200,
customRender: ({ text }) => {
return moment(text).format('YYYY-MM-DD HH:mm:ss');
},
return moment(text).format("YYYY-MM-DD HH:mm:ss");
}
},
{
title: t('routes.admin.executionDuration'),
dataIndex: 'executionDuration',
width: 150,
title: t("routes.admin.executionDuration"),
dataIndex: "executionDuration",
width: 150
},
{
title: 'Exceptions',
dataIndex: 'exceptions',
},
title: "Exceptions",
dataIndex: "exceptions"
}
];
/**
* 分页列表
* @param params
@ -69,42 +71,44 @@ export async function getTableListAsync(params: PagingAuditLogListInput) {
const _auditLogsServiceProxy = new AuditLogsServiceProxy();
return _auditLogsServiceProxy.page(params);
}
export function httpStatusCodeColor(statusCode?: number) {
if (!statusCode) {
return '';
return "";
}
if (statusCode >= 200 && statusCode < 300) {
return '#87d068';
return "#87d068";
}
if (statusCode >= 300 && statusCode < 400) {
return '#108ee9';
return "#108ee9";
}
if (statusCode >= 400 && statusCode < 500) {
return 'orange';
return "orange";
}
if (statusCode >= 500) {
return 'red';
return "red";
}
return 'cyan';
return "cyan";
}
export function httpMethodColor(method?: string) {
if (method == 'GET') {
return 'blue';
if (method == "GET") {
return "blue";
}
if (method == 'POST') {
return 'blue';
if (method == "POST") {
return "blue";
}
if (method == 'PUT') {
return 'orange';
if (method == "PUT") {
return "orange";
}
if (method == 'DELETE') {
return 'red';
if (method == "DELETE") {
return "red";
}
if (method == 'OPTIONS') {
return 'cyan';
if (method == "OPTIONS") {
return "cyan";
}
if (method == 'PATCH') {
return 'pink';
if (method == "PATCH") {
return "pink";
}
return 'cyan';
return "cyan";
}

89
vben271/src/views/admin/auditLog/AuditLog.vue

@ -3,9 +3,9 @@
<BasicTable @register="registerTable" size="small">
<template #url="{ record }">
<Tag :color="httpStatusCodeColor(record.httpStatusCode)">{{ record.httpStatusCode }}</Tag>
<Tag style="margin-left: 5px" :color="httpMethodColor(record.httpMethod)">{{
record.httpMethod
}}</Tag>
<Tag style="margin-left: 5px" :color="httpMethodColor(record.httpMethod)">
{{ record.httpMethod }}
</Tag>
<span style="margin-left: 5px">{{ record.url }}</span>
</template>
</BasicTable>
@ -13,46 +13,47 @@
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { BasicTable, useTable } from '/@/components/Table';
import { tableColumns, searchFormSchema, getTableListAsync,httpStatusCodeColor,httpMethodColor } from "/@/views/admin/auditLog/AuditLog";
import { Tag } from 'ant-design-vue';
import { useI18n } from '/@/hooks/web/useI18n';
export default defineComponent({
name: 'AuditLog',
components: {
BasicTable,
Tag,
},
setup() {
const { t } = useI18n();
// table配置
const [registerTable, { reload }] = useTable({
columns: tableColumns,
formConfig: {
labelWidth: 70,
schemas: searchFormSchema,
fieldMapToTime: [
['time', ['executionBeginTime', 'executionEndTime'], 'YYYY-MM-DD HH:mm:ss'],
],
},
api: getTableListAsync,
showTableSetting: true,
useSearchForm: true,
bordered: true,
canResize: true,
showIndexColumn: true,
immediate: true,
scroll: { x: true },
});
import { defineComponent } from "vue";
import { BasicTable, useTable } from "/@/components/Table";
import { tableColumns, searchFormSchema, getTableListAsync, httpStatusCodeColor, httpMethodColor } from "/@/views/admin/auditLog/AuditLog";
import { Tag } from "ant-design-vue";
import { useI18n } from "/@/hooks/web/useI18n";
return {
registerTable,
reload,
t,
httpStatusCodeColor,
httpMethodColor,
};
},
});
export default defineComponent({
name: "AuditLog",
components: {
BasicTable,
Tag
},
setup() {
const { t } = useI18n();
// table配置
const [registerTable, { reload }] = useTable({
columns: tableColumns,
formConfig: {
labelWidth: 70,
schemas: searchFormSchema,
fieldMapToTime: [
["time", ["executionBeginTime", "executionEndTime"], "YYYY-MM-DD HH:mm:ss"]
]
},
api: getTableListAsync,
showTableSetting: true,
useSearchForm: true,
bordered: true,
canResize: true,
showIndexColumn: true,
immediate: true,
scroll: { x: true }
});
return {
registerTable,
reload,
t,
httpStatusCodeColor,
httpMethodColor
};
}
});
</script>

35
vben271/src/views/admin/dictionary/AbpDictionary.ts

@ -66,7 +66,6 @@ export const dictionaryTypeTableColumns: BasicColumn[] = [
customRender: "text"
}
}
];
//字典项查询
export const searchFormSchema: FormSchema[] = [
@ -330,12 +329,12 @@ export async function getDictionaryTypeAsync(params: PagingDataDictionaryInput)
//新建字典类型
export async function createDictionaryTypeAsync({
request,
changeOkLoading,
closeModal,
validate,
resetFields
}) {
request,
changeOkLoading,
closeModal,
validate,
resetFields
}) {
changeOkLoading(true);
await validate();
const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy();
@ -365,12 +364,12 @@ export async function enableDictionaryAsync(input: SetDataDictinaryDetailInput)
//创建数据详情字典
export async function createDetailsDictionaryAsync({
request,
changeOkLoading,
validate,
resetFields,
closeModal
}) {
request,
changeOkLoading,
validate,
resetFields,
closeModal
}) {
changeOkLoading(true);
await validate();
const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy();
@ -390,11 +389,11 @@ export async function getDictionaryDetailsAsync({ params }) {
//编辑数据字典
export async function editDetailsDictionaryAsync({
request,
changeOkLoading,
validate,
closeModal
}) {
request,
changeOkLoading,
validate,
closeModal
}) {
changeOkLoading(true);
await validate();
const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy();

353
vben271/src/views/admin/dictionary/AbpDictionary.vue

@ -9,8 +9,8 @@
:clickToRowSelect="false"
>
<template #text="{ record }">
{{record.code}}|
{{record.displayText}}
{{ record.code }}|
{{ record.displayText }}
</template>
<template #toolbar>
<a-button
@ -19,7 +19,8 @@
preIcon="ant-design:plus-circle-outlined"
@click="handleCreateType"
>
{{ t('common.createText') }}</a-button
{{ t("common.createText") }}
</a-button
>
</template>
<template #action="{ record }">
@ -46,7 +47,8 @@
type="primary"
@click="handleCreate"
>
{{ t('common.createText') }}</a-button
{{ t("common.createText") }}
</a-button
>
</template>
@ -78,184 +80,187 @@
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
import { PageWrapper } from '/@/components/Page';
import { useModal } from '/@/components/Modal';
import CreateAbpDictionary from './CreateAbpDictionary.vue';
import EditAbpDictionary from './EditAbpDictionary.vue';
import EditAbpDictionaryType from './EditAbpDictionaryType.vue';
import CreateAbpDictionaryType from './CreateAbpDictionaryType.vue';
import { defineComponent, ref } from "vue";
import { BasicTable, useTable, TableAction } from "/@/components/Table";
import { PageWrapper } from "/@/components/Page";
import { useModal } from "/@/components/Modal";
import CreateAbpDictionary from "./CreateAbpDictionary.vue";
import EditAbpDictionary from "./EditAbpDictionary.vue";
import EditAbpDictionaryType from "./EditAbpDictionaryType.vue";
import CreateAbpDictionaryType from "./CreateAbpDictionaryType.vue";
import { useI18n } from '/@/hooks/web/useI18n';
import {
tableColumns,
searchFormSchema,
getDictionaryTypeAsync,
dictionaryTypeTableColumns,
searchDictionaryFormSchema,
getDictionaryDetailsAsync,
deleteDetailAsync,
deleteDictionaryTypeAsync,
} from '/@/views/admin/dictionary/AbpDictionary';
import { useMessage } from '/@/hooks/web/useMessage';
import { Tag, message } from 'ant-design-vue';
export default defineComponent({
name: 'AbpDictionary',
components: {
BasicTable,
PageWrapper,
TableAction,
Tag,
CreateAbpDictionaryType,
CreateAbpDictionary,
EditAbpDictionary,
EditAbpDictionaryType,
},
setup() {
const { t } = useI18n();
import { useI18n } from "/@/hooks/web/useI18n";
import {
tableColumns,
searchFormSchema,
getDictionaryTypeAsync,
dictionaryTypeTableColumns,
searchDictionaryFormSchema,
getDictionaryDetailsAsync,
deleteDetailAsync,
deleteDictionaryTypeAsync
} from "/@/views/admin/dictionary/AbpDictionary";
import { useMessage } from "/@/hooks/web/useMessage";
import { Tag, message } from "ant-design-vue";
const [registerCreateModal, { openModal: createModal }] = useModal();
const [registerEditModal, { openModal: editModal }] = useModal();
const [registerEditTypeModal, { openModal: editTypeModal }] = useModal();
const [registerCreateType, { openModal: createTypeModal }] = useModal();
const selectedDataDictionaryIdRef = ref('');
const selectedDataDictionaryDisplayTextRef = ref('');
export default defineComponent({
name: "AbpDictionary",
components: {
BasicTable,
PageWrapper,
TableAction,
Tag,
CreateAbpDictionaryType,
CreateAbpDictionary,
EditAbpDictionary,
EditAbpDictionaryType
},
setup() {
const { t } = useI18n();
//左边表格
const [registerTypeTable, { reload: reloadType, clearSelectedRowKeys }] = useTable({
columns: dictionaryTypeTableColumns,
formConfig: {
labelWidth: 0,
schemas: searchDictionaryFormSchema,
showResetButton: false,
},
api: getDictionaryTypeAsync,
useSearchForm: true,
showTableSetting: false,
showIndexColumn: false,
bordered: true,
canResize: true,
rowSelection: { type: 'radio' },
pagination: false,
actionColumn: {
width: 50,
title: t('common.action'),
dataIndex: 'action',
slots: { customRender: 'action' },
},
});
const [registerCreateModal, { openModal: createModal }] = useModal();
const [registerEditModal, { openModal: editModal }] = useModal();
const [registerEditTypeModal, { openModal: editTypeModal }] = useModal();
const [registerCreateType, { openModal: createTypeModal }] = useModal();
const selectedDataDictionaryIdRef = ref("");
const selectedDataDictionaryDisplayTextRef = ref("");
//勾选事件
const onSelectChange = ({ rows }) => {
selectedDataDictionaryIdRef.value = rows[0].id;
selectedDataDictionaryDisplayTextRef.value = rows[0].displayText;
reload();
};
//左边表格
const [registerTypeTable, { reload: reloadType, clearSelectedRowKeys }] = useTable({
columns: dictionaryTypeTableColumns,
formConfig: {
labelWidth: 0,
schemas: searchDictionaryFormSchema,
showResetButton: false
},
api: getDictionaryTypeAsync,
useSearchForm: true,
showTableSetting: false,
showIndexColumn: false,
bordered: true,
canResize: true,
rowSelection: { type: "radio" },
pagination: false,
actionColumn: {
width: 50,
title: t("common.action"),
dataIndex: "action",
slots: { customRender: "action" }
}
});
const handleCreate = () => {
if (selectedDataDictionaryIdRef.value == '') {
message.error(t('routes.admin.chooseDictionary'));
return;
} else {
let dictionaryCreate = {
id: selectedDataDictionaryIdRef.value,
displayText: selectedDataDictionaryDisplayTextRef.value,
};
createModal(true, { dictionaryCreate: dictionaryCreate });
}
};
const handleEditType = (record: Recordable) => {
editTypeModal(true, {
record: record,
});
};
const handleDeleteDictionaryType = async (record: Recordable) => {
let msg = t('common.askDelete');
createConfirm({
iconType: 'warning',
title: t('common.tip'),
content: msg,
onOk: async () => {
await deleteDictionaryTypeAsync({
id: record.id,
reloadType,
});
await reload()
},
});
};
const [registerTable, { reload }] = useTable({
columns: tableColumns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
api: getDictionaryPageDetailsAsync,
useSearchForm: true,
showTableSetting: true,
showIndexColumn: true,
bordered: true,
canResize: true,
actionColumn: {
width: 150,
title: t('common.action'),
dataIndex: 'action',
slots: { customRender: 'action' },
},
//勾选事件
const onSelectChange = ({ rows }) => {
selectedDataDictionaryIdRef.value = rows[0].id;
selectedDataDictionaryDisplayTextRef.value = rows[0].displayText;
reload();
};
const handleCreate = () => {
if (selectedDataDictionaryIdRef.value == "") {
message.error(t("routes.admin.chooseDictionary"));
return;
} else {
let dictionaryCreate = {
id: selectedDataDictionaryIdRef.value,
displayText: selectedDataDictionaryDisplayTextRef.value
};
createModal(true, { dictionaryCreate: dictionaryCreate });
}
};
const handleEditType = (record: Recordable) => {
editTypeModal(true, {
record: record
});
async function getDictionaryPageDetailsAsync(params) {
if (selectedDataDictionaryIdRef.value == '') {
return [];
};
const handleDeleteDictionaryType = async (record: Recordable) => {
let msg = t("common.askDelete");
createConfirm({
iconType: "warning",
title: t("common.tip"),
content: msg,
onOk: async () => {
await deleteDictionaryTypeAsync({
id: record.id,
reloadType
});
await reload();
}
params.dataDictionaryId = selectedDataDictionaryIdRef.value;
return await getDictionaryDetailsAsync({ params });
});
};
const [registerTable, { reload }] = useTable({
columns: tableColumns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema
},
api: getDictionaryPageDetailsAsync,
useSearchForm: true,
showTableSetting: true,
showIndexColumn: true,
bordered: true,
canResize: true,
actionColumn: {
width: 150,
title: t("common.action"),
dataIndex: "action",
slots: { customRender: "action" }
}
const handleEdit = (record: Recordable) => {
editModal(true, {
record: record,
});
};
const handleCreateType = () => {
createTypeModal(true);
};
const { createConfirm } = useMessage();
const handleDelete = async (record: Recordable) => {
let msg = t('common.askDelete');
createConfirm({
iconType: 'warning',
title: t('common.tip'),
content: msg,
onOk: async () => {
await deleteDetailAsync({
dataDictionaryId: record.dataDictionaryId,
dataDictionaryDetailId: record.id,
reload,
});
},
});
};
return {
registerTable,
registerCreateModal,
registerEditModal,
registerEditTypeModal,
handleCreate,
handleEdit,
handleEditType,
reload,
registerTypeTable,
registerCreateType,
handleCreateType,
reloadType,
onSelectChange,
clearSelectedRowKeys,
t,
handleDelete,
handleDeleteDictionaryType,
};
},
});
});
async function getDictionaryPageDetailsAsync(params) {
if (selectedDataDictionaryIdRef.value == "") {
return [];
}
params.dataDictionaryId = selectedDataDictionaryIdRef.value;
return await getDictionaryDetailsAsync({ params });
}
const handleEdit = (record: Recordable) => {
editModal(true, {
record: record
});
};
const handleCreateType = () => {
createTypeModal(true);
};
const { createConfirm } = useMessage();
const handleDelete = async (record: Recordable) => {
let msg = t("common.askDelete");
createConfirm({
iconType: "warning",
title: t("common.tip"),
content: msg,
onOk: async () => {
await deleteDetailAsync({
dataDictionaryId: record.dataDictionaryId,
dataDictionaryDetailId: record.id,
reload
});
}
});
};
return {
registerTable,
registerCreateModal,
registerEditModal,
registerEditTypeModal,
handleCreate,
handleEdit,
handleEditType,
reload,
registerTypeTable,
registerCreateType,
handleCreateType,
reloadType,
onSelectChange,
clearSelectedRowKeys,
t,
handleDelete,
handleDeleteDictionaryType
};
}
});
</script>
<style lang="less" scoped></style>

104
vben271/src/views/admin/dictionary/CreateAbpDictionary.vue

@ -14,64 +14,64 @@
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { BasicForm, useForm } from '/@/components/Form/index';
import { useI18n } from '/@/hooks/web/useI18n';
import { createFormSchema, createDetailsDictionaryAsync } from "/@/views/admin/dictionary/AbpDictionary";
import { defineComponent } from "vue";
import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from "/@/components/Form/index";
import { useI18n } from "/@/hooks/web/useI18n";
import { createFormSchema, createDetailsDictionaryAsync } from "/@/views/admin/dictionary/AbpDictionary";
export default defineComponent({
name: 'CreateDictionary',
components: {
BasicModal,
BasicForm,
},
export default defineComponent({
name: "CreateDictionary",
components: {
BasicModal,
BasicForm
},
setup(_, { emit }) {
const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
setFieldsValue({
id: data.dictionaryCreate.id,
typeDisplayText: data.dictionaryCreate.displayText,
});
setup(_, { emit }) {
const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
setFieldsValue({
id: data.dictionaryCreate.id,
typeDisplayText: data.dictionaryCreate.displayText
});
});
const [registerDictionaryForm, { resetFields, getFieldsValue, validate, setFieldsValue }] =
useForm({
labelWidth: 120,
schemas: createFormSchema,
showActionButtonGroup: false
});
const [registerDictionaryForm, { resetFields, getFieldsValue, validate, setFieldsValue }] =
useForm({
labelWidth: 120,
schemas: createFormSchema,
showActionButtonGroup: false,
const submit = async () => {
try {
let request = getFieldsValue();
await createDetailsDictionaryAsync({
request,
changeOkLoading,
validate,
resetFields,
closeModal
});
const submit = async () => {
try {
let request = getFieldsValue();
await createDetailsDictionaryAsync({
request,
changeOkLoading,
validate,
resetFields,
closeModal,
});
emit('reload');
} catch (error) {
changeOkLoading(false);
}
};
emit("reload");
} catch (error) {
changeOkLoading(false);
}
};
const cancel = () => {
resetFields();
// emit('clearSelectedRowKeys');
closeModal();
};
const cancel = () => {
resetFields();
// emit('clearSelectedRowKeys');
closeModal();
};
return {
registerModal,
registerDictionaryForm,
submit,
t,
cancel,
};
},
});
return {
registerModal,
registerDictionaryForm,
submit,
t,
cancel
};
}
});
</script>
<style lang="less" scoped></style>

95
vben271/src/views/admin/dictionary/CreateAbpDictionaryType.vue

@ -14,56 +14,57 @@
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { useI18n } from '/@/hooks/web/useI18n';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { BasicForm, useForm } from '/@/components/Form/index';
import { createDictionaryTypeFormSchema, createDictionaryTypeAsync } from "/@/views/admin/dictionary/AbpDictionary";
export default defineComponent({
name: 'CreateAbpDictionaryType',
components: {
BasicModal,
BasicForm,
},
setup(_, { emit }) {
const { t } = useI18n();
import { defineComponent } from "vue";
import { useI18n } from "/@/hooks/web/useI18n";
import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from "/@/components/Form/index";
import { createDictionaryTypeFormSchema, createDictionaryTypeAsync } from "/@/views/admin/dictionary/AbpDictionary";
const [registerModal, { closeModal, changeOkLoading }] = useModalInner();
const [registerDictionaryTypeForm, { resetFields, getFieldsValue, validate }] = useForm({
labelWidth: 100,
schemas: createDictionaryTypeFormSchema,
showActionButtonGroup: false,
});
const submit = async () => {
try {
let request = getFieldsValue();
await createDictionaryTypeAsync({
request,
changeOkLoading,
closeModal,
validate,
resetFields,
});
emit('reload');
} catch (error) {
changeOkLoading(false);
}
};
export default defineComponent({
name: "CreateAbpDictionaryType",
components: {
BasicModal,
BasicForm
},
setup(_, { emit }) {
const { t } = useI18n();
const cancel = () => {
resetFields();
closeModal();
};
const [registerModal, { closeModal, changeOkLoading }] = useModalInner();
const [registerDictionaryTypeForm, { resetFields, getFieldsValue, validate }] = useForm({
labelWidth: 100,
schemas: createDictionaryTypeFormSchema,
showActionButtonGroup: false
});
const submit = async () => {
try {
let request = getFieldsValue();
await createDictionaryTypeAsync({
request,
changeOkLoading,
closeModal,
validate,
resetFields
});
emit("reload");
} catch (error) {
changeOkLoading(false);
}
};
return {
registerModal,
registerDictionaryTypeForm,
submit,
t,
cancel,
};
},
});
const cancel = () => {
resetFields();
closeModal();
};
return {
registerModal,
registerDictionaryTypeForm,
submit,
t,
cancel
};
}
});
</script>
<style lang="less" scoped></style>

100
vben271/src/views/admin/dictionary/EditAbpDictionary.vue

@ -14,61 +14,61 @@
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { useI18n } from '/@/hooks/web/useI18n';
import { BasicForm, useForm } from '/@/components/Form/index';
import { editFormSchema, editDetailsDictionaryAsync } from "/@/views/admin/dictionary/AbpDictionary";
import { defineComponent } from "vue";
import { BasicModal, useModalInner } from "/@/components/Modal";
import { useI18n } from "/@/hooks/web/useI18n";
import { BasicForm, useForm } from "/@/components/Form/index";
import { editFormSchema, editDetailsDictionaryAsync } from "/@/views/admin/dictionary/AbpDictionary";
export default defineComponent({
name: 'EditDictionary',
components: {
BasicModal,
BasicForm,
},
setup(_, { emit }) {
const { t } = useI18n();
export default defineComponent({
name: "EditDictionary",
components: {
BasicModal,
BasicForm
},
setup(_, { emit }) {
const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
setFieldsValue({
id: data.record.id,
dataDictionaryId: data.record.dataDictionaryId,
displayText: data.record.displayText,
description: data.record.description,
code: data.record.code,
order: data.record.order,
});
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
setFieldsValue({
id: data.record.id,
dataDictionaryId: data.record.dataDictionaryId,
displayText: data.record.displayText,
description: data.record.description,
code: data.record.code,
order: data.record.order
});
const [registerDictionaryForm, { setFieldsValue, getFieldsValue, validate, resetFields }] =
useForm({
labelWidth: 120,
schemas: editFormSchema,
showActionButtonGroup: false,
});
const submit = async () => {
try {
let request = getFieldsValue();
await editDetailsDictionaryAsync({ request, changeOkLoading, validate, closeModal });
emit('reload');
} catch (error) {
changeOkLoading(false);
}
};
});
const [registerDictionaryForm, { setFieldsValue, getFieldsValue, validate, resetFields }] =
useForm({
labelWidth: 120,
schemas: editFormSchema,
showActionButtonGroup: false
});
const submit = async () => {
try {
let request = getFieldsValue();
await editDetailsDictionaryAsync({ request, changeOkLoading, validate, closeModal });
emit("reload");
} catch (error) {
changeOkLoading(false);
}
};
const cancel = () => {
resetFields();
closeModal();
};
const cancel = () => {
resetFields();
closeModal();
};
return {
registerModal,
registerDictionaryForm,
submit,
cancel,
t,
};
},
});
return {
registerModal,
registerDictionaryForm,
submit,
cancel,
t
};
}
});
</script>
<style lang="less" scoped></style>

99
vben271/src/views/admin/dictionary/EditAbpDictionaryType.vue

@ -14,59 +14,60 @@
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { useI18n } from '/@/hooks/web/useI18n';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { BasicForm, useForm } from '/@/components/Form/index';
import { editDictionaryTypeFormSchema, editDictionaryTypeAsync } from "/@/views/admin/dictionary/AbpDictionary";
export default defineComponent({
name: 'EditDictionary',
components: {
BasicModal,
BasicForm,
},
setup(_, { emit }) {
const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
setFieldsValue({
id: data.record.id,
code: data.record.code,
description: data.record.description,
displayText: data.record.displayText,
key: data.record.key,
});
import { defineComponent } from "vue";
import { useI18n } from "/@/hooks/web/useI18n";
import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from "/@/components/Form/index";
import { editDictionaryTypeFormSchema, editDictionaryTypeAsync } from "/@/views/admin/dictionary/AbpDictionary";
export default defineComponent({
name: "EditDictionary",
components: {
BasicModal,
BasicForm
},
setup(_, { emit }) {
const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
setFieldsValue({
id: data.record.id,
code: data.record.code,
description: data.record.description,
displayText: data.record.displayText,
key: data.record.key
});
});
const [registerDictionaryTypeForm, { setFieldsValue, getFieldsValue, validate, resetFields }] =
useForm({
labelWidth: 100,
schemas: editDictionaryTypeFormSchema,
showActionButtonGroup: false
});
const [registerDictionaryTypeForm, { setFieldsValue, getFieldsValue, validate, resetFields }] =
useForm({
labelWidth: 100,
schemas: editDictionaryTypeFormSchema,
showActionButtonGroup: false,
});
const submit = async () => {
try {
let request = getFieldsValue();
await editDictionaryTypeAsync({ request, changeOkLoading, validate, closeModal });
emit('reload');
} catch (error) {
changeOkLoading(false);
}
};
const submit = async () => {
try {
let request = getFieldsValue();
await editDictionaryTypeAsync({ request, changeOkLoading, validate, closeModal });
emit("reload");
} catch (error) {
changeOkLoading(false);
}
};
const cancel = () => {
resetFields();
closeModal();
};
const cancel = () => {
resetFields();
closeModal();
};
return {
registerModal,
registerDictionaryTypeForm,
submit,
t,
cancel,
};
},
});
return {
registerModal,
registerDictionaryTypeForm,
submit,
t,
cancel
};
}
});
</script>
<style lang="less" scoped></style>

54
vben271/src/views/admin/elasticSearch/ElasticSearch.ts

@ -1,50 +1,52 @@
import { FormSchema } from '/@/components/Table';
import { BasicColumn } from '/@/components/Table';
import { useI18n } from '/@/hooks/web/useI18n';
import { FormSchema } from "/@/components/Table";
import { BasicColumn } from "/@/components/Table";
import { useI18n } from "/@/hooks/web/useI18n";
const { t } = useI18n();
import moment from 'moment';
import moment from "moment";
import {
EsLogServiceProxy,
PagingElasticSearchLogInput,
PagingElasticSearchLogOutputCustomePagedResultDto,
} from '/@/services/ServiceProxies';
PagingElasticSearchLogOutputCustomePagedResultDto
} from "/@/services/ServiceProxies";
export const searchFormSchema: FormSchema[] = [
{
field: 'filter',
component: 'Input',
label: t('common.key'),
field: "filter",
component: "Input",
label: t("common.key"),
labelWidth: 80,
colProps: {
span: 6,
},
span: 6
}
},
{
field: 'time',
component: 'RangePicker',
label: '创建时间:',
field: "time",
component: "RangePicker",
label: "创建时间:",
labelWidth: 80,
colProps: { span: 6 },
defaultValue: [moment().subtract(0, 'days'), moment().add(1, 'days')],
},
defaultValue: [moment().subtract(0, "days"), moment().add(1, "days")]
}
];
export const tableColumns: BasicColumn[] = [
{
title: t('routes.admin.logLevel'),
dataIndex: 'level',
width: 200,
title: t("routes.admin.logLevel"),
dataIndex: "level",
width: 200
},
{
title: t('common.creationTime'),
dataIndex: 'creationTime',
title: t("common.creationTime"),
dataIndex: "creationTime",
customRender: ({ text }) => {
return moment(text).format('YYYY-MM-DD HH:mm:ss');
return moment(text).format("YYYY-MM-DD HH:mm:ss");
},
width: 200,
width: 200
},
{
title: t('routes.admin.logContent'),
dataIndex: 'message',
},
title: t("routes.admin.logContent"),
dataIndex: "message"
}
];
/**

119
vben271/src/views/admin/elasticSearch/ElasticSearch.vue

@ -2,9 +2,9 @@
<div>
<BasicTable @register="registerTable" size="small">
<template #action="{ record }">
<a-button type="link" size="small" @click="lookJson(record)">{{
t('common.detail')
}}</a-button>
<a-button type="link" size="small" @click="lookJson(record)">
{{ t("common.detail") }}
</a-button>
</template>
</BasicTable>
<BasicModal :canFullscreen="false" @register="registerModal" :showOkButton="false">
@ -14,64 +14,65 @@
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';
import { useI18n } from '/@/hooks/web/useI18n';
import { BasicModal, useModal } from '/@/components/Modal';
import { BasicTable, useTable } from '/@/components/Table';
import {
getElasticSearchLogAsync,
tableColumns,
searchFormSchema,
} from '/@/views/admin/elasticSearch/ElasticSearch';
export default defineComponent({
name: 'ElasticSearch',
components: {
BasicTable,
BasicModal,
},
setup() {
const { t } = useI18n();
const [registerModal, { openModal: openJsonModal }] = useModal();
const [registerTable, { reload }] = useTable({
columns: tableColumns,
formConfig: {
labelWidth: 100,
schemas: searchFormSchema,
fieldMapToTime: [['time', ['startCreationTime', 'endCreationTime']]],
},
api: getElasticSearchLogAsync,
useSearchForm: true,
showTableSetting: true,
bordered: true,
canResize: true,
showIndexColumn: true,
actionColumn: {
title: t('common.action'),
dataIndex: 'action',
slots: {
customRender: 'action',
},
width: 150,
fixed: 'right',
import { defineComponent, ref } from "vue";
import { useI18n } from "/@/hooks/web/useI18n";
import { BasicModal, useModal } from "/@/components/Modal";
import { BasicTable, useTable } from "/@/components/Table";
import {
getElasticSearchLogAsync,
tableColumns,
searchFormSchema
} from "/@/views/admin/elasticSearch/ElasticSearch";
export default defineComponent({
name: "ElasticSearch",
components: {
BasicTable,
BasicModal
},
setup() {
const { t } = useI18n();
const [registerModal, { openModal: openJsonModal }] = useModal();
const [registerTable, { reload }] = useTable({
columns: tableColumns,
formConfig: {
labelWidth: 100,
schemas: searchFormSchema,
fieldMapToTime: [["time", ["startCreationTime", "endCreationTime"]]]
},
api: getElasticSearchLogAsync,
useSearchForm: true,
showTableSetting: true,
bordered: true,
canResize: true,
showIndexColumn: true,
actionColumn: {
title: t("common.action"),
dataIndex: "action",
slots: {
customRender: "action"
},
});
let content = ref('');
const lookJson = async (record) => {
openJsonModal();
content.value = record.message;
};
width: 150,
fixed: "right"
}
});
let content = ref("");
const lookJson = async (record) => {
openJsonModal();
content.value = record.message;
};
return {
t,
registerTable,
reload,
lookJson,
registerModal,
openJsonModal,
content,
};
},
});
return {
t,
registerTable,
reload,
lookJson,
registerModal,
openJsonModal,
content
};
}
});
</script>
<style lang="less" scoped></style>

35
vben271/src/views/admin/files/File.ts

@ -1,31 +1,32 @@
import { FormSchema } from '/@/components/Table';
import { BasicColumn } from '/@/components/Table';
import moment from 'moment';
import { FilesServiceProxy, PagingFileInput } from '/@/services/ServiceProxies';
import { useI18n } from '/@/hooks/web/useI18n';
import { FormSchema } from "/@/components/Table";
import { BasicColumn } from "/@/components/Table";
import moment from "moment";
import { FilesServiceProxy, PagingFileInput } from "/@/services/ServiceProxies";
import { useI18n } from "/@/hooks/web/useI18n";
const { t } = useI18n();
export const searchFormSchema: FormSchema[] = [
{
field: 'filter',
label: t('routes.admin.fileName'),
component: 'Input',
colProps: { span: 8 },
},
field: "filter",
label: t("routes.admin.fileName"),
component: "Input",
colProps: { span: 8 }
}
];
export const tableColumns: BasicColumn[] = [
{
title: t('routes.admin.fileName'),
dataIndex: 'fileName',
title: t("routes.admin.fileName"),
dataIndex: "fileName"
},
{
title: t('routes.admin.userManagement_createTime'),
dataIndex: 'creationTime',
title: t("routes.admin.userManagement_createTime"),
dataIndex: "creationTime",
customRender: ({ text }) => {
return moment(text).format('YYYY-MM-DD HH:mm:ss');
},
},
return moment(text).format("YYYY-MM-DD HH:mm:ss");
}
}
];
/**

146
vben271/src/views/admin/files/File.vue

@ -32,81 +32,83 @@
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';
import { UploadOutlined } from '@ant-design/icons-vue';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
import { tableColumns, searchFormSchema, getTableListAsync } from "/@/views/admin/files/File";
import { Tag } from 'ant-design-vue';
import { useI18n } from '/@/hooks/web/useI18n';
import { getOSSClient, importFileAsync, downLoadFile } from './UploadOss';
import { CreateFileInput } from '/@/services/ServiceProxies';
import moment from 'moment';
export default defineComponent({
components: {
BasicTable,
TableAction,
Tag,
UploadOutlined,
},
setup() {
const { t } = useI18n();
const fileList = ref([]);
// table配置
const [registerTable, { reload }] = useTable({
columns: tableColumns,
formConfig: {
labelWidth: 70,
schemas: searchFormSchema,
fieldMapToTime: [
['time', ['executionBeginTime', 'executionEndTime'], 'YYYY-MM-DD HH:mm:ss'],
],
},
api: getTableListAsync,
showTableSetting: true,
useSearchForm: true,
bordered: true,
canResize: true,
showIndexColumn: true,
actionColumn: {
width: 120,
title: t('common.action'),
dataIndex: 'action',
slots: {
customRender: 'action',
},
fixed: 'right',
import { defineComponent, ref } from "vue";
import { UploadOutlined } from "@ant-design/icons-vue";
import { BasicTable, useTable, TableAction } from "/@/components/Table";
import { tableColumns, searchFormSchema, getTableListAsync } from "/@/views/admin/files/File";
import { Tag } from "ant-design-vue";
import { useI18n } from "/@/hooks/web/useI18n";
import { getOSSClient, importFileAsync, downLoadFile } from "./UploadOss";
import { CreateFileInput } from "/@/services/ServiceProxies";
import moment from "moment";
export default defineComponent({
components: {
BasicTable,
TableAction,
Tag,
UploadOutlined
},
setup() {
const { t } = useI18n();
const fileList = ref([]);
// table配置
const [registerTable, { reload }] = useTable({
columns: tableColumns,
formConfig: {
labelWidth: 70,
schemas: searchFormSchema,
fieldMapToTime: [
["time", ["executionBeginTime", "executionEndTime"], "YYYY-MM-DD HH:mm:ss"]
]
},
api: getTableListAsync,
showTableSetting: true,
useSearchForm: true,
bordered: true,
canResize: true,
showIndexColumn: true,
actionColumn: {
width: 120,
title: t("common.action"),
dataIndex: "action",
slots: {
customRender: "action"
},
});
fixed: "right"
}
});
async function customRequest(action) {
let fileName = action.file.name;
let index = fileName.lastIndexOf('.');
let type = fileName.slice(index + 1);
let name = fileName.slice(0, index);
const client = await getOSSClient();
let fileFullName = `host/${moment().format('YYYY-MM-DD')}/${name}_${moment().format(
'X'
)}.${type}`;
async function customRequest(action) {
let fileName = action.file.name;
let index = fileName.lastIndexOf(".");
let type = fileName.slice(index + 1);
let name = fileName.slice(0, index);
const client = await getOSSClient();
let fileFullName = `host/${moment().format("YYYY-MM-DD")}/${name}_${moment().format(
"X"
)}.${type}`;
await client.put(fileFullName, action.file);
let request = new CreateFileInput();
request.fileName = fileName;
request.filePath = fileFullName;
await importFileAsync({ request });
await reload();
}
const handleDownload = async (record: Recordable) => {
await downLoadFile(record.filePath);
};
return {
t,
fileList,
registerTable,
customRequest,
handleDownload,
};
},
});
await client.put(fileFullName, action.file);
let request = new CreateFileInput();
request.fileName = fileName;
request.filePath = fileFullName;
await importFileAsync({ request });
await reload();
}
const handleDownload = async (record: Recordable) => {
await downLoadFile(record.filePath);
};
return {
t,
fileList,
registerTable,
customRequest,
handleDownload
};
}
});
</script>
<style lang="less" scoped></style>

36
vben271/src/views/admin/files/UploadOss.ts

@ -1,6 +1,6 @@
import { FilesServiceProxy, FileTokenOutput } from '/@/services/ServiceProxies';
import OSS from 'ali-oss';
import moment from 'moment';
import { FilesServiceProxy, FileTokenOutput } from "/@/services/ServiceProxies";
import OSS from "ali-oss";
import moment from "moment";
export async function importFileAsync({ request }) {
const _filesServiceProxy = new FilesServiceProxy();
@ -10,20 +10,20 @@ export async function importFileAsync({ request }) {
async function getFileTokenAsync() {
const _filesServiceProxy = new FilesServiceProxy();
const result = await _filesServiceProxy.getFileToken();
sessionStorage.setItem('oss', JSON.stringify(result));
sessionStorage.setItem("oss", JSON.stringify(result));
return result;
}
export async function getOSSClient(): Promise<OSS> {
let fileToken = new FileTokenOutput();
try {
let oss = sessionStorage.getItem('oss');
let oss = sessionStorage.getItem("oss");
if (!oss) {
fileToken = await getFileTokenAsync();
} else {
fileToken = JSON.parse(oss);
let expiration = moment(fileToken.expiration).format('YYYY-MM-DD HH:mm:ss');
let expiration = moment(fileToken.expiration).format("YYYY-MM-DD HH:mm:ss");
debugger;
if (expiration < formatDate(moment.now())) {
fileToken = await getFileTokenAsync();
@ -34,36 +34,36 @@ export async function getOSSClient(): Promise<OSS> {
accessKeyId: fileToken.accessKeyId,
accessKeySecret: fileToken.accessKeySecret,
bucket: fileToken.bucket,
stsToken: fileToken.token as string,
stsToken: fileToken.token as string
};
return Promise.resolve<OSS>(new OSS(request));
} catch (error) {
console.error('获取oss Client失败');
console.error("获取oss Client失败");
}
}
export async function downLoadFile(fileName) {
let oss = await getOSSClient();
const response = {
'content-disposition': `attachment; filename=${encodeURIComponent(fileName)}`,
"content-disposition": `attachment; filename=${encodeURIComponent(fileName)}`
};
const url = (oss as OSS).signatureUrl(fileName, { response });
let link = document.createElement('a'); //创建a标签
link.style.display = 'none'; //使其隐藏
let link = document.createElement("a"); //创建a标签
link.style.display = "none"; //使其隐藏
link.href = url; //赋予文件下载地址
link.setAttribute('download', fileName); //设置下载属性 以及文件名
link.setAttribute("download", fileName); //设置下载属性 以及文件名
document.body.appendChild(link); //a标签插至页面中
link.click(); //强制触发a标签事件
}
function formatDate(dateTime) {
const date = new Date(dateTime);
const YY = date.getFullYear() + '-';
const MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
const DD = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
const hh = date.getHours() + ':';
const mm = date.getMinutes() + ':';
const YY = date.getFullYear() + "-";
const MM = (date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1) + "-";
const DD = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
const hh = date.getHours() + ":";
const mm = date.getMinutes() + ":";
const ss = date.getSeconds();
return YY + MM + DD + ' ' + hh + mm + ss;
return YY + MM + DD + " " + hh + mm + ss;
}

104
vben271/src/views/admin/organizationUnits/AddRoleToOrganizationUnit.vue

@ -0,0 +1,104 @@
<template>
<div>
<BasicModal
:title="t('common.createText')"
:canFullscreen="false"
@ok="submit"
:maskClosable="false"
@cancel="cancel"
@register="registerModal"
:destroyOnClose="true"
>
<BasicTable @register="registerRoleTable" @selection-change="onSelectChange" size="small" />
</BasicModal>
</div>
</template>
<script lang="ts">
import { defineComponent } from "vue";
import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm } from "/@/components/Form/index";
import { useI18n } from "/@/hooks/web/useI18n";
import {
getUnAddRolesAsync, addRoleTableColumns, searchAddRoleFormSchema, addRoleToOrganizationUnitAsync, GetUnAddUserAsync
} from "/@/views/admin/organizationUnits/OrganizationUnit";
import { AddRoleToOrganizationUnitInput, GetUnAddRoleInput } from "/@/services/ServiceProxies";
import { BasicTable, useTable } from "/@/components/Table";
export default defineComponent({
name: "AddRoleToOrganizationUnit",
components: {
BasicModal,
BasicForm,
BasicTable
},
setup(_, { emit }) {
const { t } = useI18n();
const getTableAsync = async () => {
let request= new GetUnAddRoleInput();
request.organizationUnitId=organizationUnitId;
return await getUnAddRolesAsync(request)
};
const [registerRoleTable, { reload }] = useTable({
columns: addRoleTableColumns,
formConfig: {
labelWidth: 70,
schemas: searchAddRoleFormSchema
},
api: getTableAsync,
showTableSetting: false,
useSearchForm: false,
bordered: true,
showIndexColumn: true,
maxHeight: 400,
immediate: false,
rowSelection: { type: "checkbox" }
});
let organizationUnitId = "";
const [registerModal, { closeModal, changeOkLoading }] = useModalInner(async (data) => {
organizationUnitId = data.organizationUnitId;
await reload();
});
//勾选事件
let selectRoles:string[]=[];
const onSelectChange = ({ rows }) => {
selectRoles = rows.map((item)=>{
return item.id;
})
};
const submit = async () => {
try {
changeOkLoading(true)
let request = new AddRoleToOrganizationUnitInput();
request.organizationUnitId = organizationUnitId;
request.roleId=selectRoles;
await addRoleToOrganizationUnitAsync(request);
changeOkLoading(false);
closeModal();
emit("reload");
} catch (error) {
changeOkLoading(false);
}
};
const cancel = () => {
organizationUnitId='';
selectRoles=[]
closeModal();
};
return {
registerModal,
registerRoleTable,
submit,
t,
cancel,
onSelectChange
};
}
});
</script>
<style lang="less" scoped></style>

111
vben271/src/views/admin/organizationUnits/AddUserToOrganizationUnit.vue

@ -0,0 +1,111 @@
<template>
<div>
<BasicModal
:title="t('common.createText')"
:canFullscreen="false"
@ok="submit"
:maskClosable="false"
@cancel="cancel"
@register="registerModal"
:destroyOnClose="true"
>
<BasicTable @register="registerRoleTable" @selection-change="onSelectChange" size="small" />
</BasicModal>
</div>
</template>
<script lang="ts">
import { defineComponent } from "vue";
import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm } from "/@/components/Form/index";
import { useI18n } from "/@/hooks/web/useI18n";
import {
addUserTableColumns, searchUserFormSchema, addUserToOrganizationUnitAsync, GetUnAddUserAsync
} from "/@/views/admin/organizationUnits/OrganizationUnit";
import { AddUserToOrganizationUnitInput, GetUnAddUserInput } from "/@/services/ServiceProxies";
import { BasicTable, useTable } from "/@/components/Table";
export default defineComponent({
name: "AddUserToOrganizationUnit",
components: {
BasicModal,
BasicForm,
BasicTable
},
setup(_, { emit }) {
const { t } = useI18n();
const getTableAsync = async () => {
let request= new GetUnAddUserInput();
request.organizationUnitId=organizationUnitId;
request.filter=getForm().getFieldsValue().filter;
return await GetUnAddUserAsync(request)
};
const [registerRoleTable, { reload,getForm }] = useTable({
columns: addUserTableColumns,
formConfig: {
labelWidth: 70,
schemas: searchUserFormSchema,
showResetButton: false
},
api: getTableAsync,
showTableSetting: false,
useSearchForm: true,
bordered: true,
showIndexColumn: true,
maxHeight: 400,
immediate: false,
rowSelection: { type: "checkbox" }
});
let organizationUnitId = "";
const [registerModal, { closeModal, changeOkLoading }] = useModalInner(async (data) => {
organizationUnitId = data.organizationUnitId;
await reload({ searchInfo: { organizationUnitId: organizationUnitId } });
});
//勾选事件
let selectUsers: string[] = [];
const onSelectChange = ({ rows }) => {
selectUsers = rows.map((item) => {
return item.id;
});
};
const submit = async () => {
try {
changeOkLoading(true);
let request = new AddUserToOrganizationUnitInput();
request.organizationUnitId = organizationUnitId;
request.userId = selectUsers;
await addUserToOrganizationUnitAsync(request);
changeOkLoading(false);
closeModal();
emit("reload");
} catch (error) {
changeOkLoading(false);
}
};
const cancel = () => {
organizationUnitId = "";
selectUsers = [];
closeModal();
};
return {
registerModal,
registerRoleTable,
submit,
t,
cancel,
onSelectChange
};
}
});
</script>
<style lang="less" scoped></style>

89
vben271/src/views/admin/organizationUnits/CreateOrganizationUnit.vue

@ -0,0 +1,89 @@
<template>
<div>
<BasicModal
:title="t('common.createText')"
:canFullscreen="false"
@ok="submit"
:maskClosable="false"
@cancel="cancel"
@register="registerModal"
:minHeight="100"
:destroyOnClose="true"
>
<BasicForm @register="registerOrganizationUnitForm" />
</BasicModal>
</div>
</template>
<script lang="ts">
import { defineComponent } from "vue";
import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from "/@/components/Form/index";
import { useI18n } from "/@/hooks/web/useI18n";
import {
createOrganizationUnitFormSchema,
createOrganizationUnitAsync
} from "/@/views/admin/organizationUnits/OrganizationUnit";
export default defineComponent({
name: "CreateOrganizationUnit",
components: {
BasicModal,
BasicForm
},
setup(_, { emit }) {
const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
if (data.record.parentId == "") {
updateSchema({ field: "parentDisplayName", ifShow: false });
} else {
updateSchema({ field: "parentDisplayName", ifShow: true });
setFieldsValue({
parentDisplayName: data.record.parentDisplayName,
parentId: data.record.parentId
});
}
});
const [
registerOrganizationUnitForm,
{ resetFields, getFieldsValue, validate, setFieldsValue, updateSchema }
] = useForm({
labelWidth: 120,
schemas: createOrganizationUnitFormSchema,
showActionButtonGroup: false
});
const submit = async () => {
try {
let request = getFieldsValue();
await createOrganizationUnitAsync({
request,
changeOkLoading,
validate,
resetFields,
closeModal
});
emit("reload");
} catch (error) {
changeOkLoading(false);
}
};
const cancel = () => {
resetFields();
// emit('clearSelectedRowKeys');
closeModal();
};
return {
registerModal,
registerOrganizationUnitForm,
submit,
t,
cancel
};
}
});
</script>
<style lang="less" scoped></style>

75
vben271/src/views/admin/organizationUnits/EditOrganizationUnit.vue

@ -0,0 +1,75 @@
<template>
<div>
<BasicModal
:title="t('common.editText')"
:canFullscreen="false"
@ok="submit"
:maskClosable="false"
@cancel="cancel"
@register="registerModal"
:minHeight="100"
:destroyOnClose="true"
>
<BasicForm @register="registerOrganizationUnitForm" />
</BasicModal>
</div>
</template>
<script lang="ts">
import { defineComponent } from "vue";
import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from "/@/components/Form/index";
import { useI18n } from "/@/hooks/web/useI18n";
import { editOrganizationUnitFormSchema, editOrganizationUnitAsync } from "/@/views/admin/organizationUnits/OrganizationUnit";
export default defineComponent({
name: "EditOrganizationUnit",
components: {
BasicModal,
BasicForm
},
setup(_, { emit }) {
const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
setFieldsValue({
displayName: data.record.displayName,
id: data.record.id
});
});
const [registerOrganizationUnitForm, { getFieldsValue, validate, setFieldsValue }] = useForm({
labelWidth: 120,
schemas: editOrganizationUnitFormSchema,
showActionButtonGroup: false
});
const submit = async () => {
try {
let request = getFieldsValue();
await editOrganizationUnitAsync({
request,
changeOkLoading,
validate,
closeModal
});
emit("reload");
} catch (error) {
changeOkLoading(false);
}
};
const cancel = () => {
closeModal();
};
return {
registerModal,
registerOrganizationUnitForm,
submit,
t,
cancel
};
}
});
</script>
<style lang="less" scoped></style>

236
vben271/src/views/admin/organizationUnits/OrganizationUnit.ts

@ -0,0 +1,236 @@
import {
OrganizationUnitsServiceProxy,
IdInput,
GetOrganizationUnitUserInput,
GetOrganizationUnitRoleInput,
RemoveUserToOrganizationUnitInput,
RemoveRoleToOrganizationUnitInput,
AddRoleToOrganizationUnitInput,
AddUserToOrganizationUnitInput,
GetUnAddRoleInput,
GetUnAddUserInput
} from "/@/services/ServiceProxies";
import { FormSchema } from "/@/components/Table";
import { BasicColumn } from "/@/components/Table";
import { useI18n } from "/@/hooks/web/useI18n";
const { t } = useI18n();
export const createOrganizationUnitFormSchema: FormSchema[] = [
{
field: "parentDisplayName",
label: t("routes.admin.parentOrganizationUnitName"),
component: "Input",
componentProps: {
disabled: true
},
colProps: {
span: 18
}
},
{
field: "displayName",
label: t("routes.admin.organizationUnitName"),
component: "Input",
colProps: {
span: 18
}
},
{
field: "parentId",
label: "",
component: "Input",
colProps: {
span: 18
},
ifShow: false
}
];
export const editOrganizationUnitFormSchema: FormSchema[] = [
{
field: "displayName",
label: t("routes.admin.organizationUnitName"),
component: "Input",
colProps: {
span: 18
}
},
{
field: "id",
label: "",
component: "Input",
colProps: {
span: 18
},
ifShow: false
}
];
export const addRoleToOrganizationUnitFormSchema: FormSchema[] = [
{
field: "displayName",
label: t("routes.admin.organizationUnitName"),
component: "Input",
colProps: {
span: 18
}
},
{
field: "organizationUnitId",
label: "",
component: "Input",
colProps: {
span: 18
},
ifShow: false
}
];
export const userTableColumns: BasicColumn[] = [
{
title: t("routes.admin.userManagement_userName"),
dataIndex: "userName"
},
{
title: t("routes.admin.userManagement_email"),
dataIndex: "email"
}
];
export const addUserTableColumns: BasicColumn[] = [
{
title: t("routes.admin.userManagement_userName"),
dataIndex: "userName"
},
{
title: t("routes.admin.userManagement_email"),
dataIndex: "email"
}
];
export const roleTableColumns: BasicColumn[] = [
{
title: t("routes.admin.userManagement_roleName"),
dataIndex: "name"
}
];
export const addRoleTableColumns: BasicColumn[] = [
{
title: t("routes.admin.userManagement_roleName"),
dataIndex: "name"
}
];
export const searchAddRoleFormSchema: FormSchema[] = [
{
field: "filter",
label: t("routes.admin.userManagement_roleName"),
component: "Input",
colProps: { span: 8 }
},
{
field: "organizationUnitId",
label: "",
component: "Input",
ifShow: false,
colProps: { span: 8 }
}
];
export const searchUserFormSchema: FormSchema[] = [
{
field: "filter",
label: t("routes.admin.userManagement_userName"),
component: "Input",
colProps: { span: 10 }
},
{
field: "organizationUnitId",
label: "",
component: "Input",
ifShow: false,
colProps: { span: 8 }
}
];
export async function getTreeAsync() {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return await _organizationUnitsServiceProxy.tree();
}
export async function deleteTreeNodeAsync({ id }) {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
const request = new IdInput();
request.id = id;
return await _organizationUnitsServiceProxy.delete(request);
}
export async function createOrganizationUnitAsync({
request,
changeOkLoading,
closeModal,
validate,
resetFields
}) {
changeOkLoading(true);
await validate();
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
await _organizationUnitsServiceProxy.create(request);
resetFields();
changeOkLoading(false);
closeModal();
}
export async function editOrganizationUnitAsync({
request,
changeOkLoading,
closeModal,
validate
}) {
changeOkLoading(true);
await validate();
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
await _organizationUnitsServiceProxy.update(request);
changeOkLoading(false);
closeModal();
}
export async function getUserTableListAsync(params: GetOrganizationUnitUserInput) {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.getUsers(params);
}
export async function getRoleTableListAsync(params: GetOrganizationUnitRoleInput) {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.getRoles(params);
}
export async function removeUserFromOrganizationUnitAsync(params: RemoveUserToOrganizationUnitInput) {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.removeUserFromOrganizationUnit(params);
}
export async function removeRoleFromOrganizationUnitAsync(params: RemoveRoleToOrganizationUnitInput) {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.removeRoleFromOrganizationUnit(params);
}
export async function addRoleToOrganizationUnitAsync(params: AddRoleToOrganizationUnitInput) {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.addRoleToOrganizationUnit(params);
}
export async function addUserToOrganizationUnitAsync(params: AddUserToOrganizationUnitInput) {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.addUserToOrganizationUnit(params);
}
export async function GetUnAddUserAsync(params: GetUnAddUserInput) {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.getUnAddUsers(params);
}
export async function getUnAddRolesAsync(params: GetUnAddRoleInput) {
const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy();
return _organizationUnitsServiceProxy.getUnAddRoles(params);
}

375
vben271/src/views/admin/organizationUnits/OrganizationUnit.vue

@ -0,0 +1,375 @@
<template>
<div>
<PageWrapper dense contentFullHeight contentClass="flex">
<div class="bg-white m-4 mr-0 overflow-hidden">
<BasicTree
toolbar
search
:treeData="treeData"
:beforeRightClick="getRightMenuList"
@select="handleSelect"
>
<template #headerTitle>
<span style="font-weight: 500"> {{ t("routes.admin.organizationUnit") }}</span>
<a-button
type="primary"
style="margin-left: 20px"
size="small"
v-auth="'System.OrganizationUnitManagement.Create'"
@click="createRootOrganizationUnit"
>
{{ t("routes.admin.createRootOrganizationUnit") }}
</a-button>
</template>
</BasicTree>
</div>
<div class="bg-white m-4 mr-0 w-3/4 xl:w-4/5">
<a-tabs v-model:activeKey="activeKey" @change="activeKeyChange">
<a-tab-pane key="1" :tab="t('routes.admin.member') ">
<BasicTable @register="registerUserTable" size="small">
<template #toolbar>
<a-button
preIcon="ant-design:plus-circle-outlined"
type="primary"
v-auth="'System.OrganizationUnitManagement.Update'"
@click="openAddUserToOrganizationUnitModal"
>
{{ t("common.createText") }}
</a-button>
</template>>
<template #action="{ record }">
<TableAction
:actions="[
{
icon: 'ant-design:delete-outlined',
label: t('common.delText'),
auth:'System.OrganizationUnitManagement.Delete',
onClick: handleUserDelete.bind(null, record),
},
]"
/>
</template>
</BasicTable>
</a-tab-pane>
<a-tab-pane key="2" :tab="t('routes.admin.role') " force-render>
<BasicTable @register="registerRoleTable" size="small">
<template #toolbar>
<a-button
preIcon="ant-design:plus-circle-outlined"
type="primary"
v-auth="'System.OrganizationUnitManagement.Update'"
@click="openAddRoleToOrganizationUnitModal"
>
{{ t("common.createText") }}
</a-button>
</template>
<template #action="{ record }">
<TableAction
:actions="[
{
icon: 'ant-design:delete-outlined',
label: t('common.delText'),
auth:'System.OrganizationUnitManagement.Delete',
onClick: handleRoleDelete.bind(null, record),
},
]"
/>
</template>
</BasicTable>
</a-tab-pane>
</a-tabs>
</div>
</PageWrapper>
<CreateOrganizationUnit
@register="registerCreateOrganizationUnit"
@reload="initOrganizationUnit"
/>
<EditOrganizationUnit @register="registerEditOrganizationUnit" @reload="initOrganizationUnit" />
<AddRoleToOrganizationUnit @register="registerAddRoleToOrganizationUnit"
@reload="reloadRole" />
<AddUserToOrganizationUnit @register="registerAddUserToOrganizationUnit"
@reload="reloadUser" />
</div>
</template>
<script lang="ts">
import { defineComponent, onMounted, ref } from "vue";
import { PageWrapper } from "/@/components/Page";
import { BasicTree, ContextMenuItem } from "/@/components/Tree";
import { BasicTable, useTable, TableAction } from "/@/components/Table";
import {
getTreeAsync,
deleteTreeNodeAsync,
getUserTableListAsync,
getRoleTableListAsync,
userTableColumns,
roleTableColumns,
searchUserFormSchema,
removeRoleFromOrganizationUnitAsync,
removeUserFromOrganizationUnitAsync
} from "/@/views/admin/organizationUnits/OrganizationUnit";
import {
TreeOutput,
GetOrganizationUnitUserInput,
GetOrganizationUnitRoleInput, RemoveUserToOrganizationUnitInput, RemoveRoleToOrganizationUnitInput
} from "/@/services/ServiceProxies";
import { Tabs } from "ant-design-vue";
import CreateOrganizationUnit from "./CreateOrganizationUnit.vue";
import EditOrganizationUnit from "./EditOrganizationUnit.vue";
import AddRoleToOrganizationUnit from "./AddRoleToOrganizationUnit.vue";
import AddUserToOrganizationUnit from "./AddUserToOrganizationUnit.vue";
import { useModal } from "/@/components/Modal";
import { useMessage } from "/@/hooks/web/useMessage";
import { useI18n } from "/@/hooks/web/useI18n";
export default defineComponent({
name: "OrganizationUnit",
components: {
BasicTree,
PageWrapper,
Tabs,
TabPane: Tabs.TabPane,
CreateOrganizationUnit,
EditOrganizationUnit,
BasicTable,
TableAction,
AddRoleToOrganizationUnit,
AddUserToOrganizationUnit
},
setup() {
const { t } = useI18n();
const { createConfirm } = useMessage();
const treeData = ref<TreeOutput[]>([]);
const activeKey = ref("1");
const [registerCreateOrganizationUnit, { openModal: CreateOrganizationUnitModal }] =useModal();
const [registerEditOrganizationUnit, { openModal: EditOrganizationUnitModal }] = useModal();
const [registerAddRoleToOrganizationUnit, { openModal: AddRoleToOrganizationUnitModal }] = useModal();
const [registerAddUserToOrganizationUnit, { openModal: AddUserToOrganizationUnitModal }] = useModal();
let organizationUnitId: string = "";
const openAddUserToOrganizationUnitModal= ()=>{
if(organizationUnitId)
{
AddUserToOrganizationUnitModal(true,{organizationUnitId});
}
};
const openAddRoleToOrganizationUnitModal= ()=>{
if(organizationUnitId)
{
AddRoleToOrganizationUnitModal(true,{organizationUnitId});
}
};
const initOrganizationUnit = async () => {
treeData.value = await getTreeAsync();
};
onMounted(async () => {
await initOrganizationUnit();
});
// 新增根节点
function createRootOrganizationUnit() {
let record = {
parentId: "",
parentDisplayName: ""
};
CreateOrganizationUnitModal(true, { record });
}
function getRightMenuList(node: any): ContextMenuItem[] {
return [
{
label: t("common.createText"),
handler: () => {
let record = {
parentId: "",
parentDisplayName: ""
};
record.parentId = node.$attrs.node.key;
record.parentDisplayName = node.$attrs.node.title;
CreateOrganizationUnitModal(true, { record });
},
icon: "bi:plus"
},
{
label: t("common.editText"),
handler: () => {
let record = {
id: node.$attrs.node.key,
displayName: node.$attrs.node.title
};
EditOrganizationUnitModal(true, { record });
},
icon: "ant-design:edit-outlined"
},
{
label: t("common.delText"),
handler: () => {
createConfirm({
iconType: "warning",
title: t("common.tip"),
content: t("common.askDelete"),
onOk: async () => {
await deleteTreeNodeAsync({ id: node.eventKey });
await initOrganizationUnit();
}
});
},
icon: "ant-design:delete-outlined",
}
];
}
async function handleSelect(keys) {
if (keys.length > 0) {
organizationUnitId = keys[0];
if (activeKey.value == "1") {
await reloadUser();
} else {
await reloadRole();
}
} else {
organizationUnitId = "";
}
}
const getUserAsync = async () => {
if (organizationUnitId) {
let request = new GetOrganizationUnitUserInput();
request.filter = getUserForm().getFieldsValue().filter;
request.organizationUnitId = organizationUnitId;
return await getUserTableListAsync(request);
}
};
const getRoleAsync = async () => {
if (organizationUnitId) {
let request = new GetOrganizationUnitRoleInput();
request.organizationUnitId = organizationUnitId;
return await getRoleTableListAsync(request);
}
};
const [registerUserTable, { reload: reloadUser, getForm: getUserForm }] = useTable({
columns: userTableColumns,
formConfig: {
labelWidth: 70,
schemas: searchUserFormSchema
},
api: getUserAsync,
showTableSetting: true,
useSearchForm: true,
bordered: true,
canResize: true,
showIndexColumn: true,
actionColumn: {
width: 120,
title: t("common.action"),
dataIndex: "action",
slots: {
customRender: "action"
},
fixed: "right"
}
});
const [registerRoleTable, { reload: reloadRole }] = useTable({
columns: roleTableColumns,
api: getRoleAsync,
showTableSetting: true,
useSearchForm: false,
bordered: true,
canResize: true,
showIndexColumn: true,
actionColumn: {
width: 120,
title: t("common.action"),
dataIndex: "action",
slots: {
customRender: "action"
},
fixed: "right"
}
});
const activeKeyChange = async (activeKey) => {
console.log(activeKey);
if (organizationUnitId) {
if (activeKey == 1) {
await reloadUser();
} else {
await reloadRole();
}
}
};
const handleUserDelete = async (record: Recordable) => {
let msg = t("common.askDelete");
createConfirm({
iconType: "warning",
title: t("common.tip"),
content: msg,
onOk: async () => {
let request = new RemoveUserToOrganizationUnitInput();
request.userId = record.id;
request.organizationUnitId = organizationUnitId;
await removeUserFromOrganizationUnitAsync(request);
await reloadUser();
}
});
};
const handleRoleDelete = async (record: Recordable) => {
let msg = t("common.askDelete");
createConfirm({
iconType: "warning",
title: t("common.tip"),
content: msg,
onOk: async () => {
let request = new RemoveRoleToOrganizationUnitInput();
request.roleId = record.id;
request.organizationUnitId = organizationUnitId;
await removeRoleFromOrganizationUnitAsync(request);
await reloadRole();
}
});
};
return {
treeData,
getRightMenuList,
createRootOrganizationUnit,
activeKey,
registerCreateOrganizationUnit,
initOrganizationUnit,
handleSelect,
registerEditOrganizationUnit,
registerUserTable,
registerRoleTable,
activeKeyChange,
handleUserDelete,
handleRoleDelete,
t,
registerAddRoleToOrganizationUnit,
openAddRoleToOrganizationUnitModal,
getRoleAsync,
reloadRole,
reloadUser,
openAddUserToOrganizationUnitModal,
registerAddUserToOrganizationUnit,
getUserAsync
};
}
});
</script>
<style scoped>
/*.ant-tabs-tabpane {*/
/* background: #F0F2F5;*/
/*}*/
</style>

113
vben271/src/views/admin/roles/AbpRole.ts

@ -1,5 +1,5 @@
import { FormSchema } from '/@/components/Table';
import { BasicColumn } from '/@/components/Table';
import { FormSchema } from "/@/components/Table";
import { BasicColumn } from "/@/components/Table";
import {
RolesServiceProxy,
PagingRoleListInput,
@ -7,98 +7,99 @@ import {
IdentityRoleCreateDto,
PermissionsServiceProxy,
IdInput,
GetPermissionInput,
} from '/@/services/ServiceProxies';
import { message } from 'ant-design-vue';
import { useLoading } from '/@/components/Loading';
GetPermissionInput
} from "/@/services/ServiceProxies";
import { message } from "ant-design-vue";
import { useLoading } from "/@/components/Loading";
import { useI18n } from "/@/hooks/web/useI18n";
import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n();
const [openFullLoading, closeFullLoading] = useLoading({
tip: 'Loading...',
tip: "Loading..."
});
export const tableColumns: BasicColumn[] = [
{
title: t('routes.admin.userManagement_roleName'),
dataIndex: 'name',
title: t("routes.admin.userManagement_roleName"),
dataIndex: "name"
},
{
title: t('routes.admin.roleManagement_default'),
dataIndex: 'isDefault',
slots: { customRender: 'category' },
},
title: t("routes.admin.roleManagement_default"),
dataIndex: "isDefault",
slots: { customRender: "category" }
}
];
export const searchFormSchema: FormSchema[] = [
{
field: 'filter',
label: t('routes.admin.userManagement_roleName'),
component: 'Input',
colProps: { span: 8 },
},
field: "filter",
label: t("routes.admin.userManagement_roleName"),
component: "Input",
colProps: { span: 8 }
}
];
export const createFormSchema: FormSchema[] = [
{
field: 'name',
label: t('routes.admin.userManagement_roleName'),
component: 'Input',
field: "name",
label: t("routes.admin.userManagement_roleName"),
component: "Input",
required: true,
colProps: { span: 18 },
colProps: { span: 18 }
},
{
field: 'isDefault',
component: 'RadioGroup',
label: t('routes.admin.roleManagement_default'),
field: "isDefault",
component: "RadioGroup",
label: t("routes.admin.roleManagement_default"),
required: true,
colProps: {
span: 18,
span: 18
},
defaultValue: '0',
defaultValue: "0",
componentProps: {
options: [
{
label: t('common.true'),
value: '1',
label: t("common.true"),
value: "1"
},
{
label: t('common.false'),
value: '0',
},
],
},
},
label: t("common.false"),
value: "0"
}
]
}
}
];
export const editFormSchema: FormSchema[] = [
{
field: 'name',
label: t('routes.admin.userManagement_roleName'),
component: 'Input',
field: "name",
label: t("routes.admin.userManagement_roleName"),
component: "Input",
required: true,
colProps: { span: 18 },
colProps: { span: 18 }
},
{
field: 'isDefault',
component: 'RadioGroup',
label: t('routes.admin.roleManagement_default'),
field: "isDefault",
component: "RadioGroup",
label: t("routes.admin.roleManagement_default"),
required: true,
colProps: {
span: 18,
span: 18
},
componentProps: {
options: [
{
label: t('common.true'),
value: '1',
label: t("common.true"),
value: "1"
},
{
label: t('common.false'),
value: '0',
},
],
},
},
label: t("common.false"),
value: "0"
}
]
}
}
];
/**
@ -123,7 +124,7 @@ export async function deleteRoleAsync({ roleId, reload }) {
request.id = roleId;
await _roleServiceProxy.delete(request);
closeFullLoading();
message.success(t('common.operationSuccess'));
message.success(t("common.operationSuccess"));
reload();
} catch (error) {
closeFullLoading();
@ -139,11 +140,11 @@ export async function createRoleAsync({ request, changeOkLoading, validate, clos
await validate();
let requestBody: IdentityRoleCreateDto = new IdentityRoleCreateDto();
requestBody.name = request.name;
request.isDefault == '1' ? (requestBody.isDefault = true) : (requestBody.isDefault = false);
request.isDefault == "1" ? (requestBody.isDefault = true) : (requestBody.isDefault = false);
const _roleServiceProxy = new RolesServiceProxy();
await _roleServiceProxy.create(requestBody);
changeOkLoading(false);
message.success(t('common.operationSuccess'));
message.success(t("common.operationSuccess"));
closeModal();
}
@ -155,7 +156,7 @@ export async function createRoleAsync({ request, changeOkLoading, validate, clos
export async function getRolePermissionAsync(roleName: string) {
const _permissionsServiceProxy = new PermissionsServiceProxy();
const request = new GetPermissionInput();
request.providerName = 'R';
request.providerName = "R";
request.providerKey = roleName;
return await _permissionsServiceProxy.tree(request);
}

183
vben271/src/views/admin/roles/AbpRole.vue

@ -3,7 +3,7 @@
<BasicTable @register="registerTable" size="small">
<template #category="{ record }">
<Tag :color="record.isDefault ? 'red' : 'green'">
{{ record.isDefault ? '是' : '否' }}
{{ record.isDefault ? "是" : "否" }}
</Tag>
</template>
@ -14,7 +14,7 @@
@click="openCreateAbpRoleModal"
v-auth="'AbpIdentity.Roles.Create'"
>
{{ t('common.createText') }}
{{ t("common.createText") }}
</a-button>
</template>
@ -65,101 +65,102 @@
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
import { tableColumns, searchFormSchema, getTableListAsync, deleteRoleAsync } from "/@/views/admin/roles/AbpRole";
import { useModal } from '/@/components/Modal';
import CreateAbpRole from './CreateAbpRole.vue';
import PermissionAbpRole from './PermissionAbpRole.vue';
import EditAbpRole from './EditAbpRole.vue';
import { useMessage } from '/@/hooks/web/useMessage';
import { useDrawer } from '/@/components/Drawer';
import { useI18n } from '/@/hooks/web/useI18n';
import { Tag } from 'ant-design-vue';
export default defineComponent({
name: 'AbpUser',
components: {
BasicTable,
TableAction,
CreateAbpRole,
PermissionAbpRole,
EditAbpRole,
Tag,
},
setup() {
const { createConfirm } = useMessage();
const { t } = useI18n();
const [registerPermissionAbpRoleModal, { openDrawer: openPermissionAbpRoleDrawer }] =
useDrawer();
import { defineComponent } from "vue";
import { BasicTable, useTable, TableAction } from "/@/components/Table";
import { tableColumns, searchFormSchema, getTableListAsync, deleteRoleAsync } from "/@/views/admin/roles/AbpRole";
import { useModal } from "/@/components/Modal";
import CreateAbpRole from "./CreateAbpRole.vue";
import PermissionAbpRole from "./PermissionAbpRole.vue";
import EditAbpRole from "./EditAbpRole.vue";
import { useMessage } from "/@/hooks/web/useMessage";
import { useDrawer } from "/@/components/Drawer";
import { useI18n } from "/@/hooks/web/useI18n";
import { Tag } from "ant-design-vue";
const [registerCreateAbpRoleModal, { openModal: openCreateAbpRoleModal }] = useModal();
export default defineComponent({
name: "AbpUser",
components: {
BasicTable,
TableAction,
CreateAbpRole,
PermissionAbpRole,
EditAbpRole,
Tag
},
setup() {
const { createConfirm } = useMessage();
const { t } = useI18n();
const [registerPermissionAbpRoleModal, { openDrawer: openPermissionAbpRoleDrawer }] =
useDrawer();
const [registerEditAbpRoleModal, { openModal: openEditAbpRoleModal }] = useModal();
const [registerCreateAbpRoleModal, { openModal: openCreateAbpRoleModal }] = useModal();
// table配置
const [registerTable, { reload }] = useTable({
columns: tableColumns,
formConfig: {
labelWidth: 70,
schemas: searchFormSchema,
},
api: getTableListAsync,
showTableSetting: true,
useSearchForm: true,
bordered: true,
canResize: true,
showIndexColumn: true,
actionColumn: {
width: 200,
title: t('common.action'),
dataIndex: 'action',
slots: {
customRender: 'action',
},
fixed: 'right',
const [registerEditAbpRoleModal, { openModal: openEditAbpRoleModal }] = useModal();
// table配置
const [registerTable, { reload }] = useTable({
columns: tableColumns,
formConfig: {
labelWidth: 70,
schemas: searchFormSchema
},
api: getTableListAsync,
showTableSetting: true,
useSearchForm: true,
bordered: true,
canResize: true,
showIndexColumn: true,
actionColumn: {
width: 200,
title: t("common.action"),
dataIndex: "action",
slots: {
customRender: "action"
},
});
fixed: "right"
}
});
// 角色编辑
const handleEdit = (record: Recordable) => {
openEditAbpRoleModal(true, {
record: record,
});
};
// 角色编辑
const handleEdit = (record: Recordable) => {
openEditAbpRoleModal(true, {
record: record
});
};
// 角色授权
const handlePermission = (record: Recordable) => {
openPermissionAbpRoleDrawer(true, {
record: record,
});
};
// 角色授权
const handlePermission = (record: Recordable) => {
openPermissionAbpRoleDrawer(true, {
record: record
});
};
// 删除角色
const handleDelete = async (record: Recordable) => {
let msg = t('common.askDelete');
createConfirm({
iconType: 'warning',
title: t('common.tip'),
content: msg,
onOk: async () => {
await deleteRoleAsync({ roleId: record.id, reload });
},
});
};
// 删除角色
const handleDelete = async (record: Recordable) => {
let msg = t("common.askDelete");
createConfirm({
iconType: "warning",
title: t("common.tip"),
content: msg,
onOk: async () => {
await deleteRoleAsync({ roleId: record.id, reload });
}
});
};
return {
t,
registerTable,
handleEdit,
handleDelete,
handlePermission,
getTableListAsync,
registerCreateAbpRoleModal,
openCreateAbpRoleModal,
registerPermissionAbpRoleModal,
registerEditAbpRoleModal,
reload,
};
},
});
return {
t,
registerTable,
handleEdit,
handleDelete,
handlePermission,
getTableListAsync,
registerCreateAbpRoleModal,
openCreateAbpRoleModal,
registerPermissionAbpRoleModal,
registerEditAbpRoleModal,
reload
};
}
});
</script>

94
vben271/src/views/admin/roles/CreateAbpRole.vue

@ -11,58 +11,58 @@
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { BasicForm, useForm } from '/@/components/Form/index';
import { createFormSchema, createRoleAsync } from '/@/views/admin/roles/AbpRole';
import { useI18n } from '/@/hooks/web/useI18n';
import { defineComponent } from "vue";
import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from "/@/components/Form/index";
import { createFormSchema, createRoleAsync } from "/@/views/admin/roles/AbpRole";
import { useI18n } from "/@/hooks/web/useI18n";
export default defineComponent({
name: 'CreateAbpRole',
components: {
BasicModal,
BasicForm,
},
emits: ['reload', 'register'],
setup(_, { emit }) {
// 加载父组件方法
// defineEmit(['reload']);
// const ctx = useContext();
export default defineComponent({
name: "CreateAbpRole",
components: {
BasicModal,
BasicForm
},
emits: ["reload", "register"],
setup(_, { emit }) {
// 加载父组件方法
// defineEmit(['reload']);
// const ctx = useContext();
const { t } = useI18n();
const [registerUserForm, { getFieldsValue, validate, resetFields }] = useForm({
labelWidth: 120,
schemas: createFormSchema,
showActionButtonGroup: false,
});
const { t } = useI18n();
const [registerUserForm, { getFieldsValue, validate, resetFields }] = useForm({
labelWidth: 120,
schemas: createFormSchema,
showActionButtonGroup: false
});
const [registerModal, { changeOkLoading, closeModal }] = useModalInner();
const [registerModal, { changeOkLoading, closeModal }] = useModalInner();
// 保存角色
const submit = async () => {
try {
const request = getFieldsValue();
await createRoleAsync({ request, changeOkLoading, validate, closeModal });
await resetFields();
emit('reload');
} catch (error) {
changeOkLoading(false);
}
};
// 保存角色
const submit = async () => {
try {
const request = getFieldsValue();
await createRoleAsync({ request, changeOkLoading, validate, closeModal });
await resetFields();
emit("reload");
} catch (error) {
changeOkLoading(false);
}
};
const cancel = () => {
resetFields();
closeModal();
};
return {
t,
registerModal,
registerUserForm,
submit,
cancel,
};
},
});
const cancel = () => {
resetFields();
closeModal();
};
return {
t,
registerModal,
registerUserForm,
submit,
cancel
};
}
});
</script>
<style lang="less" scoped></style>

118
vben271/src/views/admin/roles/EditAbpRole.vue

@ -10,70 +10,70 @@
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { BasicForm, useForm } from '/@/components/Form/index';
import { editFormSchema, updateRoleAsync } from '/@/views/admin/roles/AbpRole';
import { useI18n } from '/@/hooks/web/useI18n';
import {
IdentityRoleDto,
UpdateRoleInput,
IdentityRoleUpdateDto,
} from '/@/services/ServiceProxies';
import { defineComponent } from "vue";
import { BasicModal, useModalInner } from "/@/components/Modal";
import { BasicForm, useForm } from "/@/components/Form/index";
import { editFormSchema, updateRoleAsync } from "/@/views/admin/roles/AbpRole";
import { useI18n } from "/@/hooks/web/useI18n";
import {
IdentityRoleDto,
UpdateRoleInput,
IdentityRoleUpdateDto
} from "/@/services/ServiceProxies";
export default defineComponent({
name: 'EditAbpRole',
components: {
BasicModal,
BasicForm,
},
emits: ['reload', 'register'],
setup(_, { emit }) {
// 加载父组件方法
// defineEmit(['reload']);
// const ctx = useContext();
export default defineComponent({
name: "EditAbpRole",
components: {
BasicModal,
BasicForm
},
emits: ["reload", "register"],
setup(_, { emit }) {
// 加载父组件方法
// defineEmit(['reload']);
// const ctx = useContext();
const { t } = useI18n();
const [registerUserForm, { getFieldsValue, validate, setFieldsValue }] = useForm({
labelWidth: 120,
schemas: editFormSchema,
showActionButtonGroup: false,
});
let currentRoleInfo = new IdentityRoleDto();
const [registerModal, { changeOkLoading, closeModal }] = useModalInner((data) => {
currentRoleInfo = data.record;
setFieldsValue({
name: data.record.name,
isDefault: data.record.isDefault ? '1' : '0',
});
const { t } = useI18n();
const [registerUserForm, { getFieldsValue, validate, setFieldsValue }] = useForm({
labelWidth: 120,
schemas: editFormSchema,
showActionButtonGroup: false
});
let currentRoleInfo = new IdentityRoleDto();
const [registerModal, { changeOkLoading, closeModal }] = useModalInner((data) => {
currentRoleInfo = data.record;
setFieldsValue({
name: data.record.name,
isDefault: data.record.isDefault ? "1" : "0"
});
});
// 保存角色
const submit = async () => {
try {
const request = getFieldsValue();
let role = new UpdateRoleInput();
role.roleId = currentRoleInfo.id;
role.roleInfo = new IdentityRoleUpdateDto();
role.roleInfo.name = request.name;
role.roleInfo.isDefault = request.isDefault == 1;
role.roleInfo.isPublic = currentRoleInfo.isPublic;
role.roleInfo.concurrencyStamp = currentRoleInfo.concurrencyStamp;
await updateRoleAsync({ request: role, changeOkLoading, validate, closeModal });
emit('reload');
} catch (error) {
changeOkLoading(false);
}
};
// 保存角色
const submit = async () => {
try {
const request = getFieldsValue();
let role = new UpdateRoleInput();
role.roleId = currentRoleInfo.id;
role.roleInfo = new IdentityRoleUpdateDto();
role.roleInfo.name = request.name;
role.roleInfo.isDefault = request.isDefault == 1;
role.roleInfo.isPublic = currentRoleInfo.isPublic;
role.roleInfo.concurrencyStamp = currentRoleInfo.concurrencyStamp;
await updateRoleAsync({ request: role, changeOkLoading, validate, closeModal });
emit("reload");
} catch (error) {
changeOkLoading(false);
}
};
return {
t,
registerModal,
registerUserForm,
submit,
};
},
});
return {
t,
registerModal,
registerUserForm,
submit
};
}
});
</script>
<style lang="less" scoped></style>

2
vben271/src/views/admin/settings/Setting.ts

@ -1,4 +1,4 @@
import { SettingsServiceProxy } from '/@/services/ServiceProxies';
import { SettingsServiceProxy } from "/@/services/ServiceProxies";
/**
* 获取所有settings

227
vben271/src/views/admin/users/AbpUser.ts

@ -1,6 +1,6 @@
import { FormSchema } from '/@/components/Table';
import { BasicColumn } from '/@/components/Table';
import moment from 'moment';
import { FormSchema } from "/@/components/Table";
import { BasicColumn } from "/@/components/Table";
import moment from "moment";
import {
PagingUserListInput,
UsersServiceProxy,
@ -8,198 +8,199 @@ import {
IdentityRoleDtoListResultDto,
RolesServiceProxy,
LockUserInput,
IdInput,
} from '/@/services/ServiceProxies';
import { message } from 'ant-design-vue';
import { useLoading } from '/@/components/Loading';
IdInput
} from "/@/services/ServiceProxies";
import { message } from "ant-design-vue";
import { useLoading } from "/@/components/Loading";
import { useI18n } from "/@/hooks/web/useI18n";
import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n();
const [openFullLoading, closeFullLoading] = useLoading({
tip: 'Loading...',
tip: "Loading..."
});
export const tableColumns: BasicColumn[] = [
{
title: t('routes.admin.userManagement_userName'),
dataIndex: 'userName',
title: t("routes.admin.userManagement_userName"),
dataIndex: "userName"
},
{
title: t('routes.admin.userManagement_name'),
dataIndex: 'name',
title: t("routes.admin.userManagement_name"),
dataIndex: "name"
},
{
title: t('routes.admin.userManagement_email'),
dataIndex: 'email',
title: t("routes.admin.userManagement_email"),
dataIndex: "email"
},
{
title: t('routes.admin.userManagement_phone'),
dataIndex: 'phoneNumber',
title: t("routes.admin.userManagement_phone"),
dataIndex: "phoneNumber"
},
{
title: t('common.status'),
dataIndex: 'isActive',
slots: { customRender: 'isActive' },
title: t("common.status"),
dataIndex: "isActive",
slots: { customRender: "isActive" }
},
{
title: t('routes.admin.userManagement_createTime'),
dataIndex: 'creationTime',
title: t("routes.admin.userManagement_createTime"),
dataIndex: "creationTime",
customRender: ({ text }) => {
return moment(text).format('YYYY-MM-DD HH:mm:ss');
},
},
return moment(text).format("YYYY-MM-DD HH:mm:ss");
}
}
];
export const searchFormSchema: FormSchema[] = [
{
field: 'filter',
label: t('routes.admin.userManagement_userName'),
component: 'Input',
colProps: { span: 8 },
},
field: "filter",
label: t("routes.admin.userManagement_userName"),
component: "Input",
colProps: { span: 8 }
}
];
export const createFormSchema: FormSchema[] = [
{
field: 'userName',
component: 'Input',
label: t('routes.admin.userManagement_userName'),
field: "userName",
component: "Input",
label: t("routes.admin.userManagement_userName"),
labelWidth: 85,
required: true,
colProps: {
span: 12,
span: 12
},
componentProps: {
autocomplete: 'off',
},
autocomplete: "off"
}
},
{
field: 'name',
component: 'Input',
label: t('routes.admin.roleManagement_name'),
field: "name",
component: "Input",
label: t("routes.admin.roleManagement_name"),
labelWidth: 130,
required: true,
colProps: {
span: 12,
span: 12
},
componentProps: {
autocomplete: 'off',
},
autocomplete: "off"
}
},
{
field: 'email',
component: 'Input',
label: t('routes.admin.userManagement_email'),
field: "email",
component: "Input",
label: t("routes.admin.userManagement_email"),
required: true,
labelWidth: 85,
colProps: {
span: 12,
},
span: 12
}
},
{
field: 'phoneNumber',
component: 'Input',
label: t('routes.admin.userManagement_phone'),
field: "phoneNumber",
component: "Input",
label: t("routes.admin.userManagement_phone"),
required: false,
labelWidth: 130,
colProps: {
span: 12,
},
span: 12
}
},
{
field: 'password',
component: 'InputPassword',
label: t('routes.admin.userManagement_password'),
field: "password",
component: "InputPassword",
label: t("routes.admin.userManagement_password"),
required: true,
labelWidth: 85,
colProps: {
span: 12,
span: 12
},
componentProps: {
autocomplete: 'off',
},
autocomplete: "off"
}
},
{
field: 'confirmPassword',
component: 'InputPassword',
field: "confirmPassword",
component: "InputPassword",
componentProps: {
autocomplete: 'off',
autocomplete: "off"
},
label: t('routes.admin.userManagement_confirm_password'),
label: t("routes.admin.userManagement_confirm_password"),
required: true,
labelWidth: 130,
colProps: {
span: 12,
},
},
span: 12
}
}
];
export const editFormSchema: FormSchema[] = [
{
field: 'userName',
component: 'Input',
label: t('routes.admin.userManagement_userName'),
field: "userName",
component: "Input",
label: t("routes.admin.userManagement_userName"),
labelWidth: 85,
required: true,
colProps: {
span: 12,
span: 12
},
componentProps: {
autocomplete: 'off',
disabled: true,
},
autocomplete: "off",
disabled: true
}
},
{
field: 'name',
component: 'Input',
label: t('routes.admin.userManagement_name'),
field: "name",
component: "Input",
label: t("routes.admin.userManagement_name"),
labelWidth: 130,
required: true,
colProps: {
span: 12,
},
span: 12
}
},
{
field: 'email',
component: 'Input',
label: t('routes.admin.userManagement_email'),
field: "email",
component: "Input",
label: t("routes.admin.userManagement_email"),
required: true,
labelWidth: 85,
colProps: {
span: 12,
},
span: 12
}
},
{
field: 'phoneNumber',
component: 'Input',
label: t('routes.admin.userManagement_phone'),
field: "phoneNumber",
component: "Input",
label: t("routes.admin.userManagement_phone"),
required: false,
labelWidth: 130,
colProps: {
span: 12,
},
span: 12
}
},
{
field: 'password',
component: 'InputPassword',
label: t('routes.admin.userManagement_password'),
field: "password",
component: "InputPassword",
label: t("routes.admin.userManagement_password"),
required: false,
labelWidth: 85,
colProps: {
span: 12,
},
span: 12
}
},
{
field: 'confirmPassword',
component: 'InputPassword',
label: t('routes.admin.userManagement_confirm_password'),
field: "confirmPassword",
component: "InputPassword",
label: t("routes.admin.userManagement_confirm_password"),
required: false,
labelWidth: 130,
colProps: {
span: 12,
},
},
span: 12
}
}
];
/**
@ -219,16 +220,16 @@ export async function getTableListAsync(
* @param params
* @returns
*/
export function exportAsync({request}) {
export function exportAsync({ request }) {
openFullLoading();
const _userServiceProxy = new UsersServiceProxy();
_userServiceProxy.export(request).then(res=>{
const a = document.createElement('a');
a.href = URL.createObjectURL(res.data);
a.download = '用户列表导出.xlsx';
a.click();
closeFullLoading();
});
_userServiceProxy.export(request).then(res => {
const a = document.createElement("a");
a.href = URL.createObjectURL(res.data);
a.download = "用户列表导出.xlsx";
a.click();
closeFullLoading();
});
}
/**
@ -261,18 +262,18 @@ export async function createUserAsync({
changeOkLoading,
validate,
closeModal,
resetFields,
resetFields
}) {
changeOkLoading(true);
await validate();
if (request.password != request.confirmPassword) {
message.error('两次密码输入不一致');
throw new Error('两次密码输入不一致');
message.error("两次密码输入不一致");
throw new Error("两次密码输入不一致");
}
const _userServiceProxy = new UsersServiceProxy();
await _userServiceProxy.create(request);
changeOkLoading(false);
message.success(t('common.operationSuccess'));
message.success(t("common.operationSuccess"));
resetFields();
closeModal();
}
@ -289,7 +290,7 @@ export async function deleteUserAsync({ userId, reload }) {
request.id = userId;
await _userServiceProxy.delete(request);
closeFullLoading();
message.success(t('common.operationSuccess'));
message.success(t("common.operationSuccess"));
reload();
} catch (error) {
closeFullLoading();
@ -305,7 +306,7 @@ export async function updateUserAsync({
changeOkLoading,
validate,
closeModal,
resetFields,
resetFields
}) {
changeOkLoading(true);
await validate();
@ -314,7 +315,7 @@ export async function updateUserAsync({
await _userServiceProxy.update(request);
changeOkLoading(false);
resetFields();
message.success(t('common.operationSuccess'));
message.success(t("common.operationSuccess"));
closeModal();
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save