From 323a8461ca7e7bc7daafe59b15dfcdabb8f00a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=86=9B?= <510423039@qq.com> Date: Sat, 21 May 2022 09:38:39 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E6=B7=BB=E5=8A=A0=E7=BB=84?= =?UTF-8?q?=E7=BB=87=E6=9C=BA=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../System/DateTimeExtensions.cs | 25 ++ .../DataDictionaryDomainException.cs | 13 +- .../DataDictionaryManagementConsts.cs | 5 + ...aDictionaryManagementDomainSharedModule.cs | 4 +- .../DataDictionaryManagementErrorCodes.cs | 5 +- .../DataDictionaryManagement/en.json | 8 +- .../DataDictionaryManagement/zh-Hans.json | 7 +- .../DataDictionaries/DataDictionaryManager.cs | 113 ++++-- .../appsettings.json | 7 +- .../Notifications/NotificationAppService.cs | 2 +- .../NotificationManagement/en.json | 6 +- .../NotificationManagement/zh-Hans.json | 7 +- .../NotificationManagementConsts.cs | 9 + ...otificationManagementDomainSharedModule.cs | 4 +- .../NotificationManagementErrorCodes.cs | 5 +- .../NotificationManagementDomainException.cs | 13 +- .../Notifications/NotificationManager.cs | 6 +- .../AbpProHttpApiHostModule.cs | 3 - .../Lion.AbpPro.HttpApi.Host/appsettings.json | 4 +- .../AbpProPermissionDefinitionProvider.cs | 158 ++++++-- .../Permissions/AbpProPermissions.cs | 8 + .../ElasticSearchs/LionAbpProLogAppService.cs | 74 ++-- .../OrganizationUnitAppService.cs | 25 +- .../Users/AccountAppService.cs | 16 +- .../Users/UserAppService.cs | 5 +- .../DbMigratorHostedService.cs | 10 +- .../Lion.AbpPro.DbMigrator.csproj | 19 +- .../src/Lion.AbpPro.DbMigrator/Program.cs | 13 - .../appsettings.Production.json | 5 - .../appsettings.Staging.json | 5 - .../Lion.AbpPro.DbMigrator/appsettings.json | 5 + .../Lion.AbpPro.DbMigrator/appsettings1.json | 5 - .../AbpProDomainErrorCodes.cs | 12 +- .../AbpProDomainSharedConsts.cs | 9 + .../AbpProDomainSharedModule.cs | 6 +- .../Localization/AbpPro/en.json | 16 +- .../Localization/AbpPro/zh-Hans.json | 15 +- .../Localization/AbpProResource.cs | 2 +- .../Data/AbpProDbMigrationService.cs | 291 ++++++++------- .../Data/IAbpProDbSchemaMigrator.cs | 11 +- .../Data/NullAbpProDbSchemaMigrator.cs | 21 +- .../IdenityServerApiResourceManager.cs | 50 ++- .../IdenityServerApiScopeManager.cs | 46 ++- .../IdenityServerClientManager.cs | 20 +- .../IdentityServer/IdentityResourceManager.cs | 4 +- .../AbpProEntityFrameworkCoreModule.cs | 3 +- .../AbpProMigrationsDbContextFactory.cs | 8 +- ...tityFrameworkCoreAbpProDbSchemaMigrator.cs | 3 +- .../IdenityServerApiResourceManager_Tests.cs | 4 +- .../IdenityServerApiScopeManager_Tests.cs | 4 +- .../IdenityServerClientManager_Tests.cs | 4 +- .../IdentityResourceManager_Tests.cs | 4 +- vben271/src/router/routes/modules/admin.ts | 20 +- vben271/src/services/ServiceProxyBase.ts | 4 +- vben271/src/views/admin/auditLog/AuditLog.ts | 106 +++--- vben271/src/views/admin/auditLog/AuditLog.vue | 89 ++--- .../views/admin/dictionary/AbpDictionary.ts | 326 ++++++++-------- .../views/admin/dictionary/AbpDictionary.vue | 353 +++++++++--------- .../admin/dictionary/CreateAbpDictionary.vue | 104 +++--- .../dictionary/CreateAbpDictionaryType.vue | 95 ++--- .../admin/dictionary/EditAbpDictionary.vue | 100 ++--- .../dictionary/EditAbpDictionaryType.vue | 99 ++--- .../admin/elasticSearch/ElasticSearch.ts | 54 +-- .../admin/elasticSearch/ElasticSearch.vue | 119 +++--- vben271/src/views/admin/files/File.ts | 35 +- vben271/src/views/admin/files/File.vue | 146 ++++---- vben271/src/views/admin/files/UploadOss.ts | 36 +- .../AddRoleToOrganizationUnit.vue | 62 +-- .../AddUserToOrganizationUnit.vue | 111 ++++++ .../CreateOrganizationUnit.vue | 128 +++---- .../EditOrganizationUnit.vue | 98 ++--- .../organizationUnits/OrganizationUnit.ts | 174 ++++----- .../organizationUnits/OrganizationUnit.vue | 93 +++-- vben271/src/views/admin/roles/AbpRole.ts | 113 +++--- vben271/src/views/admin/roles/AbpRole.vue | 183 ++++----- .../src/views/admin/roles/CreateAbpRole.vue | 94 ++--- vben271/src/views/admin/roles/EditAbpRole.vue | 118 +++--- vben271/src/views/admin/settings/Setting.ts | 2 +- vben271/src/views/admin/users/AbpUser.ts | 227 +++++------ .../src/views/admin/users/CreateAbpUser.vue | 162 ++++---- vben271/src/views/admin/users/EditAbpUser.vue | 233 ++++++------ 81 files changed, 2531 insertions(+), 2080 deletions(-) create mode 100644 aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementConsts.cs delete mode 100644 aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Production.json delete mode 100644 aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Staging.json create mode 100644 aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.json delete mode 100644 aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings1.json create mode 100644 aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedConsts.cs create mode 100644 vben271/src/views/admin/organizationUnits/AddUserToOrganizationUnit.vue diff --git a/aspnet-core/frameworks/Extensions/src/Lion.AbpPro.Extension/System/DateTimeExtensions.cs b/aspnet-core/frameworks/Extensions/src/Lion.AbpPro.Extension/System/DateTimeExtensions.cs index 99b1bef9..1d23b6c2 100644 --- a/aspnet-core/frameworks/Extensions/src/Lion.AbpPro.Extension/System/DateTimeExtensions.cs +++ b/aspnet-core/frameworks/Extensions/src/Lion.AbpPro.Extension/System/DateTimeExtensions.cs @@ -75,5 +75,30 @@ namespace Lion.AbpPro.Extension.System var result = length == 10 ? start.AddSeconds(jsTime) : start.AddMilliseconds(jsTime); return result.ToUniversalTime(); } + + /// + /// 获取指定日期 当天的最大时间 + /// 例如 2021-09-10 11:22:33.123456 转换后 2021-09-10 23:59:59.9999999 + /// + public static DateTime? ToCurrentDateMaxDateTime(this DateTime? dateTime) + { + return dateTime?.Date.AddDays(1).AddTicks(-1); + } + + /// + /// 获取指定时间的下一秒 + /// 例如 2021-09-10 11:11:11.1234567 转换后 2021-09-10 11:11:12.0000000 + /// + 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); + } } } \ No newline at end of file diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaries/DataDictionaryDomainException.cs b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaries/DataDictionaryDomainException.cs index 8a4d320a..555d5eaa 100644 --- a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaries/DataDictionaryDomainException.cs +++ b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaries/DataDictionaryDomainException.cs @@ -5,16 +5,17 @@ using Volo.Abp; namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries { - public class DataDictionaryDomainException : UserFriendlyException + public class DataDictionaryDomainException : BusinessException { - public DataDictionaryDomainException(string message, string code = null, string details = null, - Exception innerException = null, LogLevel logLevel = LogLevel.Warning) : base(message, code, details, - innerException, logLevel) + public DataDictionaryDomainException(string code = null, string message = null, string details = null, Exception innerException = null, + LogLevel logLevel = LogLevel.Warning) : base(code, message, details, + innerException, + logLevel + ) { } - public DataDictionaryDomainException(SerializationInfo serializationInfo, StreamingContext context) : base( - serializationInfo, context) + public DataDictionaryDomainException(SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context) { } } diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementConsts.cs b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementConsts.cs index 63e08e03..044e7116 100644 --- a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementConsts.cs +++ b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementConsts.cs @@ -5,5 +5,10 @@ namespace Lion.AbpPro.DataDictionaryManagement public class DataDictionaryManagementConsts { public static Guid SeedDataDictionaryId = new Guid("39fdb236-a90e-e4b5-02a0-2866a8cf9821"); + + /// 名称空间 + public const string NameSpace = "Lion.AbpPro.DataDictionaryManagement"; + /// 默认语言 + public const string DefaultCultureName = "zh-Hans"; } } \ No newline at end of file diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementDomainSharedModule.cs b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementDomainSharedModule.cs index af6ac4ba..d61879cb 100644 --- a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementDomainSharedModule.cs +++ b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementDomainSharedModule.cs @@ -23,14 +23,14 @@ namespace Lion.AbpPro.DataDictionaryManagement Configure(options => { options.Resources - .Add("en") + .Add(DataDictionaryManagementConsts.DefaultCultureName) .AddBaseTypes(typeof(AbpValidationResource)) .AddVirtualJson("/Localization/DataDictionaryManagement"); }); Configure(options => { - options.MapCodeNamespace("DataDictionaryManagement", typeof(DataDictionaryManagementResource)); + options.MapCodeNamespace(DataDictionaryManagementConsts.NameSpace, typeof(DataDictionaryManagementResource)); }); } } diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementErrorCodes.cs b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementErrorCodes.cs index d5dfaa24..d38c19c1 100644 --- a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementErrorCodes.cs +++ b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/DataDictionaryManagementErrorCodes.cs @@ -2,6 +2,9 @@ namespace Lion.AbpPro.DataDictionaryManagement { public static class DataDictionaryManagementErrorCodes { - //Add your business exception error codes here... + public const string DataDictionaryExist =DataDictionaryManagementConsts.NameSpace+ ":100001"; + public const string DataDictionaryNotExist =DataDictionaryManagementConsts.NameSpace+ ":100002"; + public const string DataDictionaryDetailExist =DataDictionaryManagementConsts.NameSpace+ ":100003"; + public const string DataDictionaryDetailNotExist =DataDictionaryManagementConsts.NameSpace+ ":100004"; } } diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/en.json b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/en.json index c2224548..bc54b8fc 100644 --- a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/en.json +++ b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/en.json @@ -6,6 +6,12 @@ "Permission:DataDictionaryManagement": "DataDictionaryManagement", "Permission:Create": "Create", "Permission:Update": "Update", - "Permission:Delete": "Delete" + "Permission:Delete": "Delete", + + "Lion.AbpPro.DataDictionaryManagement:100001": "DataDictionary Exist", + "Lion.AbpPro.DataDictionaryManagement:100002": "DataDictionary Not Exist", + "Lion.AbpPro.DataDictionaryManagement:100003": "DataDictionaryDetail Exist", + "Lion.AbpPro.DataDictionaryManagement:100004": "DataDictionaryDetail Not Exist" + } } \ No newline at end of file diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/zh-Hans.json b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/zh-Hans.json index f463a7e2..5037b4f5 100644 --- a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/zh-Hans.json +++ b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain.Shared/Localization/DataDictionaryManagement/zh-Hans.json @@ -6,6 +6,11 @@ "Permission:DataDictionaryManagement": "数据字典", "Permission:Create": "创建", "Permission:Update": "编辑", - "Permission:Delete": "删除" + "Permission:Delete": "删除", + + "Lion.AbpPro.DataDictionaryManagement:100001": "数据字典已存在", + "Lion.AbpPro.DataDictionaryManagement:100002": "数据字典不存在", + "Lion.AbpPro.DataDictionaryManagement:100003": "数据字典明细已存在", + "Lion.AbpPro.DataDictionaryManagement:100004": "数据字典明细不存在" } } \ No newline at end of file diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs index 6f44c722..e9810dca 100644 --- a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs +++ b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs @@ -4,8 +4,8 @@ using System.Threading; using System.Threading.Tasks; using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Aggregates; using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Dto; +using Volo.Abp; using Volo.Abp.Caching; -using Volo.Abp.Domain.Services; namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries { @@ -22,22 +22,28 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries _cache = cache; } - - - + public async Task FindByIdAsync( Guid id, CancellationToken cancellationToken = default) { var cacheKey = DataDictionaryDto.CalculateCacheKey(id, null); - return await _cache.GetOrAddAsync(cacheKey, + return await _cache.GetOrAddAsync + ( + cacheKey, async () => { var entity = - await _dataDictionaryRepository.FindByIdAsync(id, true, - cancellationToken); + await _dataDictionaryRepository.FindByIdAsync + ( + id, + true, + cancellationToken + ); return ObjectMapper.Map(entity); - }, token: cancellationToken); + }, + token: cancellationToken + ); } public async Task FindByCodeAsync( @@ -45,14 +51,22 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries CancellationToken cancellationToken = default) { var cacheKey = DataDictionaryDto.CalculateCacheKey(null, code); - return await _cache.GetOrAddAsync(cacheKey, + return await _cache.GetOrAddAsync + ( + cacheKey, async () => { var entity = - await _dataDictionaryRepository.FindByCodeAsync(code, true, - cancellationToken); + await _dataDictionaryRepository.FindByCodeAsync + ( + code, + true, + cancellationToken + ); return ObjectMapper.Map(entity); - }, token: cancellationToken); + }, + token: cancellationToken + ); } @@ -62,10 +76,21 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries /// /// /// - public Task CreateAsync(string code, string displayText, string description) + public async Task CreateAsync(string code, string displayText, string description) { - var entity = new DataDictionary(GuidGenerator.Create(), code, displayText, description); - return _dataDictionaryRepository.InsertAsync(entity); + Check.NotNullOrWhiteSpace(code, nameof(code)); + var entity = await _dataDictionaryRepository.FindByCodeAsync(code); + if (entity != null) throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryExist); + + entity = new DataDictionary + ( + GuidGenerator.Create(), + code, + displayText, + description + ); + + return await _dataDictionaryRepository.InsertAsync(entity); } /// @@ -77,36 +102,47 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries /// /// /// - public async Task CreateDetailAsync(Guid dataDictionaryId, string code, + public async Task CreateDetailAsync( + Guid dataDictionaryId, + string code, string displayText, string description, int order) { var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); if (entity == null) - throw new DataDictionaryDomainException(message: "数据字典不存在"); + throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist); if (entity.Details.Any(e => e.Code == code.Trim())) { - throw new DataDictionaryDomainException(message: $"字典项{code}已存在"); + throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailExist); } - entity.AddDetail(GuidGenerator.Create(), code, displayText, order, description); + entity.AddDetail + ( + GuidGenerator.Create(), + code, + displayText, + order, + description + ); return await _dataDictionaryRepository.UpdateAsync(entity); } /// /// 设置字典明细状态 /// - public async Task SetStatus(Guid dataDictionaryId, - Guid dataDictionayDetailId, bool isEnabled) + public async Task SetStatus( + Guid dataDictionaryId, + Guid dataDictionayDetailId, + bool isEnabled) { var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); if (entity == null) - throw new DataDictionaryDomainException(message: "数据字典不存在"); + throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist); var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId); if (null == detail) { - throw new DataDictionaryDomainException(message: $"字典项不存在"); + throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailExist); } detail.SetIsEnabled(isEnabled); @@ -125,14 +161,20 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries { var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); if (entity == null) - throw new DataDictionaryDomainException(message: "数据字典不存在"); + throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist); var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId); if (null == detail) { - throw new DataDictionaryDomainException(message: $"字典项不存在"); + throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailNotExist); } - detail.UpdateDetail(dataDictionayDetailId, displayText, description, order); + detail.UpdateDetail + ( + dataDictionayDetailId, + displayText, + description, + order + ); return await _dataDictionaryRepository.UpdateAsync(entity); } @@ -140,27 +182,29 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries { var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); if (entity == null) - throw new DataDictionaryDomainException(message: "数据字典不存在"); + throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist); var detail = entity.Details.FirstOrDefault(e => e.Id == dataDictionayDetailId); if (null == detail) { - throw new DataDictionaryDomainException(message: $"字典项不存在"); + throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryDetailNotExist); } entity.Details.Remove(detail); await _dataDictionaryRepository.UpdateAsync(entity); } - public async Task UpdateAsync(Guid dataDictionaryId, + + public async Task UpdateAsync( + Guid dataDictionaryId, string displayText, string description) { var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); if (entity == null) - throw new DataDictionaryDomainException(message: "数据字典不存在"); - entity.Update(dataDictionaryId,displayText,description); + throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist); + entity.Update(dataDictionaryId, displayText, description); return await _dataDictionaryRepository.UpdateAsync(entity); - } + /// /// 删除字典类型 /// @@ -170,13 +214,14 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries { var entity = await _dataDictionaryRepository.FindByIdAsync(id); if (entity == null) - throw new DataDictionaryDomainException(message: "数据字典不存在"); + throw new DataDictionaryDomainException(DataDictionaryManagementErrorCodes.DataDictionaryNotExist); var detail = entity.Details.FirstOrDefault(e => e.DataDictionaryId == id); - if (detail !=null ) + if (detail != null) { entity.Details.Remove(detail); await _dataDictionaryRepository.UpdateAsync(entity); } + await _dataDictionaryRepository.DeleteAsync(id); } } diff --git a/aspnet-core/modules/FileManagement/host/Lion.AbpPro.FileManagement.HttpApi.Host/appsettings.json b/aspnet-core/modules/FileManagement/host/Lion.AbpPro.FileManagement.HttpApi.Host/appsettings.json index 5b227b43..8b9c4f55 100644 --- a/aspnet-core/modules/FileManagement/host/Lion.AbpPro.FileManagement.HttpApi.Host/appsettings.json +++ b/aspnet-core/modules/FileManagement/host/Lion.AbpPro.FileManagement.HttpApi.Host/appsettings.json @@ -18,9 +18,4 @@ "RoleArn": "acs:ram::1846393972471789:role/ramosstest" } } -} - -//用户登录名称 lion.abp@1846393972471789.onaliyun.com -//AccessKey ID LTAI5tLkt3vvScGPVZ5qKJDc -//AccessKey Secret BixV8vP5uPrbsdwjYzzsEXOPjkxPST -//acs:ram::1846393972471789:role/ramosstest \ No newline at end of file +} \ No newline at end of file diff --git a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Application/Notifications/NotificationAppService.cs b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Application/Notifications/NotificationAppService.cs index 38336347..c289bb57 100644 --- a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Application/Notifications/NotificationAppService.cs +++ b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Application/Notifications/NotificationAppService.cs @@ -55,7 +55,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications await SendMessageToAllClientAsync(new SendNotificationDto(title, content, messageType)); break; default: - throw new UserFriendlyException("未知的消息类型"); + throw new BusinessException(NotificationManagementErrorCodes.MessageTypeUnknown); } } diff --git a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/en.json b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/en.json index f39af7fc..04b81cc4 100644 --- a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/en.json +++ b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/en.json @@ -2,6 +2,10 @@ "culture": "en", "texts": { "ManageYourProfile": "Manage your profile", - "SamplePageMessage": "A sample page for the NotificationManagement module" + "SamplePageMessage": "A sample page for the NotificationManagement module", + "Lion.AbpPro.NotificationManagement:100001": "ReceiverNotNull", + "Lion.AbpPro.NotificationManagement:100002": "MessageNotExist", + "Lion.AbpPro.NotificationManagement:100003": "MessageTypeUnknown", + "Lion.AbpPro.NotificationManagement:100004": "UserUnSubscription" } } \ No newline at end of file diff --git a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/zh-Hans.json b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/zh-Hans.json index 01c3e18d..9ceaf7fb 100644 --- a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/zh-Hans.json +++ b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Localization/NotificationManagement/zh-Hans.json @@ -2,6 +2,11 @@ "culture": "zh-Hans", "texts": { "ManageYourProfile": "管理个人资料", - "SamplePageMessage": "NotificationManagement模块的示例页面" + "SamplePageMessage": "NotificationManagement模块的示例页面", + + "Lion.AbpPro.NotificationManagement:100001": "接收人不能为空", + "Lion.AbpPro.NotificationManagement:100002": "消息不存在", + "Lion.AbpPro.NotificationManagement:100003": "未知的消息类型", + "Lion.AbpPro.NotificationManagement:100004": "当前用户未订阅消息" } } \ No newline at end of file diff --git a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementConsts.cs b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementConsts.cs new file mode 100644 index 00000000..27c6d065 --- /dev/null +++ b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementConsts.cs @@ -0,0 +1,9 @@ +namespace Lion.AbpPro.NotificationManagement; + +public class NotificationManagementConsts +{ + /// 名称空间 + public const string NameSpace = "Lion.AbpPro.NotificationManagementConsts"; + /// 默认语言 + public const string DefaultCultureName = "zh-Hans"; +} \ No newline at end of file diff --git a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementDomainSharedModule.cs b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementDomainSharedModule.cs index 2dd1958b..1fc8fba3 100644 --- a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementDomainSharedModule.cs +++ b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementDomainSharedModule.cs @@ -23,14 +23,14 @@ namespace Lion.AbpPro.NotificationManagement Configure(options => { options.Resources - .Add("en") + .Add(NotificationManagementConsts.DefaultCultureName) .AddBaseTypes(typeof(AbpValidationResource)) .AddVirtualJson("/Localization/NotificationManagement"); }); Configure(options => { - options.MapCodeNamespace("NotificationManagement", typeof(NotificationManagementResource)); + options.MapCodeNamespace(NotificationManagementConsts.NameSpace, typeof(NotificationManagementResource)); }); } } diff --git a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementErrorCodes.cs b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementErrorCodes.cs index e70b6c6d..0ac823e0 100644 --- a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementErrorCodes.cs +++ b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/NotificationManagementErrorCodes.cs @@ -2,6 +2,9 @@ namespace Lion.AbpPro.NotificationManagement { public static class NotificationManagementErrorCodes { - //Add your business exception error codes here... + public const string ReceiverNotNull =NotificationManagementConsts.NameSpace+ ":100001"; + public const string MessageNotExist =NotificationManagementConsts.NameSpace+ ":100002"; + public const string MessageTypeUnknown =NotificationManagementConsts.NameSpace+ ":100003"; + public const string UserUnSubscription =NotificationManagementConsts.NameSpace+ ":100004"; } } diff --git a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/NotificationManagementDomainException.cs b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/NotificationManagementDomainException.cs index 4b4fd22f..671ad3ea 100644 --- a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/NotificationManagementDomainException.cs +++ b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/NotificationManagementDomainException.cs @@ -5,16 +5,17 @@ using Volo.Abp; namespace Lion.AbpPro.NotificationManagement { - public class NotificationManagementDomainException : UserFriendlyException + public class NotificationManagementDomainException : BusinessException { - public NotificationManagementDomainException(string message, string code = null, string details = null, - Exception innerException = null, LogLevel logLevel = LogLevel.Warning) : base(message, code, details, - innerException, logLevel) + public NotificationManagementDomainException(string code = null, string message = null, string details = null, Exception innerException = null, + LogLevel logLevel = LogLevel.Warning) : base(code, message, details, + innerException, + logLevel + ) { } - public NotificationManagementDomainException(SerializationInfo serializationInfo, StreamingContext context) : - base(serializationInfo, context) + public NotificationManagementDomainException(SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context) { } } diff --git a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/NotificationManager.cs b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/NotificationManager.cs index 4239bff7..22a10b79 100644 --- a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/NotificationManager.cs +++ b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/NotificationManager.cs @@ -32,7 +32,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications { if (receiveIds is {Count: 0}) { - throw new NotificationManagementDomainException("消息接收人不能为空"); + throw new NotificationManagementDomainException(NotificationManagementErrorCodes.ReceiverNotNull); } var senderId = Guid.Empty; @@ -113,7 +113,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications public async Task SetReadAsync(Guid id, Guid receiveId) { var notification = await _notificationRepository.FindByIdAsync(id); - if (notification == null) throw new NotificationManagementDomainException(message: "消息不存在"); + if (notification == null) throw new NotificationManagementDomainException(NotificationManagementErrorCodes.MessageNotExist); if (notification.MessageType == MessageType.BroadCast) { // 如果类型是广播消息,用户设置为已读,在插入一条数据 @@ -124,7 +124,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications var notificationSubscription = notification.NotificationSubscriptions.FirstOrDefault(e => e.ReceiveId == receiveId); if (notificationSubscription == null) - throw new NotificationManagementDomainException(message: "当前用户未订阅该消息"); + throw new NotificationManagementDomainException(NotificationManagementErrorCodes.UserUnSubscription); notificationSubscription.SetRead(); } diff --git a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/AbpProHttpApiHostModule.cs b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/AbpProHttpApiHostModule.cs index 72cf7124..ba921c6f 100644 --- a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/AbpProHttpApiHostModule.cs +++ b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/AbpProHttpApiHostModule.cs @@ -136,9 +136,6 @@ namespace Lion.AbpPro /// private void ConfigureAbpExceptions(ServiceConfigurationContext context) { - //开启后通过ErrorCode抛本地化异常,message不会显示本地化词条 - var SendExceptionsDetails = context.Services.GetHostingEnvironment().IsDevelopment(); - context.Services.Configure(options => { options.SendExceptionsDetailsToClients = SendExceptionsDetails; }); context.Services.AddMvc(options => { options.Filters.Add(typeof(ResultExceptionFilter)); }); } diff --git a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json index fef601db..bb8f32cf 100644 --- a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json +++ b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json @@ -13,7 +13,7 @@ "Hangfire": "Information", "DotNetCore.CAP": "Information", "Serilog.AspNetCore": "Information", - "Microsoft.EntityFrameworkCore": "Information" + "Microsoft.EntityFrameworkCore": "Warning" } }, "WriteTo": [ @@ -34,7 +34,7 @@ "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" + "Default": "Data Source=localhost;Port=3306;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" }, "Redis": { "Configuration": "localhost,password=mypassword,defaultdatabase=1" diff --git a/aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissionDefinitionProvider.cs b/aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissionDefinitionProvider.cs index 756d17f6..a40863bc 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissionDefinitionProvider.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissionDefinitionProvider.cs @@ -19,55 +19,141 @@ namespace Lion.AbpPro.Permissions abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.AuditLog, L("Permission:AuditLogManagement")); var esManagement = abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.ES, L("Permission:ESManagement")); var settingManagement = abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.Setting, L("Permission:SettingManagement")); + var organizationUnitManagement = abpIdentityGroup.AddPermission(AbpProPermissions.SystemManagement.OrganizationUnit, L("Permission:OrganizationUnitManagement")); + organizationUnitManagement.AddChild + ( + AbpProPermissions.SystemManagement.OrganizationUnitManagement.Create, + L("Permission:Create") + ); + organizationUnitManagement.AddChild + ( + AbpProPermissions.SystemManagement.OrganizationUnitManagement.Update, + L("Permission:Update") + ); + organizationUnitManagement.AddChild + ( + AbpProPermissions.SystemManagement.OrganizationUnitManagement.Delete, + L("Permission:Delete") + ); #region IdentityServer // multiTenancySide: MultiTenancySides.Host 只有host租户才有权限 var identityServerManagementGroup = - context.AddGroup(AbpProPermissions.IdentityServer.IdentityServerManagement, L("Permission:IdentityServerManagement"), - multiTenancySide: MultiTenancySides.Host); + context.AddGroup + ( + AbpProPermissions.IdentityServer.IdentityServerManagement, + L("Permission:IdentityServerManagement"), + multiTenancySide: MultiTenancySides.Host + ); - var clientManagment = identityServerManagementGroup.AddPermission(AbpProPermissions.IdentityServer.Client.Default, - L("Permission:IdentityServerManagement:Client"),multiTenancySide: MultiTenancySides.Host); - clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Create, - L("Permission:Create"),multiTenancySide: MultiTenancySides.Host); - clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Update, - L("Permission:Update"),multiTenancySide: MultiTenancySides.Host); - clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Delete, - L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host); - clientManagment.AddChild(AbpProPermissions.IdentityServer.Client.Enable, - L("Permission:Enable"),multiTenancySide: MultiTenancySides.Host); + var clientManagment = identityServerManagementGroup.AddPermission + ( + AbpProPermissions.IdentityServer.Client.Default, + L("Permission:IdentityServerManagement:Client"), + multiTenancySide: MultiTenancySides.Host + ); + clientManagment.AddChild + ( + AbpProPermissions.IdentityServer.Client.Create, + L("Permission:Create"), + multiTenancySide: MultiTenancySides.Host + ); + clientManagment.AddChild + ( + AbpProPermissions.IdentityServer.Client.Update, + L("Permission:Update"), + multiTenancySide: MultiTenancySides.Host + ); + clientManagment.AddChild + ( + AbpProPermissions.IdentityServer.Client.Delete, + L("Permission:Delete"), + multiTenancySide: MultiTenancySides.Host + ); + clientManagment.AddChild + ( + AbpProPermissions.IdentityServer.Client.Enable, + L("Permission:Enable"), + multiTenancySide: MultiTenancySides.Host + ); - var apiResourceManagment = identityServerManagementGroup.AddPermission( + var apiResourceManagment = identityServerManagementGroup.AddPermission + ( AbpProPermissions.IdentityServer.ApiResource.Default, - L("Permission:IdentityServerManagement:ApiResource"),multiTenancySide: MultiTenancySides.Host); - apiResourceManagment.AddChild(AbpProPermissions.IdentityServer.ApiResource.Create, - L("Permission:Create"),multiTenancySide: MultiTenancySides.Host); - apiResourceManagment.AddChild(AbpProPermissions.IdentityServer.ApiResource.Update, - L("Permission:Update"),multiTenancySide: MultiTenancySides.Host); - apiResourceManagment.AddChild(AbpProPermissions.IdentityServer.ApiResource.Delete, - L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host); + L("Permission:IdentityServerManagement:ApiResource"), + multiTenancySide: MultiTenancySides.Host + ); + apiResourceManagment.AddChild + ( + AbpProPermissions.IdentityServer.ApiResource.Create, + L("Permission:Create"), + multiTenancySide: MultiTenancySides.Host + ); + apiResourceManagment.AddChild + ( + AbpProPermissions.IdentityServer.ApiResource.Update, + L("Permission:Update"), + multiTenancySide: MultiTenancySides.Host + ); + apiResourceManagment.AddChild + ( + AbpProPermissions.IdentityServer.ApiResource.Delete, + L("Permission:Delete"), + multiTenancySide: MultiTenancySides.Host + ); - var apiScopeManagment = identityServerManagementGroup.AddPermission(AbpProPermissions.IdentityServer.ApiScope.Default, - L("Permission:IdentityServerManagement:ApiScope"),multiTenancySide: MultiTenancySides.Host); - apiScopeManagment.AddChild(AbpProPermissions.IdentityServer.ApiScope.Create, - L("Permission:Create"),multiTenancySide: MultiTenancySides.Host); - apiScopeManagment.AddChild(AbpProPermissions.IdentityServer.ApiScope.Update, - L("Permission:Update"),multiTenancySide: MultiTenancySides.Host); - apiScopeManagment.AddChild(AbpProPermissions.IdentityServer.ApiScope.Delete, - L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host); + var apiScopeManagment = identityServerManagementGroup.AddPermission + ( + AbpProPermissions.IdentityServer.ApiScope.Default, + L("Permission:IdentityServerManagement:ApiScope"), + multiTenancySide: MultiTenancySides.Host + ); + apiScopeManagment.AddChild + ( + AbpProPermissions.IdentityServer.ApiScope.Create, + L("Permission:Create"), + multiTenancySide: MultiTenancySides.Host + ); + apiScopeManagment.AddChild + ( + AbpProPermissions.IdentityServer.ApiScope.Update, + L("Permission:Update"), + multiTenancySide: MultiTenancySides.Host + ); + apiScopeManagment.AddChild + ( + AbpProPermissions.IdentityServer.ApiScope.Delete, + L("Permission:Delete"), + multiTenancySide: MultiTenancySides.Host + ); - var identityResourcesManagment = identityServerManagementGroup.AddPermission( + var identityResourcesManagment = identityServerManagementGroup.AddPermission + ( AbpProPermissions.IdentityServer.IdentityResources.Default, - L("Permission:IdentityServerManagement:IdentityResources"),multiTenancySide: MultiTenancySides.Host); - identityResourcesManagment.AddChild(AbpProPermissions.IdentityServer.IdentityResources.Create, - L("Permission:Create"),multiTenancySide: MultiTenancySides.Host); - identityResourcesManagment.AddChild(AbpProPermissions.IdentityServer.IdentityResources.Update, - L("Permission:Update"),multiTenancySide: MultiTenancySides.Host); - identityResourcesManagment.AddChild(AbpProPermissions.IdentityServer.IdentityResources.Delete, - L("Permission:Delete"),multiTenancySide: MultiTenancySides.Host); + L("Permission:IdentityServerManagement:IdentityResources"), + multiTenancySide: MultiTenancySides.Host + ); + identityResourcesManagment.AddChild + ( + AbpProPermissions.IdentityServer.IdentityResources.Create, + L("Permission:Create"), + multiTenancySide: MultiTenancySides.Host + ); + identityResourcesManagment.AddChild + ( + AbpProPermissions.IdentityServer.IdentityResources.Update, + L("Permission:Update"), + multiTenancySide: MultiTenancySides.Host + ); + identityResourcesManagment.AddChild + ( + AbpProPermissions.IdentityServer.IdentityResources.Delete, + L("Permission:Delete"), + multiTenancySide: MultiTenancySides.Host + ); #endregion } diff --git a/aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissions.cs b/aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissions.cs index 7ef55704..2c873c8a 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissions.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Application.Contracts/Permissions/AbpProPermissions.cs @@ -15,6 +15,14 @@ namespace Lion.AbpPro.Permissions public const string AuditLog = Default + ".AuditLog"; public const string ES = Default + ".ES"; public const string Setting = Default + ".Setting"; + public const string OrganizationUnit = Default + ".OrganizationUnitManagement"; + public static class OrganizationUnitManagement + { + public const string Default = SystemManagement.Default + ".OrganizationUnitManagement"; + public const string Create = Default + ".Create"; + public const string Update = Default + ".Update"; + public const string Delete = Default + ".Delete"; + } } diff --git a/aspnet-core/services/src/Lion.AbpPro.Application/ElasticSearchs/LionAbpProLogAppService.cs b/aspnet-core/services/src/Lion.AbpPro.Application/ElasticSearchs/LionAbpProLogAppService.cs index 8d143f51..08b44e16 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Application/ElasticSearchs/LionAbpProLogAppService.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Application/ElasticSearchs/LionAbpProLogAppService.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using Lion.AbpPro.ElasticSearchs.Dto; using Lion.AbpPro.ElasticSearchs.Providers; using Lion.AbpPro.Extension.Customs.Dtos; +using Lion.AbpPro.Extension.System; using Lion.AbpPro.Permissions; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Configuration; @@ -13,11 +14,11 @@ using Nest; namespace Lion.AbpPro.ElasticSearchs { [Authorize(Policy = AbpProPermissions.SystemManagement.ES)] - public class LionAbpProLogAppService : ElasticsearchBasicService, - ILionAbpProLogAppService + public class LionAbpProLogAppService : ElasticsearchBasicService,ILionAbpProLogAppService { private readonly IConfiguration _configuration; - + // 时区 + private const string TimeZone = "Asia/Shanghai"; public LionAbpProLogAppService( IElasticsearchProvider elasticsearchProvider, IConfiguration configuration) : base(elasticsearchProvider) @@ -25,49 +26,54 @@ namespace Lion.AbpPro.ElasticSearchs _configuration = configuration; } - public async Task> PaingAsync( - PagingElasticSearchLogInput input) + public async Task> PaingAsync(PagingElasticSearchLogInput input) { - var IndexName = - _configuration.GetValue("ElasticSearch:SearchIndexFormat"); + var IndexName = _configuration.GetValue("ElasticSearch:SearchIndexFormat"); // 默认查询当天 - input.StartCreationTime = input.StartCreationTime?.AddMilliseconds(-1) ?? - DateTime.Now.Date.AddMilliseconds(-1); - input.EndCreationTime = - input.EndCreationTime?.AddDays(1).AddMilliseconds(-1) ?? - DateTime.Now.Date.AddDays(1).AddMilliseconds(-1); - var mustFilters = - new List, - QueryContainer>> - { - t => t.DateRange(f => - f.Field(fd => fd.CreationTime).TimeZone("Asia/Shanghai") - .GreaterThanOrEquals(input.StartCreationTime.Value)), - t => t.DateRange( - f => f.Field(fd => fd.CreationTime).TimeZone("Asia/Shanghai") - .LessThanOrEquals(input.EndCreationTime.Value)) - }; + input.StartCreationTime = input.StartCreationTime?.AddMilliseconds(-1) ??DateTime.Now.Date.AddMilliseconds(-1); + input.EndCreationTime =input.EndCreationTime?.AddDays(1).AddMilliseconds(-1) ??DateTime.Now.Date.AddDays(1).AddMilliseconds(-1); + var mustFilters = new List, QueryContainer>>(); + if (input.StartCreationTime.HasValue) + { + input.StartCreationTime = input.StartCreationTime.ToCurrentDateMaxDateTime(); + mustFilters.Add(e => e.DateRange(f => f.Field(fd => fd.CreationTime).TimeZone(TimeZone).GreaterThanOrEquals(input.StartCreationTime))); + } + + if (input.EndCreationTime.HasValue) + { + input.EndCreationTime = input.EndCreationTime.ToNextSecondDateTime(); + mustFilters.Add(e => e.DateRange(f => f.Field(fd => fd.CreationTime).TimeZone(TimeZone).LessThanOrEquals(input.EndCreationTime))); + } if (!string.IsNullOrWhiteSpace(input.Filter)) { - mustFilters.Add(t => - t.MatchPhrase(f => f.Field(fd => fd.Message).Query(input.Filter.Trim()))); + mustFilters.Add + ( + t =>t.MatchPhrase(f => f.Field(fd => fd.Message).Query(input.Filter.Trim())) + ); } - var result = await Client.SearchAsync(e => e - .Index(IndexName) - .From(input.SkipCount) - .Size(input.PageSize) - .Sort(s => s.Descending(sd => sd.CreationTime)) - .Query(q => q.Bool(qb => qb.Filter(mustFilters)))); + var result = await Client.SearchAsync + ( + e => e + .Index(IndexName) + .From(input.SkipCount) + .Size(input.PageSize) + .Sort(s => s.Descending(sd => sd.CreationTime)) + .Query(q => q.Bool(qb => qb.Filter(mustFilters))) + ); if (result.HitsMetadata != null) { - return new CustomePagedResultDto( + return new CustomePagedResultDto + ( result.HitsMetadata.Total.Value, ObjectMapper - .Map, List>( - result.Documents.ToList())); + .Map, List> + ( + result.Documents.ToList() + ) + ); } return null; diff --git a/aspnet-core/services/src/Lion.AbpPro.Application/OrganizationUnits/OrganizationUnitAppService.cs b/aspnet-core/services/src/Lion.AbpPro.Application/OrganizationUnits/OrganizationUnitAppService.cs index f19ae7c8..56f4bc33 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Application/OrganizationUnits/OrganizationUnitAppService.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Application/OrganizationUnits/OrganizationUnitAppService.cs @@ -3,14 +3,16 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Lion.AbpPro.Extension.Customs.Dtos; -using Lion.AbpPro.IdentityServers.ApiResources.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; @@ -34,6 +36,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp return ConvertToTree(organizationUnitDtos); } + [Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Create)] public async Task CreateAsync(CreateOrganizationUnitInput input) { var entity = new OrganizationUnit @@ -46,11 +49,13 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp 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); @@ -61,6 +66,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp } } + [Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Create)] public async Task AddRoleToOrganizationUnitAsync(AddRoleToOrganizationUnitInput input) { foreach (var roleId in input.RoleId) @@ -69,11 +75,13 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp } } + [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) @@ -82,6 +90,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp } } + [Authorize(AbpProPermissions.SystemManagement.OrganizationUnitManagement.Delete)] public async Task RemoveUserFromOrganizationUnitAsync(RemoveUserToOrganizationUnitInput input) { await _identityUserManager.RemoveFromOrganizationUnitAsync(input.UserId, input.OrganizationUnitId); @@ -91,7 +100,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp { var listResult = new List(); var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId); - if (organizationUnit == null) throw new UserFriendlyException("组织机构不存在"); + if (organizationUnit == null) throw new BusinessException(AbpProDomainErrorCodes.OrganizationUnitNotExist); var count = await _organizationUnitRepository.GetMembersCountAsync(organizationUnit, filter: input.Filter); if (count > 0) @@ -113,7 +122,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp { var listResult = new List(); var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId); - if (organizationUnit == null) throw new UserFriendlyException("组织机构不存在"); + if (organizationUnit == null) throw new BusinessException(AbpProDomainErrorCodes.OrganizationUnitNotExist); var count = await _organizationUnitRepository.GetUnaddedUsersCountAsync(organizationUnit, input.Filter); if (count > 0) { @@ -134,7 +143,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp { var listResult = new List(); var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId); - if (organizationUnit == null) throw new UserFriendlyException("组织机构不存在"); + if (organizationUnit == null) throw new BusinessException(AbpProDomainErrorCodes.OrganizationUnitNotExist); var count = await _organizationUnitRepository.GetRolesCountAsync(organizationUnit); if (count > 0) @@ -150,7 +159,7 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp { var listResult = new List(); var organizationUnit = await _organizationUnitRepository.FindAsync(input.OrganizationUnitId); - if (organizationUnit == null) throw new UserFriendlyException("组织机构不存在"); + if (organizationUnit == null) throw new BusinessException(AbpProDomainErrorCodes.OrganizationUnitNotExist); var count = await _organizationUnitRepository.GetUnaddedRolesCountAsync(organizationUnit, input.Filter); if (count > 0) { @@ -169,7 +178,8 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp #region 私有方法 - private List ConvertToTree(List list, + private List ConvertToTree( + List list, Guid? Id = null) { var result = new List(); @@ -188,7 +198,8 @@ public class OrganizationUnitAppService : AbpProAppService, IOrganizationUnitApp return result; } - private List Children(List list, + private List Children( + List list, Guid? Id) { var childList = list.Where(x => x.ParentId == Id).ToList(); diff --git a/aspnet-core/services/src/Lion.AbpPro.Application/Users/AccountAppService.cs b/aspnet-core/services/src/Lion.AbpPro.Application/Users/AccountAppService.cs index 004121d5..d7c448aa 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Application/Users/AccountAppService.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Application/Users/AccountAppService.cs @@ -10,10 +10,12 @@ using Lion.AbpPro.ConfigurationOptions; using Lion.AbpPro.Users.Dtos; using IdentityModel; using Lion.AbpPro.Extension.Customs.Http; +using Lion.AbpPro.NotificationManagement.Notifications; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; using Volo.Abp; +using Volo.Abp.Authorization; using Volo.Abp.Identity; using Volo.Abp.Security.Claims; @@ -28,7 +30,7 @@ namespace Lion.AbpPro.Users private readonly IHttpClientFactory _httpClientFactory; private readonly IConfiguration _configuretion; private readonly Volo.Abp.Domain.Repositories.IRepository _identityRoleRepository; - + public AccountAppService( IdentityUserManager userManager, IOptionsSnapshot jwtOptions, @@ -51,12 +53,12 @@ namespace Lion.AbpPro.Users var result = await _signInManager.PasswordSignInAsync(input.Name, input.Password, false, true); if (result.IsNotAllowed) { - throw new UserFriendlyException("当前用户已锁定"); + throw new BusinessException(AbpProDomainErrorCodes.UserLockedOut); } if (!result.Succeeded) { - throw new UserFriendlyException("用户名或者密码错误"); + throw new BusinessException(AbpProDomainErrorCodes.UserOrPasswordMismatch); } var user = await _userManager.FindByNameAsync(input.Name); @@ -76,7 +78,7 @@ namespace Lion.AbpPro.Users var user = await _userManager.FindByNameAsync(response.name); if (!user.IsActive) { - throw new UserFriendlyException("当前用户已锁定"); + throw new BusinessException(AbpProDomainErrorCodes.UserLockedOut); } return await BuildResult(user); @@ -115,7 +117,7 @@ namespace Lion.AbpPro.Users { var result = new LoginOutput(); var roles = await _identityRoleRepository.GetListAsync(e => e.IsDefault); - if (roles == null || roles.Count == 0) throw new UserFriendlyException("系统未配置默认角色"); + if (roles == null || roles.Count == 0) throw new AbpAuthorizationException(); var userId = GuidGenerator.Create(); var user = new IdentityUser(userId, userName, email) @@ -138,9 +140,9 @@ namespace Lion.AbpPro.Users private async Task BuildResult(IdentityUser user) { - if (!user.IsActive) throw new UserFriendlyException("当前用户已被锁定"); + if (!user.IsActive) throw new BusinessException(AbpProDomainErrorCodes.UserLockedOut); var roles = await _userManager.GetRolesAsync(user); - if (roles == null || roles.Count == 0) throw new UserFriendlyException("当前用户未分配角色"); + if (roles == null || roles.Count == 0) throw new AbpAuthorizationException(); var token = GenerateJwt(user.Id, user.UserName, user.Name, user.Email, user.TenantId.ToString(), roles.ToList()); var loginOutput = ObjectMapper.Map(user); diff --git a/aspnet-core/services/src/Lion.AbpPro.Application/Users/UserAppService.cs b/aspnet-core/services/src/Lion.AbpPro.Application/Users/UserAppService.cs index 3125eb4f..bcee144c 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Application/Users/UserAppService.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Application/Users/UserAppService.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Threading.Tasks; using Lion.AbpPro.Users.Dtos; using Lion.AbpPro.Extension.Customs.Dtos; +using Lion.AbpPro.NotificationManagement.Notifications; using Lion.AbpPro.Permissions; using Magicodes.ExporterAndImporter.Excel; using Magicodes.ExporterAndImporter.Excel.AspNetCore; @@ -27,13 +28,13 @@ namespace Lion.AbpPro.Users private readonly IIdentityUserRepository _identityUserRepository; private readonly IExcelExporter _excelExporter; private readonly IOptions _options; - public UserAppService( IIdentityUserAppService identityUserAppService, IdentityUserManager userManager, IIdentityUserRepository userRepository, IExcelExporter excelExporter, - IOptions options) + IOptions options, + NotificationManager notificationManager) { _identityUserAppService = identityUserAppService; _userManager = userManager; diff --git a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/DbMigratorHostedService.cs b/aspnet-core/services/src/Lion.AbpPro.DbMigrator/DbMigratorHostedService.cs index 3f12abb3..689ff0e0 100644 --- a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/DbMigratorHostedService.cs +++ b/aspnet-core/services/src/Lion.AbpPro.DbMigrator/DbMigratorHostedService.cs @@ -1,3 +1,4 @@ +using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -12,24 +13,23 @@ namespace Lion.AbpPro.DbMigrator public class DbMigratorHostedService : IHostedService { private readonly IHostApplicationLifetime _hostApplicationLifetime; - private readonly IConfigurationRoot _configurationRoot; + private readonly IConfiguration _configuration; public DbMigratorHostedService(IHostApplicationLifetime hostApplicationLifetime, - IConfigurationRoot configurationRoot) + IConfiguration configuration) { _hostApplicationLifetime = hostApplicationLifetime; - _configurationRoot = configurationRoot; + _configuration = configuration; } public async Task StartAsync(CancellationToken cancellationToken) { using (var application = await AbpApplicationFactory.CreateAsync(options => { + options.Services.ReplaceConfiguration(_configuration); options.UseAutofac(); options.Services.AddLogging(c => c.AddSerilog()); })) { - - var s = _configurationRoot.GetValue("ConnectionStrings:Default"); await application.InitializeAsync(); await application diff --git a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/Lion.AbpPro.DbMigrator.csproj b/aspnet-core/services/src/Lion.AbpPro.DbMigrator/Lion.AbpPro.DbMigrator.csproj index de86759a..2d02cec6 100644 --- a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/Lion.AbpPro.DbMigrator.csproj +++ b/aspnet-core/services/src/Lion.AbpPro.DbMigrator/Lion.AbpPro.DbMigrator.csproj @@ -7,22 +7,6 @@ net6.0 - - - - - - - - PreserveNewest - Always - - - PreserveNewest - Always - - - @@ -42,6 +26,9 @@ + + Always + diff --git a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/Program.cs b/aspnet-core/services/src/Lion.AbpPro.DbMigrator/Program.cs index 85dd454f..d150c21b 100644 --- a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/Program.cs +++ b/aspnet-core/services/src/Lion.AbpPro.DbMigrator/Program.cs @@ -34,21 +34,8 @@ namespace Lion.AbpPro.DbMigrator public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging((context, logging) => logging.ClearProviders()) - .ConfigureAppConfiguration(otpions => - { - var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); - Console.WriteLine($"ASPNETCORE_ENVIRONMENT:{environment}"); - var appSettingFileName = "appsettings.json"; - if (!environment.IsNullOrWhiteSpace()) - appSettingFileName = $"appsettings.{environment}.json"; - Console.WriteLine($"appSettingFileName:{appSettingFileName}"); - otpions.AddJsonFile(appSettingFileName,optional:false); - }) .ConfigureServices((hostContext, services) => { - var s = hostContext.HostingEnvironment; - var _configurationRoot= services.GetRequiredService(); - var ss = _configurationRoot.GetValue("ConnectionStrings:Default"); services.AddHostedService(); }); } diff --git a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Production.json b/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Production.json deleted file mode 100644 index 11f3bb83..00000000 --- a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Production.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ConnectionStrings": { - "Default": "Data Source=localhost;Database=LionAbpProDB123123;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" - } -} \ No newline at end of file diff --git a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Staging.json b/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Staging.json deleted file mode 100644 index 53365434..00000000 --- a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Staging.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ConnectionStrings": { - "Default": "Data Source=localhost;Database=LionAbpProDB123123Staging;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" - } -} \ No newline at end of file diff --git a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.json b/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.json new file mode 100644 index 00000000..e711c4f8 --- /dev/null +++ b/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.json @@ -0,0 +1,5 @@ +{ + "ConnectionStrings": { + "Default": "Data Source=localhost;Port=3306;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" + } +} \ No newline at end of file diff --git a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings1.json b/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings1.json deleted file mode 100644 index 738a223d..00000000 --- a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings1.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ConnectionStrings": { - "Default": "Data Source=localhost;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" - } -} \ No newline at end of file diff --git a/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainErrorCodes.cs b/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainErrorCodes.cs index 0cbc67aa..4c1890f9 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainErrorCodes.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainErrorCodes.cs @@ -2,6 +2,16 @@ namespace Lion.AbpPro { public static class AbpProDomainErrorCodes { - /* You can add your business exception error codes here, as constants */ + public const string OrganizationUnitNotExist =AbpProDomainSharedConsts.NameSpace+ ":100001"; + public const string UserLockedOut =AbpProDomainSharedConsts.NameSpace+ ":100002"; + public const string UserOrPasswordMismatch =AbpProDomainSharedConsts.NameSpace+ ":100003"; + public const string ApiResourceNotExist =AbpProDomainSharedConsts.NameSpace+ ":100004"; + public const string ApiResourceExist =AbpProDomainSharedConsts.NameSpace+ ":100005"; + public const string ApiScopeNotExist =AbpProDomainSharedConsts.NameSpace+ ":100006"; + public const string ApiScopeExist =AbpProDomainSharedConsts.NameSpace+ ":100007"; + public const string ApiClientNotExist =AbpProDomainSharedConsts.NameSpace+ ":100008"; + public const string ApiClientExist =AbpProDomainSharedConsts.NameSpace+ ":100009"; + public const string IdentityResourceNotExist =AbpProDomainSharedConsts.NameSpace+ ":100010"; + public const string IdentityResourceExist =AbpProDomainSharedConsts.NameSpace+ ":100011"; } } diff --git a/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedConsts.cs b/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedConsts.cs new file mode 100644 index 00000000..7d139a66 --- /dev/null +++ b/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedConsts.cs @@ -0,0 +1,9 @@ +namespace Lion.AbpPro; + +public class AbpProDomainSharedConsts +{ + /// 名称空间 + public const string NameSpace = "Lion.AbpPro"; + /// 默认语言 + public const string DefaultCultureName = "zh-Hans"; +} \ No newline at end of file diff --git a/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedModule.cs b/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedModule.cs index 42ae4d33..be744054 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedModule.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/AbpProDomainSharedModule.cs @@ -51,13 +51,13 @@ namespace Lion.AbpPro { Configure(options => { - options.FileSets.AddEmbedded("Lion.AbpPro"); + options.FileSets.AddEmbedded(AbpProDomainSharedConsts.NameSpace); }); Configure(options => { options.Resources - .Add("zh-Hans") + .Add(AbpProDomainSharedConsts.DefaultCultureName) .AddVirtualJson("/Localization/AbpPro") .AddBaseTypes(typeof(IdentityResource)) .AddBaseTypes(typeof(AbpValidationResource)) @@ -70,7 +70,7 @@ namespace Lion.AbpPro Configure(options => { - options.MapCodeNamespace("AbpPro", typeof(AbpProResource)); + options.MapCodeNamespace(AbpProDomainSharedConsts.NameSpace, typeof(AbpProResource)); }); } diff --git a/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/en.json b/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/en.json index 4805147c..0adde08d 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/en.json +++ b/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/en.json @@ -17,6 +17,7 @@ "Permission:CapManagement": "IntegratedEvent", "Permission:ESManagement": "ESManagement", "Permission:SettingManagement": "SettingManagement", + "Permission:OrganizationUnitManagement": "OrganizationUnitManagement", "Permission:IdentityServerManagement": "IdentityServer", "Permission:IdentityServerManagement:Client": "Client", "Permission:IdentityServerManagement:ApiResource": "ApiResource", @@ -28,6 +29,19 @@ "Description:Setting.Group.Other.Github": "Github", "Enum:TestType:Created:1":"Created", "Enum:TestType:Cancel:1":"Cancel", - "Enum:TestType:Delete:1":"Delete" + "Enum:TestType:Delete:1":"Delete", + + "Lion.AbpPro:100001": "OrganizationUnit Not Exist", + "Lion.AbpPro:100002": "UserLockedOut", + "Lion.AbpPro:100003": "UserOrPasswordMismatch", + "Lion.AbpPro:100004": "ApiResource Not Exist", + "Lion.AbpPro:100005": "ApiResource Exist", + "Lion.AbpPro:100006": "ApiScope Not Exist", + "Lion.AbpPro:100007": "ApiScope Exist", + "Lion.AbpPro:100008": "ApiClient Not Exist", + "Lion.AbpPro:100009": "ApiClient Exist", + "Lion.AbpPro:100010": "IdentityResource Not Exist", + "Lion.AbpPro:100011": "IdentityResource Exist" + } } diff --git a/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/zh-Hans.json b/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/zh-Hans.json index cf7cc496..86321fcd 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/zh-Hans.json +++ b/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpPro/zh-Hans.json @@ -17,6 +17,7 @@ "Permission:CapManagement": "集成事件", "Permission:ESManagement": "ES日志", "Permission:SettingManagement": "设置管理", + "Permission:OrganizationUnitManagement": "组织结构管理", "Permission:IdentityServerManagement": "IdentityServer", "Permission:IdentityServerManagement:Client": "客户端", "Permission:IdentityServerManagement:ApiResource": "Api资源", @@ -28,6 +29,18 @@ "Description:Setting.Group.Other.Github": "Github", "Enum:TestType:Created:1":"创建", "Enum:TestType:Cancel:1":"取消", - "Enum:TestType:Delete:1":"删除" + "Enum:TestType:Delete:1":"删除", + + "Lion.AbpPro:100001": "组织机构不存在", + "Lion.AbpPro:100002": "用户被锁定", + "Lion.AbpPro:100003": "用户名或者密码错误", + "Lion.AbpPro:100004": "ApiResource不存在", + "Lion.AbpPro:100005": "ApiResource 已存在", + "Lion.AbpPro:100006": "ApiScope 不存在", + "Lion.AbpPro:100007": "ApiScope 已存在", + "Lion.AbpPro:100008": "ApiClient 不存在", + "Lion.AbpPro:100009": "ApiClient 已存在", + "Lion.AbpPro:100010": "IdentityResource 不存在", + "Lion.AbpPro:100011": "IdentityResource 已存在" } } \ No newline at end of file diff --git a/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpProResource.cs b/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpProResource.cs index 5b29cf44..3f420a8b 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpProResource.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Domain.Shared/Localization/AbpProResource.cs @@ -1,6 +1,6 @@ using Volo.Abp.Localization; -namespace Lion.AbpPro.Localization +namespace Lion.AbpPro { [LocalizationResourceName("AbpPro")] public class AbpProResource diff --git a/aspnet-core/services/src/Lion.AbpPro.Domain/Data/AbpProDbMigrationService.cs b/aspnet-core/services/src/Lion.AbpPro.Domain/Data/AbpProDbMigrationService.cs index b843baaa..41ce37ff 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Domain/Data/AbpProDbMigrationService.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Domain/Data/AbpProDbMigrationService.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -13,207 +13,208 @@ using Volo.Abp.Identity; using Volo.Abp.MultiTenancy; using Volo.Abp.TenantManagement; -namespace Lion.AbpPro.Data; - -public class AbpProDbMigrationService : ITransientDependency +namespace Lion.AbpPro.Data { - public ILogger Logger { get; set; } - - private readonly IDataSeeder _dataSeeder; - private readonly IEnumerable _dbSchemaMigrators; - private readonly ITenantRepository _tenantRepository; - private readonly ICurrentTenant _currentTenant; - - public AbpProDbMigrationService( - IDataSeeder dataSeeder, - IEnumerable dbSchemaMigrators, - ITenantRepository tenantRepository, - ICurrentTenant currentTenant) + public class AbpProDbMigrationService : ITransientDependency { - _dataSeeder = dataSeeder; - _dbSchemaMigrators = dbSchemaMigrators; - _tenantRepository = tenantRepository; - _currentTenant = currentTenant; - - Logger = NullLogger.Instance; - } + public ILogger Logger { get; set; } + + private readonly IDataSeeder _dataSeeder; + private readonly IEnumerable _dbSchemaMigrators; + private readonly ITenantRepository _tenantRepository; + private readonly ICurrentTenant _currentTenant; + + public AbpProDbMigrationService( + IDataSeeder dataSeeder, + IEnumerable dbSchemaMigrators, + ITenantRepository tenantRepository, + ICurrentTenant currentTenant) + { + _dataSeeder = dataSeeder; + _dbSchemaMigrators = dbSchemaMigrators; + _tenantRepository = tenantRepository; + _currentTenant = currentTenant; - public async Task MigrateAsync() - { - var initialMigrationAdded = AddInitialMigrationIfNotExist(); + Logger = NullLogger.Instance; + } - if (initialMigrationAdded) + public async Task MigrateAsync() { - return; - } + var initialMigrationAdded = AddInitialMigrationIfNotExist(); - Logger.LogInformation("Started database migrations..."); + if (initialMigrationAdded) + { + return; + } - await MigrateDatabaseSchemaAsync(); - await SeedDataAsync(); + Logger.LogInformation("Started database migrations..."); - Logger.LogInformation($"Successfully completed host database migrations."); + await MigrateDatabaseSchemaAsync(); + await SeedDataAsync(); - var tenants = await _tenantRepository.GetListAsync(includeDetails: true); + Logger.LogInformation($"Successfully completed host database migrations."); - var migratedDatabaseSchemas = new HashSet(); - foreach (var tenant in tenants) - { - using (_currentTenant.Change(tenant.Id)) + var tenants = await _tenantRepository.GetListAsync(includeDetails: true); + + var migratedDatabaseSchemas = new HashSet(); + foreach (var tenant in tenants) { - if (tenant.ConnectionStrings.Any()) + using (_currentTenant.Change(tenant.Id)) { - var tenantConnectionStrings = tenant.ConnectionStrings - .Select(x => x.Value) - .ToList(); - - if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings)) + if (tenant.ConnectionStrings.Any()) { - await MigrateDatabaseSchemaAsync(tenant); + var tenantConnectionStrings = tenant.ConnectionStrings + .Select(x => x.Value) + .ToList(); + + if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings)) + { + await MigrateDatabaseSchemaAsync(tenant); - migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings); + migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings); + } } + + await SeedDataAsync(tenant); } - await SeedDataAsync(tenant); + Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations."); } - Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations."); + Logger.LogInformation("Successfully completed all database migrations."); + Logger.LogInformation("You can safely end this process..."); } - Logger.LogInformation("Successfully completed all database migrations."); - Logger.LogInformation("You can safely end this process..."); - } - - private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null) - { - Logger.LogInformation( - $"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); - - foreach (var migrator in _dbSchemaMigrators) + private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null) { - await migrator.MigrateAsync(); + Logger.LogInformation( + $"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); + + foreach (var migrator in _dbSchemaMigrators) + { + await migrator.MigrateAsync(); + } } - } - private async Task SeedDataAsync(Tenant tenant = null) - { - Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); + private async Task SeedDataAsync(Tenant tenant = null) + { + Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); - await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id) - .WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue) - .WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue) - ); - } + await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id) + .WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue) + .WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue) + ); + } - private bool AddInitialMigrationIfNotExist() - { - try + private bool AddInitialMigrationIfNotExist() { - if (!DbMigrationsProjectExists()) + try + { + if (!DbMigrationsProjectExists()) + { + return false; + } + } + catch (Exception) { return false; } - } - catch (Exception) - { - return false; - } - try - { - if (!MigrationsFolderExists()) + try { - AddInitialMigration(); - return true; + if (!MigrationsFolderExists()) + { + AddInitialMigration(); + return true; + } + else + { + return false; + } } - else + catch (Exception e) { + Logger.LogWarning("Couldn't determinate if any migrations exist : " + e.Message); return false; } } - catch (Exception e) - { - Logger.LogWarning("Couldn't determinate if any migrations exist : " + e.Message); - return false; - } - } - private bool DbMigrationsProjectExists() - { - var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); + private bool DbMigrationsProjectExists() + { + var dbMigrationsProjectFolder = GetDbMigrationsProjectFolderPath(); - return dbMigrationsProjectFolder != null; - } + return dbMigrationsProjectFolder != null; + } - private bool MigrationsFolderExists() - { - var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); + private bool MigrationsFolderExists() + { + var dbMigrationsProjectFolder = GetDbMigrationsProjectFolderPath(); - return Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "Migrations")); - } + return Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "EntityFrameworkCore")); + } - private void AddInitialMigration() - { - Logger.LogInformation("Creating initial migration..."); + private void AddInitialMigration() + { + Logger.LogInformation("Creating initial migration..."); - string argumentPrefix; - string fileName; + string argumentPrefix; + string fileName; - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - argumentPrefix = "-c"; - fileName = "/bin/bash"; - } - else - { - argumentPrefix = "/C"; - fileName = "cmd.exe"; - } + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + argumentPrefix = "-c"; + fileName = "/bin/bash"; + } + else + { + argumentPrefix = "/C"; + fileName = "cmd.exe"; + } - var procStartInfo = new ProcessStartInfo(fileName, - $"{argumentPrefix} \"abp create-migration-and-run-migrator \"{GetEntityFrameworkCoreProjectFolderPath()}\"\"" - ); + var procStartInfo = new ProcessStartInfo(fileName, + $"{argumentPrefix} \"abp create-migration-and-run-migrator \"{GetDbMigrationsProjectFolderPath()}\"\"" + ); - try - { - Process.Start(procStartInfo); - } - catch (Exception) - { - throw new Exception("Couldn't run ABP CLI..."); + try + { + Process.Start(procStartInfo); + } + catch (Exception) + { + throw new Exception("Couldn't run ABP CLI..."); + } } - } - private string GetEntityFrameworkCoreProjectFolderPath() - { - var slnDirectoryPath = GetSolutionDirectoryPath(); - - if (slnDirectoryPath == null) + private string GetDbMigrationsProjectFolderPath() { - throw new Exception("Solution folder not found!"); - } + var slnDirectoryPath = GetSolutionDirectoryPath(); - var srcDirectoryPath = Path.Combine(slnDirectoryPath, "src"); + if (slnDirectoryPath == null) + { + throw new Exception("Solution folder not found!"); + } - return Directory.GetDirectories(srcDirectoryPath) - .FirstOrDefault(d => d.EndsWith(".EntityFrameworkCore")); - } + var srcDirectoryPath = Path.Combine(slnDirectoryPath, "src"); - private string GetSolutionDirectoryPath() - { - var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); + return Directory.GetDirectories(srcDirectoryPath) + .FirstOrDefault(d => d.EndsWith(".DbMigrations")); + } - while (Directory.GetParent(currentDirectory.FullName) != null) + private string GetSolutionDirectoryPath() { - currentDirectory = Directory.GetParent(currentDirectory.FullName); + var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); - if (Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) + while (Directory.GetParent(currentDirectory.FullName) != null) { - return currentDirectory.FullName; + currentDirectory = Directory.GetParent(currentDirectory.FullName); + + if (Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) + { + return currentDirectory.FullName; + } } - } - return null; + return null; + } } } diff --git a/aspnet-core/services/src/Lion.AbpPro.Domain/Data/IAbpProDbSchemaMigrator.cs b/aspnet-core/services/src/Lion.AbpPro.Domain/Data/IAbpProDbSchemaMigrator.cs index 3232bf1c..597ec597 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Domain/Data/IAbpProDbSchemaMigrator.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Domain/Data/IAbpProDbSchemaMigrator.cs @@ -1,8 +1,9 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; -namespace Lion.AbpPro.Data; - -public interface IAbpProDbSchemaMigrator +namespace Lion.AbpPro.Data { - Task MigrateAsync(); + public interface IAbpProDbSchemaMigrator + { + Task MigrateAsync(); + } } diff --git a/aspnet-core/services/src/Lion.AbpPro.Domain/Data/NullAbpProDbSchemaMigrator.cs b/aspnet-core/services/src/Lion.AbpPro.Domain/Data/NullAbpProDbSchemaMigrator.cs index 13ef91b9..41e46a79 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Domain/Data/NullAbpProDbSchemaMigrator.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Domain/Data/NullAbpProDbSchemaMigrator.cs @@ -1,15 +1,16 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Volo.Abp.DependencyInjection; -namespace Lion.AbpPro.Data; - -/* This is used if database provider does't define - * IAbpProDbSchemaMigrator implementation. - */ -public class NullAbpProDbSchemaMigrator : IAbpProDbSchemaMigrator, ITransientDependency +namespace Lion.AbpPro.Data { - public Task MigrateAsync() + /* This is used if database provider does't define + * IAbpProDbSchemaMigrator implementation. + */ + public class NullAbpProDbSchemaMigrator : IAbpProDbSchemaMigrator, ITransientDependency { - return Task.CompletedTask; + public Task MigrateAsync() + { + return Task.CompletedTask; + } } -} +} \ No newline at end of file diff --git a/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiResourceManager.cs b/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiResourceManager.cs index a0f3609c..04a548ed 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiResourceManager.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiResourceManager.cs @@ -26,17 +26,26 @@ namespace Lion.AbpPro.IdentityServer bool includeDetails = false, CancellationToken cancellationToken = default) { - return _apiResourceRepository.GetListAsync("CreationTime desc", skipCount, - maxResultCount, filter, + return _apiResourceRepository.GetListAsync + ( + "CreationTime desc", + skipCount, + maxResultCount, + filter, includeDetails, - cancellationToken); + cancellationToken + ); } - public Task GetCountAsync(string filter = null, + public Task GetCountAsync( + string filter = null, CancellationToken cancellationToken = default) { - return _apiResourceRepository.GetCountAsync(filter, - cancellationToken); + return _apiResourceRepository.GetCountAsync + ( + filter, + cancellationToken + ); } /// @@ -65,10 +74,16 @@ namespace Lion.AbpPro.IdentityServer await _apiResourceRepository.FindByNameAsync(name.Trim(), false, cancellationToken); if (null != apiResource) { - throw new UserFriendlyException(message: "ApiResource已存在"); + throw new BusinessException(AbpProDomainErrorCodes.ApiResourceExist); } - apiResource = new ApiResource(id, name, displayName, description) + apiResource = new ApiResource + ( + id, + name, + displayName, + description + ) { AllowedAccessTokenSigningAlgorithms = allowedAccessTokenSigningAlgorithms, ShowInDiscoveryDocument = showInDiscoveryDocument, @@ -83,8 +98,11 @@ namespace Lion.AbpPro.IdentityServer // // properties?.Distinct().ToList().ForEach(item => { apiResource.AddProperty(item.Key, item.Value); }); - return await _apiResourceRepository.InsertAsync(apiResource, - cancellationToken: cancellationToken); + return await _apiResourceRepository.InsertAsync + ( + apiResource, + cancellationToken: cancellationToken + ); } public async Task DeleteAsync( @@ -104,14 +122,13 @@ namespace Lion.AbpPro.IdentityServer bool showInDiscoveryDocument, string secret, List scopes, - CancellationToken cancellationToken = default - ) + CancellationToken cancellationToken = default) { var apiResource = await _apiResourceRepository.FindByNameAsync(name.Trim(), true, cancellationToken); if (null == apiResource) { - throw new UserFriendlyException(message: "ApiResource不存在"); + throw new BusinessException(AbpProDomainErrorCodes.ApiResourceNotExist); } apiResource.DisplayName = displayName; @@ -148,8 +165,11 @@ namespace Lion.AbpPro.IdentityServer } - return await _apiResourceRepository.UpdateAsync(apiResource, - cancellationToken: cancellationToken); + return await _apiResourceRepository.UpdateAsync + ( + apiResource, + cancellationToken: cancellationToken + ); } } } \ No newline at end of file diff --git a/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiScopeManager.cs b/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiScopeManager.cs index 37c77b36..082c2712 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiScopeManager.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerApiScopeManager.cs @@ -23,16 +23,19 @@ namespace Lion.AbpPro.IdentityServer bool includeDetails = false, CancellationToken cancellationToken = default) { - return _apiScopeRepository.GetListAsync( + return _apiScopeRepository.GetListAsync + ( "CreationTime desc", skipCount, maxResultCount, filter, includeDetails, - cancellationToken); + cancellationToken + ); } - public Task GetCountAsync(string filter = null, + public Task GetCountAsync( + string filter = null, CancellationToken cancellationToken = default) { return _apiScopeRepository.GetCountAsync(filter, cancellationToken); @@ -48,11 +51,19 @@ namespace Lion.AbpPro.IdentityServer bool showInDiscoveryDocument) { var apiScopes = await _apiScopeRepository.GetListByNameAsync(new[] { name }, false); - if (apiScopes.Count > 0) throw new UserFriendlyException(message: $"{name}已存在"); + if (apiScopes.Count > 0) throw new BusinessException(AbpProDomainErrorCodes.ApiScopeExist); - var scope = new ApiScope(GuidGenerator.Create(), name, displayName, description, - required, emphasize, - showInDiscoveryDocument, enabled); + var scope = new ApiScope + ( + GuidGenerator.Create(), + name, + displayName, + description, + required, + emphasize, + showInDiscoveryDocument, + enabled + ); return await _apiScopeRepository.InsertAsync(scope); } @@ -67,7 +78,7 @@ namespace Lion.AbpPro.IdentityServer bool showInDiscoveryDocument) { var apiScope = await _apiScopeRepository.FindAsync(id, false); - if (null == apiScope) throw new UserFriendlyException(message: $"{name}不存在"); + if (null == apiScope) throw new BusinessException(AbpProDomainErrorCodes.ApiScopeNotExist); apiScope.DisplayName = displayName; apiScope.Description = description; apiScope.Enabled = enabled; @@ -77,18 +88,25 @@ namespace Lion.AbpPro.IdentityServer return await _apiScopeRepository.UpdateAsync(apiScope); } - public Task DeleteAsync(Guid id, bool autoSave = false, + public Task DeleteAsync( + Guid id, + bool autoSave = false, CancellationToken cancellationToken = default) { return _apiScopeRepository.DeleteAsync(id, autoSave, cancellationToken); } - public async Task> FindAllAsync( - CancellationToken cancellationToken = default) + public async Task> FindAllAsync(CancellationToken cancellationToken = default) { - return await _apiScopeRepository.GetListAsync("CreationTime desc", 0, Int32.MaxValue, - null, false, - cancellationToken); + return await _apiScopeRepository.GetListAsync + ( + "CreationTime desc", + 0, + Int32.MaxValue, + null, + false, + cancellationToken + ); } } } \ No newline at end of file diff --git a/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerClientManager.cs b/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerClientManager.cs index ae0fdc7d..08805b75 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerClientManager.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdenityServerClientManager.cs @@ -50,7 +50,7 @@ namespace Lion.AbpPro.IdentityServer string description, string allowedGrantTypes) { var entity = await _clientRepository.FindByClientIdAsync(clientId); - if (null != entity) throw new UserFriendlyException(message: "当前ClientId已存在"); + if (null != entity) throw new BusinessException(AbpProDomainErrorCodes.ApiClientExist); entity = new Client(GuidGenerator.Create(), clientId) { ClientName = clientName, Description = description, @@ -108,7 +108,7 @@ namespace Lion.AbpPro.IdentityServer var client = await _clientRepository.FindByClientIdAsync(clientId); if (client == null) { - throw new UserFriendlyException(message: $"{clientId}不存在"); + throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist); } client.ClientName = clientName; @@ -180,7 +180,7 @@ namespace Lion.AbpPro.IdentityServer public async Task UpdateScopesAsync(string clientId, List scopes) { var client = await _clientRepository.FindByClientIdAsync(clientId); - if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); + if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist); client.RemoveAllScopes(); foreach (var item in scopes.Distinct()) @@ -201,7 +201,7 @@ namespace Lion.AbpPro.IdentityServer { uri = uri.Trim(); var client = await _clientRepository.FindByClientIdAsync(clientId); - if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); + if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist); if (client.RedirectUris.Any(e => e.RedirectUri == uri.Trim())) { return client; @@ -220,7 +220,7 @@ namespace Lion.AbpPro.IdentityServer { uri = uri.Trim(); var client = await _clientRepository.FindByClientIdAsync(clientId); - if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); + if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist); if (client.RedirectUris.Any(e => e.RedirectUri == uri.Trim())) { client.RemoveRedirectUri(uri); @@ -239,7 +239,7 @@ namespace Lion.AbpPro.IdentityServer { uri = uri.Trim(); var client = await _clientRepository.FindByClientIdAsync(clientId); - if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); + if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist); if (client.PostLogoutRedirectUris.Any(e => e.PostLogoutRedirectUri == uri)) { return client; @@ -256,7 +256,7 @@ namespace Lion.AbpPro.IdentityServer { uri = uri.Trim(); var client = await _clientRepository.FindByClientIdAsync(clientId); - if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); + if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist); if (client.PostLogoutRedirectUris.Any(e => e.PostLogoutRedirectUri == uri)) { client.RemovePostLogoutRedirectUri(uri); @@ -273,7 +273,7 @@ namespace Lion.AbpPro.IdentityServer { origin = origin.Trim(); var client = await _clientRepository.FindByClientIdAsync(clientId); - if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); + if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist); if (client.AllowedCorsOrigins.Any(e => e.Origin == origin)) { return client; @@ -292,7 +292,7 @@ namespace Lion.AbpPro.IdentityServer { origin = origin.Trim(); var client = await _clientRepository.FindByClientIdAsync(clientId); - if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); + if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist); if (client.AllowedCorsOrigins.Any(e => e.Origin == origin)) { client.RemoveCorsOrigin(origin); @@ -305,7 +305,7 @@ namespace Lion.AbpPro.IdentityServer public async Task EnabledAsync(string clientId, bool enabled) { var client = await _clientRepository.FindByClientIdAsync(clientId); - if (client == null) throw new UserFriendlyException(message: $"{clientId}不存在"); + if (client == null) throw new BusinessException(AbpProDomainErrorCodes.ApiClientNotExist); client.Enabled = enabled; return await _clientRepository.UpdateAsync(client); } diff --git a/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdentityResourceManager.cs b/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdentityResourceManager.cs index 3f6fb1fc..6453c284 100644 --- a/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdentityResourceManager.cs +++ b/aspnet-core/services/src/Lion.AbpPro.Domain/IdentityServer/IdentityResourceManager.cs @@ -56,7 +56,7 @@ namespace Lion.AbpPro.IdentityServer bool showInDiscoveryDocument) { var identityResource = await _identityResourceRepository.FindByNameAsync(name, false); - if (null != identityResource) throw new UserFriendlyException(message: $"{name}已存在"); + if (null != identityResource) throw new BusinessException(AbpProDomainErrorCodes.IdentityResourceExist); identityResource = new IdentityResource(GuidGenerator.Create(), name, displayName, description, enabled, required, @@ -74,7 +74,7 @@ namespace Lion.AbpPro.IdentityServer bool showInDiscoveryDocument) { var identityResource = await _identityResourceRepository.FindByNameAsync(name, false); - if (null == identityResource) throw new UserFriendlyException(message: $"{name}不存在"); + if (null == identityResource) throw new BusinessException(AbpProDomainErrorCodes.IdentityResourceNotExist); identityResource.DisplayName = displayName; identityResource.Description = description; identityResource.Enabled = enabled; diff --git a/aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProEntityFrameworkCoreModule.cs b/aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProEntityFrameworkCoreModule.cs index 0088f421..06d05d2f 100644 --- a/aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProEntityFrameworkCoreModule.cs +++ b/aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProEntityFrameworkCoreModule.cs @@ -52,11 +52,12 @@ namespace Lion.AbpPro.EntityFrameworkCore { /* The main point to change your DBMS. * See also AbpProMigrationsDbContextFactory for EF Core tooling. */ + options.UseMySQL(); options.PreConfigure(options => { options.DbContextOptions.UseBatchEF_MySQLPomelo(); }); - options.UseMySQL(); + }); } } diff --git a/aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProMigrationsDbContextFactory.cs b/aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProMigrationsDbContextFactory.cs index ba11db38..c8213b13 100644 --- a/aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProMigrationsDbContextFactory.cs +++ b/aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/AbpProMigrationsDbContextFactory.cs @@ -24,12 +24,6 @@ namespace Lion.AbpPro.EntityFrameworkCore private static IConfigurationRoot BuildConfiguration() { - var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); - var appSettingFileName = "appsettings.json"; - if (!environment.IsNullOrWhiteSpace()) - appSettingFileName = $"appsettings.{environment}.json"; - - var builder = new ConfigurationBuilder() .SetBasePath ( @@ -41,7 +35,7 @@ namespace Lion.AbpPro.EntityFrameworkCore ) .AddJsonFile ( - appSettingFileName, + "appsettings.json", false ); diff --git a/aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreAbpProDbSchemaMigrator.cs b/aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreAbpProDbSchemaMigrator.cs index d3c8f1d8..9cb3547f 100644 --- a/aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreAbpProDbSchemaMigrator.cs +++ b/aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreAbpProDbSchemaMigrator.cs @@ -12,8 +12,7 @@ namespace Lion.AbpPro.EntityFrameworkCore { private readonly IServiceProvider _serviceProvider; - public EntityFrameworkCoreAbpProDbSchemaMigrator( - IServiceProvider serviceProvider) + public EntityFrameworkCoreAbpProDbSchemaMigrator(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } diff --git a/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiResourceManager_Tests.cs b/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiResourceManager_Tests.cs index cca9b243..ae1b8e34 100644 --- a/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiResourceManager_Tests.cs +++ b/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiResourceManager_Tests.cs @@ -61,11 +61,11 @@ namespace Lion.AbpPro.IdentityServer [Fact] public async Task Shuold_CreateAsync_Name_Repetition_Exception() { - (await Should.ThrowAsync(async () => + (await Should.ThrowAsync(async () => { var result = await _idenityServerApiResourceManager.CreateAsync(Guid.NewGuid(), "ApiResource_Test", "单元测试创建", "Xunit", true, "", false, "1q2w3E*"); - })).Message.ShouldBe("ApiResource已存在"); + })).Code.ShouldBe(AbpProDomainErrorCodes.ApiResourceExist); } diff --git a/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiScopeManager_Tests.cs b/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiScopeManager_Tests.cs index 8ef230c3..8e63b289 100644 --- a/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiScopeManager_Tests.cs +++ b/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerApiScopeManager_Tests.cs @@ -59,11 +59,11 @@ namespace Lion.AbpPro.IdentityServer [Fact] public async Task Shuold_CreateAsync_Name_Repetition_Exception() { - (await Should.ThrowAsync(async () => + (await Should.ThrowAsync(async () => { var result = await _idenityServerApiScopeManager.CreateAsync( "ApiScope_Test", "单元测试创建", "Xunit", true, false, false, true); - })).Message.ShouldBe("ApiScope_Test已存在"); + })).Code.ShouldBe(AbpProDomainErrorCodes.ApiScopeExist); } // [Fact] diff --git a/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerClientManager_Tests.cs b/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerClientManager_Tests.cs index 76a3faff..a9f4d341 100644 --- a/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerClientManager_Tests.cs +++ b/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdenityServerClientManager_Tests.cs @@ -60,12 +60,12 @@ namespace Lion.AbpPro.IdentityServer [Fact] public async Task Shuold_CreateAsync_Name_Repetition_Exception() { - (await Should.ThrowAsync(async () => + (await Should.ThrowAsync(async () => { var result = await _idenityServerClientManager.CreateAsync("Test_Client", "XunitName", "desc", "test"); - })).Message.ShouldBe("当前ClientId已存在"); + })).Code.ShouldBe(AbpProDomainErrorCodes.ApiClientExist); } [Fact] diff --git a/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdentityResourceManager_Tests.cs b/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdentityResourceManager_Tests.cs index d929f294..c5c33753 100644 --- a/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdentityResourceManager_Tests.cs +++ b/aspnet-core/services/test/Lion.AbpPro.Domain.Tests/IdentityServer/IdentityResourceManager_Tests.cs @@ -63,13 +63,13 @@ namespace Lion.AbpPro.IdentityServer [Fact] public async Task Shuold_CreateAsync_Name_Repetition_Exception() { - (await Should.ThrowAsync(async () => + (await Should.ThrowAsync(async () => { var result = await _identityResourceManager.CreateAsync("openid", "单元测试", "desc", true, false, false, false); - })).Message.ShouldBe("openid已存在"); + })).Code.ShouldBe(AbpProDomainErrorCodes.IdentityResourceExist); } diff --git a/vben271/src/router/routes/modules/admin.ts b/vben271/src/router/routes/modules/admin.ts index 2948e212..9da424c6 100644 --- a/vben271/src/router/routes/modules/admin.ts +++ b/vben271/src/router/routes/modules/admin.ts @@ -33,6 +33,16 @@ const admin: AppRouteModule = { icon: 'ant-design:lock-outlined', }, }, + { + path: 'organizationUnit', + name: 'organizationUnit', + component: () => import('/@/views/admin/organizationUnits/OrganizationUnit.vue'), + meta: { + title: t('routes.admin.organizationUnitManagement'), + icon: 'ant-design:gold-outlined', + policy: 'System.OrganizationUnitManagement', + }, + }, { path: 'settings', name: 'Settings', @@ -83,16 +93,6 @@ const admin: AppRouteModule = { policy: 'System.FileManagement', }, }, - { - path: 'organizationUnit', - name: 'organizationUnit', - component: () => import('/@/views/admin/organizationUnits/OrganizationUnit.vue'), - meta: { - title: t('routes.admin.organizationUnitManagement'), - icon: 'ant-design:snippets-outlined', - policy: 'System.FileManagement', - }, - }, ], }; diff --git a/vben271/src/services/ServiceProxyBase.ts b/vben271/src/services/ServiceProxyBase.ts index e57b6768..527997e8 100644 --- a/vben271/src/services/ServiceProxyBase.ts +++ b/vben271/src/services/ServiceProxyBase.ts @@ -11,13 +11,12 @@ export class ServiceProxyBase { options.baseURL = import.meta.env.VITE_API_URL as string; const guard: boolean = this.urlGuard(options.url as string); const userStore = useUserStoreWithOut(); - + const { token, language } = this.buildRequestMessage(); if (!guard) { if (userStore.checkUserLoginExpire) { router.replace(PageEnum.BASE_LOGIN); return; } - const { token, language } = this.buildRequestMessage(); // 添加header options.headers = { 'accept-language': language, @@ -29,6 +28,7 @@ export class ServiceProxyBase { options.headers = { 'Content-Type': 'application/json', __tenant: userStore.tenantId, + 'accept-language': language, }; } diff --git a/vben271/src/views/admin/auditLog/AuditLog.ts b/vben271/src/views/admin/auditLog/AuditLog.ts index 7140e7f1..fc747c97 100644 --- a/vben271/src/views/admin/auditLog/AuditLog.ts +++ b/vben271/src/views/admin/auditLog/AuditLog.ts @@ -1,25 +1,26 @@ -import { FormSchema } from '/@/components/Table'; -import { BasicColumn } from '/@/components/Table'; -import { useI18n } from '/@/hooks/web/useI18n'; +import { FormSchema } from "/@/components/Table"; +import { BasicColumn } from "/@/components/Table"; +import { useI18n } from "/@/hooks/web/useI18n"; const { t } = useI18n(); -import moment from 'moment'; -import { AuditLogsServiceProxy, PagingAuditLogListInput } from '/@/services/ServiceProxies'; +import moment from "moment"; +import { AuditLogsServiceProxy, PagingAuditLogListInput } from "/@/services/ServiceProxies"; + export const searchFormSchema: FormSchema[] = [ { - field: 'userName', - label: t('routes.admin.userManagement_userName'), - component: 'Input', - colProps: { span: 8 }, + field: "userName", + label: t("routes.admin.userManagement_userName"), + component: "Input", + colProps: { span: 8 } }, { - field: 'time', - component: 'RangePicker', - label: t('routes.admin.audit_executeTime'), + field: "time", + component: "RangePicker", + label: t("routes.admin.audit_executeTime"), colProps: { - span: 6, - }, - }, + span: 6 + } + } ]; export const tableColumns: BasicColumn[] = [ @@ -29,37 +30,38 @@ export const tableColumns: BasicColumn[] = [ // width: 100, // }, { - title: 'Url', - dataIndex: 'url', + title: "Url", + dataIndex: "url", width: 350, slots: { - customRender: 'url', + customRender: "url" }, - align: 'left', + align: "left" }, { - title: t('routes.admin.userManagement_userName'), - dataIndex: 'userName', - width: 100, + title: t("routes.admin.userManagement_userName"), + dataIndex: "userName", + width: 100 }, { - title: t('routes.admin.executionTime'), - dataIndex: 'executionTime', + title: t("routes.admin.executionTime"), + dataIndex: "executionTime", width: 200, customRender: ({ text }) => { - return moment(text).format('YYYY-MM-DD HH:mm:ss'); - }, + return moment(text).format("YYYY-MM-DD HH:mm:ss"); + } }, { - title: t('routes.admin.executionDuration'), - dataIndex: 'executionDuration', - width: 150, + title: t("routes.admin.executionDuration"), + dataIndex: "executionDuration", + width: 150 }, { - title: 'Exceptions', - dataIndex: 'exceptions', - }, + title: "Exceptions", + dataIndex: "exceptions" + } ]; + /** * 分页列表 * @param params @@ -69,42 +71,44 @@ export async function getTableListAsync(params: PagingAuditLogListInput) { const _auditLogsServiceProxy = new AuditLogsServiceProxy(); return _auditLogsServiceProxy.page(params); } + export function httpStatusCodeColor(statusCode?: number) { if (!statusCode) { - return ''; + return ""; } if (statusCode >= 200 && statusCode < 300) { - return '#87d068'; + return "#87d068"; } if (statusCode >= 300 && statusCode < 400) { - return '#108ee9'; + return "#108ee9"; } if (statusCode >= 400 && statusCode < 500) { - return 'orange'; + return "orange"; } if (statusCode >= 500) { - return 'red'; + return "red"; } - return 'cyan'; + return "cyan"; } + export function httpMethodColor(method?: string) { - if (method == 'GET') { - return 'blue'; + if (method == "GET") { + return "blue"; } - if (method == 'POST') { - return 'blue'; + if (method == "POST") { + return "blue"; } - if (method == 'PUT') { - return 'orange'; + if (method == "PUT") { + return "orange"; } - if (method == 'DELETE') { - return 'red'; + if (method == "DELETE") { + return "red"; } - if (method == 'OPTIONS') { - return 'cyan'; + if (method == "OPTIONS") { + return "cyan"; } - if (method == 'PATCH') { - return 'pink'; + if (method == "PATCH") { + return "pink"; } - return 'cyan'; + return "cyan"; } diff --git a/vben271/src/views/admin/auditLog/AuditLog.vue b/vben271/src/views/admin/auditLog/AuditLog.vue index c5e1e892..a6279494 100644 --- a/vben271/src/views/admin/auditLog/AuditLog.vue +++ b/vben271/src/views/admin/auditLog/AuditLog.vue @@ -3,9 +3,9 @@ @@ -13,46 +13,47 @@ diff --git a/vben271/src/views/admin/dictionary/AbpDictionary.ts b/vben271/src/views/admin/dictionary/AbpDictionary.ts index cce7cd11..8363b897 100644 --- a/vben271/src/views/admin/dictionary/AbpDictionary.ts +++ b/vben271/src/views/admin/dictionary/AbpDictionary.ts @@ -1,39 +1,39 @@ -import { FormSchema } from '/@/components/Table'; -import { BasicColumn } from '/@/components/Table'; -import { message } from 'ant-design-vue'; -import { useI18n } from '/@/hooks/web/useI18n'; +import { FormSchema } from "/@/components/Table"; +import { BasicColumn } from "/@/components/Table"; +import { message } from "ant-design-vue"; +import { useI18n } from "/@/hooks/web/useI18n"; import { PagingDataDictionaryInput, DataDictionaryServiceProxy, SetDataDictinaryDetailInput, DeleteDataDictionaryDetailInput, - IdInput, -} from '/@/services/ServiceProxies'; -import { h } from 'vue'; -import { Switch } from 'ant-design-vue'; + IdInput +} from "/@/services/ServiceProxies"; +import { h } from "vue"; +import { Switch } from "ant-design-vue"; const { t } = useI18n(); export const tableColumns: BasicColumn[] = [ { - title: t('routes.admin.dictionaryCode'), - dataIndex: 'code', + title: t("routes.admin.dictionaryCode"), + dataIndex: "code" }, { - title: t('routes.admin.dictionaryDisplayText'), - dataIndex: 'displayText', + title: t("routes.admin.dictionaryDisplayText"), + dataIndex: "displayText" }, { - title: t('routes.admin.dictionaryOrder'), - dataIndex: 'order', + title: t("routes.admin.dictionaryOrder"), + dataIndex: "order" }, { - title: t('common.status'), - dataIndex: 'isEnabled', + title: t("common.status"), + dataIndex: "isEnabled", customRender: ({ record }) => { return h(Switch, { checked: record.isEnabled, - checkedChildren: '是', - unCheckedChildren: '否', + checkedChildren: "是", + unCheckedChildren: "否", onChange(checked: boolean) { const request = new SetDataDictinaryDetailInput(); request.dataDictionaryId = record.dataDictionaryId; @@ -42,102 +42,102 @@ export const tableColumns: BasicColumn[] = [ enableDictionaryAsync(request) .then(() => { record.isEnabled = checked; - message.success(t('common.operationSuccess')); + message.success(t("common.operationSuccess")); }) .catch(() => { - message.error(t('common.operationFail')); + message.error(t("common.operationFail")); }); - }, + } }); - }, + } }, { - dataIndex: 'description', - title: t('routes.admin.dictionaryDescription'), - }, + dataIndex: "description", + title: t("routes.admin.dictionaryDescription") + } ]; //字典类型表格 export const dictionaryTypeTableColumns: BasicColumn[] = [ { - title: t('routes.admin.dictionaryCode') + '|' + t('routes.admin.dictionaryDisplayText'), - dataIndex: 'text', - align: 'left', + title: t("routes.admin.dictionaryCode") + "|" + t("routes.admin.dictionaryDisplayText"), + dataIndex: "text", + align: "left", slots: { - customRender: 'text', - }, - }, + customRender: "text" + } + } ]; //字典项查询 export const searchFormSchema: FormSchema[] = [ { - field: 'filter', - label: '', - component: 'Input', + field: "filter", + label: "", + component: "Input", colProps: { - span: 6, - }, - }, + span: 6 + } + } ]; //字典类型查询 export const searchDictionaryFormSchema: FormSchema[] = [ { - field: 'filter', - label: '', - component: 'Input', + field: "filter", + label: "", + component: "Input", colProps: { - span: 18, - }, - }, + span: 18 + } + } ]; //新增字典项 export const createFormSchema: FormSchema[] = [ { - field: 'id', - label: '', + field: "id", + label: "", ifShow: false, - component: 'Input', + component: "Input", colProps: { - span: 18, - }, + span: 18 + } }, { - field: 'typeDisplayText', - label: t('routes.admin.dictionaryTypeName'), - component: 'Input', + field: "typeDisplayText", + label: t("routes.admin.dictionaryTypeName"), + component: "Input", colProps: { - span: 18, + span: 18 }, componentProps: { - disabled: true, - }, + disabled: true + } }, { - field: 'code', - label: t('routes.admin.dictionaryCode'), + field: "code", + label: t("routes.admin.dictionaryCode"), required: true, - component: 'Input', + component: "Input", colProps: { - span: 18, - }, + span: 18 + } }, { - field: 'displayText', - label: t('routes.admin.dictionaryDisplayText'), - component: 'Input', + field: "displayText", + label: t("routes.admin.dictionaryDisplayText"), + component: "Input", required: true, colProps: { - span: 18, - }, + span: 18 + } }, { - field: 'order', - label: t('routes.admin.dictionaryOrder'), + field: "order", + label: t("routes.admin.dictionaryOrder"), required: true, - component: 'InputNumber', + component: "InputNumber", colProps: { - span: 18, + span: 18 }, dynamicRules: () => { return [ @@ -148,69 +148,69 @@ export const createFormSchema: FormSchema[] = [ if (regNull.test(value)) { return Promise.resolve(); } - return Promise.reject(t('routes.admin.nonZeroMessage')); - }, - }, + return Promise.reject(t("routes.admin.nonZeroMessage")); + } + } ]; - }, + } }, { - field: 'description', - label: t('routes.admin.dictionaryDescription'), - component: 'InputTextArea', + field: "description", + label: t("routes.admin.dictionaryDescription"), + component: "InputTextArea", colProps: { - span: 18, - }, - }, + span: 18 + } + } ]; //编辑字典项 export const editFormSchema: FormSchema[] = [ { - field: 'dataDictionaryId', - label: '', + field: "dataDictionaryId", + label: "", ifShow: false, - component: 'Input', + component: "Input", colProps: { - span: 18, - }, + span: 18 + } }, { - field: 'id', - label: '', + field: "id", + label: "", ifShow: false, - component: 'Input', + component: "Input", colProps: { - span: 18, - }, + span: 18 + } }, { - field: 'code', - label: t('routes.admin.dictionaryCode'), + field: "code", + label: t("routes.admin.dictionaryCode"), required: true, - component: 'Input', + component: "Input", colProps: { - span: 18, + span: 18 }, componentProps: { - disabled: true, - }, + disabled: true + } }, { - field: 'displayText', - label: t('routes.admin.dictionaryDisplayText'), - component: 'Input', + field: "displayText", + label: t("routes.admin.dictionaryDisplayText"), + component: "Input", required: true, colProps: { - span: 18, - }, + span: 18 + } }, { - field: 'order', - label: t('routes.admin.dictionaryOrder'), + field: "order", + label: t("routes.admin.dictionaryOrder"), required: true, - component: 'InputNumber', + component: "InputNumber", colProps: { - span: 18, + span: 18 }, dynamicRules: () => { return [ @@ -221,99 +221,99 @@ export const editFormSchema: FormSchema[] = [ if (regNull.test(value)) { return Promise.resolve(); } - return Promise.reject(t('routes.admin.nonZeroMessage')); - }, - }, + return Promise.reject(t("routes.admin.nonZeroMessage")); + } + } ]; - }, + } }, { - field: 'description', - label: t('routes.admin.dictionaryDescription'), - component: 'InputTextArea', + field: "description", + label: t("routes.admin.dictionaryDescription"), + component: "InputTextArea", colProps: { - span: 18, - }, - }, + span: 18 + } + } ]; //新增字典类型 export const createDictionaryTypeFormSchema: FormSchema[] = [ { - field: 'code', - label: t('routes.admin.dictionaryCode'), - component: 'Input', + field: "code", + label: t("routes.admin.dictionaryCode"), + component: "Input", required: true, colProps: { - span: 22, - }, + span: 22 + } }, { - field: 'displayText', - label: t('routes.admin.dictionaryDisplayText'), - component: 'Input', + field: "displayText", + label: t("routes.admin.dictionaryDisplayText"), + component: "Input", required: true, colProps: { - span: 22, - }, + span: 22 + } }, { - field: 'description', - label: t('routes.admin.dictionaryDescription'), - component: 'InputTextArea', + field: "description", + label: t("routes.admin.dictionaryDescription"), + component: "InputTextArea", colProps: { - span: 22, - }, - }, + span: 22 + } + } ]; //编辑字典类型 export const editDictionaryTypeFormSchema: FormSchema[] = [ { - field: 'code', - label: t('routes.admin.dictionaryCode'), - component: 'Input', + field: "code", + label: t("routes.admin.dictionaryCode"), + component: "Input", required: true, colProps: { - span: 22, + span: 22 }, componentProps: { - disabled: true, - }, + disabled: true + } }, { - field: 'displayText', - label: t('routes.admin.dictionaryDisplayText'), - component: 'Input', + field: "displayText", + label: t("routes.admin.dictionaryDisplayText"), + component: "Input", required: true, colProps: { - span: 22, - }, + span: 22 + } }, { - field: 'description', - label: t('routes.admin.dictionaryDescription'), - component: 'InputTextArea', + field: "description", + label: t("routes.admin.dictionaryDescription"), + component: "InputTextArea", colProps: { - span: 22, - }, + span: 22 + } }, { - field: 'key', - label: '', + field: "key", + label: "", ifShow: false, - component: 'Input', + component: "Input", colProps: { - span: 18, - }, + span: 18 + } }, { - field: 'id', - label: '', + field: "id", + label: "", ifShow: false, - component: 'Input', + component: "Input", colProps: { - span: 18, - }, - }, + span: 18 + } + } ]; /** @@ -333,13 +333,13 @@ export async function createDictionaryTypeAsync({ changeOkLoading, closeModal, validate, - resetFields, + resetFields }) { changeOkLoading(true); await validate(); const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy(); await _dataDictionaryServiceProxy.create(request); - message.success(t('common.operationSuccess')); + message.success(t("common.operationSuccess")); resetFields(); changeOkLoading(false); closeModal(); @@ -351,7 +351,7 @@ export async function editDictionaryTypeAsync({ request, changeOkLoading, valida await validate(); const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy(); await _dataDictionaryServiceProxy.update(request); - message.success(t('common.operationSuccess')); + message.success(t("common.operationSuccess")); changeOkLoading(false); closeModal(); } @@ -368,13 +368,13 @@ export async function createDetailsDictionaryAsync({ changeOkLoading, validate, resetFields, - closeModal, + closeModal }) { changeOkLoading(true); await validate(); const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy(); await _dataDictionaryServiceProxy.createDetail(request); - message.success(t('common.operationSuccess')); + message.success(t("common.operationSuccess")); resetFields(); changeOkLoading(false); closeModal(); @@ -392,13 +392,13 @@ export async function editDetailsDictionaryAsync({ request, changeOkLoading, validate, - closeModal, + closeModal }) { changeOkLoading(true); await validate(); const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy(); await _dataDictionaryServiceProxy.updateDetail(request); - message.success(t('common.operationSuccess')); + message.success(t("common.operationSuccess")); changeOkLoading(false); closeModal(); } diff --git a/vben271/src/views/admin/dictionary/AbpDictionary.vue b/vben271/src/views/admin/dictionary/AbpDictionary.vue index 67565546..56220743 100644 --- a/vben271/src/views/admin/dictionary/AbpDictionary.vue +++ b/vben271/src/views/admin/dictionary/AbpDictionary.vue @@ -9,8 +9,8 @@ :clickToRowSelect="false" > @@ -78,184 +80,187 @@ diff --git a/vben271/src/views/admin/dictionary/CreateAbpDictionary.vue b/vben271/src/views/admin/dictionary/CreateAbpDictionary.vue index 88d03b98..6c1b963a 100644 --- a/vben271/src/views/admin/dictionary/CreateAbpDictionary.vue +++ b/vben271/src/views/admin/dictionary/CreateAbpDictionary.vue @@ -14,64 +14,64 @@ diff --git a/vben271/src/views/admin/dictionary/CreateAbpDictionaryType.vue b/vben271/src/views/admin/dictionary/CreateAbpDictionaryType.vue index 1124ff2d..4375d7f2 100644 --- a/vben271/src/views/admin/dictionary/CreateAbpDictionaryType.vue +++ b/vben271/src/views/admin/dictionary/CreateAbpDictionaryType.vue @@ -14,56 +14,57 @@ diff --git a/vben271/src/views/admin/dictionary/EditAbpDictionary.vue b/vben271/src/views/admin/dictionary/EditAbpDictionary.vue index 633361d0..6f183fd6 100644 --- a/vben271/src/views/admin/dictionary/EditAbpDictionary.vue +++ b/vben271/src/views/admin/dictionary/EditAbpDictionary.vue @@ -14,61 +14,61 @@ diff --git a/vben271/src/views/admin/dictionary/EditAbpDictionaryType.vue b/vben271/src/views/admin/dictionary/EditAbpDictionaryType.vue index 08c8da0b..1a5c4c85 100644 --- a/vben271/src/views/admin/dictionary/EditAbpDictionaryType.vue +++ b/vben271/src/views/admin/dictionary/EditAbpDictionaryType.vue @@ -14,59 +14,60 @@ diff --git a/vben271/src/views/admin/elasticSearch/ElasticSearch.ts b/vben271/src/views/admin/elasticSearch/ElasticSearch.ts index e088b7d6..c828f8d0 100644 --- a/vben271/src/views/admin/elasticSearch/ElasticSearch.ts +++ b/vben271/src/views/admin/elasticSearch/ElasticSearch.ts @@ -1,50 +1,52 @@ -import { FormSchema } from '/@/components/Table'; -import { BasicColumn } from '/@/components/Table'; -import { useI18n } from '/@/hooks/web/useI18n'; +import { FormSchema } from "/@/components/Table"; +import { BasicColumn } from "/@/components/Table"; +import { useI18n } from "/@/hooks/web/useI18n"; + const { t } = useI18n(); -import moment from 'moment'; +import moment from "moment"; import { EsLogServiceProxy, PagingElasticSearchLogInput, - PagingElasticSearchLogOutputCustomePagedResultDto, -} from '/@/services/ServiceProxies'; + PagingElasticSearchLogOutputCustomePagedResultDto +} from "/@/services/ServiceProxies"; + export const searchFormSchema: FormSchema[] = [ { - field: 'filter', - component: 'Input', - label: t('common.key'), + field: "filter", + component: "Input", + label: t("common.key"), labelWidth: 80, colProps: { - span: 6, - }, + span: 6 + } }, { - field: 'time', - component: 'RangePicker', - label: '创建时间:', + field: "time", + component: "RangePicker", + label: "创建时间:", labelWidth: 80, colProps: { span: 6 }, - defaultValue: [moment().subtract(0, 'days'), moment().add(1, 'days')], - }, + defaultValue: [moment().subtract(0, "days"), moment().add(1, "days")] + } ]; export const tableColumns: BasicColumn[] = [ { - title: t('routes.admin.logLevel'), - dataIndex: 'level', - width: 200, + title: t("routes.admin.logLevel"), + dataIndex: "level", + width: 200 }, { - title: t('common.creationTime'), - dataIndex: 'creationTime', + title: t("common.creationTime"), + dataIndex: "creationTime", customRender: ({ text }) => { - return moment(text).format('YYYY-MM-DD HH:mm:ss'); + return moment(text).format("YYYY-MM-DD HH:mm:ss"); }, - width: 200, + width: 200 }, { - title: t('routes.admin.logContent'), - dataIndex: 'message', - }, + title: t("routes.admin.logContent"), + dataIndex: "message" + } ]; /** diff --git a/vben271/src/views/admin/elasticSearch/ElasticSearch.vue b/vben271/src/views/admin/elasticSearch/ElasticSearch.vue index 1c8ca3d9..c52d4bc2 100644 --- a/vben271/src/views/admin/elasticSearch/ElasticSearch.vue +++ b/vben271/src/views/admin/elasticSearch/ElasticSearch.vue @@ -2,9 +2,9 @@
@@ -14,64 +14,65 @@ diff --git a/vben271/src/views/admin/files/File.ts b/vben271/src/views/admin/files/File.ts index a411cab9..ef068386 100644 --- a/vben271/src/views/admin/files/File.ts +++ b/vben271/src/views/admin/files/File.ts @@ -1,31 +1,32 @@ -import { FormSchema } from '/@/components/Table'; -import { BasicColumn } from '/@/components/Table'; -import moment from 'moment'; -import { FilesServiceProxy, PagingFileInput } from '/@/services/ServiceProxies'; -import { useI18n } from '/@/hooks/web/useI18n'; +import { FormSchema } from "/@/components/Table"; +import { BasicColumn } from "/@/components/Table"; +import moment from "moment"; +import { FilesServiceProxy, PagingFileInput } from "/@/services/ServiceProxies"; +import { useI18n } from "/@/hooks/web/useI18n"; + const { t } = useI18n(); export const searchFormSchema: FormSchema[] = [ { - field: 'filter', - label: t('routes.admin.fileName'), - component: 'Input', - colProps: { span: 8 }, - }, + field: "filter", + label: t("routes.admin.fileName"), + component: "Input", + colProps: { span: 8 } + } ]; export const tableColumns: BasicColumn[] = [ { - title: t('routes.admin.fileName'), - dataIndex: 'fileName', + title: t("routes.admin.fileName"), + dataIndex: "fileName" }, { - title: t('routes.admin.userManagement_createTime'), - dataIndex: 'creationTime', + title: t("routes.admin.userManagement_createTime"), + dataIndex: "creationTime", customRender: ({ text }) => { - return moment(text).format('YYYY-MM-DD HH:mm:ss'); - }, - }, + return moment(text).format("YYYY-MM-DD HH:mm:ss"); + } + } ]; /** diff --git a/vben271/src/views/admin/files/File.vue b/vben271/src/views/admin/files/File.vue index c389eed3..0e09b7d9 100644 --- a/vben271/src/views/admin/files/File.vue +++ b/vben271/src/views/admin/files/File.vue @@ -32,81 +32,83 @@ diff --git a/vben271/src/views/admin/files/UploadOss.ts b/vben271/src/views/admin/files/UploadOss.ts index 5b88cb09..917cd6d8 100644 --- a/vben271/src/views/admin/files/UploadOss.ts +++ b/vben271/src/views/admin/files/UploadOss.ts @@ -1,6 +1,6 @@ -import { FilesServiceProxy, FileTokenOutput } from '/@/services/ServiceProxies'; -import OSS from 'ali-oss'; -import moment from 'moment'; +import { FilesServiceProxy, FileTokenOutput } from "/@/services/ServiceProxies"; +import OSS from "ali-oss"; +import moment from "moment"; export async function importFileAsync({ request }) { const _filesServiceProxy = new FilesServiceProxy(); @@ -10,20 +10,20 @@ export async function importFileAsync({ request }) { async function getFileTokenAsync() { const _filesServiceProxy = new FilesServiceProxy(); const result = await _filesServiceProxy.getFileToken(); - sessionStorage.setItem('oss', JSON.stringify(result)); + sessionStorage.setItem("oss", JSON.stringify(result)); return result; } export async function getOSSClient(): Promise { let fileToken = new FileTokenOutput(); try { - let oss = sessionStorage.getItem('oss'); + let oss = sessionStorage.getItem("oss"); if (!oss) { fileToken = await getFileTokenAsync(); } else { fileToken = JSON.parse(oss); - let expiration = moment(fileToken.expiration).format('YYYY-MM-DD HH:mm:ss'); + let expiration = moment(fileToken.expiration).format("YYYY-MM-DD HH:mm:ss"); debugger; if (expiration < formatDate(moment.now())) { fileToken = await getFileTokenAsync(); @@ -34,36 +34,36 @@ export async function getOSSClient(): Promise { accessKeyId: fileToken.accessKeyId, accessKeySecret: fileToken.accessKeySecret, bucket: fileToken.bucket, - stsToken: fileToken.token as string, + stsToken: fileToken.token as string }; return Promise.resolve(new OSS(request)); } catch (error) { - console.error('获取oss Client失败'); + console.error("获取oss Client失败"); } } export async function downLoadFile(fileName) { let oss = await getOSSClient(); const response = { - 'content-disposition': `attachment; filename=${encodeURIComponent(fileName)}`, + "content-disposition": `attachment; filename=${encodeURIComponent(fileName)}` }; const url = (oss as OSS).signatureUrl(fileName, { response }); - let link = document.createElement('a'); //创建a标签 - link.style.display = 'none'; //使其隐藏 + let link = document.createElement("a"); //创建a标签 + link.style.display = "none"; //使其隐藏 link.href = url; //赋予文件下载地址 - link.setAttribute('download', fileName); //设置下载属性 以及文件名 + link.setAttribute("download", fileName); //设置下载属性 以及文件名 document.body.appendChild(link); //a标签插至页面中 link.click(); //强制触发a标签事件 } function formatDate(dateTime) { const date = new Date(dateTime); - const YY = date.getFullYear() + '-'; - const MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; - const DD = date.getDate() < 10 ? '0' + date.getDate() : date.getDate(); - const hh = date.getHours() + ':'; - const mm = date.getMinutes() + ':'; + const YY = date.getFullYear() + "-"; + const MM = (date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1) + "-"; + const DD = date.getDate() < 10 ? "0" + date.getDate() : date.getDate(); + const hh = date.getHours() + ":"; + const mm = date.getMinutes() + ":"; const ss = date.getSeconds(); - return YY + MM + DD + ' ' + hh + mm + ss; + return YY + MM + DD + " " + hh + mm + ss; } diff --git a/vben271/src/views/admin/organizationUnits/AddRoleToOrganizationUnit.vue b/vben271/src/views/admin/organizationUnits/AddRoleToOrganizationUnit.vue index 98ff9818..181ca3fc 100644 --- a/vben271/src/views/admin/organizationUnits/AddRoleToOrganizationUnit.vue +++ b/vben271/src/views/admin/organizationUnits/AddRoleToOrganizationUnit.vue @@ -7,10 +7,9 @@ :maskClosable="false" @cancel="cancel" @register="registerModal" - :minHeight="100" :destroyOnClose="true" > - +
@@ -21,45 +20,63 @@ import { BasicModal, useModalInner } from "/@/components/Modal"; import { BasicForm } from "/@/components/Form/index"; import { useI18n } from "/@/hooks/web/useI18n"; import { - getUnAddRolesAsync, addRoleTableColumns, searchAddRoleFormSchema + getUnAddRolesAsync, addRoleTableColumns, searchAddRoleFormSchema, addRoleToOrganizationUnitAsync, GetUnAddUserAsync } from "/@/views/admin/organizationUnits/OrganizationUnit"; -import { AddRoleToOrganizationUnitInput } from "/@/services/ServiceProxies"; -import { useTable } from "/@/components/Table"; +import { AddRoleToOrganizationUnitInput, GetUnAddRoleInput } from "/@/services/ServiceProxies"; +import { BasicTable, useTable } from "/@/components/Table"; export default defineComponent({ name: "AddRoleToOrganizationUnit", components: { BasicModal, - BasicForm + BasicForm, + BasicTable }, setup(_, { emit }) { const { t } = useI18n(); - const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => { - getForm().setFieldsValue({ - organizationUnitId: data.organizationUnitId - }); - }); - const [registerRoleTable, { getForm,getSelectRowKeys }] = useTable({ + 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: getUnAddRolesAsync, - showTableSetting: true, + api: getTableAsync, + showTableSetting: false, useSearchForm: false, bordered: true, - canResize: true, - showIndexColumn: 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 { - let selectedRoles = getSelectRowKeys(); - console.log(selectedRoles); + changeOkLoading(true) let request = new AddRoleToOrganizationUnitInput(); - request.organizationUnitId = getForm().getFieldsValue().organizationUnitId; - + request.organizationUnitId = organizationUnitId; + request.roleId=selectRoles; + await addRoleToOrganizationUnitAsync(request); + changeOkLoading(false); + closeModal(); emit("reload"); } catch (error) { changeOkLoading(false); @@ -67,6 +84,8 @@ export default defineComponent({ }; const cancel = () => { + organizationUnitId=''; + selectRoles=[] closeModal(); }; @@ -75,7 +94,8 @@ export default defineComponent({ registerRoleTable, submit, t, - cancel + cancel, + onSelectChange }; } }); diff --git a/vben271/src/views/admin/organizationUnits/AddUserToOrganizationUnit.vue b/vben271/src/views/admin/organizationUnits/AddUserToOrganizationUnit.vue new file mode 100644 index 00000000..20a80fa9 --- /dev/null +++ b/vben271/src/views/admin/organizationUnits/AddUserToOrganizationUnit.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/vben271/src/views/admin/organizationUnits/CreateOrganizationUnit.vue b/vben271/src/views/admin/organizationUnits/CreateOrganizationUnit.vue index 8337643d..11998c07 100644 --- a/vben271/src/views/admin/organizationUnits/CreateOrganizationUnit.vue +++ b/vben271/src/views/admin/organizationUnits/CreateOrganizationUnit.vue @@ -16,74 +16,74 @@ diff --git a/vben271/src/views/admin/organizationUnits/EditOrganizationUnit.vue b/vben271/src/views/admin/organizationUnits/EditOrganizationUnit.vue index bd44beb2..e90d8e66 100644 --- a/vben271/src/views/admin/organizationUnits/EditOrganizationUnit.vue +++ b/vben271/src/views/admin/organizationUnits/EditOrganizationUnit.vue @@ -16,60 +16,60 @@ diff --git a/vben271/src/views/admin/organizationUnits/OrganizationUnit.ts b/vben271/src/views/admin/organizationUnits/OrganizationUnit.ts index 7c60d79b..07755a20 100644 --- a/vben271/src/views/admin/organizationUnits/OrganizationUnit.ts +++ b/vben271/src/views/admin/organizationUnits/OrganizationUnit.ts @@ -10,161 +10,165 @@ import { GetUnAddRoleInput, GetUnAddUserInput } from "/@/services/ServiceProxies"; -import { FormSchema } from '/@/components/Table'; -import { BasicColumn } from '/@/components/Table'; -import { useI18n } from '/@/hooks/web/useI18n'; +import { FormSchema } from "/@/components/Table"; +import { BasicColumn } from "/@/components/Table"; +import { useI18n } from "/@/hooks/web/useI18n"; + const { t } = useI18n(); export const createOrganizationUnitFormSchema: FormSchema[] = [ { - field: 'parentDisplayName', - label: t('routes.admin.parentOrganizationUnitName'), - component: 'Input', + field: "parentDisplayName", + label: t("routes.admin.parentOrganizationUnitName"), + component: "Input", componentProps: { - disabled: true, + disabled: true }, colProps: { - span: 18, - }, + span: 18 + } }, { - field: 'displayName', - label: t('routes.admin.organizationUnitName'), - component: 'Input', + field: "displayName", + label: t("routes.admin.organizationUnitName"), + component: "Input", colProps: { - span: 18, - }, + span: 18 + } }, { - field: 'parentId', - label: '', - component: 'Input', + field: "parentId", + label: "", + component: "Input", colProps: { - span: 18, + span: 18 }, - ifShow: false, - }, + ifShow: false + } ]; export const editOrganizationUnitFormSchema: FormSchema[] = [ { - field: 'displayName', - label: t('routes.admin.organizationUnitName'), - component: 'Input', + field: "displayName", + label: t("routes.admin.organizationUnitName"), + component: "Input", colProps: { - span: 18, - }, + span: 18 + } }, { - field: 'id', - label: '', - component: 'Input', + field: "id", + label: "", + component: "Input", colProps: { - span: 18, + span: 18 }, - ifShow: false, - }, + ifShow: false + } ]; export const addRoleToOrganizationUnitFormSchema: FormSchema[] = [ { - field: 'displayName', - label: t('routes.admin.organizationUnitName'), - component: 'Input', + field: "displayName", + label: t("routes.admin.organizationUnitName"), + component: "Input", colProps: { - span: 18, - }, + span: 18 + } }, { - field: 'organizationUnitId', - label: '', - component: 'Input', + field: "organizationUnitId", + label: "", + component: "Input", colProps: { - span: 18, + span: 18 }, - ifShow: false, - }, + ifShow: false + } ]; export const userTableColumns: BasicColumn[] = [ { - title: t('routes.admin.userManagement_userName'), - dataIndex: 'userName', + title: t("routes.admin.userManagement_userName"), + dataIndex: "userName" }, { - title: t('routes.admin.userManagement_email'), - dataIndex: 'email', + 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_userName"), + dataIndex: "userName" }, { - title: t('routes.admin.userManagement_email'), - dataIndex: 'email', + title: t("routes.admin.userManagement_email"), + dataIndex: "email" } ]; export const roleTableColumns: BasicColumn[] = [ { - title: t('routes.admin.userManagement_roleName'), - dataIndex: 'name', + title: t("routes.admin.userManagement_roleName"), + dataIndex: "name" } ]; export const addRoleTableColumns: BasicColumn[] = [ { - title: t('routes.admin.userManagement_roleName'), - dataIndex: 'name', + 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: "filter", + label: t("routes.admin.userManagement_roleName"), + component: "Input", + colProps: { span: 8 } }, { - field: 'organizationUnitId', - label: '', - component: 'Input', - ifShow:false, - 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: 8 }, + field: "filter", + label: t("routes.admin.userManagement_userName"), + component: "Input", + colProps: { span: 10 } }, { - field: 'organizationUnitId', - label: '', - component: 'Input', - ifShow:false, - colProps: { span: 8 }, + 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, + resetFields }) { changeOkLoading(true); await validate(); @@ -179,7 +183,7 @@ export async function editOrganizationUnitAsync({ request, changeOkLoading, closeModal, - validate, + validate }) { changeOkLoading(true); await validate(); @@ -193,42 +197,40 @@ 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) -{ +export async function removeUserFromOrganizationUnitAsync(params: RemoveUserToOrganizationUnitInput) { const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); return _organizationUnitsServiceProxy.removeUserFromOrganizationUnit(params); } -export async function removeRoleFromOrganizationUnitAsync(params:RemoveRoleToOrganizationUnitInput) -{ + +export async function removeRoleFromOrganizationUnitAsync(params: RemoveRoleToOrganizationUnitInput) { const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); return _organizationUnitsServiceProxy.removeRoleFromOrganizationUnit(params); } -export async function addRoleToOrganizationUnitAsync(params:AddRoleToOrganizationUnitInput) -{ + +export async function addRoleToOrganizationUnitAsync(params: AddRoleToOrganizationUnitInput) { const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); return _organizationUnitsServiceProxy.addRoleToOrganizationUnit(params); } -export async function addUserToOrganizationUnitAsync(params:AddUserToOrganizationUnitInput) -{ + +export async function addUserToOrganizationUnitAsync(params: AddUserToOrganizationUnitInput) { const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); return _organizationUnitsServiceProxy.addUserToOrganizationUnit(params); } -export async function GetUnAddUserAsync(params:GetUnAddUserInput) -{ +export async function GetUnAddUserAsync(params: GetUnAddUserInput) { const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); return _organizationUnitsServiceProxy.getUnAddUsers(params); } -export async function getUnAddRolesAsync(params:GetUnAddRoleInput) -{ +export async function getUnAddRolesAsync(params: GetUnAddRoleInput) { const _organizationUnitsServiceProxy = new OrganizationUnitsServiceProxy(); return _organizationUnitsServiceProxy.getUnAddRoles(params); } diff --git a/vben271/src/views/admin/organizationUnits/OrganizationUnit.vue b/vben271/src/views/admin/organizationUnits/OrganizationUnit.vue index f485b8a1..c0004171 100644 --- a/vben271/src/views/admin/organizationUnits/OrganizationUnit.vue +++ b/vben271/src/views/admin/organizationUnits/OrganizationUnit.vue @@ -1,6 +1,6 @@ diff --git a/vben271/src/views/admin/roles/CreateAbpRole.vue b/vben271/src/views/admin/roles/CreateAbpRole.vue index 1faa2189..a29cb405 100644 --- a/vben271/src/views/admin/roles/CreateAbpRole.vue +++ b/vben271/src/views/admin/roles/CreateAbpRole.vue @@ -11,58 +11,58 @@ diff --git a/vben271/src/views/admin/roles/EditAbpRole.vue b/vben271/src/views/admin/roles/EditAbpRole.vue index b4a7f74f..4ac782cc 100644 --- a/vben271/src/views/admin/roles/EditAbpRole.vue +++ b/vben271/src/views/admin/roles/EditAbpRole.vue @@ -10,70 +10,70 @@ diff --git a/vben271/src/views/admin/settings/Setting.ts b/vben271/src/views/admin/settings/Setting.ts index 46fe2c1e..2238f909 100644 --- a/vben271/src/views/admin/settings/Setting.ts +++ b/vben271/src/views/admin/settings/Setting.ts @@ -1,4 +1,4 @@ -import { SettingsServiceProxy } from '/@/services/ServiceProxies'; +import { SettingsServiceProxy } from "/@/services/ServiceProxies"; /** * 获取所有settings diff --git a/vben271/src/views/admin/users/AbpUser.ts b/vben271/src/views/admin/users/AbpUser.ts index a9b2021b..9f7c1422 100644 --- a/vben271/src/views/admin/users/AbpUser.ts +++ b/vben271/src/views/admin/users/AbpUser.ts @@ -1,6 +1,6 @@ -import { FormSchema } from '/@/components/Table'; -import { BasicColumn } from '/@/components/Table'; -import moment from 'moment'; +import { FormSchema } from "/@/components/Table"; +import { BasicColumn } from "/@/components/Table"; +import moment from "moment"; import { PagingUserListInput, UsersServiceProxy, @@ -8,198 +8,199 @@ import { IdentityRoleDtoListResultDto, RolesServiceProxy, LockUserInput, - IdInput, -} from '/@/services/ServiceProxies'; -import { message } from 'ant-design-vue'; -import { useLoading } from '/@/components/Loading'; + IdInput +} from "/@/services/ServiceProxies"; +import { message } from "ant-design-vue"; +import { useLoading } from "/@/components/Loading"; + +import { useI18n } from "/@/hooks/web/useI18n"; -import { useI18n } from '/@/hooks/web/useI18n'; const { t } = useI18n(); const [openFullLoading, closeFullLoading] = useLoading({ - tip: 'Loading...', + tip: "Loading..." }); export const tableColumns: BasicColumn[] = [ { - title: t('routes.admin.userManagement_userName'), - dataIndex: 'userName', + title: t("routes.admin.userManagement_userName"), + dataIndex: "userName" }, { - title: t('routes.admin.userManagement_name'), - dataIndex: 'name', + title: t("routes.admin.userManagement_name"), + dataIndex: "name" }, { - title: t('routes.admin.userManagement_email'), - dataIndex: 'email', + title: t("routes.admin.userManagement_email"), + dataIndex: "email" }, { - title: t('routes.admin.userManagement_phone'), - dataIndex: 'phoneNumber', + title: t("routes.admin.userManagement_phone"), + dataIndex: "phoneNumber" }, { - title: t('common.status'), - dataIndex: 'isActive', - slots: { customRender: 'isActive' }, + title: t("common.status"), + dataIndex: "isActive", + slots: { customRender: "isActive" } }, { - title: t('routes.admin.userManagement_createTime'), - dataIndex: 'creationTime', + title: t("routes.admin.userManagement_createTime"), + dataIndex: "creationTime", customRender: ({ text }) => { - return moment(text).format('YYYY-MM-DD HH:mm:ss'); - }, - }, + return moment(text).format("YYYY-MM-DD HH:mm:ss"); + } + } ]; export const searchFormSchema: FormSchema[] = [ { - field: 'filter', - label: t('routes.admin.userManagement_userName'), - component: 'Input', - colProps: { span: 8 }, - }, + field: "filter", + label: t("routes.admin.userManagement_userName"), + component: "Input", + colProps: { span: 8 } + } ]; export const createFormSchema: FormSchema[] = [ { - field: 'userName', - component: 'Input', - label: t('routes.admin.userManagement_userName'), + field: "userName", + component: "Input", + label: t("routes.admin.userManagement_userName"), labelWidth: 85, required: true, colProps: { - span: 12, + span: 12 }, componentProps: { - autocomplete: 'off', - }, + autocomplete: "off" + } }, { - field: 'name', - component: 'Input', - label: t('routes.admin.roleManagement_name'), + field: "name", + component: "Input", + label: t("routes.admin.roleManagement_name"), labelWidth: 130, required: true, colProps: { - span: 12, + span: 12 }, componentProps: { - autocomplete: 'off', - }, + autocomplete: "off" + } }, { - field: 'email', - component: 'Input', - label: t('routes.admin.userManagement_email'), + field: "email", + component: "Input", + label: t("routes.admin.userManagement_email"), required: true, labelWidth: 85, colProps: { - span: 12, - }, + span: 12 + } }, { - field: 'phoneNumber', - component: 'Input', - label: t('routes.admin.userManagement_phone'), + field: "phoneNumber", + component: "Input", + label: t("routes.admin.userManagement_phone"), required: false, labelWidth: 130, colProps: { - span: 12, - }, + span: 12 + } }, { - field: 'password', - component: 'InputPassword', - label: t('routes.admin.userManagement_password'), + field: "password", + component: "InputPassword", + label: t("routes.admin.userManagement_password"), required: true, labelWidth: 85, colProps: { - span: 12, + span: 12 }, componentProps: { - autocomplete: 'off', - }, + autocomplete: "off" + } }, { - field: 'confirmPassword', - component: 'InputPassword', + field: "confirmPassword", + component: "InputPassword", componentProps: { - autocomplete: 'off', + autocomplete: "off" }, - label: t('routes.admin.userManagement_confirm_password'), + label: t("routes.admin.userManagement_confirm_password"), required: true, labelWidth: 130, colProps: { - span: 12, - }, - }, + span: 12 + } + } ]; export const editFormSchema: FormSchema[] = [ { - field: 'userName', - component: 'Input', - label: t('routes.admin.userManagement_userName'), + field: "userName", + component: "Input", + label: t("routes.admin.userManagement_userName"), labelWidth: 85, required: true, colProps: { - span: 12, + span: 12 }, componentProps: { - autocomplete: 'off', - disabled: true, - }, + autocomplete: "off", + disabled: true + } }, { - field: 'name', - component: 'Input', - label: t('routes.admin.userManagement_name'), + field: "name", + component: "Input", + label: t("routes.admin.userManagement_name"), labelWidth: 130, required: true, colProps: { - span: 12, - }, + span: 12 + } }, { - field: 'email', - component: 'Input', - label: t('routes.admin.userManagement_email'), + field: "email", + component: "Input", + label: t("routes.admin.userManagement_email"), required: true, labelWidth: 85, colProps: { - span: 12, - }, + span: 12 + } }, { - field: 'phoneNumber', - component: 'Input', - label: t('routes.admin.userManagement_phone'), + field: "phoneNumber", + component: "Input", + label: t("routes.admin.userManagement_phone"), required: false, labelWidth: 130, colProps: { - span: 12, - }, + span: 12 + } }, { - field: 'password', - component: 'InputPassword', - label: t('routes.admin.userManagement_password'), + field: "password", + component: "InputPassword", + label: t("routes.admin.userManagement_password"), required: false, labelWidth: 85, colProps: { - span: 12, - }, + span: 12 + } }, { - field: 'confirmPassword', - component: 'InputPassword', - label: t('routes.admin.userManagement_confirm_password'), + field: "confirmPassword", + component: "InputPassword", + label: t("routes.admin.userManagement_confirm_password"), required: false, labelWidth: 130, colProps: { - span: 12, - }, - }, + span: 12 + } + } ]; /** @@ -219,16 +220,16 @@ export async function getTableListAsync( * @param params * @returns */ - export function exportAsync({request}) { +export function exportAsync({ request }) { openFullLoading(); const _userServiceProxy = new UsersServiceProxy(); - _userServiceProxy.export(request).then(res=>{ - const a = document.createElement('a'); - a.href = URL.createObjectURL(res.data); - a.download = '用户列表导出.xlsx'; - a.click(); - closeFullLoading(); - }); + _userServiceProxy.export(request).then(res => { + const a = document.createElement("a"); + a.href = URL.createObjectURL(res.data); + a.download = "用户列表导出.xlsx"; + a.click(); + closeFullLoading(); + }); } /** @@ -261,18 +262,18 @@ export async function createUserAsync({ changeOkLoading, validate, closeModal, - resetFields, + resetFields }) { changeOkLoading(true); await validate(); if (request.password != request.confirmPassword) { - message.error('两次密码输入不一致'); - throw new Error('两次密码输入不一致'); + message.error("两次密码输入不一致"); + throw new Error("两次密码输入不一致"); } const _userServiceProxy = new UsersServiceProxy(); await _userServiceProxy.create(request); changeOkLoading(false); - message.success(t('common.operationSuccess')); + message.success(t("common.operationSuccess")); resetFields(); closeModal(); } @@ -289,7 +290,7 @@ export async function deleteUserAsync({ userId, reload }) { request.id = userId; await _userServiceProxy.delete(request); closeFullLoading(); - message.success(t('common.operationSuccess')); + message.success(t("common.operationSuccess")); reload(); } catch (error) { closeFullLoading(); @@ -305,7 +306,7 @@ export async function updateUserAsync({ changeOkLoading, validate, closeModal, - resetFields, + resetFields }) { changeOkLoading(true); await validate(); @@ -314,7 +315,7 @@ export async function updateUserAsync({ await _userServiceProxy.update(request); changeOkLoading(false); resetFields(); - message.success(t('common.operationSuccess')); + message.success(t("common.operationSuccess")); closeModal(); } diff --git a/vben271/src/views/admin/users/CreateAbpUser.vue b/vben271/src/views/admin/users/CreateAbpUser.vue index 2a95a94e..a0e4949b 100644 --- a/vben271/src/views/admin/users/CreateAbpUser.vue +++ b/vben271/src/views/admin/users/CreateAbpUser.vue @@ -25,7 +25,7 @@ v-for="(item, index) in itemRolesRef" :key="index" :value="item.name" - >{{ item.name }} + >{{ item.name }} @@ -37,88 +37,88 @@ diff --git a/vben271/src/views/admin/users/EditAbpUser.vue b/vben271/src/views/admin/users/EditAbpUser.vue index 4e71ec6c..c9a733ea 100644 --- a/vben271/src/views/admin/users/EditAbpUser.vue +++ b/vben271/src/views/admin/users/EditAbpUser.vue @@ -25,7 +25,9 @@ v-for="(item, index) in rolesRef" :key="index" :value="item.name" - >{{ item.name }} + {{ item.name }} + @@ -37,128 +39,129 @@