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); var result = length == 10 ? start.AddSeconds(jsTime) : start.AddMilliseconds(jsTime);
return result.ToUniversalTime(); 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 namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{ {
public class DataDictionaryDomainException : UserFriendlyException public class DataDictionaryDomainException : BusinessException
{ {
public DataDictionaryDomainException(string message, string code = null, string details = null, public DataDictionaryDomainException(string code = null, string message = null, string details = null, Exception innerException = null,
Exception innerException = null, LogLevel logLevel = LogLevel.Warning) : base(message, code, details, LogLevel logLevel = LogLevel.Warning) : base(code, message, details,
innerException, logLevel) innerException,
logLevel
)
{ {
} }
public DataDictionaryDomainException(SerializationInfo serializationInfo, StreamingContext context) : base( public DataDictionaryDomainException(SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context)
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 class DataDictionaryManagementConsts
{ {
public static Guid SeedDataDictionaryId = new Guid("39fdb236-a90e-e4b5-02a0-2866a8cf9821"); 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 => Configure<AbpLocalizationOptions>(options =>
{ {
options.Resources options.Resources
.Add<DataDictionaryManagementResource>("en") .Add<DataDictionaryManagementResource>(DataDictionaryManagementConsts.DefaultCultureName)
.AddBaseTypes(typeof(AbpValidationResource)) .AddBaseTypes(typeof(AbpValidationResource))
.AddVirtualJson("/Localization/DataDictionaryManagement"); .AddVirtualJson("/Localization/DataDictionaryManagement");
}); });
Configure<AbpExceptionLocalizationOptions>(options => 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 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:DataDictionaryManagement": "DataDictionaryManagement",
"Permission:Create": "Create", "Permission:Create": "Create",
"Permission:Update": "Update", "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:DataDictionaryManagement": "数据字典",
"Permission:Create": "创建", "Permission:Create": "创建",
"Permission:Update": "编辑", "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 System.Threading.Tasks;
using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Aggregates; using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Aggregates;
using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Dto; using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Dto;
using Volo.Abp;
using Volo.Abp.Caching; using Volo.Abp.Caching;
using Volo.Abp.Domain.Services;
namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{ {
@ -22,22 +22,28 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
_cache = cache; _cache = cache;
} }
public async Task<DataDictionaryDto> FindByIdAsync( public async Task<DataDictionaryDto> FindByIdAsync(
Guid id, Guid id,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var cacheKey = DataDictionaryDto.CalculateCacheKey(id, null); var cacheKey = DataDictionaryDto.CalculateCacheKey(id, null);
return await _cache.GetOrAddAsync(cacheKey, return await _cache.GetOrAddAsync
(
cacheKey,
async () => async () =>
{ {
var entity = var entity =
await _dataDictionaryRepository.FindByIdAsync(id, true, await _dataDictionaryRepository.FindByIdAsync
cancellationToken); (
id,
true,
cancellationToken
);
return ObjectMapper.Map<DataDictionary, DataDictionaryDto>(entity); return ObjectMapper.Map<DataDictionary, DataDictionaryDto>(entity);
}, token: cancellationToken); },
token: cancellationToken
);
} }
public async Task<DataDictionaryDto> FindByCodeAsync( public async Task<DataDictionaryDto> FindByCodeAsync(
@ -45,14 +51,22 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var cacheKey = DataDictionaryDto.CalculateCacheKey(null, code); var cacheKey = DataDictionaryDto.CalculateCacheKey(null, code);
return await _cache.GetOrAddAsync(cacheKey, return await _cache.GetOrAddAsync
(
cacheKey,
async () => async () =>
{ {
var entity = var entity =
await _dataDictionaryRepository.FindByCodeAsync(code, true, await _dataDictionaryRepository.FindByCodeAsync
cancellationToken); (
code,
true,
cancellationToken
);
return ObjectMapper.Map<DataDictionary, DataDictionaryDto>(entity); 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="code"></param>
/// <param name="displayText"></param> /// <param name="displayText"></param>
/// <param name="description"></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); Check.NotNullOrWhiteSpace(code, nameof(code));
return _dataDictionaryRepository.InsertAsync(entity); 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> /// <summary>
@ -77,36 +102,47 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
/// <param name="description"></param> /// <param name="description"></param>
/// <param name="order"></param> /// <param name="order"></param>
/// <exception cref="DataDictionaryDomainException"></exception> /// <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 displayText,
string description, string description,
int order) int order)
{ {
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null) if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
if (entity.Details.Any(e => e.Code == code.Trim())) 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); return await _dataDictionaryRepository.UpdateAsync(entity);
} }
/// <summary> /// <summary>
/// 设置字典明细状态 /// 设置字典明细状态
/// </summary> /// </summary>
public async Task<DataDictionary> SetStatus(Guid dataDictionaryId, public async Task<DataDictionary> SetStatus(
Guid dataDictionayDetailId, bool isEnabled) Guid dataDictionaryId,
Guid dataDictionayDetailId,
bool isEnabled)
{ {
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null) if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId); var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId);
if (null == detail) if (null == detail)
{ {
throw new DataDictionaryDomainException(message: $"字典项不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailExist);
} }
detail.SetIsEnabled(isEnabled); detail.SetIsEnabled(isEnabled);
@ -125,14 +161,20 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{ {
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null) if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId); var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId);
if (null == detail) 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); return await _dataDictionaryRepository.UpdateAsync(entity);
} }
@ -140,27 +182,29 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{ {
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null) if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId); var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId);
if (null == detail) if (null == detail)
{ {
throw new DataDictionaryDomainException(message: $"字典项不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailNotExist);
} }
entity.Details.Remove(detail); entity.Details.Remove(detail);
await _dataDictionaryRepository.UpdateAsync(entity); await _dataDictionaryRepository.UpdateAsync(entity);
} }
public async Task<DataDictionary> UpdateAsync(Guid dataDictionaryId,
public async Task<DataDictionary> UpdateAsync(
Guid dataDictionaryId,
string displayText, string displayText,
string description) string description)
{ {
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null) if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
entity.Update(dataDictionaryId,displayText,description); entity.Update(dataDictionaryId, displayText, description);
return await _dataDictionaryRepository.UpdateAsync(entity); return await _dataDictionaryRepository.UpdateAsync(entity);
} }
/// <summary> /// <summary>
/// 删除字典类型 /// 删除字典类型
/// </summary> /// </summary>
@ -170,13 +214,14 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{ {
var entity = await _dataDictionaryRepository.FindByIdAsync(id); var entity = await _dataDictionaryRepository.FindByIdAsync(id);
if (entity == null) if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在"); throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist);
var detail = entity.Details.FirstOrDefault(e => e.DataDictionaryId == id); var detail = entity.Details.FirstOrDefault(e => e.DataDictionaryId == id);
if (detail !=null ) if (detail != null)
{ {
entity.Details.Remove(detail); entity.Details.Remove(detail);
await _dataDictionaryRepository.UpdateAsync(entity); await _dataDictionaryRepository.UpdateAsync(entity);
} }
await _dataDictionaryRepository.DeleteAsync(id); 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" "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)); await SendMessageToAllClientAsync(new SendNotificationDto(title, content, messageType));
break; break;
default: 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", "culture": "en",
"texts": { "texts": {
"ManageYourProfile": "Manage your profile", "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", "culture": "zh-Hans",
"texts": { "texts": {
"ManageYourProfile": "管理个人资料", "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 => Configure<AbpLocalizationOptions>(options =>
{ {
options.Resources options.Resources
.Add<NotificationManagementResource>("en") .Add<NotificationManagementResource>(NotificationManagementConsts.DefaultCultureName)
.AddBaseTypes(typeof(AbpValidationResource)) .AddBaseTypes(typeof(AbpValidationResource))
.AddVirtualJson("/Localization/NotificationManagement"); .AddVirtualJson("/Localization/NotificationManagement");
}); });
Configure<AbpExceptionLocalizationOptions>(options => 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 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 namespace Lion.AbpPro.NotificationManagement
{ {
public class NotificationManagementDomainException : UserFriendlyException public class NotificationManagementDomainException : BusinessException
{ {
public NotificationManagementDomainException(string message, string code = null, string details = null, public NotificationManagementDomainException(string code = null, string message = null, string details = null, Exception innerException = null,
Exception innerException = null, LogLevel logLevel = LogLevel.Warning) : base(message, code, details, LogLevel logLevel = LogLevel.Warning) : base(code, message, details,
innerException, logLevel) innerException,
logLevel
)
{ {
} }
public NotificationManagementDomainException(SerializationInfo serializationInfo, StreamingContext context) : public NotificationManagementDomainException(SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, 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}) if (receiveIds is {Count: 0})
{ {
throw new NotificationManagementDomainException("消息接收人不能为空"); throw new NotificationManagementDomainException(NotificationManagementErrorCodes.ReceiverNotNull);
} }
var senderId = Guid.Empty; var senderId = Guid.Empty;
@ -113,7 +113,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
public async Task SetReadAsync(Guid id, Guid receiveId) public async Task SetReadAsync(Guid id, Guid receiveId)
{ {
var notification = await _notificationRepository.FindByIdAsync(id); 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) if (notification.MessageType == MessageType.BroadCast)
{ {
// 如果类型是广播消息,用户设置为已读,在插入一条数据 // 如果类型是广播消息,用户设置为已读,在插入一条数据
@ -124,7 +124,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
var notificationSubscription = var notificationSubscription =
notification.NotificationSubscriptions.FirstOrDefault(e => e.ReceiveId == receiveId); notification.NotificationSubscriptions.FirstOrDefault(e => e.ReceiveId == receiveId);
if (notificationSubscription == null) if (notificationSubscription == null)
throw new NotificationManagementDomainException(message: "当前用户未订阅该消息"); throw new NotificationManagementDomainException(NotificationManagementErrorCodes.UserUnSubscription);
notificationSubscription.SetRead(); notificationSubscription.SetRead();
} }

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

@ -135,9 +135,6 @@ namespace Lion.AbpPro
/// <param name="context"></param> /// <param name="context"></param>
private void ConfigureAbpExceptions(ServiceConfigurationContext context) 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)); }); 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": { "Serilog": {
"Using": [ "Using": [
"Serilog.Sinks.Console", "Serilog.Sinks.Console",
@ -12,7 +13,7 @@
"Hangfire": "Information", "Hangfire": "Information",
"DotNetCore.CAP": "Information", "DotNetCore.CAP": "Information",
"Serilog.AspNetCore": "Information", "Serilog.AspNetCore": "Information",
"Microsoft.EntityFrameworkCore": "Information" "Microsoft.EntityFrameworkCore": "Warning"
} }
}, },
"WriteTo": [ "WriteTo": [
@ -33,7 +34,7 @@
"CorsOrigins": "https://*.AbpPro.com,http://localhost:4200,http://localhost:3100" "CorsOrigins": "https://*.AbpPro.com,http://localhost:4200,http://localhost:3100"
}, },
"ConnectionStrings": { "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": { "Redis": {
"Configuration": "localhost,password=mypassword,defaultdatabase=1" "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")); abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.AuditLog, L("Permission:AuditLogManagement"));
var esManagement = abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.ES, L("Permission:ESManagement")); var esManagement = abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.ES, L("Permission:ESManagement"));
var settingManagement = abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.Setting, L("Permission:SettingManagement")); 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 #region IdentityServer
// multiTenancySide: MultiTenancySides.Host 只有host租户才有权限 // multiTenancySide: MultiTenancySides.Host 只有host租户才有权限
var identityServerManagementGroup = var identityServerManagementGroup =
context.AddGroup(AbpProPermissions.IdentityServer.IdentityServerManagement, L("Permission:IdentityServerManagement"), context.AddGroup
multiTenancySide: MultiTenancySides.Host); (
AbpProPermissions.IdentityServer.IdentityServerManagement,
L("Permission:IdentityServerManagement"),
multiTenancySide: MultiTenancySides.Host
);
var clientManagment = identityServerManagementGroup.AddPermission(AbpProPermissions.IdentityServer.Client.Default, var clientManagment = identityServerManagementGroup.AddPermission
L("Permission:IdentityServerManagement:Client"),multiTenancySide: MultiTenancySides.Host); (
clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Create, AbpProPermissions.IdentityServer.Client.Default,
L("Permission:Create"),multiTenancySide: MultiTenancySides.Host); L("Permission:IdentityServerManagement:Client"),
clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Update, multiTenancySide: MultiTenancySides.Host
L("Permission:Update"),multiTenancySide: MultiTenancySides.Host); );
clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Delete, clientManagment.AddChild
L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host); (
clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Enable, AbpProPermissions.IdentityServer.Client.Create,
L("Permission:Enable"),multiTenancySide: MultiTenancySides.Host); 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, AbpProPermissions.IdentityServer.ApiResource.Default,
L("Permission:IdentityServerManagement:ApiResource"),multiTenancySide: MultiTenancySides.Host); L("Permission:IdentityServerManagement:ApiResource"),
apiResourceManagment.AddChild(AbpProPermissions.IdentityServer.ApiResource.Create, multiTenancySide: MultiTenancySides.Host
L("Permission:Create"),multiTenancySide: MultiTenancySides.Host); );
apiResourceManagment.AddChild(AbpProPermissions.IdentityServer.ApiResource.Update, apiResourceManagment.AddChild
L("Permission:Update"),multiTenancySide: MultiTenancySides.Host); (
apiResourceManagment.AddChild(AbpProPermissions.IdentityServer.ApiResource.Delete, AbpProPermissions.IdentityServer.ApiResource.Create,
L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host); 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, var apiScopeManagment = identityServerManagementGroup.AddPermission
L("Permission:IdentityServerManagement:ApiScope"),multiTenancySide: MultiTenancySides.Host); (
apiScopeManagment.AddChild(AbpProPermissions.IdentityServer.ApiScope.Create, AbpProPermissions.IdentityServer.ApiScope.Default,
L("Permission:Create"),multiTenancySide: MultiTenancySides.Host); L("Permission:IdentityServerManagement:ApiScope"),
apiScopeManagment.AddChild(AbpProPermissions.IdentityServer.ApiScope.Update, multiTenancySide: MultiTenancySides.Host
L("Permission:Update"),multiTenancySide: MultiTenancySides.Host); );
apiScopeManagment.AddChild(AbpProPermissions.IdentityServer.ApiScope.Delete, apiScopeManagment.AddChild
L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host); (
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, AbpProPermissions.IdentityServer.IdentityResources.Default,
L("Permission:IdentityServerManagement:IdentityResources"),multiTenancySide: MultiTenancySides.Host); L("Permission:IdentityServerManagement:IdentityResources"),
identityResourcesManagment.AddChild(AbpProPermissions.IdentityServer.IdentityResources.Create, multiTenancySide: MultiTenancySides.Host
L("Permission:Create"),multiTenancySide: MultiTenancySides.Host); );
identityResourcesManagment.AddChild(AbpProPermissions.IdentityServer.IdentityResources.Update, identityResourcesManagment.AddChild
L("Permission:Update"),multiTenancySide: MultiTenancySides.Host); (
identityResourcesManagment.AddChild(AbpProPermissions.IdentityServer.IdentityResources.Delete, AbpProPermissions.IdentityServer.IdentityResources.Create,
L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host); 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 #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 AuditLog = Default + ".AuditLog";
public const string ES = Default + ".ES"; public const string ES = Default + ".ES";
public const string Setting = Default + ".Setting"; 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 AutoMapper;
using Lion.AbpPro.OrganizationUnits.Dto;
using Lion.AbpPro.Users.Dtos; using Lion.AbpPro.Users.Dtos;
using Volo.Abp.Identity; using Volo.Abp.Identity;
@ -14,6 +15,11 @@ namespace Lion.AbpPro
CreateMap<IdentityUser, ExportIdentityUserOutput>() CreateMap<IdentityUser, ExportIdentityUserOutput>()
.ForMember(e => e.CreationTimeFormat, opt => opt.Ignore()) .ForMember(e => e.CreationTimeFormat, opt => opt.Ignore())
.ForMember(e => e.Status, 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.Dto;
using Lion.AbpPro.ElasticSearchs.Providers; using Lion.AbpPro.ElasticSearchs.Providers;
using Lion.AbpPro.Extension.Customs.Dtos; using Lion.AbpPro.Extension.Customs.Dtos;
using Lion.AbpPro.Extension.System;
using Lion.AbpPro.Permissions; using Lion.AbpPro.Permissions;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
@ -13,11 +14,11 @@ using Nest;
namespace Lion.AbpPro.ElasticSearchs namespace Lion.AbpPro.ElasticSearchs
{ {
[Authorize(Policy = AbpProPermissions.SystemManagement.ES)] [Authorize(Policy = AbpProPermissions.SystemManagement.ES)]
public class LionAbpProLogAppService : ElasticsearchBasicService, public class LionAbpProLogAppService : ElasticsearchBasicService,ILionAbpProLogAppService
ILionAbpProLogAppService
{ {
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
// 时区
private const string TimeZone = "Asia/Shanghai";
public LionAbpProLogAppService( public LionAbpProLogAppService(
IElasticsearchProvider elasticsearchProvider, IElasticsearchProvider elasticsearchProvider,
IConfiguration configuration) : base(elasticsearchProvider) IConfiguration configuration) : base(elasticsearchProvider)
@ -25,49 +26,54 @@ namespace Lion.AbpPro.ElasticSearchs
_configuration = configuration; _configuration = configuration;
} }
public async Task<CustomePagedResultDto<PagingElasticSearchLogOutput>> PaingAsync( public async Task<CustomePagedResultDto<PagingElasticSearchLogOutput>> PaingAsync(PagingElasticSearchLogInput input)
PagingElasticSearchLogInput input)
{ {
var IndexName = var IndexName = _configuration.GetValue<string>("ElasticSearch:SearchIndexFormat");
_configuration.GetValue<string>("ElasticSearch:SearchIndexFormat");
// 默认查询当天 // 默认查询当天
input.StartCreationTime = input.StartCreationTime?.AddMilliseconds(-1) ?? input.StartCreationTime = input.StartCreationTime?.AddMilliseconds(-1) ??DateTime.Now.Date.AddMilliseconds(-1);
DateTime.Now.Date.AddMilliseconds(-1); input.EndCreationTime =input.EndCreationTime?.AddDays(1).AddMilliseconds(-1) ??DateTime.Now.Date.AddDays(1).AddMilliseconds(-1);
input.EndCreationTime = var mustFilters = new List<Func<QueryContainerDescriptor<PagingElasticSearchLogDto>, QueryContainer>>();
input.EndCreationTime?.AddDays(1).AddMilliseconds(-1) ?? if (input.StartCreationTime.HasValue)
DateTime.Now.Date.AddDays(1).AddMilliseconds(-1); {
var mustFilters = input.StartCreationTime = input.StartCreationTime.ToCurrentDateMaxDateTime();
new List<Func<QueryContainerDescriptor<PagingElasticSearchLogDto>, mustFilters.Add(e => e.DateRange(f => f.Field(fd => fd.CreationTime).TimeZone(TimeZone).GreaterThanOrEquals(input.StartCreationTime)));
QueryContainer>> }
{
t => t.DateRange(f => if (input.EndCreationTime.HasValue)
f.Field(fd => fd.CreationTime).TimeZone("Asia/Shanghai") {
.GreaterThanOrEquals(input.StartCreationTime.Value)), input.EndCreationTime = input.EndCreationTime.ToNextSecondDateTime();
t => t.DateRange( mustFilters.Add(e => e.DateRange(f => f.Field(fd => fd.CreationTime).TimeZone(TimeZone).LessThanOrEquals(input.EndCreationTime)));
f => f.Field(fd => fd.CreationTime).TimeZone("Asia/Shanghai") }
.LessThanOrEquals(input.EndCreationTime.Value))
};
if (!string.IsNullOrWhiteSpace(input.Filter)) if (!string.IsNullOrWhiteSpace(input.Filter))
{ {
mustFilters.Add(t => mustFilters.Add
t.MatchPhrase(f => f.Field(fd => fd.Message).Query(input.Filter.Trim()))); (
t =>t.MatchPhrase(f => f.Field(fd => fd.Message).Query(input.Filter.Trim()))
);
} }
var result = await Client.SearchAsync<PagingElasticSearchLogDto>(e => e var result = await Client.SearchAsync<PagingElasticSearchLogDto>
.Index(IndexName) (
.From(input.SkipCount) e => e
.Size(input.PageSize) .Index(IndexName)
.Sort(s => s.Descending(sd => sd.CreationTime)) .From(input.SkipCount)
.Query(q => q.Bool(qb => qb.Filter(mustFilters)))); .Size(input.PageSize)
.Sort(s => s.Descending(sd => sd.CreationTime))
.Query(q => q.Bool(qb => qb.Filter(mustFilters)))
);
if (result.HitsMetadata != null) if (result.HitsMetadata != null)
{ {
return new CustomePagedResultDto<PagingElasticSearchLogOutput>( return new CustomePagedResultDto<PagingElasticSearchLogOutput>
(
result.HitsMetadata.Total.Value, result.HitsMetadata.Total.Value,
ObjectMapper ObjectMapper
.Map<List<PagingElasticSearchLogDto>, List<PagingElasticSearchLogOutput>>( .Map<List<PagingElasticSearchLogDto>, List<PagingElasticSearchLogOutput>>
result.Documents.ToList())); (
result.Documents.ToList()
)
);
} }
return null; 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 Lion.AbpPro.Users.Dtos;
using IdentityModel; using IdentityModel;
using Lion.AbpPro.Extension.Customs.Http; using Lion.AbpPro.Extension.Customs.Http;
using Lion.AbpPro.NotificationManagement.Notifications;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Authorization;
using Volo.Abp.Identity; using Volo.Abp.Identity;
using Volo.Abp.Security.Claims; using Volo.Abp.Security.Claims;
@ -27,9 +29,8 @@ namespace Lion.AbpPro.Users
private readonly Microsoft.AspNetCore.Identity.SignInManager<IdentityUser> _signInManager; private readonly Microsoft.AspNetCore.Identity.SignInManager<IdentityUser> _signInManager;
private readonly IHttpClientFactory _httpClientFactory; private readonly IHttpClientFactory _httpClientFactory;
private readonly IConfiguration _configuretion; private readonly IConfiguration _configuretion;
private readonly Volo.Abp.Domain.Repositories.IRepository<IdentityRole> _identityRoleRepository; private readonly Volo.Abp.Domain.Repositories.IRepository<IdentityRole> _identityRoleRepository;
public AccountAppService( public AccountAppService(
IdentityUserManager userManager, IdentityUserManager userManager,
IOptionsSnapshot<JwtOptions> jwtOptions, IOptionsSnapshot<JwtOptions> jwtOptions,
@ -52,12 +53,12 @@ namespace Lion.AbpPro.Users
var result = await _signInManager.PasswordSignInAsync(input.Name, input.Password, false, true); var result = await _signInManager.PasswordSignInAsync(input.Name, input.Password, false, true);
if (result.IsNotAllowed) if (result.IsNotAllowed)
{ {
throw new UserFriendlyException("当前用户已锁定"); throw new BusinessException(AbpProDomainErrorCodes.UserLockedOut);
} }
if (!result.Succeeded) if (!result.Succeeded)
{ {
throw new UserFriendlyException("用户名或者密码错误"); throw new BusinessException(AbpProDomainErrorCodes.UserOrPasswordMismatch);
} }
var user = await _userManager.FindByNameAsync(input.Name); var user = await _userManager.FindByNameAsync(input.Name);
@ -77,7 +78,7 @@ namespace Lion.AbpPro.Users
var user = await _userManager.FindByNameAsync(response.name); var user = await _userManager.FindByNameAsync(response.name);
if (!user.IsActive) if (!user.IsActive)
{ {
throw new UserFriendlyException("当前用户已锁定"); throw new BusinessException(AbpProDomainErrorCodes.UserLockedOut);
} }
return await BuildResult(user); return await BuildResult(user);
@ -116,7 +117,7 @@ namespace Lion.AbpPro.Users
{ {
var result = new LoginOutput(); var result = new LoginOutput();
var roles = await _identityRoleRepository.GetListAsync(e => e.IsDefault); 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 userId = GuidGenerator.Create();
var user = new IdentityUser(userId, userName, email) var user = new IdentityUser(userId, userName, email)
@ -139,9 +140,9 @@ namespace Lion.AbpPro.Users
private async Task<LoginOutput> BuildResult(IdentityUser user) 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); 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, var token = GenerateJwt(user.Id, user.UserName, user.Name, user.Email,
user.TenantId.ToString(), roles.ToList()); user.TenantId.ToString(), roles.ToList());
var loginOutput = ObjectMapper.Map<IdentityUser, LoginOutput>(user); 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 System.Threading.Tasks;
using Lion.AbpPro.Users.Dtos; using Lion.AbpPro.Users.Dtos;
using Lion.AbpPro.Extension.Customs.Dtos; using Lion.AbpPro.Extension.Customs.Dtos;
using Lion.AbpPro.NotificationManagement.Notifications;
using Lion.AbpPro.Permissions; using Lion.AbpPro.Permissions;
using Magicodes.ExporterAndImporter.Excel; using Magicodes.ExporterAndImporter.Excel;
using Magicodes.ExporterAndImporter.Excel.AspNetCore; using Magicodes.ExporterAndImporter.Excel.AspNetCore;
@ -27,13 +28,13 @@ namespace Lion.AbpPro.Users
private readonly IIdentityUserRepository _identityUserRepository; private readonly IIdentityUserRepository _identityUserRepository;
private readonly IExcelExporter _excelExporter; private readonly IExcelExporter _excelExporter;
private readonly IOptions<IdentityOptions> _options; private readonly IOptions<IdentityOptions> _options;
public UserAppService( public UserAppService(
IIdentityUserAppService identityUserAppService, IIdentityUserAppService identityUserAppService,
IdentityUserManager userManager, IdentityUserManager userManager,
IIdentityUserRepository userRepository, IIdentityUserRepository userRepository,
IExcelExporter excelExporter, IExcelExporter excelExporter,
IOptions<IdentityOptions> options) IOptions<IdentityOptions> options,
NotificationManager notificationManager)
{ {
_identityUserAppService = identityUserAppService; _identityUserAppService = identityUserAppService;
_userManager = userManager; _userManager = userManager;

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

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

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

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

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

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

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

@ -1,5 +1,5 @@
{ {
"ConnectionStrings": { "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 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 => Configure<AbpVirtualFileSystemOptions>(options =>
{ {
options.FileSets.AddEmbedded<AbpProDomainSharedModule>("Lion.AbpPro"); options.FileSets.AddEmbedded<AbpProDomainSharedModule>(AbpProDomainSharedConsts.NameSpace);
}); });
Configure<AbpLocalizationOptions>(options => Configure<AbpLocalizationOptions>(options =>
{ {
options.Resources options.Resources
.Add<AbpProResource>("zh-Hans") .Add<AbpProResource>(AbpProDomainSharedConsts.DefaultCultureName)
.AddVirtualJson("/Localization/AbpPro") .AddVirtualJson("/Localization/AbpPro")
.AddBaseTypes(typeof(IdentityResource)) .AddBaseTypes(typeof(IdentityResource))
.AddBaseTypes(typeof(AbpValidationResource)) .AddBaseTypes(typeof(AbpValidationResource))
@ -70,7 +70,7 @@ namespace Lion.AbpPro
Configure<AbpExceptionLocalizationOptions>(options => 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:CapManagement": "IntegratedEvent",
"Permission:ESManagement": "ESManagement", "Permission:ESManagement": "ESManagement",
"Permission:SettingManagement": "SettingManagement", "Permission:SettingManagement": "SettingManagement",
"Permission:OrganizationUnitManagement": "OrganizationUnitManagement",
"Permission:IdentityServerManagement": "IdentityServer", "Permission:IdentityServerManagement": "IdentityServer",
"Permission:IdentityServerManagement:Client": "Client", "Permission:IdentityServerManagement:Client": "Client",
"Permission:IdentityServerManagement:ApiResource": "ApiResource", "Permission:IdentityServerManagement:ApiResource": "ApiResource",
@ -28,6 +29,19 @@
"Description:Setting.Group.Other.Github": "Github", "Description:Setting.Group.Other.Github": "Github",
"Enum:TestType:Created:1":"Created", "Enum:TestType:Created:1":"Created",
"Enum:TestType:Cancel:1":"Cancel", "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:CapManagement": "集成事件",
"Permission:ESManagement": "ES日志", "Permission:ESManagement": "ES日志",
"Permission:SettingManagement": "设置管理", "Permission:SettingManagement": "设置管理",
"Permission:OrganizationUnitManagement": "组织结构管理",
"Permission:IdentityServerManagement": "IdentityServer", "Permission:IdentityServerManagement": "IdentityServer",
"Permission:IdentityServerManagement:Client": "客户端", "Permission:IdentityServerManagement:Client": "客户端",
"Permission:IdentityServerManagement:ApiResource": "Api资源", "Permission:IdentityServerManagement:ApiResource": "Api资源",
@ -28,6 +29,18 @@
"Description:Setting.Group.Other.Github": "Github", "Description:Setting.Group.Other.Github": "Github",
"Enum:TestType:Created:1":"创建", "Enum:TestType:Created:1":"创建",
"Enum:TestType:Cancel: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; using Volo.Abp.Localization;
namespace Lion.AbpPro.Localization namespace Lion.AbpPro
{ {
[LocalizationResourceName("AbpPro")] [LocalizationResourceName("AbpPro")]
public class AbpProResource 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.MultiTenancy;
using Lion.AbpPro.NotificationManagement; using Lion.AbpPro.NotificationManagement;
using Volo.Abp.AuditLogging; using Volo.Abp.AuditLogging;
using Volo.Abp.AutoMapper;
using Volo.Abp.BackgroundJobs; using Volo.Abp.BackgroundJobs;
using Volo.Abp.Emailing; using Volo.Abp.Emailing;
using Volo.Abp.FeatureManagement; using Volo.Abp.FeatureManagement;
@ -43,7 +44,10 @@ namespace Lion.AbpPro
{ {
options.IsEnabled = MultiTenancyConsts.IsEnabled; options.IsEnabled = MultiTenancyConsts.IsEnabled;
}); });
Configure<AbpAutoMapperOptions>(options =>
{
options.AddMaps<AbpProDomainModule>();
});
#if DEBUG #if DEBUG
context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>()); context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>());
#endif #endif

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

@ -26,17 +26,26 @@ namespace Lion.AbpPro.IdentityServer
bool includeDetails = false, bool includeDetails = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return _apiResourceRepository.GetListAsync("CreationTime desc", skipCount, return _apiResourceRepository.GetListAsync
maxResultCount, filter, (
"CreationTime desc",
skipCount,
maxResultCount,
filter,
includeDetails, includeDetails,
cancellationToken); cancellationToken
);
} }
public Task<long> GetCountAsync(string filter = null, public Task<long> GetCountAsync(
string filter = null,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return _apiResourceRepository.GetCountAsync(filter, return _apiResourceRepository.GetCountAsync
cancellationToken); (
filter,
cancellationToken
);
} }
/// <summary> /// <summary>
@ -65,10 +74,16 @@ namespace Lion.AbpPro.IdentityServer
await _apiResourceRepository.FindByNameAsync(name.Trim(), false, cancellationToken); await _apiResourceRepository.FindByNameAsync(name.Trim(), false, cancellationToken);
if (null != apiResource) 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, AllowedAccessTokenSigningAlgorithms = allowedAccessTokenSigningAlgorithms,
ShowInDiscoveryDocument = showInDiscoveryDocument, ShowInDiscoveryDocument = showInDiscoveryDocument,
@ -83,8 +98,11 @@ namespace Lion.AbpPro.IdentityServer
// //
// properties?.Distinct().ToList().ForEach(item => { apiResource.AddProperty(item.Key, item.Value); }); // properties?.Distinct().ToList().ForEach(item => { apiResource.AddProperty(item.Key, item.Value); });
return await _apiResourceRepository.InsertAsync(apiResource, return await _apiResourceRepository.InsertAsync
cancellationToken: cancellationToken); (
apiResource,
cancellationToken: cancellationToken
);
} }
public async Task DeleteAsync( public async Task DeleteAsync(
@ -104,14 +122,13 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument, bool showInDiscoveryDocument,
string secret, string secret,
List<string> scopes, List<string> scopes,
CancellationToken cancellationToken = default CancellationToken cancellationToken = default)
)
{ {
var apiResource = var apiResource =
await _apiResourceRepository.FindByNameAsync(name.Trim(), true, cancellationToken); await _apiResourceRepository.FindByNameAsync(name.Trim(), true, cancellationToken);
if (null == apiResource) if (null == apiResource)
{ {
throw new UserFriendlyException(message: "ApiResource不存在"); throw new BusinessException(AbpProDomainErrorCodes.ApiResourceNotExist);
} }
apiResource.DisplayName = displayName; apiResource.DisplayName = displayName;
@ -148,8 +165,11 @@ namespace Lion.AbpPro.IdentityServer
} }
return await _apiResourceRepository.UpdateAsync(apiResource, return await _apiResourceRepository.UpdateAsync
cancellationToken: cancellationToken); (
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, bool includeDetails = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return _apiScopeRepository.GetListAsync( return _apiScopeRepository.GetListAsync
(
"CreationTime desc", "CreationTime desc",
skipCount, skipCount,
maxResultCount, maxResultCount,
filter, filter,
includeDetails, includeDetails,
cancellationToken); cancellationToken
);
} }
public Task<long> GetCountAsync(string filter = null, public Task<long> GetCountAsync(
string filter = null,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return _apiScopeRepository.GetCountAsync(filter, cancellationToken); return _apiScopeRepository.GetCountAsync(filter, cancellationToken);
@ -48,11 +51,19 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument) bool showInDiscoveryDocument)
{ {
var apiScopes = await _apiScopeRepository.GetListByNameAsync(new[] { name }, false); 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, var scope = new ApiScope
required, emphasize, (
showInDiscoveryDocument, enabled); GuidGenerator.Create(),
name,
displayName,
description,
required,
emphasize,
showInDiscoveryDocument,
enabled
);
return await _apiScopeRepository.InsertAsync(scope); return await _apiScopeRepository.InsertAsync(scope);
} }
@ -67,7 +78,7 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument) bool showInDiscoveryDocument)
{ {
var apiScope = await _apiScopeRepository.FindAsync(id, false); 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.DisplayName = displayName;
apiScope.Description = description; apiScope.Description = description;
apiScope.Enabled = enabled; apiScope.Enabled = enabled;
@ -77,18 +88,25 @@ namespace Lion.AbpPro.IdentityServer
return await _apiScopeRepository.UpdateAsync(apiScope); return await _apiScopeRepository.UpdateAsync(apiScope);
} }
public Task DeleteAsync(Guid id, bool autoSave = false, public Task DeleteAsync(
Guid id,
bool autoSave = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return _apiScopeRepository.DeleteAsync(id, autoSave, cancellationToken); return _apiScopeRepository.DeleteAsync(id, autoSave, cancellationToken);
} }
public async Task<List<ApiScope>> FindAllAsync( public async Task<List<ApiScope>> FindAllAsync(CancellationToken cancellationToken = default)
CancellationToken cancellationToken = default)
{ {
return await _apiScopeRepository.GetListAsync("CreationTime desc", 0, Int32.MaxValue, return await _apiScopeRepository.GetListAsync
null, false, (
cancellationToken); "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) string description, string allowedGrantTypes)
{ {
var entity = await _clientRepository.FindByClientIdAsync(clientId); 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) entity = new Client(GuidGenerator.Create(), clientId)
{ {
ClientName = clientName, Description = description, ClientName = clientName, Description = description,
@ -108,7 +108,7 @@ namespace Lion.AbpPro.IdentityServer
var client = await _clientRepository.FindByClientIdAsync(clientId); var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) if (client == null)
{ {
throw new UserFriendlyException(message: $"{clientId}不存在"); throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
} }
client.ClientName = clientName; client.ClientName = clientName;
@ -180,7 +180,7 @@ namespace Lion.AbpPro.IdentityServer
public async Task<Client> UpdateScopesAsync(string clientId, List<string> scopes) public async Task<Client> UpdateScopesAsync(string clientId, List<string> scopes)
{ {
var client = await _clientRepository.FindByClientIdAsync(clientId); var client = await _clientRepository.FindByClientIdAsync(clientId);
if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist);
client.RemoveAllScopes(); client.RemoveAllScopes();
foreach (var item in scopes.Distinct()) foreach (var item in scopes.Distinct())
@ -201,7 +201,7 @@ namespace Lion.AbpPro.IdentityServer
{ {
uri = uri.Trim(); uri = uri.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId); 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())) if (client.RedirectUris.Any(e => e.RedirectUri == uri.Trim()))
{ {
return client; return client;
@ -220,7 +220,7 @@ namespace Lion.AbpPro.IdentityServer
{ {
uri = uri.Trim(); uri = uri.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId); 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())) if (client.RedirectUris.Any(e => e.RedirectUri == uri.Trim()))
{ {
client.RemoveRedirectUri(uri); client.RemoveRedirectUri(uri);
@ -239,7 +239,7 @@ namespace Lion.AbpPro.IdentityServer
{ {
uri = uri.Trim(); uri = uri.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId); 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)) if (client.PostLogoutRedirectUris.Any(e => e.PostLogoutRedirectUri == uri))
{ {
return client; return client;
@ -256,7 +256,7 @@ namespace Lion.AbpPro.IdentityServer
{ {
uri = uri.Trim(); uri = uri.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId); 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)) if (client.PostLogoutRedirectUris.Any(e => e.PostLogoutRedirectUri == uri))
{ {
client.RemovePostLogoutRedirectUri(uri); client.RemovePostLogoutRedirectUri(uri);
@ -273,7 +273,7 @@ namespace Lion.AbpPro.IdentityServer
{ {
origin = origin.Trim(); origin = origin.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId); 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)) if (client.AllowedCorsOrigins.Any(e => e.Origin == origin))
{ {
return client; return client;
@ -292,7 +292,7 @@ namespace Lion.AbpPro.IdentityServer
{ {
origin = origin.Trim(); origin = origin.Trim();
var client = await _clientRepository.FindByClientIdAsync(clientId); 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)) if (client.AllowedCorsOrigins.Any(e => e.Origin == origin))
{ {
client.RemoveCorsOrigin(origin); client.RemoveCorsOrigin(origin);
@ -305,7 +305,7 @@ namespace Lion.AbpPro.IdentityServer
public async Task<Client> EnabledAsync(string clientId, bool enabled) public async Task<Client> EnabledAsync(string clientId, bool enabled)
{ {
var client = await _clientRepository.FindByClientIdAsync(clientId); 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; client.Enabled = enabled;
return await _clientRepository.UpdateAsync(client); 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) bool showInDiscoveryDocument)
{ {
var identityResource = await _identityResourceRepository.FindByNameAsync(name, false); 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, identityResource = new IdentityResource(GuidGenerator.Create(), name, displayName,
description, enabled, description, enabled,
required, required,
@ -74,7 +74,7 @@ namespace Lion.AbpPro.IdentityServer
bool showInDiscoveryDocument) bool showInDiscoveryDocument)
{ {
var identityResource = await _identityResourceRepository.FindByNameAsync(name, false); 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.DisplayName = displayName;
identityResource.Description = description; identityResource.Description = description;
identityResource.Enabled = enabled; 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. /* The main point to change your DBMS.
* See also AbpProMigrationsDbContextFactory for EF Core tooling. */ * See also AbpProMigrationsDbContextFactory for EF Core tooling. */
options.UseMySQL();
options.PreConfigure<AbpProDbContext>(options => options.PreConfigure<AbpProDbContext>(options =>
{ {
options.DbContextOptions.UseBatchEF_MySQLPomelo(); 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 System.IO;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore.Design;
@ -24,10 +25,21 @@ namespace Lion.AbpPro.EntityFrameworkCore
private static IConfigurationRoot BuildConfiguration() private static IConfigurationRoot BuildConfiguration()
{ {
var builder = new ConfigurationBuilder() var builder = new ConfigurationBuilder()
.SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../Lion.AbpPro.DbMigrator/")) .SetBasePath
.AddJsonFile("appsettings.json", optional: false); (
Path.Combine
(
Directory.GetCurrentDirectory(),
"../Lion.AbpPro.DbMigrator/"
)
)
.AddJsonFile
(
"appsettings.json",
false
);
return builder.Build(); 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; private readonly IServiceProvider _serviceProvider;
public EntityFrameworkCoreAbpProDbSchemaMigrator( public EntityFrameworkCoreAbpProDbSchemaMigrator(IServiceProvider serviceProvider)
IServiceProvider serviceProvider)
{ {
_serviceProvider = 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] [Fact]
public async Task Shuold_CreateAsync_Name_Repetition_Exception() 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(), var result = await _idenityServerApiResourceManager.CreateAsync(Guid.NewGuid(),
"ApiResource_Test", "单元测试创建", "Xunit", true, "", false, "1q2w3E*"); "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] [Fact]
public async Task Shuold_CreateAsync_Name_Repetition_Exception() public async Task Shuold_CreateAsync_Name_Repetition_Exception()
{ {
(await Should.ThrowAsync<UserFriendlyException>(async () => (await Should.ThrowAsync<BusinessException>(async () =>
{ {
var result = await _idenityServerApiScopeManager.CreateAsync( var result = await _idenityServerApiScopeManager.CreateAsync(
"ApiScope_Test", "单元测试创建", "Xunit", true, false, false, true); "ApiScope_Test", "单元测试创建", "Xunit", true, false, false, true);
})).Message.ShouldBe("ApiScope_Test已存在"); })).Code.ShouldBe(AbpProDomainErrorCodes.ApiScopeExist);
} }
// [Fact] // [Fact]

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

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

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

@ -63,13 +63,13 @@ namespace Lion.AbpPro.IdentityServer
[Fact] [Fact]
public async Task Shuold_CreateAsync_Name_Repetition_Exception() public async Task Shuold_CreateAsync_Name_Repetition_Exception()
{ {
(await Should.ThrowAsync<UserFriendlyException>(async () => (await Should.ThrowAsync<BusinessException>(async () =>
{ {
var result = await _identityResourceManager.CreateAsync("openid", "单元测试", var result = await _identityResourceManager.CreateAsync("openid", "单元测试",
"desc", true, false, "desc", true, false,
false, 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/my-profile",
"/api/identity", "/api/identity",
"/api/multi-tenancy/tenants", "/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_httpMethod: 'HttpMethod',
audit_httpStatusCode: 'HttpStatusCode', audit_httpStatusCode: 'HttpStatusCode',
audit_httpRequest: 'HttpRequest', audit_httpRequest: 'HttpRequest',
audit_ipAdrress: 'IP Address', audit_ipAddress: 'IP Address',
audit_time: 'Time', audit_time: 'Time',
audit_duration: 'Execution Duration(ms)', audit_duration: 'Execution Duration(ms)',
audit_url: 'URL', audit_url: 'URL',
@ -68,4 +68,11 @@ export default {
editPasswordMessage: 'The passwords entered twice are inconsistent. Procedure', editPasswordMessage: 'The passwords entered twice are inconsistent. Procedure',
executionTime: 'ExecutionTime', executionTime: 'ExecutionTime',
executionDuration: 'ExecutionDuration(Millisecond)', 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_httpMethod: 'Http方法',
audit_httpStatusCode: 'Http状态码', audit_httpStatusCode: 'Http状态码',
audit_httpRequest: 'Http请求', audit_httpRequest: 'Http请求',
audit_ipAdrress: 'IP地址', audit_ipAddress: 'IP地址',
audit_time: '时间', audit_time: '时间',
audit_duration: '持续时间(ms)', audit_duration: '持续时间(ms)',
audit_url: 'Url地址', audit_url: 'Url地址',
@ -67,5 +67,11 @@ export default {
editPasswordMessage: '输入的2次密码不一致', editPasswordMessage: '输入的2次密码不一致',
executionTime: '执行时间', executionTime: '执行时间',
executionDuration: '响应时间(毫秒)', 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 { createWebHistory, RouteRecordRaw } from "vue-router";
import type { App } from "vue"; import type { App } from "vue";
import { createRouter, createWebHashHistory } from "vue-router"; import { createRouter } from "vue-router";
import { basicRoutes } from "./routes"; import { basicRoutes } from "./routes";
// 白名单应该包含基本静态路由 // 白名单应该包含基本静态路由

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

@ -33,6 +33,16 @@ const admin: AppRouteModule = {
icon: 'ant-design:lock-outlined', 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', path: 'settings',
name: '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; options.baseURL = import.meta.env.VITE_API_URL as string;
const guard: boolean = this.urlGuard(options.url as string); const guard: boolean = this.urlGuard(options.url as string);
const userStore = useUserStoreWithOut(); const userStore = useUserStoreWithOut();
const { token, language } = this.buildRequestMessage();
if (!guard) { if (!guard) {
if (userStore.checkUserLoginExpire) { if (userStore.checkUserLoginExpire) {
router.replace(PageEnum.BASE_LOGIN); router.replace(PageEnum.BASE_LOGIN);
return; return;
} }
const { token, language } = this.buildRequestMessage();
// 添加header // 添加header
options.headers = { options.headers = {
'accept-language': language, 'accept-language': language,
@ -29,6 +28,7 @@ export class ServiceProxyBase {
options.headers = { options.headers = {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
__tenant: userStore.tenantId, __tenant: userStore.tenantId,
'accept-language': language,
}; };
} }

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

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

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

@ -3,9 +3,9 @@
<BasicTable @register="registerTable" size="small"> <BasicTable @register="registerTable" size="small">
<template #url="{ record }"> <template #url="{ record }">
<Tag :color="httpStatusCodeColor(record.httpStatusCode)">{{ record.httpStatusCode }}</Tag> <Tag :color="httpStatusCodeColor(record.httpStatusCode)">{{ record.httpStatusCode }}</Tag>
<Tag style="margin-left: 5px" :color="httpMethodColor(record.httpMethod)">{{ <Tag style="margin-left: 5px" :color="httpMethodColor(record.httpMethod)">
record.httpMethod {{ record.httpMethod }}
}}</Tag> </Tag>
<span style="margin-left: 5px">{{ record.url }}</span> <span style="margin-left: 5px">{{ record.url }}</span>
</template> </template>
</BasicTable> </BasicTable>
@ -13,46 +13,47 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from "vue";
import { BasicTable, useTable } from '/@/components/Table'; import { BasicTable, useTable } from "/@/components/Table";
import { tableColumns, searchFormSchema, getTableListAsync,httpStatusCodeColor,httpMethodColor } from "/@/views/admin/auditLog/AuditLog"; import { tableColumns, searchFormSchema, getTableListAsync, httpStatusCodeColor, httpMethodColor } from "/@/views/admin/auditLog/AuditLog";
import { Tag } from 'ant-design-vue'; import { Tag } from "ant-design-vue";
import { useI18n } from '/@/hooks/web/useI18n'; 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 },
});
return { export default defineComponent({
registerTable, name: "AuditLog",
reload, components: {
t, BasicTable,
httpStatusCodeColor, Tag
httpMethodColor, },
}; 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> </script>

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -1,50 +1,52 @@
import { FormSchema } from '/@/components/Table'; import { FormSchema } from "/@/components/Table";
import { BasicColumn } from '/@/components/Table'; import { BasicColumn } from "/@/components/Table";
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from "/@/hooks/web/useI18n";
const { t } = useI18n(); const { t } = useI18n();
import moment from 'moment'; import moment from "moment";
import { import {
EsLogServiceProxy, EsLogServiceProxy,
PagingElasticSearchLogInput, PagingElasticSearchLogInput,
PagingElasticSearchLogOutputCustomePagedResultDto, PagingElasticSearchLogOutputCustomePagedResultDto
} from '/@/services/ServiceProxies'; } from "/@/services/ServiceProxies";
export const searchFormSchema: FormSchema[] = [ export const searchFormSchema: FormSchema[] = [
{ {
field: 'filter', field: "filter",
component: 'Input', component: "Input",
label: t('common.key'), label: t("common.key"),
labelWidth: 80, labelWidth: 80,
colProps: { colProps: {
span: 6, span: 6
}, }
}, },
{ {
field: 'time', field: "time",
component: 'RangePicker', component: "RangePicker",
label: '创建时间:', label: "创建时间:",
labelWidth: 80, labelWidth: 80,
colProps: { span: 6 }, 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[] = [ export const tableColumns: BasicColumn[] = [
{ {
title: t('routes.admin.logLevel'), title: t("routes.admin.logLevel"),
dataIndex: 'level', dataIndex: "level",
width: 200, width: 200
}, },
{ {
title: t('common.creationTime'), title: t("common.creationTime"),
dataIndex: 'creationTime', dataIndex: "creationTime",
customRender: ({ text }) => { 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'), title: t("routes.admin.logContent"),
dataIndex: 'message', dataIndex: "message"
}, }
]; ];
/** /**

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

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

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

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

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

@ -1,6 +1,6 @@
import { FilesServiceProxy, FileTokenOutput } from '/@/services/ServiceProxies'; import { FilesServiceProxy, FileTokenOutput } from "/@/services/ServiceProxies";
import OSS from 'ali-oss'; import OSS from "ali-oss";
import moment from 'moment'; import moment from "moment";
export async function importFileAsync({ request }) { export async function importFileAsync({ request }) {
const _filesServiceProxy = new FilesServiceProxy(); const _filesServiceProxy = new FilesServiceProxy();
@ -10,20 +10,20 @@ export async function importFileAsync({ request }) {
async function getFileTokenAsync() { async function getFileTokenAsync() {
const _filesServiceProxy = new FilesServiceProxy(); const _filesServiceProxy = new FilesServiceProxy();
const result = await _filesServiceProxy.getFileToken(); const result = await _filesServiceProxy.getFileToken();
sessionStorage.setItem('oss', JSON.stringify(result)); sessionStorage.setItem("oss", JSON.stringify(result));
return result; return result;
} }
export async function getOSSClient(): Promise<OSS> { export async function getOSSClient(): Promise<OSS> {
let fileToken = new FileTokenOutput(); let fileToken = new FileTokenOutput();
try { try {
let oss = sessionStorage.getItem('oss'); let oss = sessionStorage.getItem("oss");
if (!oss) { if (!oss) {
fileToken = await getFileTokenAsync(); fileToken = await getFileTokenAsync();
} else { } else {
fileToken = JSON.parse(oss); 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; debugger;
if (expiration < formatDate(moment.now())) { if (expiration < formatDate(moment.now())) {
fileToken = await getFileTokenAsync(); fileToken = await getFileTokenAsync();
@ -34,36 +34,36 @@ export async function getOSSClient(): Promise<OSS> {
accessKeyId: fileToken.accessKeyId, accessKeyId: fileToken.accessKeyId,
accessKeySecret: fileToken.accessKeySecret, accessKeySecret: fileToken.accessKeySecret,
bucket: fileToken.bucket, bucket: fileToken.bucket,
stsToken: fileToken.token as string, stsToken: fileToken.token as string
}; };
return Promise.resolve<OSS>(new OSS(request)); return Promise.resolve<OSS>(new OSS(request));
} catch (error) { } catch (error) {
console.error('获取oss Client失败'); console.error("获取oss Client失败");
} }
} }
export async function downLoadFile(fileName) { export async function downLoadFile(fileName) {
let oss = await getOSSClient(); let oss = await getOSSClient();
const response = { const response = {
'content-disposition': `attachment; filename=${encodeURIComponent(fileName)}`, "content-disposition": `attachment; filename=${encodeURIComponent(fileName)}`
}; };
const url = (oss as OSS).signatureUrl(fileName, { response }); const url = (oss as OSS).signatureUrl(fileName, { response });
let link = document.createElement('a'); //创建a标签 let link = document.createElement("a"); //创建a标签
link.style.display = 'none'; //使其隐藏 link.style.display = "none"; //使其隐藏
link.href = url; //赋予文件下载地址 link.href = url; //赋予文件下载地址
link.setAttribute('download', fileName); //设置下载属性 以及文件名 link.setAttribute("download", fileName); //设置下载属性 以及文件名
document.body.appendChild(link); //a标签插至页面中 document.body.appendChild(link); //a标签插至页面中
link.click(); //强制触发a标签事件 link.click(); //强制触发a标签事件
} }
function formatDate(dateTime) { function formatDate(dateTime) {
const date = new Date(dateTime); const date = new Date(dateTime);
const YY = date.getFullYear() + '-'; const YY = date.getFullYear() + "-";
const MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; const MM = (date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1) + "-";
const DD = date.getDate() < 10 ? '0' + date.getDate() : date.getDate(); const DD = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
const hh = date.getHours() + ':'; const hh = date.getHours() + ":";
const mm = date.getMinutes() + ':'; const mm = date.getMinutes() + ":";
const ss = date.getSeconds(); 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 { FormSchema } from "/@/components/Table";
import { BasicColumn } from '/@/components/Table'; import { BasicColumn } from "/@/components/Table";
import { import {
RolesServiceProxy, RolesServiceProxy,
PagingRoleListInput, PagingRoleListInput,
@ -7,98 +7,99 @@ import {
IdentityRoleCreateDto, IdentityRoleCreateDto,
PermissionsServiceProxy, PermissionsServiceProxy,
IdInput, IdInput,
GetPermissionInput, GetPermissionInput
} from '/@/services/ServiceProxies'; } from "/@/services/ServiceProxies";
import { message } from 'ant-design-vue'; import { message } from "ant-design-vue";
import { useLoading } from '/@/components/Loading'; import { useLoading } from "/@/components/Loading";
import { useI18n } from "/@/hooks/web/useI18n";
import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n(); const { t } = useI18n();
const [openFullLoading, closeFullLoading] = useLoading({ const [openFullLoading, closeFullLoading] = useLoading({
tip: 'Loading...', tip: "Loading..."
}); });
export const tableColumns: BasicColumn[] = [ export const tableColumns: BasicColumn[] = [
{ {
title: t('routes.admin.userManagement_roleName'), title: t("routes.admin.userManagement_roleName"),
dataIndex: 'name', dataIndex: "name"
}, },
{ {
title: t('routes.admin.roleManagement_default'), title: t("routes.admin.roleManagement_default"),
dataIndex: 'isDefault', dataIndex: "isDefault",
slots: { customRender: 'category' }, slots: { customRender: "category" }
}, }
]; ];
export const searchFormSchema: FormSchema[] = [ export const searchFormSchema: FormSchema[] = [
{ {
field: 'filter', field: "filter",
label: t('routes.admin.userManagement_roleName'), label: t("routes.admin.userManagement_roleName"),
component: 'Input', component: "Input",
colProps: { span: 8 }, colProps: { span: 8 }
}, }
]; ];
export const createFormSchema: FormSchema[] = [ export const createFormSchema: FormSchema[] = [
{ {
field: 'name', field: "name",
label: t('routes.admin.userManagement_roleName'), label: t("routes.admin.userManagement_roleName"),
component: 'Input', component: "Input",
required: true, required: true,
colProps: { span: 18 }, colProps: { span: 18 }
}, },
{ {
field: 'isDefault', field: "isDefault",
component: 'RadioGroup', component: "RadioGroup",
label: t('routes.admin.roleManagement_default'), label: t("routes.admin.roleManagement_default"),
required: true, required: true,
colProps: { colProps: {
span: 18, span: 18
}, },
defaultValue: '0', defaultValue: "0",
componentProps: { componentProps: {
options: [ options: [
{ {
label: t('common.true'), label: t("common.true"),
value: '1', value: "1"
}, },
{ {
label: t('common.false'), label: t("common.false"),
value: '0', value: "0"
}, }
], ]
}, }
}, }
]; ];
export const editFormSchema: FormSchema[] = [ export const editFormSchema: FormSchema[] = [
{ {
field: 'name', field: "name",
label: t('routes.admin.userManagement_roleName'), label: t("routes.admin.userManagement_roleName"),
component: 'Input', component: "Input",
required: true, required: true,
colProps: { span: 18 }, colProps: { span: 18 }
}, },
{ {
field: 'isDefault', field: "isDefault",
component: 'RadioGroup', component: "RadioGroup",
label: t('routes.admin.roleManagement_default'), label: t("routes.admin.roleManagement_default"),
required: true, required: true,
colProps: { colProps: {
span: 18, span: 18
}, },
componentProps: { componentProps: {
options: [ options: [
{ {
label: t('common.true'), label: t("common.true"),
value: '1', value: "1"
}, },
{ {
label: t('common.false'), label: t("common.false"),
value: '0', value: "0"
}, }
], ]
}, }
}, }
]; ];
/** /**
@ -123,7 +124,7 @@ export async function deleteRoleAsync({ roleId, reload }) {
request.id = roleId; request.id = roleId;
await _roleServiceProxy.delete(request); await _roleServiceProxy.delete(request);
closeFullLoading(); closeFullLoading();
message.success(t('common.operationSuccess')); message.success(t("common.operationSuccess"));
reload(); reload();
} catch (error) { } catch (error) {
closeFullLoading(); closeFullLoading();
@ -139,11 +140,11 @@ export async function createRoleAsync({ request, changeOkLoading, validate, clos
await validate(); await validate();
let requestBody: IdentityRoleCreateDto = new IdentityRoleCreateDto(); let requestBody: IdentityRoleCreateDto = new IdentityRoleCreateDto();
requestBody.name = request.name; 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(); const _roleServiceProxy = new RolesServiceProxy();
await _roleServiceProxy.create(requestBody); await _roleServiceProxy.create(requestBody);
changeOkLoading(false); changeOkLoading(false);
message.success(t('common.operationSuccess')); message.success(t("common.operationSuccess"));
closeModal(); closeModal();
} }
@ -155,7 +156,7 @@ export async function createRoleAsync({ request, changeOkLoading, validate, clos
export async function getRolePermissionAsync(roleName: string) { export async function getRolePermissionAsync(roleName: string) {
const _permissionsServiceProxy = new PermissionsServiceProxy(); const _permissionsServiceProxy = new PermissionsServiceProxy();
const request = new GetPermissionInput(); const request = new GetPermissionInput();
request.providerName = 'R'; request.providerName = "R";
request.providerKey = roleName; request.providerKey = roleName;
return await _permissionsServiceProxy.tree(request); return await _permissionsServiceProxy.tree(request);
} }

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

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

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

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

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

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

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

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

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

Loading…
Cancel
Save